When creating veth pair, at first rtnl_new_link() creates veth_dev, i.e. one end of the veth pipe, but not registers it; then veth_newlink() gets invoked, where peer dev is created _and_ registered, followed by veth_dev registration, which may fail if peer information, that is VETH_INFO_PEER attribute, has not been provided and the kernel will allocate unique veth name.
So, we should ask the kernel to allocate unique name for veth_dev only when peer info is not available. Example: % ip link dev veth0 type veth RTNETLINK answers: File exists After fix: % ip link dev veth0 type veth % ip link show dev veth0 5: veth0@veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether f6:ef:8b:96:f4:ec brd ff:ff:ff:ff:ff:ff % Signed-off-by: Roman Mashak <m...@mojatatu.com> --- drivers/net/veth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/veth.c b/drivers/net/veth.c index f5438d0..00dce15 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c @@ -432,7 +432,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev, if (tb[IFLA_ADDRESS] == NULL) eth_hw_addr_random(dev); - if (tb[IFLA_IFNAME]) + if (ifmp && tb[IFLA_IFNAME]) nla_strlcpy(dev->name, tb[IFLA_IFNAME], IFNAMSIZ); else snprintf(dev->name, IFNAMSIZ, DRV_NAME "%%d"); -- 1.9.1