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}