From 29d532d8b8d6475d370351572a2acd8e0e180edd Mon Sep 17 00:00:00 2001 From: Alex Wang Date: Wed, 5 Jun 2013 12:34:01 -0700 Subject: [PATCH 1/1] ofproto-dpif.c: Modify vsp_realdev_to_vlandev() function Commit 52a90c29 (Implement new "VLAN splinters" feature) passed in OpenFlow port number to vsp_realdev_to_vlandev() function which asks for datapath port number. This patch fixes this bug by making the vsp_realdev_to_vlandev() function take in and return OpenFlow port number. Signed-off-by: Alex Wang Signed-off-by: Ben Pfaff --- ofproto/ofproto-dpif.c | 47 ++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index bf8a601b6..8c8487aa9 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -570,8 +570,9 @@ struct vlan_splinter { int vid; }; -static uint32_t vsp_realdev_to_vlandev(const struct ofproto_dpif *, - uint32_t realdev, ovs_be16 vlan_tci); +static uint16_t vsp_realdev_to_vlandev(const struct ofproto_dpif *, + uint16_t realdev_ofp_port, + ovs_be16 vlan_tci); static bool vsp_adjust_flow(const struct ofproto_dpif *, struct flow *); static void vsp_remove(struct ofport_dpif *); static void vsp_add(struct ofport_dpif *, uint16_t realdev_ofp_port, int vid); @@ -5752,9 +5753,13 @@ send_packet(const struct ofport_dpif *ofport, struct ofpbuf *packet) odp_put_tunnel_action(&flow.tunnel, &odp_actions); odp_put_skb_mark_action(flow.skb_mark, &odp_actions); } else { - odp_port = vsp_realdev_to_vlandev(ofproto, ofport->odp_port, - flow.vlan_tci); - if (odp_port != ofport->odp_port) { + uint16_t vlandev_port; + vlandev_port = vsp_realdev_to_vlandev(ofproto, ofport->up.ofp_port, + flow.vlan_tci); + if (vlandev_port == ofport->up.ofp_port) { + odp_port = ofport->odp_port; + } else { + odp_port = ofp_port_to_odp_port(ofproto, vlandev_port); eth_pop_vlan(packet); flow.vlan_tci = htons(0); } @@ -6035,9 +6040,13 @@ compose_output_action__(struct action_xlate_ctx *ctx, uint16_t ofp_port, commit_odp_tunnel_action(&ctx->flow, &ctx->base_flow, ctx->odp_actions); } else { - out_port = vsp_realdev_to_vlandev(ctx->ofproto, odp_port, - ctx->flow.vlan_tci); - if (out_port != odp_port) { + uint16_t vlandev_port; + vlandev_port = vsp_realdev_to_vlandev(ctx->ofproto, ofp_port, + ctx->flow.vlan_tci); + if (vlandev_port == ofp_port) { + out_port = odp_port; + } else { + out_port = ofp_port_to_odp_port(ctx->ofproto, vlandev_port); ctx->flow.vlan_tci = htons(0); } ctx->flow.skb_mark &= ~IPSEC_MARK; @@ -8434,33 +8443,31 @@ hash_realdev_vid(uint16_t realdev_ofp_port, int vid) return hash_2words(realdev_ofp_port, vid); } -/* Returns the ODP port number of the Linux VLAN device that corresponds to - * 'vlan_tci' on the network device with port number 'realdev_odp_port' in - * 'ofproto'. For example, given 'realdev_odp_port' of eth0 and 'vlan_tci' 9, - * it would return the port number of eth0.9. +/* Returns the OFP port number of the Linux VLAN device that corresponds to + * 'vlan_tci' on the network device with port number 'realdev_ofp_port' in + * 'struct ofport_dpif'. For example, given 'realdev_ofp_port' of eth0 and + * 'vlan_tci' 9, it would return the port number of eth0.9. * - * Unless VLAN splinters are enabled for port 'realdev_odp_port', this - * function just returns its 'realdev_odp_port' argument. */ -static uint32_t + * Unless VLAN splinters are enabled for port 'realdev_ofp_port', this + * function just returns its 'realdev_ofp_port' argument. */ +static uint16_t vsp_realdev_to_vlandev(const struct ofproto_dpif *ofproto, - uint32_t realdev_odp_port, ovs_be16 vlan_tci) + uint16_t realdev_ofp_port, ovs_be16 vlan_tci) { if (!hmap_is_empty(&ofproto->realdev_vid_map)) { - uint16_t realdev_ofp_port; int vid = vlan_tci_to_vid(vlan_tci); const struct vlan_splinter *vsp; - realdev_ofp_port = odp_port_to_ofp_port(ofproto, realdev_odp_port); HMAP_FOR_EACH_WITH_HASH (vsp, realdev_vid_node, hash_realdev_vid(realdev_ofp_port, vid), &ofproto->realdev_vid_map) { if (vsp->realdev_ofp_port == realdev_ofp_port && vsp->vid == vid) { - return ofp_port_to_odp_port(ofproto, vsp->vlandev_ofp_port); + return vsp->vlandev_ofp_port; } } } - return realdev_odp_port; + return realdev_ofp_port; } static struct vlan_splinter * -- 2.20.1