rtnetlink.c (7a56493f0620cc1b4cffc9bc59289fdefe76b5f3) | rtnetlink.c (ab92d68fc22f9afab480153bd82a20f6e2533769) |
---|---|
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 * --- 966 unchanged lines hidden (view full) --- 975 size_t xdp_size = nla_total_size(0) + /* nest IFLA_XDP */ 976 nla_total_size(1) + /* XDP_ATTACHED */ 977 nla_total_size(4) + /* XDP_PROG_ID (or 1st mode) */ 978 nla_total_size(4); /* XDP_<mode>_PROG_ID */ 979 980 return xdp_size; 981} 982 | 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 * --- 966 unchanged lines hidden (view full) --- 975 size_t xdp_size = nla_total_size(0) + /* nest IFLA_XDP */ 976 nla_total_size(1) + /* XDP_ATTACHED */ 977 nla_total_size(4) + /* XDP_PROG_ID (or 1st mode) */ 978 nla_total_size(4); /* XDP_<mode>_PROG_ID */ 979 980 return xdp_size; 981} 982 |
983static size_t rtnl_prop_list_size(const struct net_device *dev) 984{ 985 struct netdev_name_node *name_node; 986 size_t size; 987 988 if (list_empty(&dev->name_node->list)) 989 return 0; 990 size = nla_total_size(0); 991 list_for_each_entry(name_node, &dev->name_node->list, list) 992 size += nla_total_size(ALTIFNAMSIZ); 993 return size; 994} 995 | |
996static noinline size_t if_nlmsg_size(const struct net_device *dev, 997 u32 ext_filter_mask) 998{ 999 return NLMSG_ALIGN(sizeof(struct ifinfomsg)) 1000 + nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */ 1001 + nla_total_size(IFALIASZ) /* IFLA_IFALIAS */ 1002 + nla_total_size(IFNAMSIZ) /* IFLA_QDISC */ 1003 + nla_total_size_64bit(sizeof(struct rtnl_link_ifmap)) --- 31 unchanged lines hidden (view full) --- 1035 + nla_total_size(4) /* IFLA_NEW_NETNSID */ 1036 + nla_total_size(4) /* IFLA_NEW_IFINDEX */ 1037 + nla_total_size(1) /* IFLA_PROTO_DOWN */ 1038 + nla_total_size(4) /* IFLA_TARGET_NETNSID */ 1039 + nla_total_size(4) /* IFLA_CARRIER_UP_COUNT */ 1040 + nla_total_size(4) /* IFLA_CARRIER_DOWN_COUNT */ 1041 + nla_total_size(4) /* IFLA_MIN_MTU */ 1042 + nla_total_size(4) /* IFLA_MAX_MTU */ | 983static noinline size_t if_nlmsg_size(const struct net_device *dev, 984 u32 ext_filter_mask) 985{ 986 return NLMSG_ALIGN(sizeof(struct ifinfomsg)) 987 + nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */ 988 + nla_total_size(IFALIASZ) /* IFLA_IFALIAS */ 989 + nla_total_size(IFNAMSIZ) /* IFLA_QDISC */ 990 + nla_total_size_64bit(sizeof(struct rtnl_link_ifmap)) --- 31 unchanged lines hidden (view full) --- 1022 + nla_total_size(4) /* IFLA_NEW_NETNSID */ 1023 + nla_total_size(4) /* IFLA_NEW_IFINDEX */ 1024 + nla_total_size(1) /* IFLA_PROTO_DOWN */ 1025 + nla_total_size(4) /* IFLA_TARGET_NETNSID */ 1026 + nla_total_size(4) /* IFLA_CARRIER_UP_COUNT */ 1027 + nla_total_size(4) /* IFLA_CARRIER_DOWN_COUNT */ 1028 + nla_total_size(4) /* IFLA_MIN_MTU */ 1029 + nla_total_size(4) /* IFLA_MAX_MTU */ |
1043 + rtnl_prop_list_size(dev) | |
1044 + 0; 1045} 1046 1047static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev) 1048{ 1049 struct nlattr *vf_ports; 1050 struct nlattr *vf_port; 1051 int vf; --- 541 unchanged lines hidden (view full) --- 1593 1594 nla_nest_end(skb, af); 1595 } 1596 1597 nla_nest_end(skb, af_spec); 1598 return 0; 1599} 1600 | 1030 + 0; 1031} 1032 1033static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev) 1034{ 1035 struct nlattr *vf_ports; 1036 struct nlattr *vf_port; 1037 int vf; --- 541 unchanged lines hidden (view full) --- 1579 1580 nla_nest_end(skb, af); 1581 } 1582 1583 nla_nest_end(skb, af_spec); 1584 return 0; 1585} 1586 |
1601static int rtnl_fill_alt_ifnames(struct sk_buff *skb, 1602 const struct net_device *dev) 1603{ 1604 struct netdev_name_node *name_node; 1605 int count = 0; 1606 1607 list_for_each_entry(name_node, &dev->name_node->list, list) { 1608 if (nla_put_string(skb, IFLA_ALT_IFNAME, name_node->name)) 1609 return -EMSGSIZE; 1610 count++; 1611 } 1612 return count; 1613} 1614 1615static int rtnl_fill_prop_list(struct sk_buff *skb, 1616 const struct net_device *dev) 1617{ 1618 struct nlattr *prop_list; 1619 int ret; 1620 1621 prop_list = nla_nest_start(skb, IFLA_PROP_LIST); 1622 if (!prop_list) 1623 return -EMSGSIZE; 1624 1625 ret = rtnl_fill_alt_ifnames(skb, dev); 1626 if (ret <= 0) 1627 goto nest_cancel; 1628 1629 nla_nest_end(skb, prop_list); 1630 return 0; 1631 1632nest_cancel: 1633 nla_nest_cancel(skb, prop_list); 1634 return ret; 1635} 1636 | |
1637static int rtnl_fill_ifinfo(struct sk_buff *skb, 1638 struct net_device *dev, struct net *src_net, 1639 int type, u32 pid, u32 seq, u32 change, 1640 unsigned int flags, u32 ext_filter_mask, 1641 u32 event, int *new_nsid, int new_ifindex, 1642 int tgt_netnsid) 1643{ 1644 struct ifinfomsg *ifm; --- 97 unchanged lines hidden (view full) --- 1742 goto nla_put_failure; 1743 1744 1745 rcu_read_lock(); 1746 if (rtnl_fill_link_af(skb, dev, ext_filter_mask)) 1747 goto nla_put_failure_rcu; 1748 rcu_read_unlock(); 1749 | 1587static int rtnl_fill_ifinfo(struct sk_buff *skb, 1588 struct net_device *dev, struct net *src_net, 1589 int type, u32 pid, u32 seq, u32 change, 1590 unsigned int flags, u32 ext_filter_mask, 1591 u32 event, int *new_nsid, int new_ifindex, 1592 int tgt_netnsid) 1593{ 1594 struct ifinfomsg *ifm; --- 97 unchanged lines hidden (view full) --- 1692 goto nla_put_failure; 1693 1694 1695 rcu_read_lock(); 1696 if (rtnl_fill_link_af(skb, dev, ext_filter_mask)) 1697 goto nla_put_failure_rcu; 1698 rcu_read_unlock(); 1699 |
1750 if (rtnl_fill_prop_list(skb, dev)) 1751 goto nla_put_failure; 1752 | |
1753 nlmsg_end(skb, nlh); 1754 return 0; 1755 1756nla_put_failure_rcu: 1757 rcu_read_unlock(); 1758nla_put_failure: 1759 nlmsg_cancel(skb, nlh); 1760 return -EMSGSIZE; --- 37 unchanged lines hidden (view full) --- 1798 [IFLA_XDP] = { .type = NLA_NESTED }, 1799 [IFLA_EVENT] = { .type = NLA_U32 }, 1800 [IFLA_GROUP] = { .type = NLA_U32 }, 1801 [IFLA_TARGET_NETNSID] = { .type = NLA_S32 }, 1802 [IFLA_CARRIER_UP_COUNT] = { .type = NLA_U32 }, 1803 [IFLA_CARRIER_DOWN_COUNT] = { .type = NLA_U32 }, 1804 [IFLA_MIN_MTU] = { .type = NLA_U32 }, 1805 [IFLA_MAX_MTU] = { .type = NLA_U32 }, | 1700 nlmsg_end(skb, nlh); 1701 return 0; 1702 1703nla_put_failure_rcu: 1704 rcu_read_unlock(); 1705nla_put_failure: 1706 nlmsg_cancel(skb, nlh); 1707 return -EMSGSIZE; --- 37 unchanged lines hidden (view full) --- 1745 [IFLA_XDP] = { .type = NLA_NESTED }, 1746 [IFLA_EVENT] = { .type = NLA_U32 }, 1747 [IFLA_GROUP] = { .type = NLA_U32 }, 1748 [IFLA_TARGET_NETNSID] = { .type = NLA_S32 }, 1749 [IFLA_CARRIER_UP_COUNT] = { .type = NLA_U32 }, 1750 [IFLA_CARRIER_DOWN_COUNT] = { .type = NLA_U32 }, 1751 [IFLA_MIN_MTU] = { .type = NLA_U32 }, 1752 [IFLA_MAX_MTU] = { .type = NLA_U32 }, |
1806 [IFLA_PROP_LIST] = { .type = NLA_NESTED }, 1807 [IFLA_ALT_IFNAME] = { .type = NLA_STRING, 1808 .len = ALTIFNAMSIZ - 1 }, | |
1809}; 1810 1811static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { 1812 [IFLA_INFO_KIND] = { .type = NLA_STRING }, 1813 [IFLA_INFO_DATA] = { .type = NLA_NESTED }, 1814 [IFLA_INFO_SLAVE_KIND] = { .type = NLA_STRING }, 1815 [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED }, 1816}; --- 589 unchanged lines hidden (view full) --- 2406 if (upper_dev) { 2407 if (upper_dev->ifindex == ifindex) 2408 return 0; 2409 ops = upper_dev->netdev_ops; 2410 if (ops->ndo_del_slave) { 2411 err = ops->ndo_del_slave(upper_dev, dev); 2412 if (err) 2413 return err; | 1753}; 1754 1755static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { 1756 [IFLA_INFO_KIND] = { .type = NLA_STRING }, 1757 [IFLA_INFO_DATA] = { .type = NLA_NESTED }, 1758 [IFLA_INFO_SLAVE_KIND] = { .type = NLA_STRING }, 1759 [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED }, 1760}; --- 589 unchanged lines hidden (view full) --- 2350 if (upper_dev) { 2351 if (upper_dev->ifindex == ifindex) 2352 return 0; 2353 ops = upper_dev->netdev_ops; 2354 if (ops->ndo_del_slave) { 2355 err = ops->ndo_del_slave(upper_dev, dev); 2356 if (err) 2357 return err; |
2358 netdev_update_lockdep_key(dev); |
|
2414 } else { 2415 return -EOPNOTSUPP; 2416 } 2417 } 2418 2419 if (ifindex) { 2420 upper_dev = __dev_get_by_index(dev_net(dev), ifindex); 2421 if (!upper_dev) --- 351 unchanged lines hidden (view full) --- 2773 if (err < 0) 2774 net_warn_ratelimited("A link change request failed with some changes committed already. Interface %s may have been left with an inconsistent configuration, please check.\n", 2775 dev->name); 2776 } 2777 2778 return err; 2779} 2780 | 2359 } else { 2360 return -EOPNOTSUPP; 2361 } 2362 } 2363 2364 if (ifindex) { 2365 upper_dev = __dev_get_by_index(dev_net(dev), ifindex); 2366 if (!upper_dev) --- 351 unchanged lines hidden (view full) --- 2718 if (err < 0) 2719 net_warn_ratelimited("A link change request failed with some changes committed already. Interface %s may have been left with an inconsistent configuration, please check.\n", 2720 dev->name); 2721 } 2722 2723 return err; 2724} 2725 |
2781static struct net_device *rtnl_dev_get(struct net *net, 2782 struct nlattr *ifname_attr, 2783 struct nlattr *altifname_attr, 2784 char *ifname) 2785{ 2786 char buffer[ALTIFNAMSIZ]; 2787 2788 if (!ifname) { 2789 ifname = buffer; 2790 if (ifname_attr) 2791 nla_strlcpy(ifname, ifname_attr, IFNAMSIZ); 2792 else if (altifname_attr) 2793 nla_strlcpy(ifname, altifname_attr, ALTIFNAMSIZ); 2794 else 2795 return NULL; 2796 } 2797 2798 return __dev_get_by_name(net, ifname); 2799} 2800 | |
2801static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, 2802 struct netlink_ext_ack *extack) 2803{ 2804 struct net *net = sock_net(skb->sk); 2805 struct ifinfomsg *ifm; 2806 struct net_device *dev; 2807 int err; 2808 struct nlattr *tb[IFLA_MAX+1]; --- 12 unchanged lines hidden (view full) --- 2821 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 2822 else 2823 ifname[0] = '\0'; 2824 2825 err = -EINVAL; 2826 ifm = nlmsg_data(nlh); 2827 if (ifm->ifi_index > 0) 2828 dev = __dev_get_by_index(net, ifm->ifi_index); | 2726static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, 2727 struct netlink_ext_ack *extack) 2728{ 2729 struct net *net = sock_net(skb->sk); 2730 struct ifinfomsg *ifm; 2731 struct net_device *dev; 2732 int err; 2733 struct nlattr *tb[IFLA_MAX+1]; --- 12 unchanged lines hidden (view full) --- 2746 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 2747 else 2748 ifname[0] = '\0'; 2749 2750 err = -EINVAL; 2751 ifm = nlmsg_data(nlh); 2752 if (ifm->ifi_index > 0) 2753 dev = __dev_get_by_index(net, ifm->ifi_index); |
2829 else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME]) 2830 dev = rtnl_dev_get(net, NULL, tb[IFLA_ALT_IFNAME], ifname); | 2754 else if (tb[IFLA_IFNAME]) 2755 dev = __dev_get_by_name(net, ifname); |
2831 else 2832 goto errout; 2833 2834 if (dev == NULL) { 2835 err = -ENODEV; 2836 goto errout; 2837 } 2838 --- 56 unchanged lines hidden (view full) --- 2895 2896static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh, 2897 struct netlink_ext_ack *extack) 2898{ 2899 struct net *net = sock_net(skb->sk); 2900 struct net *tgt_net = net; 2901 struct net_device *dev = NULL; 2902 struct ifinfomsg *ifm; | 2756 else 2757 goto errout; 2758 2759 if (dev == NULL) { 2760 err = -ENODEV; 2761 goto errout; 2762 } 2763 --- 56 unchanged lines hidden (view full) --- 2820 2821static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh, 2822 struct netlink_ext_ack *extack) 2823{ 2824 struct net *net = sock_net(skb->sk); 2825 struct net *tgt_net = net; 2826 struct net_device *dev = NULL; 2827 struct ifinfomsg *ifm; |
2828 char ifname[IFNAMSIZ]; |
|
2903 struct nlattr *tb[IFLA_MAX+1]; 2904 int err; 2905 int netnsid = -1; 2906 2907 err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFLA_MAX, 2908 ifla_policy, extack); 2909 if (err < 0) 2910 return err; 2911 2912 err = rtnl_ensure_unique_netns(tb, extack, true); 2913 if (err < 0) 2914 return err; 2915 | 2829 struct nlattr *tb[IFLA_MAX+1]; 2830 int err; 2831 int netnsid = -1; 2832 2833 err = nlmsg_parse_deprecated(nlh, sizeof(*ifm), tb, IFLA_MAX, 2834 ifla_policy, extack); 2835 if (err < 0) 2836 return err; 2837 2838 err = rtnl_ensure_unique_netns(tb, extack, true); 2839 if (err < 0) 2840 return err; 2841 |
2842 if (tb[IFLA_IFNAME]) 2843 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 2844 |
|
2916 if (tb[IFLA_TARGET_NETNSID]) { 2917 netnsid = nla_get_s32(tb[IFLA_TARGET_NETNSID]); 2918 tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid); 2919 if (IS_ERR(tgt_net)) 2920 return PTR_ERR(tgt_net); 2921 } 2922 2923 err = -EINVAL; 2924 ifm = nlmsg_data(nlh); 2925 if (ifm->ifi_index > 0) 2926 dev = __dev_get_by_index(tgt_net, ifm->ifi_index); | 2845 if (tb[IFLA_TARGET_NETNSID]) { 2846 netnsid = nla_get_s32(tb[IFLA_TARGET_NETNSID]); 2847 tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid); 2848 if (IS_ERR(tgt_net)) 2849 return PTR_ERR(tgt_net); 2850 } 2851 2852 err = -EINVAL; 2853 ifm = nlmsg_data(nlh); 2854 if (ifm->ifi_index > 0) 2855 dev = __dev_get_by_index(tgt_net, ifm->ifi_index); |
2927 else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME]) 2928 dev = rtnl_dev_get(net, tb[IFLA_IFNAME], 2929 tb[IFLA_ALT_IFNAME], NULL); | 2856 else if (tb[IFLA_IFNAME]) 2857 dev = __dev_get_by_name(tgt_net, ifname); |
2930 else if (tb[IFLA_GROUP]) 2931 err = rtnl_group_dellink(tgt_net, nla_get_u32(tb[IFLA_GROUP])); 2932 else 2933 goto out; 2934 2935 if (!dev) { 2936 if (tb[IFLA_IFNAME] || ifm->ifi_index > 0) 2937 err = -ENODEV; --- 154 unchanged lines hidden (view full) --- 3092 if (tb[IFLA_IFNAME]) 3093 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 3094 else 3095 ifname[0] = '\0'; 3096 3097 ifm = nlmsg_data(nlh); 3098 if (ifm->ifi_index > 0) 3099 dev = __dev_get_by_index(net, ifm->ifi_index); | 2858 else if (tb[IFLA_GROUP]) 2859 err = rtnl_group_dellink(tgt_net, nla_get_u32(tb[IFLA_GROUP])); 2860 else 2861 goto out; 2862 2863 if (!dev) { 2864 if (tb[IFLA_IFNAME] || ifm->ifi_index > 0) 2865 err = -ENODEV; --- 154 unchanged lines hidden (view full) --- 3020 if (tb[IFLA_IFNAME]) 3021 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 3022 else 3023 ifname[0] = '\0'; 3024 3025 ifm = nlmsg_data(nlh); 3026 if (ifm->ifi_index > 0) 3027 dev = __dev_get_by_index(net, ifm->ifi_index); |
3100 else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME]) 3101 dev = rtnl_dev_get(net, NULL, tb[IFLA_ALT_IFNAME], ifname); 3102 else 3103 dev = NULL; | 3028 else { 3029 if (ifname[0]) 3030 dev = __dev_get_by_name(net, ifname); 3031 else 3032 dev = NULL; 3033 } |
3104 3105 if (dev) { 3106 master_dev = netdev_master_upper_dev_get(dev); 3107 if (master_dev) 3108 m_ops = master_dev->rtnl_link_ops; 3109 } 3110 3111 err = validate_linkmsg(dev, tb); --- 245 unchanged lines hidden (view full) --- 3357 return err; 3358 3359 for (i = 0; i <= IFLA_MAX; i++) { 3360 if (!tb[i]) 3361 continue; 3362 3363 switch (i) { 3364 case IFLA_IFNAME: | 3034 3035 if (dev) { 3036 master_dev = netdev_master_upper_dev_get(dev); 3037 if (master_dev) 3038 m_ops = master_dev->rtnl_link_ops; 3039 } 3040 3041 err = validate_linkmsg(dev, tb); --- 245 unchanged lines hidden (view full) --- 3287 return err; 3288 3289 for (i = 0; i <= IFLA_MAX; i++) { 3290 if (!tb[i]) 3291 continue; 3292 3293 switch (i) { 3294 case IFLA_IFNAME: |
3365 case IFLA_ALT_IFNAME: | |
3366 case IFLA_EXT_MASK: 3367 case IFLA_TARGET_NETNSID: 3368 break; 3369 default: 3370 NL_SET_ERR_MSG(extack, "Unsupported attribute in get link request"); 3371 return -EINVAL; 3372 } 3373 } 3374 3375 return 0; 3376} 3377 3378static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr *nlh, 3379 struct netlink_ext_ack *extack) 3380{ 3381 struct net *net = sock_net(skb->sk); 3382 struct net *tgt_net = net; 3383 struct ifinfomsg *ifm; | 3295 case IFLA_EXT_MASK: 3296 case IFLA_TARGET_NETNSID: 3297 break; 3298 default: 3299 NL_SET_ERR_MSG(extack, "Unsupported attribute in get link request"); 3300 return -EINVAL; 3301 } 3302 } 3303 3304 return 0; 3305} 3306 3307static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr *nlh, 3308 struct netlink_ext_ack *extack) 3309{ 3310 struct net *net = sock_net(skb->sk); 3311 struct net *tgt_net = net; 3312 struct ifinfomsg *ifm; |
3313 char ifname[IFNAMSIZ]; |
|
3384 struct nlattr *tb[IFLA_MAX+1]; 3385 struct net_device *dev = NULL; 3386 struct sk_buff *nskb; 3387 int netnsid = -1; 3388 int err; 3389 u32 ext_filter_mask = 0; 3390 3391 err = rtnl_valid_getlink_req(skb, nlh, tb, extack); --- 6 unchanged lines hidden (view full) --- 3398 3399 if (tb[IFLA_TARGET_NETNSID]) { 3400 netnsid = nla_get_s32(tb[IFLA_TARGET_NETNSID]); 3401 tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid); 3402 if (IS_ERR(tgt_net)) 3403 return PTR_ERR(tgt_net); 3404 } 3405 | 3314 struct nlattr *tb[IFLA_MAX+1]; 3315 struct net_device *dev = NULL; 3316 struct sk_buff *nskb; 3317 int netnsid = -1; 3318 int err; 3319 u32 ext_filter_mask = 0; 3320 3321 err = rtnl_valid_getlink_req(skb, nlh, tb, extack); --- 6 unchanged lines hidden (view full) --- 3328 3329 if (tb[IFLA_TARGET_NETNSID]) { 3330 netnsid = nla_get_s32(tb[IFLA_TARGET_NETNSID]); 3331 tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid); 3332 if (IS_ERR(tgt_net)) 3333 return PTR_ERR(tgt_net); 3334 } 3335 |
3336 if (tb[IFLA_IFNAME]) 3337 nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ); 3338 |
|
3406 if (tb[IFLA_EXT_MASK]) 3407 ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]); 3408 3409 err = -EINVAL; 3410 ifm = nlmsg_data(nlh); 3411 if (ifm->ifi_index > 0) 3412 dev = __dev_get_by_index(tgt_net, ifm->ifi_index); | 3339 if (tb[IFLA_EXT_MASK]) 3340 ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]); 3341 3342 err = -EINVAL; 3343 ifm = nlmsg_data(nlh); 3344 if (ifm->ifi_index > 0) 3345 dev = __dev_get_by_index(tgt_net, ifm->ifi_index); |
3413 else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME]) 3414 dev = rtnl_dev_get(tgt_net, tb[IFLA_IFNAME], 3415 tb[IFLA_ALT_IFNAME], NULL); | 3346 else if (tb[IFLA_IFNAME]) 3347 dev = __dev_get_by_name(tgt_net, ifname); |
3416 else 3417 goto out; 3418 3419 err = -ENODEV; 3420 if (dev == NULL) 3421 goto out; 3422 3423 err = -ENOBUFS; --- 13 unchanged lines hidden (view full) --- 3437 err = rtnl_unicast(nskb, net, NETLINK_CB(skb).portid); 3438out: 3439 if (netnsid >= 0) 3440 put_net(tgt_net); 3441 3442 return err; 3443} 3444 | 3348 else 3349 goto out; 3350 3351 err = -ENODEV; 3352 if (dev == NULL) 3353 goto out; 3354 3355 err = -ENOBUFS; --- 13 unchanged lines hidden (view full) --- 3369 err = rtnl_unicast(nskb, net, NETLINK_CB(skb).portid); 3370out: 3371 if (netnsid >= 0) 3372 put_net(tgt_net); 3373 3374 return err; 3375} 3376 |
3445static int rtnl_alt_ifname(int cmd, struct net_device *dev, struct nlattr *attr, 3446 bool *changed, struct netlink_ext_ack *extack) 3447{ 3448 char *alt_ifname; 3449 int err; 3450 3451 err = nla_validate(attr, attr->nla_len, IFLA_MAX, ifla_policy, extack); 3452 if (err) 3453 return err; 3454 3455 alt_ifname = nla_data(attr); 3456 if (cmd == RTM_NEWLINKPROP) { 3457 alt_ifname = kstrdup(alt_ifname, GFP_KERNEL); 3458 if (!alt_ifname) 3459 return -ENOMEM; 3460 err = netdev_name_node_alt_create(dev, alt_ifname); 3461 if (err) { 3462 kfree(alt_ifname); 3463 return err; 3464 } 3465 } else if (cmd == RTM_DELLINKPROP) { 3466 err = netdev_name_node_alt_destroy(dev, alt_ifname); 3467 if (err) 3468 return err; 3469 } else { 3470 WARN_ON(1); 3471 return 0; 3472 } 3473 3474 *changed = true; 3475 return 0; 3476} 3477 3478static int rtnl_linkprop(int cmd, struct sk_buff *skb, struct nlmsghdr *nlh, 3479 struct netlink_ext_ack *extack) 3480{ 3481 struct net *net = sock_net(skb->sk); 3482 struct nlattr *tb[IFLA_MAX + 1]; 3483 struct net_device *dev; 3484 struct ifinfomsg *ifm; 3485 bool changed = false; 3486 struct nlattr *attr; 3487 int err, rem; 3488 3489 err = nlmsg_parse(nlh, sizeof(*ifm), tb, IFLA_MAX, ifla_policy, extack); 3490 if (err) 3491 return err; 3492 3493 err = rtnl_ensure_unique_netns(tb, extack, true); 3494 if (err) 3495 return err; 3496 3497 ifm = nlmsg_data(nlh); 3498 if (ifm->ifi_index > 0) 3499 dev = __dev_get_by_index(net, ifm->ifi_index); 3500 else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME]) 3501 dev = rtnl_dev_get(net, tb[IFLA_IFNAME], 3502 tb[IFLA_ALT_IFNAME], NULL); 3503 else 3504 return -EINVAL; 3505 3506 if (!dev) 3507 return -ENODEV; 3508 3509 if (!tb[IFLA_PROP_LIST]) 3510 return 0; 3511 3512 nla_for_each_nested(attr, tb[IFLA_PROP_LIST], rem) { 3513 switch (nla_type(attr)) { 3514 case IFLA_ALT_IFNAME: 3515 err = rtnl_alt_ifname(cmd, dev, attr, &changed, extack); 3516 if (err) 3517 return err; 3518 break; 3519 } 3520 } 3521 3522 if (changed) 3523 netdev_state_change(dev); 3524 return 0; 3525} 3526 3527static int rtnl_newlinkprop(struct sk_buff *skb, struct nlmsghdr *nlh, 3528 struct netlink_ext_ack *extack) 3529{ 3530 return rtnl_linkprop(RTM_NEWLINKPROP, skb, nlh, extack); 3531} 3532 3533static int rtnl_dellinkprop(struct sk_buff *skb, struct nlmsghdr *nlh, 3534 struct netlink_ext_ack *extack) 3535{ 3536 return rtnl_linkprop(RTM_DELLINKPROP, skb, nlh, extack); 3537} 3538 | |
3539static u16 rtnl_calcit(struct sk_buff *skb, struct nlmsghdr *nlh) 3540{ 3541 struct net *net = sock_net(skb->sk); 3542 struct net_device *dev; 3543 struct nlattr *tb[IFLA_MAX+1]; 3544 u32 ext_filter_mask = 0; 3545 u16 min_ifinfo_dump_size = 0; 3546 int hdrlen; --- 1942 unchanged lines hidden (view full) --- 5489 rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, 0); 5490 rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL, 0); 5491 rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL, 0); 5492 5493 rtnl_register(PF_UNSPEC, RTM_GETADDR, NULL, rtnl_dump_all, 0); 5494 rtnl_register(PF_UNSPEC, RTM_GETROUTE, NULL, rtnl_dump_all, 0); 5495 rtnl_register(PF_UNSPEC, RTM_GETNETCONF, NULL, rtnl_dump_all, 0); 5496 | 3377static u16 rtnl_calcit(struct sk_buff *skb, struct nlmsghdr *nlh) 3378{ 3379 struct net *net = sock_net(skb->sk); 3380 struct net_device *dev; 3381 struct nlattr *tb[IFLA_MAX+1]; 3382 u32 ext_filter_mask = 0; 3383 u16 min_ifinfo_dump_size = 0; 3384 int hdrlen; --- 1942 unchanged lines hidden (view full) --- 5327 rtnl_register(PF_UNSPEC, RTM_SETLINK, rtnl_setlink, NULL, 0); 5328 rtnl_register(PF_UNSPEC, RTM_NEWLINK, rtnl_newlink, NULL, 0); 5329 rtnl_register(PF_UNSPEC, RTM_DELLINK, rtnl_dellink, NULL, 0); 5330 5331 rtnl_register(PF_UNSPEC, RTM_GETADDR, NULL, rtnl_dump_all, 0); 5332 rtnl_register(PF_UNSPEC, RTM_GETROUTE, NULL, rtnl_dump_all, 0); 5333 rtnl_register(PF_UNSPEC, RTM_GETNETCONF, NULL, rtnl_dump_all, 0); 5334 |
5497 rtnl_register(PF_UNSPEC, RTM_NEWLINKPROP, rtnl_newlinkprop, NULL, 0); 5498 rtnl_register(PF_UNSPEC, RTM_DELLINKPROP, rtnl_dellinkprop, NULL, 0); 5499 | |
5500 rtnl_register(PF_BRIDGE, RTM_NEWNEIGH, rtnl_fdb_add, NULL, 0); 5501 rtnl_register(PF_BRIDGE, RTM_DELNEIGH, rtnl_fdb_del, NULL, 0); 5502 rtnl_register(PF_BRIDGE, RTM_GETNEIGH, rtnl_fdb_get, rtnl_fdb_dump, 0); 5503 5504 rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, rtnl_bridge_getlink, 0); 5505 rtnl_register(PF_BRIDGE, RTM_DELLINK, rtnl_bridge_dellink, NULL, 0); 5506 rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL, 0); 5507 5508 rtnl_register(PF_UNSPEC, RTM_GETSTATS, rtnl_stats_get, rtnl_stats_dump, 5509 0); 5510} | 5335 rtnl_register(PF_BRIDGE, RTM_NEWNEIGH, rtnl_fdb_add, NULL, 0); 5336 rtnl_register(PF_BRIDGE, RTM_DELNEIGH, rtnl_fdb_del, NULL, 0); 5337 rtnl_register(PF_BRIDGE, RTM_GETNEIGH, rtnl_fdb_get, rtnl_fdb_dump, 0); 5338 5339 rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, rtnl_bridge_getlink, 0); 5340 rtnl_register(PF_BRIDGE, RTM_DELLINK, rtnl_bridge_dellink, NULL, 0); 5341 rtnl_register(PF_BRIDGE, RTM_SETLINK, rtnl_bridge_setlink, NULL, 0); 5342 5343 rtnl_register(PF_UNSPEC, RTM_GETSTATS, rtnl_stats_get, rtnl_stats_dump, 5344 0); 5345} |