# HG changeset patch # User Ovidiu Poncea # Date 1440055493 25200 # Thu Aug 20 00:24:53 2015 -0700 # Node ID b67788184707a296f3d0451b5c9af92c7ec491e2 # Parent 18af0e64eee77846082e9f0a84f6bf501a46ab63 Fix (again) Fix TCP/UDP port numbers are correctly read from the IP packet diff -r 18af0e64eee7 -r b67788184707 src/openflow/model/openflow-switch-net-device.cc --- a/src/openflow/model/openflow-switch-net-device.cc Tue Aug 18 16:17:36 2015 -0700 +++ b/src/openflow/model/openflow-switch-net-device.cc Thu Aug 20 00:24:53 2015 -0700 @@ -474,12 +474,15 @@ l2_length = ETH_HEADER_LEN; } + Ipv4Header ip_hd; + uint32_t ip_header_size; // We have to wrap this because PeekHeader has an assert fail if we check for an Ipv4Header that isn't there. if (protocol == Ipv4L3Protocol::PROT_NUMBER) { Ipv4Header ip_hd; if (packet->PeekHeader (ip_hd)) { + ip_header_size = ip_hd.GetSerializedSize(); buffer->l3 = new ip_header; ip_header* ip_h = (ip_header*)buffer->l3; ip_h->ip_ihl_ver = IP_IHL_VER (5, IP_VERSION); // Version @@ -526,7 +529,8 @@ if (ip_h->ip_proto == TcpL4Protocol::PROT_NUMBER) { TcpHeader tcp_hd; - if (packet->PeekHeader (tcp_hd)) + Ptr tcp_hd_fragment = packet->CreateFragment(ip_header_size,tcp_hd.GetSerializedSize()); + if (tcp_hd_fragment->PeekHeader (tcp_hd)) { buffer->l4 = new tcp_header; tcp_header* tcp_h = (tcp_header*)buffer->l4; @@ -546,7 +550,8 @@ else if (ip_h->ip_proto == UdpL4Protocol::PROT_NUMBER) { UdpHeader udp_hd; - if (packet->PeekHeader (udp_hd)) + Ptr udp_hd_fragment = packet->CreateFragment(ip_header_size,udp_hd.GetSerializedSize()); + if (udp_hd_fragment->PeekHeader (udp_hd)) { buffer->l4 = new udp_header; udp_header* udp_h = (udp_header*)buffer->l4;