summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorHIYAMA Manabu <hiyama.manabu@po.ntts.co.jp>2012-09-26 13:07:31 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2012-09-26 13:11:10 +0900
commit79e7d09cf04f313555a7a838eebd463a45def43c (patch)
treef3f3dccdf01551ecf4a5064da86ac7d3afdec2fa
parentbb05f39c3afb7a090e314e299972d45cbdd6c9b5 (diff)
packet lib: ipv4 option data support
also make checksum handling consistent with the other code. Signed-off-by: HIYAMA Manabu <hiyama.manabu@po.ntts.co.jp> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--ryu/lib/packet/ipv4.py10
1 files changed, 8 insertions, 2 deletions
diff --git a/ryu/lib/packet/ipv4.py b/ryu/lib/packet/ipv4.py
index e4f87782..2adf6895 100644
--- a/ryu/lib/packet/ipv4.py
+++ b/ryu/lib/packet/ipv4.py
@@ -14,6 +14,7 @@
# limitations under the License.
import struct
+import socket
from . import packet_base
from . import packet_utils
from . import udp
@@ -69,8 +70,13 @@ class ipv4(packet_base.PacketBase):
struct.pack_into(ipv4._PACK_STR, hdr, 0, version, self.tos,
self.total_length, self.identification, flags,
self.ttl, self.proto, 0, self.src, self.dst)
- self.csum = packet_utils.checksum(hdr)
- struct.pack_into('H', hdr, 10, self.csum)
+
+ if self.option:
+ assert struct.calcsize('I') >= len(self.option)
+ hdr[ipv4._MIN_LEN:ipv4._MIN_LEN + len(self.option)] = self.option
+
+ self.csum = socket.htons(packet_utils.checksum(hdr))
+ struct.pack_into('!H', hdr, 10, self.csum)
return hdr
ipv4.register_packet_type(tcp.tcp, inet.IPPROTO_TCP)