Patrick McHardy wrote: > Pavel Emelianov wrote: >> +static int veth_newlink(struct net_device *dev, >> + struct nlattr *tb[], struct nlattr *data[]) >> +{ >> + int err; >> + struct net_device *peer; >> + struct veth_priv *priv; >> + char ifname[IFNAMSIZ]; >> + >> + /* >> + * prepare the devices info >> + */ >> + >> + if (tb[IFLA_ADDRESS] == NULL) >> + random_ether_addr(dev->dev_addr); >> + >> + if (data != NULL && data[VETH_INFO_PEER] != NULL) { >> + err = nla_parse_nested(tb, IFLA_INFO_MAX, >> + data[VETH_INFO_PEER], ifla_policy); >> + if (err < 0) >> + return err; >> + } > > > Not having a peer should be an error, no?
No. That's the intention - if the user doesn't specify "peer" in the command line then two _identical_ devices are created. Of course, if he specifies one name - there'll be a collision, but one can say "my_own_veth_number_%d" and everything will be ok. Or just use the default name provided. E.g. "ip link add type veth" will send a packet with data[VETH_INFO_PEER} == NULL, but this is OK! User just wants a default tunnel and he will get it :) Does this answer your second comment below? >> + >> + if (tb[IFLA_IFNAME]) >> + nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); >> + else >> + snprintf(ifname, IFNAMSIZ, DRV_NAME "%%d"); > > > Does this work? The other device is not registered at this time, so I > think the allocated names could clash .. > > If it does work you could also perform name allocation in the > rtnl_create_link function. > > >> + >> + peer = rtnl_create_link(ifname, &veth_link_ops, tb); >> + if (IS_ERR(peer)) >> + return PTR_ERR(peer); >> + >> + if (tb[IFLA_ADDRESS] == NULL) >> + random_ether_addr(peer->dev_addr); >> + >> + /* >> + * register devices >> + */ >> + >> + err = register_netdevice(peer); >> + if (err < 0) >> + goto err_register_peer; >> + >> + err = register_netdevice(dev); >> + if (err < 0) >> + goto err_register_dev; >> + >> + /* >> + * tie the deviced together >> + */ >> + >> + priv = netdev_priv(dev); >> + priv->dev = dev; >> + priv->peer = peer; >> + list_add(&priv->list, &veth_list); >> + >> + priv = netdev_priv(peer); >> + priv->dev = peer; >> + priv->peer = dev; >> + INIT_LIST_HEAD(&priv->list); >> + return 0; >> + >> +err_register_dev: >> + unregister_netdevice(peer); >> + return err; >> + >> +err_register_peer: >> + free_netdev(peer); >> + return err; >> +} > >> +static __exit void veth_exit(void) >> +{ >> + struct veth_priv *priv, *next; >> + >> + rtnl_lock(); >> + __rtnl_link_unregister(&veth_link_ops); >> + >> + list_for_each_entry_safe(priv, next, &veth_list, list) >> + veth_dellink(priv->dev); >> + rtnl_unlock(); > > > Devices are unregistered automatically through the dellink function, > rtnl_link_unregister(..) is enough. OK. This looks like a minor and not-significant comment, so do I need to resend the patch or David is OK to take it and I will send an incremental one? Thanks, Pavel - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html