Loading net/ipv4/ipmr.c +36 −37 Original line number Diff line number Diff line Loading @@ -471,17 +471,16 @@ static bool ipmr_init_vif_indev(const struct net_device *dev) static struct net_device *ipmr_new_tunnel(struct net *net, struct vifctl *v) { struct net_device *dev; dev = __dev_get_by_name(net, "tunl0"); if (dev) { const struct net_device_ops *ops = dev->netdev_ops; int err; struct net_device *tunnel_dev, *new_dev; struct ip_tunnel_parm p = { }; mm_segment_t oldfs = get_fs(); struct ifreq ifr; struct ip_tunnel_parm p; int err; tunnel_dev = __dev_get_by_name(net, "tunl0"); if (!tunnel_dev) goto out; memset(&p, 0, sizeof(p)); p.iph.daddr = v->vifc_rmt_addr.s_addr; p.iph.saddr = v->vifc_lcl_addr.s_addr; p.iph.version = 4; Loading @@ -490,31 +489,31 @@ static struct net_device *ipmr_new_tunnel(struct net *net, struct vifctl *v) sprintf(p.name, "dvmrp%d", v->vifc_vifi); ifr.ifr_ifru.ifru_data = (__force void __user *)&p; if (ops->ndo_do_ioctl) { mm_segment_t oldfs = get_fs(); if (!tunnel_dev->netdev_ops->ndo_do_ioctl) goto out; set_fs(KERNEL_DS); err = ops->ndo_do_ioctl(dev, &ifr, SIOCADDTUNNEL); err = tunnel_dev->netdev_ops->ndo_do_ioctl(tunnel_dev, &ifr, SIOCADDTUNNEL); set_fs(oldfs); } else { err = -EOPNOTSUPP; } dev = NULL; if (err) goto out; if (err == 0 && (dev = __dev_get_by_name(net, p.name)) != NULL) { dev->flags |= IFF_MULTICAST; if (!ipmr_init_vif_indev(dev)) goto failure; if (dev_open(dev, NULL)) goto failure; dev_hold(dev); } } return dev; new_dev = __dev_get_by_name(net, p.name); if (!new_dev) goto out; failure: unregister_netdevice(dev); new_dev->flags |= IFF_MULTICAST; if (!ipmr_init_vif_indev(new_dev)) goto out_unregister; if (dev_open(new_dev, NULL)) goto out_unregister; dev_hold(new_dev); return new_dev; out_unregister: unregister_netdevice(new_dev); out: return NULL; } Loading Loading
net/ipv4/ipmr.c +36 −37 Original line number Diff line number Diff line Loading @@ -471,17 +471,16 @@ static bool ipmr_init_vif_indev(const struct net_device *dev) static struct net_device *ipmr_new_tunnel(struct net *net, struct vifctl *v) { struct net_device *dev; dev = __dev_get_by_name(net, "tunl0"); if (dev) { const struct net_device_ops *ops = dev->netdev_ops; int err; struct net_device *tunnel_dev, *new_dev; struct ip_tunnel_parm p = { }; mm_segment_t oldfs = get_fs(); struct ifreq ifr; struct ip_tunnel_parm p; int err; tunnel_dev = __dev_get_by_name(net, "tunl0"); if (!tunnel_dev) goto out; memset(&p, 0, sizeof(p)); p.iph.daddr = v->vifc_rmt_addr.s_addr; p.iph.saddr = v->vifc_lcl_addr.s_addr; p.iph.version = 4; Loading @@ -490,31 +489,31 @@ static struct net_device *ipmr_new_tunnel(struct net *net, struct vifctl *v) sprintf(p.name, "dvmrp%d", v->vifc_vifi); ifr.ifr_ifru.ifru_data = (__force void __user *)&p; if (ops->ndo_do_ioctl) { mm_segment_t oldfs = get_fs(); if (!tunnel_dev->netdev_ops->ndo_do_ioctl) goto out; set_fs(KERNEL_DS); err = ops->ndo_do_ioctl(dev, &ifr, SIOCADDTUNNEL); err = tunnel_dev->netdev_ops->ndo_do_ioctl(tunnel_dev, &ifr, SIOCADDTUNNEL); set_fs(oldfs); } else { err = -EOPNOTSUPP; } dev = NULL; if (err) goto out; if (err == 0 && (dev = __dev_get_by_name(net, p.name)) != NULL) { dev->flags |= IFF_MULTICAST; if (!ipmr_init_vif_indev(dev)) goto failure; if (dev_open(dev, NULL)) goto failure; dev_hold(dev); } } return dev; new_dev = __dev_get_by_name(net, p.name); if (!new_dev) goto out; failure: unregister_netdevice(dev); new_dev->flags |= IFF_MULTICAST; if (!ipmr_init_vif_indev(new_dev)) goto out_unregister; if (dev_open(new_dev, NULL)) goto out_unregister; dev_hold(new_dev); return new_dev; out_unregister: unregister_netdevice(new_dev); out: return NULL; } Loading