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 --- |