rtnetlink.c (34aa83c2fc23e055968387c8b78ac8bafd735aff) rtnetlink.c (3d3ea5af5c0b382bc9d9aed378fd814fb5d4a011)
1/*
2 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
5 *
6 * Routing netlink socket interface: protocol independent part.
7 *
8 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>

--- 927 unchanged lines hidden (view full) ---

936 + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */
937 + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */
938 + rtnl_link_get_size(dev) /* IFLA_LINKINFO */
939 + rtnl_link_get_af_size(dev, ext_filter_mask) /* IFLA_AF_SPEC */
940 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */
941 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */
942 + nla_total_size(IFNAMSIZ) /* IFLA_PHYS_PORT_NAME */
943 + rtnl_xdp_size() /* IFLA_XDP */
1/*
2 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
5 *
6 * Routing netlink socket interface: protocol independent part.
7 *
8 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>

--- 927 unchanged lines hidden (view full) ---

936 + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */
937 + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */
938 + rtnl_link_get_size(dev) /* IFLA_LINKINFO */
939 + rtnl_link_get_af_size(dev, ext_filter_mask) /* IFLA_AF_SPEC */
940 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */
941 + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */
942 + nla_total_size(IFNAMSIZ) /* IFLA_PHYS_PORT_NAME */
943 + rtnl_xdp_size() /* IFLA_XDP */
944 + nla_total_size(4) /* IFLA_EVENT */
944 + nla_total_size(1); /* IFLA_PROTO_DOWN */
945
946}
947
948static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev)
949{
950 struct nlattr *vf_ports;
951 struct nlattr *vf_port;

--- 325 unchanged lines hidden (view full) ---

1277 nla_nest_end(skb, xdp);
1278 return 0;
1279
1280err_cancel:
1281 nla_nest_cancel(skb, xdp);
1282 return err;
1283}
1284
945 + nla_total_size(1); /* IFLA_PROTO_DOWN */
946
947}
948
949static int rtnl_vf_ports_fill(struct sk_buff *skb, struct net_device *dev)
950{
951 struct nlattr *vf_ports;
952 struct nlattr *vf_port;

--- 325 unchanged lines hidden (view full) ---

1278 nla_nest_end(skb, xdp);
1279 return 0;
1280
1281err_cancel:
1282 nla_nest_cancel(skb, xdp);
1283 return err;
1284}
1285
1286static u32 rtnl_get_event(unsigned long event)
1287{
1288 u32 rtnl_event_type = IFLA_EVENT_NONE;
1289
1290 switch (event) {
1291 case NETDEV_REBOOT:
1292 rtnl_event_type = IFLA_EVENT_REBOOT;
1293 break;
1294 case NETDEV_FEAT_CHANGE:
1295 rtnl_event_type = IFLA_EVENT_FEATURES;
1296 break;
1297 case NETDEV_BONDING_FAILOVER:
1298 rtnl_event_type = IFLA_EVENT_BONDING_FAILOVER;
1299 break;
1300 case NETDEV_NOTIFY_PEERS:
1301 rtnl_event_type = IFLA_EVENT_NOTIFY_PEERS;
1302 break;
1303 case NETDEV_RESEND_IGMP:
1304 rtnl_event_type = IFLA_EVENT_IGMP_RESEND;
1305 break;
1306 case NETDEV_CHANGEINFODATA:
1307 rtnl_event_type = IFLA_EVENT_BONDING_OPTIONS;
1308 break;
1309 default:
1310 break;
1311 }
1312
1313 return rtnl_event_type;
1314}
1315
1285static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
1286 int type, u32 pid, u32 seq, u32 change,
1316static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
1317 int type, u32 pid, u32 seq, u32 change,
1287 unsigned int flags, u32 ext_filter_mask)
1318 unsigned int flags, u32 ext_filter_mask,
1319 u32 event)
1288{
1289 struct ifinfomsg *ifm;
1290 struct nlmsghdr *nlh;
1291 struct nlattr *af_spec;
1292 struct rtnl_af_ops *af_ops;
1293 struct net_device *upper_dev = netdev_master_upper_dev_get(dev);
1294
1295 ASSERT_RTNL();

--- 32 unchanged lines hidden (view full) ---

1328 nla_put_string(skb, IFLA_QDISC, dev->qdisc->ops->id)) ||
1329 (dev->ifalias &&
1330 nla_put_string(skb, IFLA_IFALIAS, dev->ifalias)) ||
1331 nla_put_u32(skb, IFLA_CARRIER_CHANGES,
1332 atomic_read(&dev->carrier_changes)) ||
1333 nla_put_u8(skb, IFLA_PROTO_DOWN, dev->proto_down))
1334 goto nla_put_failure;
1335
1320{
1321 struct ifinfomsg *ifm;
1322 struct nlmsghdr *nlh;
1323 struct nlattr *af_spec;
1324 struct rtnl_af_ops *af_ops;
1325 struct net_device *upper_dev = netdev_master_upper_dev_get(dev);
1326
1327 ASSERT_RTNL();

--- 32 unchanged lines hidden (view full) ---

1360 nla_put_string(skb, IFLA_QDISC, dev->qdisc->ops->id)) ||
1361 (dev->ifalias &&
1362 nla_put_string(skb, IFLA_IFALIAS, dev->ifalias)) ||
1363 nla_put_u32(skb, IFLA_CARRIER_CHANGES,
1364 atomic_read(&dev->carrier_changes)) ||
1365 nla_put_u8(skb, IFLA_PROTO_DOWN, dev->proto_down))
1366 goto nla_put_failure;
1367
1368 if (event != IFLA_EVENT_NONE) {
1369 if (nla_put_u32(skb, IFLA_EVENT, event))
1370 goto nla_put_failure;
1371 }
1372
1336 if (rtnl_fill_link_ifmap(skb, dev))
1337 goto nla_put_failure;
1338
1339 if (dev->addr_len) {
1340 if (nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr) ||
1341 nla_put(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast))
1342 goto nla_put_failure;
1343 }

--- 118 unchanged lines hidden (view full) ---

1462 [IFLA_NUM_TX_QUEUES] = { .type = NLA_U32 },
1463 [IFLA_NUM_RX_QUEUES] = { .type = NLA_U32 },
1464 [IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN },
1465 [IFLA_CARRIER_CHANGES] = { .type = NLA_U32 }, /* ignored */
1466 [IFLA_PHYS_SWITCH_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN },
1467 [IFLA_LINK_NETNSID] = { .type = NLA_S32 },
1468 [IFLA_PROTO_DOWN] = { .type = NLA_U8 },
1469 [IFLA_XDP] = { .type = NLA_NESTED },
1373 if (rtnl_fill_link_ifmap(skb, dev))
1374 goto nla_put_failure;
1375
1376 if (dev->addr_len) {
1377 if (nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr) ||
1378 nla_put(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast))
1379 goto nla_put_failure;
1380 }

--- 118 unchanged lines hidden (view full) ---

1499 [IFLA_NUM_TX_QUEUES] = { .type = NLA_U32 },
1500 [IFLA_NUM_RX_QUEUES] = { .type = NLA_U32 },
1501 [IFLA_PHYS_PORT_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN },
1502 [IFLA_CARRIER_CHANGES] = { .type = NLA_U32 }, /* ignored */
1503 [IFLA_PHYS_SWITCH_ID] = { .type = NLA_BINARY, .len = MAX_PHYS_ITEM_ID_LEN },
1504 [IFLA_LINK_NETNSID] = { .type = NLA_S32 },
1505 [IFLA_PROTO_DOWN] = { .type = NLA_U8 },
1506 [IFLA_XDP] = { .type = NLA_NESTED },
1507 [IFLA_EVENT] = { .type = NLA_U32 },
1470};
1471
1472static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = {
1473 [IFLA_INFO_KIND] = { .type = NLA_STRING },
1474 [IFLA_INFO_DATA] = { .type = NLA_NESTED },
1475 [IFLA_INFO_SLAVE_KIND] = { .type = NLA_STRING },
1476 [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED },
1477};

--- 143 unchanged lines hidden (view full) ---

1621 if (link_dump_filtered(dev, master_idx, kind_ops))
1622 goto cont;
1623 if (idx < s_idx)
1624 goto cont;
1625 err = rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK,
1626 NETLINK_CB(cb->skb).portid,
1627 cb->nlh->nlmsg_seq, 0,
1628 flags,
1508};
1509
1510static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = {
1511 [IFLA_INFO_KIND] = { .type = NLA_STRING },
1512 [IFLA_INFO_DATA] = { .type = NLA_NESTED },
1513 [IFLA_INFO_SLAVE_KIND] = { .type = NLA_STRING },
1514 [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED },
1515};

--- 143 unchanged lines hidden (view full) ---

1659 if (link_dump_filtered(dev, master_idx, kind_ops))
1660 goto cont;
1661 if (idx < s_idx)
1662 goto cont;
1663 err = rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK,
1664 NETLINK_CB(cb->skb).portid,
1665 cb->nlh->nlmsg_seq, 0,
1666 flags,
1629 ext_filter_mask);
1667 ext_filter_mask, 0);
1630
1631 if (err < 0) {
1632 if (likely(skb->len))
1633 goto out;
1634
1635 goto out_err;
1636 }
1637

--- 1093 unchanged lines hidden (view full) ---

2731 if (dev == NULL)
2732 return -ENODEV;
2733
2734 nskb = nlmsg_new(if_nlmsg_size(dev, ext_filter_mask), GFP_KERNEL);
2735 if (nskb == NULL)
2736 return -ENOBUFS;
2737
2738 err = rtnl_fill_ifinfo(nskb, dev, RTM_NEWLINK, NETLINK_CB(skb).portid,
1668
1669 if (err < 0) {
1670 if (likely(skb->len))
1671 goto out;
1672
1673 goto out_err;
1674 }
1675

--- 1093 unchanged lines hidden (view full) ---

2769 if (dev == NULL)
2770 return -ENODEV;
2771
2772 nskb = nlmsg_new(if_nlmsg_size(dev, ext_filter_mask), GFP_KERNEL);
2773 if (nskb == NULL)
2774 return -ENOBUFS;
2775
2776 err = rtnl_fill_ifinfo(nskb, dev, RTM_NEWLINK, NETLINK_CB(skb).portid,
2739 nlh->nlmsg_seq, 0, 0, ext_filter_mask);
2777 nlh->nlmsg_seq, 0, 0, ext_filter_mask, 0);
2740 if (err < 0) {
2741 /* -EMSGSIZE implies BUG in if_nlmsg_size */
2742 WARN_ON(err == -EMSGSIZE);
2743 kfree_skb(nskb);
2744 } else
2745 err = rtnl_unicast(nskb, net, NETLINK_CB(skb).portid);
2746
2747 return err;

--- 55 unchanged lines hidden (view full) ---

2803 break;
2804 }
2805 cb->family = idx;
2806
2807 return skb->len;
2808}
2809
2810struct sk_buff *rtmsg_ifinfo_build_skb(int type, struct net_device *dev,
2778 if (err < 0) {
2779 /* -EMSGSIZE implies BUG in if_nlmsg_size */
2780 WARN_ON(err == -EMSGSIZE);
2781 kfree_skb(nskb);
2782 } else
2783 err = rtnl_unicast(nskb, net, NETLINK_CB(skb).portid);
2784
2785 return err;

--- 55 unchanged lines hidden (view full) ---

2841 break;
2842 }
2843 cb->family = idx;
2844
2845 return skb->len;
2846}
2847
2848struct sk_buff *rtmsg_ifinfo_build_skb(int type, struct net_device *dev,
2811 unsigned int change, gfp_t flags)
2849 unsigned int change,
2850 u32 event, gfp_t flags)
2812{
2813 struct net *net = dev_net(dev);
2814 struct sk_buff *skb;
2815 int err = -ENOBUFS;
2816 size_t if_info_size;
2817
2818 skb = nlmsg_new((if_info_size = if_nlmsg_size(dev, 0)), flags);
2819 if (skb == NULL)
2820 goto errout;
2821
2851{
2852 struct net *net = dev_net(dev);
2853 struct sk_buff *skb;
2854 int err = -ENOBUFS;
2855 size_t if_info_size;
2856
2857 skb = nlmsg_new((if_info_size = if_nlmsg_size(dev, 0)), flags);
2858 if (skb == NULL)
2859 goto errout;
2860
2822 err = rtnl_fill_ifinfo(skb, dev, type, 0, 0, change, 0, 0);
2861 err = rtnl_fill_ifinfo(skb, dev, type, 0, 0, change, 0, 0, event);
2823 if (err < 0) {
2824 /* -EMSGSIZE implies BUG in if_nlmsg_size() */
2825 WARN_ON(err == -EMSGSIZE);
2826 kfree_skb(skb);
2827 goto errout;
2828 }
2829 return skb;
2830errout:

--- 4 unchanged lines hidden (view full) ---

2835
2836void rtmsg_ifinfo_send(struct sk_buff *skb, struct net_device *dev, gfp_t flags)
2837{
2838 struct net *net = dev_net(dev);
2839
2840 rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, flags);
2841}
2842
2862 if (err < 0) {
2863 /* -EMSGSIZE implies BUG in if_nlmsg_size() */
2864 WARN_ON(err == -EMSGSIZE);
2865 kfree_skb(skb);
2866 goto errout;
2867 }
2868 return skb;
2869errout:

--- 4 unchanged lines hidden (view full) ---

2874
2875void rtmsg_ifinfo_send(struct sk_buff *skb, struct net_device *dev, gfp_t flags)
2876{
2877 struct net *net = dev_net(dev);
2878
2879 rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, flags);
2880}
2881
2843void rtmsg_ifinfo(int type, struct net_device *dev, unsigned int change,
2844 gfp_t flags)
2882static void rtmsg_ifinfo_event(int type, struct net_device *dev,
2883 unsigned int change, u32 event,
2884 gfp_t flags)
2845{
2846 struct sk_buff *skb;
2847
2848 if (dev->reg_state != NETREG_REGISTERED)
2849 return;
2850
2885{
2886 struct sk_buff *skb;
2887
2888 if (dev->reg_state != NETREG_REGISTERED)
2889 return;
2890
2851 skb = rtmsg_ifinfo_build_skb(type, dev, change, flags);
2891 skb = rtmsg_ifinfo_build_skb(type, dev, change, event, flags);
2852 if (skb)
2853 rtmsg_ifinfo_send(skb, dev, flags);
2854}
2892 if (skb)
2893 rtmsg_ifinfo_send(skb, dev, flags);
2894}
2895
2896void rtmsg_ifinfo(int type, struct net_device *dev, unsigned int change,
2897 gfp_t flags)
2898{
2899 rtmsg_ifinfo_event(type, dev, change, IFLA_EVENT_NONE, flags);
2900}
2855EXPORT_SYMBOL(rtmsg_ifinfo);
2856
2857static int nlmsg_populate_fdb_fill(struct sk_buff *skb,
2858 struct net_device *dev,
2859 u8 *addr, u16 vid, u32 pid, u32 seq,
2860 int type, unsigned int flags,
2861 int nlflags, u16 ndm_state)
2862{

--- 1300 unchanged lines hidden (view full) ---

4163 switch (event) {
4164 case NETDEV_REBOOT:
4165 case NETDEV_CHANGENAME:
4166 case NETDEV_FEAT_CHANGE:
4167 case NETDEV_BONDING_FAILOVER:
4168 case NETDEV_NOTIFY_PEERS:
4169 case NETDEV_RESEND_IGMP:
4170 case NETDEV_CHANGEINFODATA:
2901EXPORT_SYMBOL(rtmsg_ifinfo);
2902
2903static int nlmsg_populate_fdb_fill(struct sk_buff *skb,
2904 struct net_device *dev,
2905 u8 *addr, u16 vid, u32 pid, u32 seq,
2906 int type, unsigned int flags,
2907 int nlflags, u16 ndm_state)
2908{

--- 1300 unchanged lines hidden (view full) ---

4209 switch (event) {
4210 case NETDEV_REBOOT:
4211 case NETDEV_CHANGENAME:
4212 case NETDEV_FEAT_CHANGE:
4213 case NETDEV_BONDING_FAILOVER:
4214 case NETDEV_NOTIFY_PEERS:
4215 case NETDEV_RESEND_IGMP:
4216 case NETDEV_CHANGEINFODATA:
4171 rtmsg_ifinfo(RTM_NEWLINK, dev, 0, GFP_KERNEL);
4217 rtmsg_ifinfo_event(RTM_NEWLINK, dev, 0, rtnl_get_event(event),
4218 GFP_KERNEL);
4172 break;
4173 default:
4174 break;
4175 }
4176 return NOTIFY_DONE;
4177}
4178
4179static struct notifier_block rtnetlink_dev_notifier = {

--- 60 unchanged lines hidden ---
4219 break;
4220 default:
4221 break;
4222 }
4223 return NOTIFY_DONE;
4224}
4225
4226static struct notifier_block rtnetlink_dev_notifier = {

--- 60 unchanged lines hidden ---