From: Ben Pfaff <blp@nicira.com>
Date: Mon, 19 Dec 2011 22:45:23 +0000 (-0800)
Subject: flow: Make flow_compose() fake packets slightly more realistic.
X-Git-Tag: sliver-openvswitch-0.1-1~546
X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=df9b6612b52d671f7dc286deedb1cef8a3ed58ab;p=sliver-openvswitch.git

flow: Make flow_compose() fake packets slightly more realistic.

This makes flow_extract() happier with TCP packets that this function
produces.

Signed-off-by: Ben Pfaff <blp@nicira.com>
---

diff --git a/lib/flow.c b/lib/flow.c
index a491afffc..922412fd8 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -1020,6 +1020,7 @@ flow_compose(struct ofpbuf *b, const struct flow *flow)
                 b->l4 = tcp = ofpbuf_put_zeros(b, sizeof *tcp);
                 tcp->tcp_src = flow->tp_src;
                 tcp->tcp_dst = flow->tp_dst;
+                tcp->tcp_ctl = TCP_CTL(0, 5);
             } else if (flow->nw_proto == IPPROTO_UDP) {
                 struct udp_header *udp;
 
@@ -1034,6 +1035,9 @@ flow_compose(struct ofpbuf *b, const struct flow *flow)
                 icmp->icmp_code = ntohs(flow->tp_dst);
             }
         }
+
+        ip->ip_tot_len = htons((uint8_t *) b->data + b->size
+                               - (uint8_t *) b->l3);
     } else if (flow->dl_type == htons(ETH_TYPE_IPV6)) {
         /* XXX */
     } else if (flow->dl_type == htons(ETH_TYPE_ARP)) {
diff --git a/lib/packets.h b/lib/packets.h
index 9e283a5ab..19b7346ba 100644
--- a/lib/packets.h
+++ b/lib/packets.h
@@ -357,6 +357,7 @@ BUILD_ASSERT_DECL(UDP_HEADER_LEN == sizeof(struct udp_header));
 #define TCP_ACK 0x10
 #define TCP_URG 0x20
 
+#define TCP_CTL(flags, offset) (htons((flags) | ((offset) << 12)))
 #define TCP_FLAGS(tcp_ctl) (ntohs(tcp_ctl) & 0x003f)
 #define TCP_OFFSET(tcp_ctl) (ntohs(tcp_ctl) >> 12)