From: Jarno Rajahalme Date: Wed, 19 Mar 2014 23:13:32 +0000 (-0700) Subject: lib/flow: Retain ODPP_NONE on flow_extract(). X-Git-Tag: sliver-openvswitch-2.2.90-1~6^2~74 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=03fbdf8d9c80a5c2d517faecfa025c8b2ee505d3 lib/flow: Retain ODPP_NONE on flow_extract(). We used to map ODPP_NONE to port number 0, which is wrong, as ODPP_NONE is a valid value of the flow's in_port. Signed-off-by: Jarno Rajahalme Signed-off-by: Ben Pfaff --- diff --git a/lib/flow.c b/lib/flow.c index 82d672931..c482474c3 100644 --- a/lib/flow.c +++ b/lib/flow.c @@ -393,9 +393,7 @@ flow_extract(struct ofpbuf *packet, const struct pkt_metadata *md, if (md) { flow->tunnel = md->tunnel; - if (md->in_port.odp_port != ODPP_NONE) { - flow->in_port = md->in_port; - }; + flow->in_port = md->in_port; flow->skb_priority = md->skb_priority; flow->pkt_mark = md->pkt_mark; } diff --git a/lib/ofp-print.c b/lib/ofp-print.c index 5b533663a..c8d7f95a1 100644 --- a/lib/ofp-print.c +++ b/lib/ofp-print.c @@ -59,7 +59,7 @@ char * ofp_packet_to_string(const void *data, size_t len) { struct ds ds = DS_EMPTY_INITIALIZER; - const struct pkt_metadata md = PKT_METADATA_INITIALIZER(ODPP_NONE); + const struct pkt_metadata md = PKT_METADATA_INITIALIZER(0); struct ofpbuf buf; struct flow flow; diff --git a/lib/packets.c b/lib/packets.c index 3f7d6ebfd..0c023fc21 100644 --- a/lib/packets.c +++ b/lib/packets.c @@ -992,23 +992,3 @@ packet_format_tcp_flags(struct ds *s, uint16_t tcp_flags) ds_put_cstr(s, "[800]"); } } - -void pkt_metadata_init(struct pkt_metadata *md, const struct flow_tnl *tnl, - const uint32_t skb_priority, - const uint32_t pkt_mark, - const union flow_in_port *in_port) -{ - - tnl ? memcpy(&md->tunnel, tnl, sizeof(md->tunnel)) - : memset(&md->tunnel, 0, sizeof(md->tunnel)); - - md->skb_priority = skb_priority; - md->pkt_mark = pkt_mark; - md->in_port.odp_port = in_port ? in_port->odp_port : ODPP_NONE; -} - -void pkt_metadata_from_flow(struct pkt_metadata *md, const struct flow *flow) -{ - pkt_metadata_init(md, &flow->tunnel, flow->skb_priority, - flow->pkt_mark, &flow->in_port); -} diff --git a/lib/packets.h b/lib/packets.h index e6b330380..24d61a95a 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -42,11 +42,9 @@ struct pkt_metadata { #define PKT_METADATA_INITIALIZER(PORT) \ (struct pkt_metadata){ { 0, 0, 0, 0, 0, 0}, 0, 0, {(PORT)} } -void pkt_metadata_init(struct pkt_metadata *md, const struct flow_tnl *tnl, - const uint32_t skb_priority, - const uint32_t pkt_mark, - const union flow_in_port *in_port); -void pkt_metadata_from_flow(struct pkt_metadata *md, const struct flow *flow); +#define PKT_METADATA_INITIALIZER_FLOW(FLOW) \ + (struct pkt_metadata){ (FLOW)->tunnel, (FLOW)->skb_priority, \ + (FLOW)->pkt_mark, (FLOW)->in_port } bool dpid_from_string(const char *s, uint64_t *dpidp); diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 839cbff79..005023a6c 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -1008,11 +1008,9 @@ handle_upcalls(struct handler *handler, struct list *upcalls) type = classify_upcall(upcall); if (type == MISS_UPCALL) { uint32_t hash; - struct pkt_metadata md; + struct pkt_metadata md = PKT_METADATA_INITIALIZER_FLOW(&flow); - pkt_metadata_from_flow(&md, &flow); flow_extract(packet, &md, &miss->flow); - hash = flow_hash(&miss->flow, 0); existing_miss = flow_miss_find(&misses, ofproto, &miss->flow, hash); diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 2cdf8568f..d131ec2a8 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -3787,14 +3787,10 @@ parse_flow_and_packet(int argc, const char *argv[], if (!packet->size) { flow_compose(packet, flow); } else { - union flow_in_port in_port = flow->in_port; - struct pkt_metadata md; + struct pkt_metadata md = PKT_METADATA_INITIALIZER_FLOW(flow); /* Use the metadata from the flow and the packet argument * to reconstruct the flow. */ - pkt_metadata_init(&md, NULL, flow->skb_priority, - flow->pkt_mark, &in_port); - flow_extract(packet, &md, flow); } } diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at index ad23e9df3..ca0d2bb51 100644 --- a/tests/ofproto-dpif.at +++ b/tests/ofproto-dpif.at @@ -975,15 +975,15 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) # Check the packets that were output. AT_CHECK([ovs-ofctl parse-pcap p2.pcap], [0], [dnl -arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00 -arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00 -arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41 -arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00 -arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00 -arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41 -arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00 -arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00 -arp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41 +arp,metadata=0,in_port=ANY,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00 +arp,metadata=0,in_port=ANY,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00 +arp,metadata=0,in_port=ANY,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41 +arp,metadata=0,in_port=ANY,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00 +arp,metadata=0,in_port=ANY,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00 +arp,metadata=0,in_port=ANY,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41 +arp,metadata=0,in_port=ANY,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.0.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00 +arp,metadata=0,in_port=ANY,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=00:00:00:00:00:00 +arp,metadata=0,in_port=ANY,vlan_tci=0x0000,dl_src=80:88:88:88:88:88,dl_dst=ff:ff:ff:ff:ff:ff,arp_spa=192.168.128.1,arp_tpa=192.168.0.2,arp_op=2,arp_sha=50:54:00:00:00:05,arp_tha=40:44:44:44:44:41 ]) OVS_VSWITCHD_STOP