lkml.org 
[lkml]   [2011]   [Dec]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH] ipip, sit: copy parms.name after register_netdevice
    From
    Same fix as 731abb9cb2 for ipip and sit tunnel.
    Commit 1c5cae815d removed an explicit call to dev_alloc_name in
    ipip_tunnel_locate
    and ipip6_tunnel_locate, because register_netdevice will now create a
    valid name.
    However the tunnel keeps a copy of the name in the private parms structure.

    This shows up if you do a simple tunnel add, followed by a tunnel show:

    $ sudo ip tunnel add mode ipip remote 10.2.20.211
    $ ip tunnel
    tunl0: ip/ip remote any local any ttl inherit nopmtudisc
    tunl%d: ip/ip remote 10.2.20.211 local any ttl inherit
    $ sudo ip tunnel add mode sit remote 10.2.20.212
    $ ip tunnel
    sit0: ipv6/ip remote any local any ttl 64 nopmtudisc 6rd-prefix 2002::/16
    sit%d: ioctl 89f8 failed: No such device
    sit%d: ipv6/ip remote 10.2.20.212 local any ttl inherit

    Signed-off-by: Ted Feng <artisdom@gmail.com>

    diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c
    index 065effd..0b2e732 100644
    --- a/net/ipv4/ipip.c
    +++ b/net/ipv4/ipip.c
    @@ -285,6 +285,8 @@ static struct ip_tunnel *
    ipip_tunnel_locate(struct net *net,
    if (register_netdevice(dev) < 0)
    goto failed_free;

    + strcpy(nt->parms.name, dev->name);
    +
    dev_hold(dev);
    ipip_tunnel_link(ipn, nt);
    return nt;
    @@ -759,7 +761,6 @@ static int ipip_tunnel_init(struct net_device *dev)
    struct ip_tunnel *tunnel = netdev_priv(dev);

    tunnel->dev = dev;
    - strcpy(tunnel->parms.name, dev->name);

    memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4);
    memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4);
    @@ -825,6 +826,7 @@ static void ipip_destroy_tunnels(struct ipip_net
    *ipn, struct list_head *head)
    static int __net_init ipip_init_net(struct net *net)
    {
    struct ipip_net *ipn = net_generic(net, ipip_net_id);
    + struct ip_tunnel *t;
    int err;

    ipn->tunnels[0] = ipn->tunnels_wc;
    @@ -848,6 +850,9 @@ static int __net_init ipip_init_net(struct net *net)
    if ((err = register_netdev(ipn->fb_tunnel_dev)))
    goto err_reg_dev;

    + t = netdev_priv(ipn->fb_tunnel_dev);
    +
    + strcpy(t->parms.name, ipn->fb_tunnel_dev->name);
    return 0;

    err_reg_dev:
    diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
    index a7a1860..96f3623 100644
    --- a/net/ipv6/sit.c
    +++ b/net/ipv6/sit.c
    @@ -263,6 +263,8 @@ static struct ip_tunnel
    *ipip6_tunnel_locate(struct net *net,
    if (register_netdevice(dev) < 0)
    goto failed_free;

    + strcpy(nt->parms.name, dev->name);
    +
    dev_hold(dev);

    ipip6_tunnel_link(sitn, nt);
    @@ -1144,7 +1146,6 @@ static int ipip6_tunnel_init(struct net_device *dev)
    struct ip_tunnel *tunnel = netdev_priv(dev);

    tunnel->dev = dev;
    - strcpy(tunnel->parms.name, dev->name);

    memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4);
    memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4);
    @@ -1207,6 +1208,7 @@ static void __net_exit
    sit_destroy_tunnels(struct sit_net *sitn, struct list_hea
    static int __net_init sit_init_net(struct net *net)
    {
    struct sit_net *sitn = net_generic(net, sit_net_id);
    + struct ip_tunnel *t;
    int err;

    sitn->tunnels[0] = sitn->tunnels_wc;
    @@ -1231,6 +1233,9 @@ static int __net_init sit_init_net(struct net *net)
    if ((err = register_netdev(sitn->fb_tunnel_dev)))
    goto err_reg_dev;

    + t = netdev_priv(sitn->fb_tunnel_dev);
    +
    + strcpy(t->parms.name, sitn->fb_tunnel_dev->name);
    return 0;

    err_reg_dev:

    \
     
     \ /
      Last update: 2011-12-06 10:27    [W:0.022 / U:61.920 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site