veth.c (24540535d33f72505807be3e7ef2e94f3726f971) | veth.c (81adee47dfb608df3ad0b91d230fb3cef75f0060) |
---|---|
1/* 2 * drivers/net/veth.c 3 * 4 * Copyright (C) 2007 OpenVZ http://openvz.org, SWsoft Inc 5 * 6 * Author: Pavel Emelianov <xemul@openvz.org> 7 * Ethtool interface from: Eric W. Biederman <ebiederm@xmission.com> 8 * --- 326 unchanged lines hidden (view full) --- 335 if (!is_valid_veth_mtu(nla_get_u32(tb[IFLA_MTU]))) 336 return -EINVAL; 337 } 338 return 0; 339} 340 341static struct rtnl_link_ops veth_link_ops; 342 | 1/* 2 * drivers/net/veth.c 3 * 4 * Copyright (C) 2007 OpenVZ http://openvz.org, SWsoft Inc 5 * 6 * Author: Pavel Emelianov <xemul@openvz.org> 7 * Ethtool interface from: Eric W. Biederman <ebiederm@xmission.com> 8 * --- 326 unchanged lines hidden (view full) --- 335 if (!is_valid_veth_mtu(nla_get_u32(tb[IFLA_MTU]))) 336 return -EINVAL; 337 } 338 return 0; 339} 340 341static struct rtnl_link_ops veth_link_ops; 342 |
343static int veth_newlink(struct net_device *dev, | 343static int veth_newlink(struct net *src_net, struct net_device *dev, |
344 struct nlattr *tb[], struct nlattr *data[]) 345{ 346 int err; 347 struct net_device *peer; 348 struct veth_priv *priv; 349 char ifname[IFNAMSIZ]; 350 struct nlattr *peer_tb[IFLA_MAX + 1], **tbp; | 344 struct nlattr *tb[], struct nlattr *data[]) 345{ 346 int err; 347 struct net_device *peer; 348 struct veth_priv *priv; 349 char ifname[IFNAMSIZ]; 350 struct nlattr *peer_tb[IFLA_MAX + 1], **tbp; |
351 struct net *net; |
|
351 352 /* 353 * create and register peer first 354 * 355 * struct ifinfomsg is at the head of VETH_INFO_PEER, but we 356 * skip it since no info from it is useful yet 357 */ 358 --- 16 unchanged lines hidden (view full) --- 375 } else 376 tbp = tb; 377 378 if (tbp[IFLA_IFNAME]) 379 nla_strlcpy(ifname, tbp[IFLA_IFNAME], IFNAMSIZ); 380 else 381 snprintf(ifname, IFNAMSIZ, DRV_NAME "%%d"); 382 | 352 353 /* 354 * create and register peer first 355 * 356 * struct ifinfomsg is at the head of VETH_INFO_PEER, but we 357 * skip it since no info from it is useful yet 358 */ 359 --- 16 unchanged lines hidden (view full) --- 376 } else 377 tbp = tb; 378 379 if (tbp[IFLA_IFNAME]) 380 nla_strlcpy(ifname, tbp[IFLA_IFNAME], IFNAMSIZ); 381 else 382 snprintf(ifname, IFNAMSIZ, DRV_NAME "%%d"); 383 |
383 peer = rtnl_create_link(dev_net(dev), ifname, &veth_link_ops, tbp); 384 if (IS_ERR(peer)) | 384 net = rtnl_link_get_net(src_net, tbp); 385 if (IS_ERR(net)) 386 return PTR_ERR(net); 387 388 peer = rtnl_create_link(src_net, net, ifname, &veth_link_ops, tbp); 389 if (IS_ERR(peer)) { 390 put_net(net); |
385 return PTR_ERR(peer); | 391 return PTR_ERR(peer); |
392 } |
|
386 387 if (tbp[IFLA_ADDRESS] == NULL) 388 random_ether_addr(peer->dev_addr); 389 390 err = register_netdevice(peer); | 393 394 if (tbp[IFLA_ADDRESS] == NULL) 395 random_ether_addr(peer->dev_addr); 396 397 err = register_netdevice(peer); |
398 put_net(net); 399 net = NULL; |
|
391 if (err < 0) 392 goto err_register_peer; 393 394 netif_carrier_off(peer); 395 396 /* 397 * register dev last 398 * --- 91 unchanged lines hidden --- | 400 if (err < 0) 401 goto err_register_peer; 402 403 netif_carrier_off(peer); 404 405 /* 406 * register dev last 407 * --- 91 unchanged lines hidden --- |