Looks good to me. Thanks~
On Wed, Jun 5, 2013 at 12:36 PM, Ben Pfaff <b...@nicira.com> wrote: > On Wed, Jun 05, 2013 at 10:46:13AM -0700, Alex Wang wrote: > > Hey Ben, > > > > I found in that the "send_packet()" function in branch-1.10 also invokes > > the "realdev_to_vlandev()" function. So there needs another fix in > > branch-1.10. > > OK, how about like this, then. > > --8<--------------------------cut here-------------------------->8-- > > From: Alex Wang <al...@nicira.com> > Date: Wed, 5 Jun 2013 12:34:01 -0700 > Subject: [PATCH] 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 <al...@nicira.com> > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > ofproto/ofproto-dpif.c | 47 > +++++++++++++++++++++++++++-------------------- > 1 files changed, 27 insertions(+), 20 deletions(-) > > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c > index bf8a601..8c8487a 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 * > -- > 1.7.2.5 > >
_______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev