[ovs-dev] [PATCH v2 1/2] tunneling: Remove struct tnl_vport and tnl_ops.

Jesse Gross jesse at nicira.com
Wed May 1 00:11:17 UTC 2013


On Tue, Apr 30, 2013 at 4:20 PM, Pravin B Shelar <pshelar at nicira.com> wrote:
> diff --git a/datapath/tunnel.c b/datapath/tunnel.c
> index 057aaed..fb430f2 100644
> --- a/datapath/tunnel.c
> +++ b/datapath/tunnel.c
> @@ -234,17 +221,32 @@ int ovs_tnl_send(struct vport *vport, struct sk_buff *skb)
>         rt = find_route(ovs_dp_get_net(vport->dp),
>                         &saddr,
>                         OVS_CB(skb)->tun_key->ipv4_dst,
> -                       tnl_vport->tnl_ops->ipproto,
> +                       ipproto,
>                         OVS_CB(skb)->tun_key->ipv4_tos,
>                         skb_get_mark(skb));
>         if (IS_ERR(rt))
>                 goto error_free;
>
> -       /* Offloading */
> -       tunnel_hlen = tnl_vport->tnl_ops->hdr_len(OVS_CB(skb)->tun_key);
>         tunnel_hlen += sizeof(struct iphdr);
>
> -       skb = handle_offloads(skb, rt, tunnel_hlen);
> +       min_headroom = LL_RESERVED_SPACE(rt_dst(rt).dev) + rt_dst(rt).header_len
> +                       + tunnel_hlen
> +                       + (vlan_tx_tag_present(skb) ? VLAN_HLEN : 0);
> +
> +       if (skb_headroom(skb) < min_headroom || skb_header_cloned(skb)) {
> +               int err;
> +               int head_delta = SKB_DATA_ALIGN(min_headroom -
> +                                               skb_headroom(skb) +
> +                                               16);
> +
> +               err = pskb_expand_head(skb, max_t(int, head_delta, 0),
> +                                       0, GFP_ATOMIC);
> +               if (unlikely(err))
> +                       goto error_free;
> +       }
> +
> +       /* Offloading */
> +       skb = handle_offloads(skb, rt);

I'm not sure I understand why the code block that expands the headroom
was moved out of handle_offloads(). However, I see a couple of issues:
 * It leaks the rt in the case of an error.
 * rt is not used in handle_offloads().

> diff --git a/datapath/vport-vxlan.c b/datapath/vport-vxlan.c
> index 1850fc2..92b1666 100644
> --- a/datapath/vport-vxlan.c
> +++ b/datapath/vport-vxlan.c
>  /**
>   * struct vxlan_port - Keeps track of open UDP ports
> - * @list: list element.
> - * @vport: vport for the tunnel.
> + * @dst_port: vxlan UDP port no.
> + * @list: list element in @vxlan_ports.
>   * @socket: The socket created for this port number.
> + * @name: vport name.
> + * @rcu: RCU callback head for deferred destruction.
>   */
>  struct vxlan_port {
> +       __be16 dst_port;
>         struct list_head list;
> -       struct vport *vport;
>         struct socket *vxlan_rcv_socket;
> +       char name[IFNAMSIZ];
>         struct rcu_head rcu;

We're not using the 'rcu' element anymore, are we?



More information about the dev mailing list