rtnetlink.c (63105e83987a08f73accfba78602a073bf219b69) | rtnetlink.c (02839cc8d72b49c1440b5019b3f40ca49c4824e5) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * INET An implementation of the TCP/IP protocol suite for the LINUX 4 * operating system. INET is implemented using the BSD Socket 5 * interface as the means of communication with the user level. 6 * 7 * Routing netlink socket interface: protocol independent part. 8 * --- 3291 unchanged lines hidden (view full) --- 3300 } 3301 3302 return 0; 3303} 3304 3305static int rtnl_newlink_create(struct sk_buff *skb, struct ifinfomsg *ifm, 3306 const struct rtnl_link_ops *ops, 3307 struct nlattr **tb, struct nlattr **data, | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * INET An implementation of the TCP/IP protocol suite for the LINUX 4 * operating system. INET is implemented using the BSD Socket 5 * interface as the means of communication with the user level. 6 * 7 * Routing netlink socket interface: protocol independent part. 8 * --- 3291 unchanged lines hidden (view full) --- 3300 } 3301 3302 return 0; 3303} 3304 3305static int rtnl_newlink_create(struct sk_buff *skb, struct ifinfomsg *ifm, 3306 const struct rtnl_link_ops *ops, 3307 struct nlattr **tb, struct nlattr **data, |
3308 struct netlink_ext_ack *extack); | 3308 struct netlink_ext_ack *extack) 3309{ 3310 unsigned char name_assign_type = NET_NAME_USER; 3311 struct net *net = sock_net(skb->sk); 3312 struct net *dest_net, *link_net; 3313 struct net_device *dev; 3314 char ifname[IFNAMSIZ]; 3315 int err; |
3309 | 3316 |
3317 if (!ops->alloc && !ops->setup) 3318 return -EOPNOTSUPP; 3319 3320 if (tb[IFLA_IFNAME]) { 3321 nla_strscpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 3322 } else { 3323 snprintf(ifname, IFNAMSIZ, "%s%%d", ops->kind); 3324 name_assign_type = NET_NAME_ENUM; 3325 } 3326 3327 dest_net = rtnl_link_get_net_capable(skb, net, tb, CAP_NET_ADMIN); 3328 if (IS_ERR(dest_net)) 3329 return PTR_ERR(dest_net); 3330 3331 if (tb[IFLA_LINK_NETNSID]) { 3332 int id = nla_get_s32(tb[IFLA_LINK_NETNSID]); 3333 3334 link_net = get_net_ns_by_id(dest_net, id); 3335 if (!link_net) { 3336 NL_SET_ERR_MSG(extack, "Unknown network namespace id"); 3337 err = -EINVAL; 3338 goto out; 3339 } 3340 err = -EPERM; 3341 if (!netlink_ns_capable(skb, link_net->user_ns, CAP_NET_ADMIN)) 3342 goto out; 3343 } else { 3344 link_net = NULL; 3345 } 3346 3347 dev = rtnl_create_link(link_net ? : dest_net, ifname, 3348 name_assign_type, ops, tb, extack); 3349 if (IS_ERR(dev)) { 3350 err = PTR_ERR(dev); 3351 goto out; 3352 } 3353 3354 dev->ifindex = ifm->ifi_index; 3355 3356 if (ops->newlink) 3357 err = ops->newlink(link_net ? : net, dev, tb, data, extack); 3358 else 3359 err = register_netdevice(dev); 3360 if (err < 0) { 3361 free_netdev(dev); 3362 goto out; 3363 } 3364 3365 err = rtnl_configure_link(dev, ifm); 3366 if (err < 0) 3367 goto out_unregister; 3368 if (link_net) { 3369 err = dev_change_net_namespace(dev, dest_net, ifname); 3370 if (err < 0) 3371 goto out_unregister; 3372 } 3373 if (tb[IFLA_MASTER]) { 3374 err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]), extack); 3375 if (err) 3376 goto out_unregister; 3377 } 3378out: 3379 if (link_net) 3380 put_net(link_net); 3381 put_net(dest_net); 3382 return err; 3383out_unregister: 3384 if (ops->newlink) { 3385 LIST_HEAD(list_kill); 3386 3387 ops->dellink(dev, &list_kill); 3388 unregister_netdevice_many(&list_kill); 3389 } else { 3390 unregister_netdevice(dev); 3391 } 3392 goto out; 3393} 3394 |
|
3310struct rtnl_newlink_tbs { 3311 struct nlattr *tb[IFLA_MAX + 1]; 3312 struct nlattr *attr[RTNL_MAX_TYPE + 1]; 3313 struct nlattr *slave_attr[RTNL_SLAVE_MAX_TYPE + 1]; 3314}; 3315 3316static int __rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, 3317 struct rtnl_newlink_tbs *tbs, --- 166 unchanged lines hidden (view full) --- 3484#endif 3485 NL_SET_ERR_MSG(extack, "Unknown device type"); 3486 return -EOPNOTSUPP; 3487 } 3488 3489 return rtnl_newlink_create(skb, ifm, ops, tb, data, extack); 3490} 3491 | 3395struct rtnl_newlink_tbs { 3396 struct nlattr *tb[IFLA_MAX + 1]; 3397 struct nlattr *attr[RTNL_MAX_TYPE + 1]; 3398 struct nlattr *slave_attr[RTNL_SLAVE_MAX_TYPE + 1]; 3399}; 3400 3401static int __rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, 3402 struct rtnl_newlink_tbs *tbs, --- 166 unchanged lines hidden (view full) --- 3569#endif 3570 NL_SET_ERR_MSG(extack, "Unknown device type"); 3571 return -EOPNOTSUPP; 3572 } 3573 3574 return rtnl_newlink_create(skb, ifm, ops, tb, data, extack); 3575} 3576 |
3492static int rtnl_newlink_create(struct sk_buff *skb, struct ifinfomsg *ifm, 3493 const struct rtnl_link_ops *ops, 3494 struct nlattr **tb, struct nlattr **data, 3495 struct netlink_ext_ack *extack) 3496{ 3497 unsigned char name_assign_type = NET_NAME_USER; 3498 struct net *net = sock_net(skb->sk); 3499 struct net *dest_net, *link_net; 3500 struct net_device *dev; 3501 char ifname[IFNAMSIZ]; 3502 int err; 3503 3504 if (!ops->alloc && !ops->setup) 3505 return -EOPNOTSUPP; 3506 3507 if (tb[IFLA_IFNAME]) { 3508 nla_strscpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 3509 } else { 3510 snprintf(ifname, IFNAMSIZ, "%s%%d", ops->kind); 3511 name_assign_type = NET_NAME_ENUM; 3512 } 3513 3514 dest_net = rtnl_link_get_net_capable(skb, net, tb, CAP_NET_ADMIN); 3515 if (IS_ERR(dest_net)) 3516 return PTR_ERR(dest_net); 3517 3518 if (tb[IFLA_LINK_NETNSID]) { 3519 int id = nla_get_s32(tb[IFLA_LINK_NETNSID]); 3520 3521 link_net = get_net_ns_by_id(dest_net, id); 3522 if (!link_net) { 3523 NL_SET_ERR_MSG(extack, "Unknown network namespace id"); 3524 err = -EINVAL; 3525 goto out; 3526 } 3527 err = -EPERM; 3528 if (!netlink_ns_capable(skb, link_net->user_ns, CAP_NET_ADMIN)) 3529 goto out; 3530 } else { 3531 link_net = NULL; 3532 } 3533 3534 dev = rtnl_create_link(link_net ? : dest_net, ifname, 3535 name_assign_type, ops, tb, extack); 3536 if (IS_ERR(dev)) { 3537 err = PTR_ERR(dev); 3538 goto out; 3539 } 3540 3541 dev->ifindex = ifm->ifi_index; 3542 3543 if (ops->newlink) 3544 err = ops->newlink(link_net ? : net, dev, tb, data, extack); 3545 else 3546 err = register_netdevice(dev); 3547 if (err < 0) { 3548 free_netdev(dev); 3549 goto out; 3550 } 3551 3552 err = rtnl_configure_link(dev, ifm); 3553 if (err < 0) 3554 goto out_unregister; 3555 if (link_net) { 3556 err = dev_change_net_namespace(dev, dest_net, ifname); 3557 if (err < 0) 3558 goto out_unregister; 3559 } 3560 if (tb[IFLA_MASTER]) { 3561 err = do_set_master(dev, nla_get_u32(tb[IFLA_MASTER]), extack); 3562 if (err) 3563 goto out_unregister; 3564 } 3565out: 3566 if (link_net) 3567 put_net(link_net); 3568 put_net(dest_net); 3569 return err; 3570out_unregister: 3571 if (ops->newlink) { 3572 LIST_HEAD(list_kill); 3573 3574 ops->dellink(dev, &list_kill); 3575 unregister_netdevice_many(&list_kill); 3576 } else { 3577 unregister_netdevice(dev); 3578 } 3579 goto out; 3580} 3581 | |
3582static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, 3583 struct netlink_ext_ack *extack) 3584{ 3585 struct rtnl_newlink_tbs *tbs; 3586 int ret; 3587 3588 tbs = kmalloc(sizeof(*tbs), GFP_KERNEL); 3589 if (!tbs) --- 2625 unchanged lines hidden --- | 3577static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, 3578 struct netlink_ext_ack *extack) 3579{ 3580 struct rtnl_newlink_tbs *tbs; 3581 int ret; 3582 3583 tbs = kmalloc(sizeof(*tbs), GFP_KERNEL); 3584 if (!tbs) --- 2625 unchanged lines hidden --- |