[ovs-dev] [branch-1.10] ofproto-dpif.c: Modify vsp_realdev_to_vlandev() function

Alex Wang alexw at nicira.com
Wed Jun 5 17:46:13 UTC 2013


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.

@@ -5743,8 +5744,10 @@ 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);
+        uint16_t vlandev_port;
+        vlandev_port = vsp_realdev_to_vlandev(ofproto, ofport->up.ofp_port,
+                                              flow.vlan_tci);
+        odp_port = ofp_port_to_odp_port(ofproto, vlandev_port);
         if (odp_port != ofport->odp_port) {
             eth_pop_vlan(packet);
             flow.vlan_tci = htons(0);

Thanks,


On Thu, May 30, 2013 at 10:05 PM, Ben Pfaff <blp at nicira.com> wrote:

> From: Alex Wang <alexw at nicira.com>
>
> 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 <alexw at nicira.com>
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> This is a backport of commit deea120099d23 from master to branch-1.10.
> There were conflicts, which I resolved.  I would appreciate it if
> someone would review and commit this while I am out of the office Friday
> and Monday.
>
> Thanks,
>
> Ben.
>
>  ofproto/ofproto-dpif.c |   37 ++++++++++++++++++++-----------------
>  1 file changed, 20 insertions(+), 17 deletions(-)
>
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index a3b1153..a4afba6 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -569,8 +569,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);
> @@ -6026,9 +6027,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;
> @@ -8422,33 +8427,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.10.4
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20130605/6b1814dc/attachment-0004.html>


More information about the dev mailing list