Lines Matching +full:array +full:- +full:nest
1 // SPDX-License-Identifier: GPL-2.0-or-later
98 tail->next = defer_kfree_skb_list; in rtnl_kfree_skbs()
146 struct sk_buff *next = head->next; in __rtnl_unlock()
192 mutex_lock(&net->rtnl_mutex); in __rtnl_net_lock()
200 mutex_unlock(&net->rtnl_mutex); in __rtnl_net_unlock()
246 return -1; in rtnl_net_cmp_locks()
252 return net_a < net_b ? -1 : 1; in rtnl_net_cmp_locks()
267 return rtnl_is_locked() && mutex_is_locked(&net->rtnl_mutex); in rtnl_net_is_locked()
273 return lockdep_rtnl_is_held() && lockdep_is_held(&net->rtnl_mutex); in lockdep_rtnl_net_is_held()
280 return -1; in rtnl_net_cmp_locks()
285 /* ->newlink() needs to freeze 3 netns at most;
301 for (i = 0; i < rtnl_nets->len; i++) { in rtnl_nets_destroy()
302 put_net(rtnl_nets->net[i]); in rtnl_nets_destroy()
303 rtnl_nets->net[i] = NULL; in rtnl_nets_destroy()
306 rtnl_nets->len = 0; in rtnl_nets_destroy()
310 * rtnl_nets_add - Add netns to be locked before ->newlink().
312 * @rtnl_nets: rtnl_nets pointer passed to ->get_peer_net().
321 DEBUG_NET_WARN_ON_ONCE(rtnl_nets->len == ARRAY_SIZE(rtnl_nets->net)); in rtnl_nets_add()
323 for (i = 0; i < rtnl_nets->len; i++) { in rtnl_nets_add()
324 switch (rtnl_net_cmp_locks(rtnl_nets->net[i], net)) { in rtnl_nets_add()
329 swap(rtnl_nets->net[i], net); in rtnl_nets_add()
333 rtnl_nets->net[i] = net; in rtnl_nets_add()
334 rtnl_nets->len++; in rtnl_nets_add()
343 for (i = 0; i < rtnl_nets->len; i++) in rtnl_nets_lock()
344 __rtnl_net_lock(rtnl_nets->net[i]); in rtnl_nets_lock()
351 for (i = 0; i < rtnl_nets->len; i++) in rtnl_nets_unlock()
352 __rtnl_net_unlock(rtnl_nets->net[i]); in rtnl_nets_unlock()
361 int msgindex = msgtype - RTM_BASE; in rtm_msgindex()
395 int ret = -ENOBUFS; in rtnl_register_internal()
422 WARN_ON(link->owner && link->owner != owner); in rtnl_register_internal()
423 link->owner = owner; in rtnl_register_internal()
425 WARN_ON(doit && link->doit && link->doit != doit); in rtnl_register_internal()
427 link->doit = doit; in rtnl_register_internal()
428 WARN_ON(dumpit && link->dumpit && link->dumpit != dumpit); in rtnl_register_internal()
430 link->dumpit = dumpit; in rtnl_register_internal()
434 link->flags |= flags; in rtnl_register_internal()
447 * rtnl_unregister - Unregister a rtnetlink message type
466 return -ENOENT; in rtnl_unregister()
478 * rtnl_unregister_all - Unregister all rtnetlink message type of a protocol
511 * __rtnl_register_many - Register rtnetlink message types
512 * @handlers: Array of struct rtnl_msg_handlers
516 * to be non-NULL) to be called whenever a request message for the
524 * 1) built-in: panics.
536 err = rtnl_register_internal(handler->owner, handler->protocol, in __rtnl_register_many()
537 handler->msgtype, handler->doit, in __rtnl_register_many()
538 handler->dumpit, handler->flags); in __rtnl_register_many()
540 if (!handler->owner) in __rtnl_register_many()
558 for (i = n - 1, handler = handlers + n - 1; i >= 0; i--, handler--) in __rtnl_unregister_many()
559 rtnl_unregister(handler->protocol, handler->msgtype); in __rtnl_unregister_many()
573 if (!strcmp(ops->kind, kind)) { in rtnl_link_ops_get()
574 *srcu_index = srcu_read_lock(&ops->srcu); in rtnl_link_ops_get()
588 srcu_read_unlock(&ops->srcu, srcu_index); in rtnl_link_ops_put()
592 * rtnl_link_register - Register rtnl_link_ops with rtnetlink.
602 /* Sanity-check max sizes to avoid stack buffer overflow. */ in rtnl_link_register()
603 if (WARN_ON(ops->maxtype > RTNL_MAX_TYPE || in rtnl_link_register()
604 ops->slave_maxtype > RTNL_SLAVE_MAX_TYPE)) in rtnl_link_register()
605 return -EINVAL; in rtnl_link_register()
612 if ((ops->alloc || ops->setup) && !ops->dellink) in rtnl_link_register()
613 ops->dellink = unregister_netdevice_queue; in rtnl_link_register()
615 err = init_srcu_struct(&ops->srcu); in rtnl_link_register()
622 if (!strcmp(ops->kind, tmp->kind)) { in rtnl_link_register()
623 err = -EEXIST; in rtnl_link_register()
628 list_add_tail_rcu(&ops->list, &link_ops); in rtnl_link_register()
642 if (dev->rtnl_link_ops == ops) in __rtnl_kill_links()
643 ops->dellink(dev, &list_kill); in __rtnl_kill_links()
671 * rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink.
679 list_del_rcu(&ops->list); in rtnl_link_unregister()
682 synchronize_srcu(&ops->srcu); in rtnl_link_unregister()
683 cleanup_srcu_struct(&ops->srcu); in rtnl_link_unregister()
709 ops = master_dev->rtnl_link_ops; in rtnl_link_get_slave_info_data_size()
710 if (!ops || !ops->get_slave_size) in rtnl_link_get_slave_info_data_size()
714 ops->get_slave_size(master_dev, dev); in rtnl_link_get_slave_info_data_size()
723 const struct rtnl_link_ops *ops = dev->rtnl_link_ops; in rtnl_link_get_size()
730 nla_total_size(strlen(ops->kind) + 1); /* IFLA_INFO_KIND */ in rtnl_link_get_size()
732 if (ops->get_size) in rtnl_link_get_size()
735 ops->get_size(dev); in rtnl_link_get_size()
737 if (ops->get_xstats_size) in rtnl_link_get_size()
739 size += nla_total_size(ops->get_xstats_size(dev)); in rtnl_link_get_size()
757 if (ops->family == family) { in rtnl_af_lookup()
758 *srcu_index = srcu_read_lock(&ops->srcu); in rtnl_af_lookup()
772 srcu_read_unlock(&ops->srcu, srcu_index); in rtnl_af_put()
776 * rtnl_af_register - Register rtnl_af_ops with rtnetlink.
783 int err = init_srcu_struct(&ops->srcu); in rtnl_af_register()
789 list_add_tail_rcu(&ops->list, &rtnl_af_ops); in rtnl_af_register()
797 * rtnl_af_unregister - Unregister rtnl_af_ops from rtnetlink.
803 list_del_rcu(&ops->list); in rtnl_af_unregister()
807 synchronize_srcu(&ops->srcu); in rtnl_af_unregister()
808 cleanup_srcu_struct(&ops->srcu); in rtnl_af_unregister()
823 if (af_ops->get_link_af_size) { in rtnl_link_get_af_size()
826 af_ops->get_link_af_size(dev, ext_filter_mask); in rtnl_link_get_af_size()
842 if (master_dev && master_dev->rtnl_link_ops) in rtnl_have_link_slave_info()
859 ops = master_dev->rtnl_link_ops; in rtnl_link_slave_info_fill()
862 if (nla_put_string(skb, IFLA_INFO_SLAVE_KIND, ops->kind) < 0) in rtnl_link_slave_info_fill()
863 return -EMSGSIZE; in rtnl_link_slave_info_fill()
864 if (ops->fill_slave_info) { in rtnl_link_slave_info_fill()
867 return -EMSGSIZE; in rtnl_link_slave_info_fill()
868 err = ops->fill_slave_info(skb, master_dev, dev); in rtnl_link_slave_info_fill()
883 const struct rtnl_link_ops *ops = dev->rtnl_link_ops; in rtnl_link_info_fill()
889 if (nla_put_string(skb, IFLA_INFO_KIND, ops->kind) < 0) in rtnl_link_info_fill()
890 return -EMSGSIZE; in rtnl_link_info_fill()
891 if (ops->fill_xstats) { in rtnl_link_info_fill()
892 err = ops->fill_xstats(skb, dev); in rtnl_link_info_fill()
896 if (ops->fill_info) { in rtnl_link_info_fill()
899 return -EMSGSIZE; in rtnl_link_info_fill()
900 err = ops->fill_info(skb, dev); in rtnl_link_info_fill()
915 int err = -EMSGSIZE; in rtnl_link_fill()
940 struct sock *rtnl = net->rtnl; in rtnetlink_send()
947 struct sock *rtnl = net->rtnl; in rtnl_unicast()
956 struct sock *rtnl = net->rtnl; in rtnl_notify()
964 struct sock *rtnl = net->rtnl; in rtnl_set_sk_err()
981 return -ENOBUFS; in rtnetlink_put_metrics()
985 if (i == RTAX_CC_ALGO - 1) { in rtnetlink_put_metrics()
993 } else if (i == RTAX_FEATURES - 1) { in rtnetlink_put_metrics()
1018 return -EMSGSIZE; in rtnetlink_put_metrics()
1032 delta = jiffies - READ_ONCE(dst->lastuse); in rtnl_put_cacheinfo()
1034 ci.rta_used = dst->__use; in rtnl_put_cacheinfo()
1035 ci.rta_clntref = rcuref_read(&dst->__rcuref); in rtnl_put_cacheinfo()
1042 ci.rta_expires = (expires > 0) ? clock : -clock; in rtnl_put_cacheinfo()
1050 unsigned int old = READ_ONCE(dev->operstate); in netif_set_operstate()
1055 } while (!try_cmpxchg(&dev->operstate, &old, newstate)); in netif_set_operstate()
1063 unsigned char operstate = READ_ONCE(dev->operstate); in set_operstate()
1090 return (dev->flags & ~(IFF_PROMISC | IFF_ALLMULTI)) | in rtnl_dev_get_flags()
1091 (dev->gflags & (IFF_PROMISC | IFF_ALLMULTI)); in rtnl_dev_get_flags()
1097 unsigned int flags = ifm->ifi_flags; in rtnl_dev_combine_flags()
1100 if (ifm->ifi_change) in rtnl_dev_combine_flags()
1101 flags = (flags & ifm->ifi_change) | in rtnl_dev_combine_flags()
1102 (rtnl_dev_get_flags(dev) & ~ifm->ifi_change); in rtnl_dev_combine_flags()
1110 a->rx_packets = b->rx_packets; in copy_rtnl_link_stats()
1111 a->tx_packets = b->tx_packets; in copy_rtnl_link_stats()
1112 a->rx_bytes = b->rx_bytes; in copy_rtnl_link_stats()
1113 a->tx_bytes = b->tx_bytes; in copy_rtnl_link_stats()
1114 a->rx_errors = b->rx_errors; in copy_rtnl_link_stats()
1115 a->tx_errors = b->tx_errors; in copy_rtnl_link_stats()
1116 a->rx_dropped = b->rx_dropped; in copy_rtnl_link_stats()
1117 a->tx_dropped = b->tx_dropped; in copy_rtnl_link_stats()
1119 a->multicast = b->multicast; in copy_rtnl_link_stats()
1120 a->collisions = b->collisions; in copy_rtnl_link_stats()
1122 a->rx_length_errors = b->rx_length_errors; in copy_rtnl_link_stats()
1123 a->rx_over_errors = b->rx_over_errors; in copy_rtnl_link_stats()
1124 a->rx_crc_errors = b->rx_crc_errors; in copy_rtnl_link_stats()
1125 a->rx_frame_errors = b->rx_frame_errors; in copy_rtnl_link_stats()
1126 a->rx_fifo_errors = b->rx_fifo_errors; in copy_rtnl_link_stats()
1127 a->rx_missed_errors = b->rx_missed_errors; in copy_rtnl_link_stats()
1129 a->tx_aborted_errors = b->tx_aborted_errors; in copy_rtnl_link_stats()
1130 a->tx_carrier_errors = b->tx_carrier_errors; in copy_rtnl_link_stats()
1131 a->tx_fifo_errors = b->tx_fifo_errors; in copy_rtnl_link_stats()
1132 a->tx_heartbeat_errors = b->tx_heartbeat_errors; in copy_rtnl_link_stats()
1133 a->tx_window_errors = b->tx_window_errors; in copy_rtnl_link_stats()
1135 a->rx_compressed = b->rx_compressed; in copy_rtnl_link_stats()
1136 a->tx_compressed = b->tx_compressed; in copy_rtnl_link_stats()
1138 a->rx_nohandler = b->rx_nohandler; in copy_rtnl_link_stats()
1145 if (dev->dev.parent && (ext_filter_mask & RTEXT_FILTER_VF)) { in rtnl_vfinfo_size()
1146 int num_vfs = dev_num_vf(dev->dev.parent); in rtnl_vfinfo_size()
1153 nla_total_size(0) + /* nest IFLA_VF_VLAN_LIST */ in rtnl_vfinfo_size()
1164 (nla_total_size(0) + /* nest IFLA_VF_STATS */ in rtnl_vfinfo_size()
1182 if (dev->netdev_ops->ndo_get_vf_guid) in rtnl_vfinfo_size()
1205 if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent || in rtnl_port_size()
1208 if (dev_num_vf(dev->dev.parent)) in rtnl_port_size()
1210 vf_port_size * dev_num_vf(dev->dev.parent); in rtnl_port_size()
1217 size_t xdp_size = nla_total_size(0) + /* nest IFLA_XDP */ in rtnl_xdp_size()
1231 list_for_each_entry_rcu(name_node, &dev->name_node->list, list) in rtnl_prop_list_size()
1245 /* Assume dev->proto_down_reason is not zero. */ in rtnl_proto_down_size()
1253 size_t size = nla_total_size(0); /* nest IFLA_DEVLINK_PORT */ in rtnl_devlink_port_size()
1255 if (dev->devlink_port) in rtnl_devlink_port_size()
1256 size += devlink_nl_port_handle_size(dev->devlink_port); in rtnl_devlink_port_size()
1263 size_t size = nla_total_size(0); /* nest IFLA_DPLL_PIN */ in rtnl_dpll_pin_size()
1349 return -EMSGSIZE; in rtnl_vf_ports_fill()
1351 for (vf = 0; vf < dev_num_vf(dev->dev.parent); vf++) { in rtnl_vf_ports_fill()
1357 err = dev->netdev_ops->ndo_get_vf_port(dev, vf, skb); in rtnl_vf_ports_fill()
1358 if (err == -EMSGSIZE) in rtnl_vf_ports_fill()
1373 return -EMSGSIZE; in rtnl_vf_ports_fill()
1383 return -EMSGSIZE; in rtnl_port_self_fill()
1385 err = dev->netdev_ops->ndo_get_vf_port(dev, PORT_SELF_VF, skb); in rtnl_port_self_fill()
1388 return (err == -EMSGSIZE) ? err : 0; in rtnl_port_self_fill()
1401 if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent || in rtnl_port_fill()
1409 if (dev_num_vf(dev->dev.parent)) { in rtnl_port_fill()
1425 if (err == -EOPNOTSUPP) in rtnl_phys_port_id_fill()
1431 return -EMSGSIZE; in rtnl_phys_port_id_fill()
1443 if (err == -EOPNOTSUPP) in rtnl_phys_port_name_fill()
1449 return -EMSGSIZE; in rtnl_phys_port_name_fill()
1461 if (err == -EOPNOTSUPP) in rtnl_phys_switch_id_fill()
1467 return -EMSGSIZE; in rtnl_phys_switch_id_fill()
1481 return -EMSGSIZE; in rtnl_fill_stats()
1489 return -EMSGSIZE; in rtnl_fill_stats()
1519 /* Not all SR-IOV capable drivers support the in rtnl_fill_vfinfo()
1521 * -1 so the user space tool can detect that the driver in rtnl_fill_vfinfo()
1524 ivi.spoofchk = -1; in rtnl_fill_vfinfo()
1525 ivi.rss_query_en = -1; in rtnl_fill_vfinfo()
1526 ivi.trusted = -1; in rtnl_fill_vfinfo()
1533 if (dev->netdev_ops->ndo_get_vf_config(dev, vfs_num, &ivi)) in rtnl_fill_vfinfo()
1553 memcpy(vf_broadcast.broadcast, dev->broadcast, dev->addr_len); in rtnl_fill_vfinfo()
1568 return -EMSGSIZE; in rtnl_fill_vfinfo()
1587 if (dev->netdev_ops->ndo_get_vf_guid && in rtnl_fill_vfinfo()
1588 !dev->netdev_ops->ndo_get_vf_guid(dev, vfs_num, &node_guid, in rtnl_fill_vfinfo()
1607 if (dev->netdev_ops->ndo_get_vf_stats) in rtnl_fill_vfinfo()
1608 dev->netdev_ops->ndo_get_vf_stats(dev, vfs_num, in rtnl_fill_vfinfo()
1639 return -EMSGSIZE; in rtnl_fill_vfinfo()
1649 if (!dev->dev.parent || ((ext_filter_mask & RTEXT_FILTER_VF) == 0)) in rtnl_fill_vf()
1652 num_vfs = dev_num_vf(dev->dev.parent); in rtnl_fill_vf()
1654 return -EMSGSIZE; in rtnl_fill_vf()
1656 if (!dev->netdev_ops->ndo_get_vf_config) in rtnl_fill_vf()
1661 return -EMSGSIZE; in rtnl_fill_vf()
1666 return -EMSGSIZE; in rtnl_fill_vf()
1680 map.mem_start = READ_ONCE(dev->mem_start); in rtnl_fill_link_ifmap()
1681 map.mem_end = READ_ONCE(dev->mem_end); in rtnl_fill_link_ifmap()
1682 map.base_addr = READ_ONCE(dev->base_addr); in rtnl_fill_link_ifmap()
1683 map.irq = READ_ONCE(dev->irq); in rtnl_fill_link_ifmap()
1684 map.dma = READ_ONCE(dev->dma); in rtnl_fill_link_ifmap()
1685 map.port = READ_ONCE(dev->if_port); in rtnl_fill_link_ifmap()
1688 return -EMSGSIZE; in rtnl_fill_link_ifmap()
1699 generic_xdp_prog = rcu_dereference(dev->xdp_prog); in rtnl_xdp_prog_skb()
1701 res = generic_xdp_prog->aux->id; in rtnl_xdp_prog_skb()
1750 return -EMSGSIZE; in rtnl_xdp_fill()
1825 READ_ONCE(upper_dev->ifindex)); in put_master_ifindex()
1836 if (force || READ_ONCE(dev->ifindex) != iflink) in nla_put_iflink()
1858 if (dev->rtnl_link_ops && dev->rtnl_link_ops->get_link_net) { in rtnl_fill_link_netnsid()
1859 struct net *link_net = dev->rtnl_link_ops->get_link_net(dev); in rtnl_fill_link_netnsid()
1865 return -EMSGSIZE; in rtnl_fill_link_netnsid()
1883 return -EMSGSIZE; in rtnl_fill_link_af()
1889 if (!af_ops->fill_link_af) in rtnl_fill_link_af()
1892 af = nla_nest_start_noflag(skb, af_ops->family); in rtnl_fill_link_af()
1894 return -EMSGSIZE; in rtnl_fill_link_af()
1896 err = af_ops->fill_link_af(skb, dev, ext_filter_mask); in rtnl_fill_link_af()
1903 if (err == -ENODATA) in rtnl_fill_link_af()
1906 return -EMSGSIZE; in rtnl_fill_link_af()
1921 list_for_each_entry_rcu(name_node, &dev->name_node->list, list) { in rtnl_fill_alt_ifnames()
1922 if (nla_put_string(skb, IFLA_ALT_IFNAME, name_node->name)) in rtnl_fill_alt_ifnames()
1923 return -EMSGSIZE; in rtnl_fill_alt_ifnames()
1938 return -EMSGSIZE; in rtnl_fill_prop_list()
1958 if (nla_put_u8(skb, IFLA_PROTO_DOWN, READ_ONCE(dev->proto_down))) in rtnl_fill_proto_down()
1961 preason = READ_ONCE(dev->proto_down_reason); in rtnl_fill_proto_down()
1967 return -EMSGSIZE; in rtnl_fill_proto_down()
1978 return -EMSGSIZE; in rtnl_fill_proto_down()
1989 return -EMSGSIZE; in rtnl_fill_devlink_port()
1991 if (dev->devlink_port) { in rtnl_fill_devlink_port()
1992 ret = devlink_nl_port_handle_fill(skb, dev->devlink_port); in rtnl_fill_devlink_port()
2013 return -EMSGSIZE; in rtnl_fill_dpll_pin()
2042 return -EMSGSIZE; in rtnl_fill_ifinfo()
2045 ifm->ifi_family = AF_UNSPEC; in rtnl_fill_ifinfo()
2046 ifm->__ifi_pad = 0; in rtnl_fill_ifinfo()
2047 ifm->ifi_type = READ_ONCE(dev->type); in rtnl_fill_ifinfo()
2048 ifm->ifi_index = READ_ONCE(dev->ifindex); in rtnl_fill_ifinfo()
2049 ifm->ifi_flags = netif_get_flags(dev); in rtnl_fill_ifinfo()
2050 ifm->ifi_change = change; in rtnl_fill_ifinfo()
2059 if (nla_put_u32(skb, IFLA_TXQLEN, READ_ONCE(dev->tx_queue_len)) || in rtnl_fill_ifinfo()
2061 netif_running(dev) ? READ_ONCE(dev->operstate) : in rtnl_fill_ifinfo()
2063 nla_put_u8(skb, IFLA_LINKMODE, READ_ONCE(dev->link_mode)) || in rtnl_fill_ifinfo()
2064 nla_put_u8(skb, IFLA_NETNS_IMMUTABLE, dev->netns_immutable) || in rtnl_fill_ifinfo()
2065 nla_put_u32(skb, IFLA_MTU, READ_ONCE(dev->mtu)) || in rtnl_fill_ifinfo()
2066 nla_put_u32(skb, IFLA_MIN_MTU, READ_ONCE(dev->min_mtu)) || in rtnl_fill_ifinfo()
2067 nla_put_u32(skb, IFLA_MAX_MTU, READ_ONCE(dev->max_mtu)) || in rtnl_fill_ifinfo()
2068 nla_put_u32(skb, IFLA_GROUP, READ_ONCE(dev->group)) || in rtnl_fill_ifinfo()
2069 nla_put_u32(skb, IFLA_PROMISCUITY, READ_ONCE(dev->promiscuity)) || in rtnl_fill_ifinfo()
2070 nla_put_u32(skb, IFLA_ALLMULTI, READ_ONCE(dev->allmulti)) || in rtnl_fill_ifinfo()
2072 READ_ONCE(dev->num_tx_queues)) || in rtnl_fill_ifinfo()
2074 READ_ONCE(dev->gso_max_segs)) || in rtnl_fill_ifinfo()
2076 READ_ONCE(dev->gso_max_size)) || in rtnl_fill_ifinfo()
2078 READ_ONCE(dev->gro_max_size)) || in rtnl_fill_ifinfo()
2080 READ_ONCE(dev->gso_ipv4_max_size)) || in rtnl_fill_ifinfo()
2082 READ_ONCE(dev->gro_ipv4_max_size)) || in rtnl_fill_ifinfo()
2084 READ_ONCE(dev->tso_max_size)) || in rtnl_fill_ifinfo()
2086 READ_ONCE(dev->tso_max_segs)) || in rtnl_fill_ifinfo()
2088 READ_ONCE(dev->max_pacing_offload_horizon)) || in rtnl_fill_ifinfo()
2091 READ_ONCE(dev->num_rx_queues)) || in rtnl_fill_ifinfo()
2097 atomic_read(&dev->carrier_up_count) + in rtnl_fill_ifinfo()
2098 atomic_read(&dev->carrier_down_count)) || in rtnl_fill_ifinfo()
2100 atomic_read(&dev->carrier_up_count)) || in rtnl_fill_ifinfo()
2102 atomic_read(&dev->carrier_down_count)) || in rtnl_fill_ifinfo()
2104 READ_ONCE(dev->needed_headroom)) || in rtnl_fill_ifinfo()
2106 READ_ONCE(dev->needed_tailroom))) in rtnl_fill_ifinfo()
2117 if (dev->addr_len) { in rtnl_fill_ifinfo()
2118 if (nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr) || in rtnl_fill_ifinfo()
2119 nla_put(skb, IFLA_BROADCAST, dev->addr_len, dev->broadcast)) in rtnl_fill_ifinfo()
2145 if (dev->rtnl_link_ops || rtnl_have_link_slave_info(dev)) { in rtnl_fill_ifinfo()
2157 if (memchr_inv(dev->perm_addr, '\0', dev->addr_len) && in rtnl_fill_ifinfo()
2158 nla_put(skb, IFLA_PERM_ADDRESS, dev->addr_len, dev->perm_addr)) in rtnl_fill_ifinfo()
2164 qdisc = rcu_dereference(dev->qdisc); in rtnl_fill_ifinfo()
2165 if (qdisc && nla_put_string(skb, IFLA_QDISC, qdisc->ops->id)) in rtnl_fill_ifinfo()
2175 if (dev->dev.parent && in rtnl_fill_ifinfo()
2177 dev_name(dev->dev.parent))) in rtnl_fill_ifinfo()
2180 if (dev->dev.parent && dev->dev.parent->bus && in rtnl_fill_ifinfo()
2182 dev->dev.parent->bus->name)) in rtnl_fill_ifinfo()
2198 return -EMSGSIZE; in rtnl_fill_ifinfo()
2203 [IFLA_IFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ-1 },
2219 * allow 0-length string (needed to remove an alias).
2221 [IFLA_IFALIAS] = { .type = NLA_BINARY, .len = IFALIASZ - 1 },
2247 .len = ALTIFNAMSIZ - 1 },
2345 if (master_idx == -1) in link_master_filtered()
2348 if (!master || master->ifindex != master_idx) in link_master_filtered()
2357 if (kind_ops && dev->rtnl_link_ops != kind_ops) in link_kind_filtered()
2375 * rtnl_get_net_ns_capable - Get netns if sufficiently privileged.
2388 return ERR_PTR(-EINVAL); in rtnl_get_net_ns_capable()
2393 if (!sk_ns_capable(sk, net->user_ns, CAP_NET_ADMIN)) { in rtnl_get_net_ns_capable()
2395 return ERR_PTR(-EACCES); in rtnl_get_net_ns_capable()
2413 return -EINVAL; in rtnl_valid_dump_ifinfo_req()
2416 if (ifm->__ifi_pad || ifm->ifi_type || ifm->ifi_flags || in rtnl_valid_dump_ifinfo_req()
2417 ifm->ifi_change) { in rtnl_valid_dump_ifinfo_req()
2419 return -EINVAL; in rtnl_valid_dump_ifinfo_req()
2421 if (ifm->ifi_index) { in rtnl_valid_dump_ifinfo_req()
2423 return -EINVAL; in rtnl_valid_dump_ifinfo_req()
2431 /* A hack to preserve kernel<->userspace interface. in rtnl_valid_dump_ifinfo_req()
2447 struct netlink_ext_ack *extack = cb->extack; in rtnl_dump_ifinfo()
2449 const struct nlmsghdr *nlh = cb->nlh; in rtnl_dump_ifinfo()
2450 struct net *net = sock_net(skb->sk); in rtnl_dump_ifinfo()
2455 } *ctx = (void *)cb->ctx; in rtnl_dump_ifinfo()
2461 int netnsid = -1; in rtnl_dump_ifinfo()
2464 err = rtnl_valid_dump_ifinfo_req(nlh, cb->strict_check, tb, extack); in rtnl_dump_ifinfo()
2466 if (cb->strict_check) in rtnl_dump_ifinfo()
2480 tgt_net = rtnl_get_net_ns_capable(skb->sk, netnsid); in rtnl_dump_ifinfo()
2484 netnsid = -1; in rtnl_dump_ifinfo()
2498 if (cb->strict_check) { in rtnl_dump_ifinfo()
2500 err = -EINVAL; in rtnl_dump_ifinfo()
2511 for_each_netdev_dump(tgt_net, dev, ctx->ifindex) { in rtnl_dump_ifinfo()
2515 NETLINK_CB(cb->skb).portid, in rtnl_dump_ifinfo()
2516 nlh->nlmsg_seq, 0, flags, in rtnl_dump_ifinfo()
2524 cb->seq = tgt_net->dev_base_seq; in rtnl_dump_ifinfo()
2546 len = nla_len(nla_peer) - sizeof(struct ifinfomsg); in rtnl_nla_parse_ifinfomsg()
2548 if (ifmp->ifi_index < 0) { in rtnl_nla_parse_ifinfomsg()
2551 return -EINVAL; in rtnl_nla_parse_ifinfomsg()
2605 return ERR_PTR(-EINVAL); in rtnl_link_get_net_by_nlattr()
2620 if (!netlink_ns_capable(skb, net->user_ns, cap)) { in rtnl_link_get_net_capable()
2622 return ERR_PTR(-EPERM); in rtnl_link_get_net_capable()
2641 return -EOPNOTSUPP; in rtnl_ensure_unique_netns()
2657 return -EINVAL; in rtnl_ensure_unique_netns()
2663 const struct net_device_ops *ops = dev->netdev_ops; in rtnl_set_vf_rate()
2665 if (!ops->ndo_set_vf_rate) in rtnl_set_vf_rate()
2666 return -EOPNOTSUPP; in rtnl_set_vf_rate()
2668 return -EINVAL; in rtnl_set_vf_rate()
2670 return ops->ndo_set_vf_rate(dev, vf, min_tx_rate, max_tx_rate); in rtnl_set_vf_rate()
2677 nla_len(tb[IFLA_ADDRESS]) < dev->addr_len) in validate_linkmsg()
2678 return -EINVAL; in validate_linkmsg()
2681 nla_len(tb[IFLA_BROADCAST]) < dev->addr_len) in validate_linkmsg()
2682 return -EINVAL; in validate_linkmsg()
2685 nla_get_u32(tb[IFLA_GSO_MAX_SIZE]) > dev->tso_max_size) { in validate_linkmsg()
2687 return -EINVAL; in validate_linkmsg()
2692 nla_get_u32(tb[IFLA_GSO_MAX_SEGS]) > dev->tso_max_segs)) { in validate_linkmsg()
2694 return -EINVAL; in validate_linkmsg()
2700 return -EINVAL; in validate_linkmsg()
2704 nla_get_u32(tb[IFLA_GSO_IPV4_MAX_SIZE]) > dev->tso_max_size) { in validate_linkmsg()
2706 return -EINVAL; in validate_linkmsg()
2712 return -EINVAL; in validate_linkmsg()
2725 return -EAFNOSUPPORT; in validate_linkmsg()
2727 if (!af_ops->set_link_af) in validate_linkmsg()
2728 err = -EOPNOTSUPP; in validate_linkmsg()
2729 else if (af_ops->validate_link_af) in validate_linkmsg()
2730 err = af_ops->validate_link_af(dev, af, extack); in validate_linkmsg()
2747 const struct net_device_ops *ops = dev->netdev_ops; in handle_infiniband_guid()
2749 return ops->ndo_set_vf_guid(dev, ivt->vf, ivt->guid, guid_type); in handle_infiniband_guid()
2754 if (dev->type != ARPHRD_INFINIBAND) in handle_vf_guid()
2755 return -EOPNOTSUPP; in handle_vf_guid()
2762 const struct net_device_ops *ops = dev->netdev_ops; in do_setvfinfo()
2763 int err = -EINVAL; in do_setvfinfo()
2768 if (ivm->vf >= INT_MAX) in do_setvfinfo()
2769 return -EINVAL; in do_setvfinfo()
2770 err = -EOPNOTSUPP; in do_setvfinfo()
2771 if (ops->ndo_set_vf_mac) in do_setvfinfo()
2772 err = ops->ndo_set_vf_mac(dev, ivm->vf, in do_setvfinfo()
2773 ivm->mac); in do_setvfinfo()
2781 if (ivv->vf >= INT_MAX) in do_setvfinfo()
2782 return -EINVAL; in do_setvfinfo()
2783 err = -EOPNOTSUPP; in do_setvfinfo()
2784 if (ops->ndo_set_vf_vlan) in do_setvfinfo()
2785 err = ops->ndo_set_vf_vlan(dev, ivv->vf, ivv->vlan, in do_setvfinfo()
2786 ivv->qos, in do_setvfinfo()
2797 err = -EOPNOTSUPP; in do_setvfinfo()
2798 if (!ops->ndo_set_vf_vlan) in do_setvfinfo()
2804 return -EINVAL; in do_setvfinfo()
2807 return -EOPNOTSUPP; in do_setvfinfo()
2813 return -EINVAL; in do_setvfinfo()
2815 if (ivvl[0]->vf >= INT_MAX) in do_setvfinfo()
2816 return -EINVAL; in do_setvfinfo()
2817 err = ops->ndo_set_vf_vlan(dev, ivvl[0]->vf, ivvl[0]->vlan, in do_setvfinfo()
2818 ivvl[0]->qos, ivvl[0]->vlan_proto); in do_setvfinfo()
2827 if (ivt->vf >= INT_MAX) in do_setvfinfo()
2828 return -EINVAL; in do_setvfinfo()
2829 err = -EOPNOTSUPP; in do_setvfinfo()
2830 if (ops->ndo_get_vf_config) in do_setvfinfo()
2831 err = ops->ndo_get_vf_config(dev, ivt->vf, &ivf); in do_setvfinfo()
2835 err = rtnl_set_vf_rate(dev, ivt->vf, in do_setvfinfo()
2836 ivf.min_tx_rate, ivt->rate); in do_setvfinfo()
2844 if (ivt->vf >= INT_MAX) in do_setvfinfo()
2845 return -EINVAL; in do_setvfinfo()
2847 err = rtnl_set_vf_rate(dev, ivt->vf, in do_setvfinfo()
2848 ivt->min_tx_rate, ivt->max_tx_rate); in do_setvfinfo()
2856 if (ivs->vf >= INT_MAX) in do_setvfinfo()
2857 return -EINVAL; in do_setvfinfo()
2858 err = -EOPNOTSUPP; in do_setvfinfo()
2859 if (ops->ndo_set_vf_spoofchk) in do_setvfinfo()
2860 err = ops->ndo_set_vf_spoofchk(dev, ivs->vf, in do_setvfinfo()
2861 ivs->setting); in do_setvfinfo()
2869 if (ivl->vf >= INT_MAX) in do_setvfinfo()
2870 return -EINVAL; in do_setvfinfo()
2871 err = -EOPNOTSUPP; in do_setvfinfo()
2872 if (ops->ndo_set_vf_link_state) in do_setvfinfo()
2873 err = ops->ndo_set_vf_link_state(dev, ivl->vf, in do_setvfinfo()
2874 ivl->link_state); in do_setvfinfo()
2882 err = -EOPNOTSUPP; in do_setvfinfo()
2884 if (ivrssq_en->vf >= INT_MAX) in do_setvfinfo()
2885 return -EINVAL; in do_setvfinfo()
2886 if (ops->ndo_set_vf_rss_query_en) in do_setvfinfo()
2887 err = ops->ndo_set_vf_rss_query_en(dev, ivrssq_en->vf, in do_setvfinfo()
2888 ivrssq_en->setting); in do_setvfinfo()
2896 if (ivt->vf >= INT_MAX) in do_setvfinfo()
2897 return -EINVAL; in do_setvfinfo()
2898 err = -EOPNOTSUPP; in do_setvfinfo()
2899 if (ops->ndo_set_vf_trust) in do_setvfinfo()
2900 err = ops->ndo_set_vf_trust(dev, ivt->vf, ivt->setting); in do_setvfinfo()
2908 if (ivt->vf >= INT_MAX) in do_setvfinfo()
2909 return -EINVAL; in do_setvfinfo()
2910 if (!ops->ndo_set_vf_guid) in do_setvfinfo()
2911 return -EOPNOTSUPP; in do_setvfinfo()
2918 if (ivt->vf >= INT_MAX) in do_setvfinfo()
2919 return -EINVAL; in do_setvfinfo()
2920 if (!ops->ndo_set_vf_guid) in do_setvfinfo()
2921 return -EOPNOTSUPP; in do_setvfinfo()
2942 if (upper_dev->ifindex == ifindex) in do_set_master()
2944 ops = upper_dev->netdev_ops; in do_set_master()
2945 if (ops->ndo_del_slave) { in do_set_master()
2947 err = ops->ndo_del_slave(upper_dev, dev); in do_set_master()
2952 return -EOPNOTSUPP; in do_set_master()
2959 return -EINVAL; in do_set_master()
2960 ops = upper_dev->netdev_ops; in do_set_master()
2961 if (ops->ndo_add_slave) { in do_set_master()
2963 err = ops->ndo_add_slave(upper_dev, dev, extack); in do_set_master()
2968 return -EOPNOTSUPP; in do_set_master()
2990 if (!dev->change_proto_down) { in do_set_proto_down()
2992 return -EOPNOTSUPP; in do_set_proto_down()
3006 return -EINVAL; in do_set_proto_down()
3021 if (!proto_down && dev->proto_down_reason) { in do_set_proto_down()
3023 return -EBUSY; in do_set_proto_down()
3041 const struct net_device_ops *ops = dev->netdev_ops; in do_setlink()
3074 if (!ops->ndo_set_config) { in do_setlink()
3075 err = -EOPNOTSUPP; in do_setlink()
3080 err = -ENODEV; in do_setlink()
3085 k_map.mem_start = (unsigned long) u_map->mem_start; in do_setlink()
3086 k_map.mem_end = (unsigned long) u_map->mem_end; in do_setlink()
3087 k_map.base_addr = (unsigned short) u_map->base_addr; in do_setlink()
3088 k_map.irq = (unsigned char) u_map->irq; in do_setlink()
3089 k_map.dma = (unsigned char) u_map->dma; in do_setlink()
3090 k_map.port = (unsigned char) u_map->port; in do_setlink()
3092 err = ops->ndo_set_config(dev, &k_map); in do_setlink()
3108 ss.ss_family = dev->type; in do_setlink()
3109 memcpy(ss.__data, nla_data(tb[IFLA_ADDRESS]), dev->addr_len); in do_setlink()
3137 if (ifm->ifi_index > 0 && ifname[0]) { in do_setlink()
3153 nla_memcpy(dev->broadcast, tb[IFLA_BROADCAST], dev->addr_len); in do_setlink()
3157 if (ifm->ifi_flags || ifm->ifi_change) { in do_setlink()
3190 if (dev->gso_max_size ^ max_size) { in do_setlink()
3199 if (dev->gso_max_segs ^ max_segs) { in do_setlink()
3208 if (dev->gro_max_size ^ gro_max_size) { in do_setlink()
3217 if (dev->gso_ipv4_max_size ^ max_size) { in do_setlink()
3226 if (dev->gro_ipv4_max_size ^ gro_max_size) { in do_setlink()
3238 if (dev->link_mode ^ value) in do_setlink()
3240 WRITE_ONCE(dev->link_mode, value); in do_setlink()
3251 err = -EINVAL; in do_setlink()
3274 err = -EOPNOTSUPP; in do_setlink()
3275 if (!ops->ndo_set_vf_port) in do_setlink()
3281 err = -EINVAL; in do_setlink()
3291 err = -EOPNOTSUPP; in do_setlink()
3295 err = ops->ndo_set_vf_port(dev, vf, port); in do_setlink()
3312 err = -EOPNOTSUPP; in do_setlink()
3313 if (ops->ndo_set_vf_port) in do_setlink()
3314 err = ops->ndo_set_vf_port(dev, PORT_SELF_VF, port); in do_setlink()
3330 err = -EAFNOSUPPORT; in do_setlink()
3334 err = af_ops->set_link_af(dev, af, extack); in do_setlink()
3364 err = -EINVAL; in do_setlink()
3371 err = -EINVAL; in do_setlink()
3375 err = -EINVAL; in do_setlink()
3381 int expected_fd = -1; in do_setlink()
3385 err = -EINVAL; in do_setlink()
3409 dev->name); in do_setlink()
3436 struct net *net = sock_net(skb->sk); in rtnl_setlink()
3464 if (ifm->ifi_index > 0) in rtnl_setlink()
3465 dev = __dev_get_by_index(net, ifm->ifi_index); in rtnl_setlink()
3469 err = -EINVAL; in rtnl_setlink()
3474 err = -ENODEV; in rtnl_setlink()
3489 return -EPERM; in rtnl_group_dellink()
3492 if (dev->group == group) { in rtnl_group_dellink()
3496 ops = dev->rtnl_link_ops; in rtnl_group_dellink()
3497 if (!ops || !ops->dellink) in rtnl_group_dellink()
3498 return -EOPNOTSUPP; in rtnl_group_dellink()
3503 return -ENODEV; in rtnl_group_dellink()
3506 if (dev->group == group) { in rtnl_group_dellink()
3509 ops = dev->rtnl_link_ops; in rtnl_group_dellink()
3510 ops->dellink(dev, &list_kill); in rtnl_group_dellink()
3523 ops = dev->rtnl_link_ops; in rtnl_delete_link()
3524 if (!ops || !ops->dellink) in rtnl_delete_link()
3525 return -EOPNOTSUPP; in rtnl_delete_link()
3527 ops->dellink(dev, &list_kill); in rtnl_delete_link()
3538 struct net *net = sock_net(skb->sk); in rtnl_dellink()
3543 int netnsid = -1; in rtnl_dellink()
3564 if (ifm->ifi_index > 0) in rtnl_dellink()
3565 dev = __dev_get_by_index(tgt_net, ifm->ifi_index); in rtnl_dellink()
3571 else if (ifm->ifi_index > 0 || tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME]) in rtnl_dellink()
3572 err = -ENODEV; in rtnl_dellink()
3576 err = -EINVAL; in rtnl_dellink()
3592 old_flags = dev->flags; in rtnl_configure_link()
3593 if (ifm && (ifm->ifi_flags || ifm->ifi_change)) { in rtnl_configure_link()
3600 changed = old_flags ^ dev->flags; in rtnl_configure_link()
3601 if (dev->rtnl_link_initializing) { in rtnl_configure_link()
3602 dev->rtnl_link_initializing = false; in rtnl_configure_link()
3624 else if (ops->get_num_tx_queues) in rtnl_create_link()
3625 num_tx_queues = ops->get_num_tx_queues(); in rtnl_create_link()
3629 else if (ops->get_num_rx_queues) in rtnl_create_link()
3630 num_rx_queues = ops->get_num_rx_queues(); in rtnl_create_link()
3634 return ERR_PTR(-EINVAL); in rtnl_create_link()
3639 return ERR_PTR(-EINVAL); in rtnl_create_link()
3642 if (ops->alloc) { in rtnl_create_link()
3643 dev = ops->alloc(tb, ifname, name_assign_type, in rtnl_create_link()
3648 dev = alloc_netdev_mqs(ops->priv_size, ifname, in rtnl_create_link()
3649 name_assign_type, ops->setup, in rtnl_create_link()
3654 return ERR_PTR(-ENOMEM); in rtnl_create_link()
3663 dev->rtnl_link_ops = ops; in rtnl_create_link()
3664 dev->rtnl_link_initializing = true; in rtnl_create_link()
3674 dev->mtu = mtu; in rtnl_create_link()
3679 dev->addr_assign_type = NET_ADDR_SET; in rtnl_create_link()
3682 memcpy(dev->broadcast, nla_data(tb[IFLA_BROADCAST]), in rtnl_create_link()
3685 dev->tx_queue_len = nla_get_u32(tb[IFLA_TXQLEN]); in rtnl_create_link()
3689 dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]); in rtnl_create_link()
3721 struct nlattr ** const linkinfo = tbs->linkinfo; in rtnl_changelink()
3722 struct nlattr ** const tb = tbs->tb; in rtnl_changelink()
3726 if (nlh->nlmsg_flags & NLM_F_EXCL) in rtnl_changelink()
3727 return -EEXIST; in rtnl_changelink()
3729 if (nlh->nlmsg_flags & NLM_F_REPLACE) in rtnl_changelink()
3730 return -EOPNOTSUPP; in rtnl_changelink()
3733 if (!ops || ops != dev->rtnl_link_ops || !ops->changelink) in rtnl_changelink()
3734 return -EOPNOTSUPP; in rtnl_changelink()
3736 err = ops->changelink(dev, tb, data, extack); in rtnl_changelink()
3750 m_ops = master_dev->rtnl_link_ops; in rtnl_changelink()
3752 if (!m_ops || !m_ops->slave_changelink) in rtnl_changelink()
3753 return -EOPNOTSUPP; in rtnl_changelink()
3755 if (m_ops->slave_maxtype > RTNL_SLAVE_MAX_TYPE) in rtnl_changelink()
3756 return -EINVAL; in rtnl_changelink()
3758 if (m_ops->slave_maxtype) { in rtnl_changelink()
3759 err = nla_parse_nested_deprecated(tbs->slave_attr, in rtnl_changelink()
3760 m_ops->slave_maxtype, in rtnl_changelink()
3762 m_ops->slave_policy, extack); in rtnl_changelink()
3766 slave_data = tbs->slave_attr; in rtnl_changelink()
3769 err = m_ops->slave_changelink(master_dev, dev, tb, slave_data, extack); in rtnl_changelink()
3789 if (dev->group == group) { in rtnl_group_changelink()
3809 .src_net = sock_net(skb->sk), in rtnl_newlink_create()
3820 if (!ops->alloc && !ops->setup) in rtnl_newlink_create()
3821 return -EOPNOTSUPP; in rtnl_newlink_create()
3826 snprintf(ifname, IFNAMSIZ, "%s%%d", ops->kind); in rtnl_newlink_create()
3837 dev->ifindex = ifm->ifi_index; in rtnl_newlink_create()
3839 if (ops->newlink) in rtnl_newlink_create()
3840 err = ops->newlink(dev, ¶ms, extack); in rtnl_newlink_create()
3864 if (ops->newlink) { in rtnl_newlink_create()
3867 ops->dellink(dev, &list_kill); in rtnl_newlink_create()
3883 if (!data || !data[ops->peer_type]) in rtnl_get_peer_net()
3886 err = rtnl_nla_parse_ifinfomsg(tb, data[ops->peer_type], extack); in rtnl_get_peer_net()
3890 if (ops->validate) { in rtnl_get_peer_net()
3891 err = ops->validate(tb, NULL, extack); in rtnl_get_peer_net()
3907 struct nlattr ** const tb = tbs->tb; in __rtnl_newlink()
3908 struct net *net = sock_net(skb->sk); in __rtnl_newlink()
3915 device_net = (nlh->nlmsg_flags & NLM_F_CREATE) && in __rtnl_newlink()
3916 (nlh->nlmsg_flags & NLM_F_EXCL) ? in __rtnl_newlink()
3920 if (ifm->ifi_index > 0) { in __rtnl_newlink()
3922 dev = __dev_get_by_index(device_net, ifm->ifi_index); in __rtnl_newlink()
3923 } else if (ifm->ifi_index < 0) { in __rtnl_newlink()
3925 return -EINVAL; in __rtnl_newlink()
3937 if (!(nlh->nlmsg_flags & NLM_F_CREATE)) { in __rtnl_newlink()
3942 return -ENODEV; in __rtnl_newlink()
3950 return -EOPNOTSUPP; in __rtnl_newlink()
3954 return -EOPNOTSUPP; in __rtnl_newlink()
3974 return -ENOMEM; in rtnl_newlink()
3976 tb = tbs->tb; in rtnl_newlink()
3986 linkinfo = tbs->linkinfo; in rtnl_newlink()
3994 memset(linkinfo, 0, sizeof(tbs->linkinfo)); in rtnl_newlink()
4004 request_module("rtnl-link-%s", kind); in rtnl_newlink()
4013 if (ops->maxtype > RTNL_MAX_TYPE) { in rtnl_newlink()
4014 ret = -EINVAL; in rtnl_newlink()
4018 if (ops->maxtype && linkinfo[IFLA_INFO_DATA]) { in rtnl_newlink()
4019 ret = nla_parse_nested_deprecated(tbs->attr, ops->maxtype, in rtnl_newlink()
4021 ops->policy, extack); in rtnl_newlink()
4025 data = tbs->attr; in rtnl_newlink()
4028 if (ops->validate) { in rtnl_newlink()
4029 ret = ops->validate(tb, data, extack); in rtnl_newlink()
4034 if (ops->peer_type) { in rtnl_newlink()
4045 tgt_net = rtnl_link_get_net_capable(skb, sock_net(skb->sk), tb, CAP_NET_ADMIN); in rtnl_newlink()
4059 ret = -EINVAL; in rtnl_newlink()
4065 if (!netlink_ns_capable(skb, link_net->user_ns, CAP_NET_ADMIN)) { in rtnl_newlink()
4066 ret = -EPERM; in rtnl_newlink()
4096 return -EINVAL; in rtnl_valid_getlink_req()
4103 if (ifm->__ifi_pad || ifm->ifi_type || ifm->ifi_flags || in rtnl_valid_getlink_req()
4104 ifm->ifi_change) { in rtnl_valid_getlink_req()
4106 return -EINVAL; in rtnl_valid_getlink_req()
4126 return -EINVAL; in rtnl_valid_getlink_req()
4136 struct net *net = sock_net(skb->sk); in rtnl_getlink()
4142 int netnsid = -1; in rtnl_getlink()
4164 err = -EINVAL; in rtnl_getlink()
4166 if (ifm->ifi_index > 0) in rtnl_getlink()
4167 dev = __dev_get_by_index(tgt_net, ifm->ifi_index); in rtnl_getlink()
4173 err = -ENODEV; in rtnl_getlink()
4177 err = -ENOBUFS; in rtnl_getlink()
4184 * the driver just did a carrier off->on transition, we can in rtnl_getlink()
4192 nlh->nlmsg_seq, 0, 0, ext_filter_mask, in rtnl_getlink()
4195 /* -EMSGSIZE implies BUG in if_nlmsg_size */ in rtnl_getlink()
4196 WARN_ON(err == -EMSGSIZE); in rtnl_getlink()
4214 err = nla_validate(attr, attr->nla_len, IFLA_MAX, ifla_policy, extack); in rtnl_alt_ifname()
4224 return -EINVAL; in rtnl_alt_ifname()
4230 return -ENOMEM; in rtnl_alt_ifname()
4240 err = -EINVAL; in rtnl_alt_ifname()
4252 struct net *net = sock_net(skb->sk); in rtnl_linkprop()
4269 if (ifm->ifi_index > 0) in rtnl_linkprop()
4270 dev = __dev_get_by_index(net, ifm->ifi_index); in rtnl_linkprop()
4274 return -EINVAL; in rtnl_linkprop()
4277 return -ENODEV; in rtnl_linkprop()
4312 struct net *net = sock_net(skb->sk); in rtnl_calcit()
4319 /* Same kernel<->userspace interface hack as in rtnl_dump_ifinfo. */ in rtnl_calcit()
4323 if (nlh->nlmsg_len < nlmsg_msg_size(hdrlen)) in rtnl_calcit()
4352 int s_idx = cb->family; in rtnl_dump_all()
4353 int type = cb->nlh->nlmsg_type - RTM_BASE; in rtnl_dump_all()
4378 dumpit = link->dumpit; in rtnl_dump_all()
4383 memset(&cb->args[0], 0, sizeof(cb->args)); in rtnl_dump_all()
4384 cb->prev_seq = 0; in rtnl_dump_all()
4385 cb->seq = 0; in rtnl_dump_all()
4391 cb->family = idx; in rtnl_dump_all()
4393 return skb->len ? : ret; in rtnl_dump_all()
4404 int err = -ENOBUFS; in rtmsg_ifinfo_build_skb()
4418 new_nsid, new_ifindex, -1, flags); in rtmsg_ifinfo_build_skb()
4420 /* -EMSGSIZE implies BUG in if_nlmsg_size() */ in rtmsg_ifinfo_build_skb()
4421 WARN_ON(err == -EMSGSIZE); in rtmsg_ifinfo_build_skb()
4446 if (dev->reg_state != NETREG_REGISTERED) in rtmsg_ifinfo_event()
4480 return -EMSGSIZE; in nlmsg_populate_fdb_fill()
4483 ndm->ndm_family = AF_BRIDGE; in nlmsg_populate_fdb_fill()
4484 ndm->ndm_pad1 = 0; in nlmsg_populate_fdb_fill()
4485 ndm->ndm_pad2 = 0; in nlmsg_populate_fdb_fill()
4486 ndm->ndm_flags = flags; in nlmsg_populate_fdb_fill()
4487 ndm->ndm_type = 0; in nlmsg_populate_fdb_fill()
4488 ndm->ndm_ifindex = dev->ifindex; in nlmsg_populate_fdb_fill()
4489 ndm->ndm_state = ndm_state; in nlmsg_populate_fdb_fill()
4491 if (nla_put(skb, NDA_LLADDR, dev->addr_len, addr)) in nlmsg_populate_fdb_fill()
4502 return -EMSGSIZE; in nlmsg_populate_fdb_fill()
4508 nla_total_size(dev->addr_len) + /* NDA_LLADDR */ in rtnl_fdb_nlmsg_size()
4518 int err = -ENOBUFS; in rtnl_fdb_notify()
4538 * ndo_dflt_fdb_add - default netdevice operation to add an FDB entry
4546 int err = -EINVAL; in ndo_dflt_fdb_add()
4551 if (ndm->ndm_state && !(ndm->ndm_state & NUD_PERMANENT)) { in ndo_dflt_fdb_add()
4572 if (err == -EEXIST && !(flags & NLM_F_EXCL)) in ndo_dflt_fdb_add()
4587 return -EINVAL; in fdb_vid_parse()
4594 return -EINVAL; in fdb_vid_parse()
4604 struct net *net = sock_net(skb->sk); in rtnl_fdb_add()
4618 if (ndm->ndm_ifindex == 0) { in rtnl_fdb_add()
4620 return -EINVAL; in rtnl_fdb_add()
4623 dev = __dev_get_by_index(net, ndm->ndm_ifindex); in rtnl_fdb_add()
4626 return -ENODEV; in rtnl_fdb_add()
4631 return -EINVAL; in rtnl_fdb_add()
4634 if (dev->type != ARPHRD_ETHER) { in rtnl_fdb_add()
4636 return -EINVAL; in rtnl_fdb_add()
4645 err = -EOPNOTSUPP; in rtnl_fdb_add()
4648 if ((!ndm->ndm_flags || ndm->ndm_flags & NTF_MASTER) && in rtnl_fdb_add()
4651 const struct net_device_ops *ops = br_dev->netdev_ops; in rtnl_fdb_add()
4654 err = ops->ndo_fdb_add(ndm, tb, dev, addr, vid, in rtnl_fdb_add()
4655 nlh->nlmsg_flags, ¬ified, extack); in rtnl_fdb_add()
4659 ndm->ndm_flags &= ~NTF_MASTER; in rtnl_fdb_add()
4663 if ((ndm->ndm_flags & NTF_SELF)) { in rtnl_fdb_add()
4666 if (dev->netdev_ops->ndo_fdb_add) in rtnl_fdb_add()
4667 err = dev->netdev_ops->ndo_fdb_add(ndm, tb, dev, addr, in rtnl_fdb_add()
4669 nlh->nlmsg_flags, in rtnl_fdb_add()
4673 nlh->nlmsg_flags); in rtnl_fdb_add()
4677 ndm->ndm_state); in rtnl_fdb_add()
4678 ndm->ndm_flags &= ~NTF_SELF; in rtnl_fdb_add()
4686 * ndo_dflt_fdb_del - default netdevice operation to delete an FDB entry
4693 int err = -EINVAL; in ndo_dflt_fdb_del()
4698 if (!(ndm->ndm_state & NUD_PERMANENT)) { in ndo_dflt_fdb_del()
4715 bool del_bulk = !!(nlh->nlmsg_flags & NLM_F_BULK); in rtnl_fdb_del()
4716 struct net *net = sock_net(skb->sk); in rtnl_fdb_del()
4738 if (ndm->ndm_ifindex == 0) { in rtnl_fdb_del()
4740 return -EINVAL; in rtnl_fdb_del()
4743 dev = __dev_get_by_index(net, ndm->ndm_ifindex); in rtnl_fdb_del()
4746 return -ENODEV; in rtnl_fdb_del()
4752 return -EINVAL; in rtnl_fdb_del()
4761 if (dev->type != ARPHRD_ETHER) { in rtnl_fdb_del()
4763 return -EINVAL; in rtnl_fdb_del()
4766 err = -EOPNOTSUPP; in rtnl_fdb_del()
4769 if ((!ndm->ndm_flags || ndm->ndm_flags & NTF_MASTER) && in rtnl_fdb_del()
4774 ops = br_dev->netdev_ops; in rtnl_fdb_del()
4776 if (ops->ndo_fdb_del) in rtnl_fdb_del()
4777 err = ops->ndo_fdb_del(ndm, tb, dev, addr, vid, in rtnl_fdb_del()
4780 if (ops->ndo_fdb_del_bulk) in rtnl_fdb_del()
4781 err = ops->ndo_fdb_del_bulk(nlh, dev, extack); in rtnl_fdb_del()
4787 ndm->ndm_flags &= ~NTF_MASTER; in rtnl_fdb_del()
4791 if (ndm->ndm_flags & NTF_SELF) { in rtnl_fdb_del()
4794 ops = dev->netdev_ops; in rtnl_fdb_del()
4796 if (ops->ndo_fdb_del) in rtnl_fdb_del()
4797 err = ops->ndo_fdb_del(ndm, tb, dev, addr, vid, in rtnl_fdb_del()
4803 err = -EOPNOTSUPP; in rtnl_fdb_del()
4804 if (ops->ndo_fdb_del_bulk) in rtnl_fdb_del()
4805 err = ops->ndo_fdb_del_bulk(nlh, dev, extack); in rtnl_fdb_del()
4811 ndm->ndm_state); in rtnl_fdb_del()
4812 ndm->ndm_flags &= ~NTF_SELF; in rtnl_fdb_del()
4825 struct ndo_fdb_dump_context *ctx = (void *)cb->ctx; in nlmsg_populate_fdb()
4830 portid = NETLINK_CB(cb->skb).portid; in nlmsg_populate_fdb()
4831 seq = cb->nlh->nlmsg_seq; in nlmsg_populate_fdb()
4833 list_for_each_entry(ha, &list->list, list) { in nlmsg_populate_fdb()
4834 if (*idx < ctx->fdb_idx) in nlmsg_populate_fdb()
4837 err = nlmsg_populate_fdb_fill(skb, dev, ha->addr, 0, in nlmsg_populate_fdb()
4850 * ndo_dflt_fdb_dump - default netdevice operation to dump an FDB table.
4868 if (dev->type != ARPHRD_ETHER) in ndo_dflt_fdb_dump()
4869 return -EINVAL; in ndo_dflt_fdb_dump()
4872 err = nlmsg_populate_fdb(skb, cb, dev, idx, &dev->uc); in ndo_dflt_fdb_dump()
4875 err = nlmsg_populate_fdb(skb, cb, dev, idx, &dev->mc); in ndo_dflt_fdb_dump()
4893 return -EINVAL; in valid_fdb_dump_strict()
4896 if (ndm->ndm_pad1 || ndm->ndm_pad2 || ndm->ndm_state || in valid_fdb_dump_strict()
4897 ndm->ndm_flags || ndm->ndm_type) { in valid_fdb_dump_strict()
4899 return -EINVAL; in valid_fdb_dump_strict()
4907 *brport_idx = ndm->ndm_ifindex; in valid_fdb_dump_strict()
4916 return -EINVAL; in valid_fdb_dump_strict()
4923 return -EINVAL; in valid_fdb_dump_strict()
4929 return -EINVAL; in valid_fdb_dump_strict()
4943 /* A hack to preserve kernel<->userspace interface. in valid_fdb_dump_legacy()
4959 return -EINVAL; in valid_fdb_dump_legacy()
4966 *brport_idx = ifm->ifi_index; in valid_fdb_dump_legacy()
4974 struct ndo_fdb_dump_context *ctx = (void *)cb->ctx; in rtnl_fdb_dump()
4976 struct net *net = sock_net(skb->sk); in rtnl_fdb_dump()
4984 if (cb->strict_check) in rtnl_fdb_dump()
4985 err = valid_fdb_dump_strict(cb->nlh, &br_idx, &brport_idx, in rtnl_fdb_dump()
4986 cb->extack); in rtnl_fdb_dump()
4988 err = valid_fdb_dump_legacy(cb->nlh, &br_idx, &brport_idx, in rtnl_fdb_dump()
4989 cb->extack); in rtnl_fdb_dump()
4996 return -ENODEV; in rtnl_fdb_dump()
4998 ops = br_dev->netdev_ops; in rtnl_fdb_dump()
5001 for_each_netdev_dump(net, dev, ctx->ifindex) { in rtnl_fdb_dump()
5002 if (brport_idx && (dev->ifindex != brport_idx)) in rtnl_fdb_dump()
5008 cops = br_dev->netdev_ops; in rtnl_fdb_dump()
5022 if (cops && cops->ndo_fdb_dump) { in rtnl_fdb_dump()
5023 err = cops->ndo_fdb_dump(skb, cb, br_dev, dev, in rtnl_fdb_dump()
5025 if (err == -EMSGSIZE) in rtnl_fdb_dump()
5030 if (dev->netdev_ops->ndo_fdb_dump) in rtnl_fdb_dump()
5031 err = dev->netdev_ops->ndo_fdb_dump(skb, cb, dev, NULL, in rtnl_fdb_dump()
5035 if (err == -EMSGSIZE) in rtnl_fdb_dump()
5041 ctx->fdb_idx = 0; in rtnl_fdb_dump()
5045 ctx->fdb_idx = fidx; in rtnl_fdb_dump()
5047 return skb->len; in rtnl_fdb_dump()
5061 return -EINVAL; in valid_fdb_get_strict()
5064 if (ndm->ndm_pad1 || ndm->ndm_pad2 || ndm->ndm_state || in valid_fdb_get_strict()
5065 ndm->ndm_type) { in valid_fdb_get_strict()
5067 return -EINVAL; in valid_fdb_get_strict()
5070 if (ndm->ndm_flags & ~(NTF_MASTER | NTF_SELF)) { in valid_fdb_get_strict()
5072 return -EINVAL; in valid_fdb_get_strict()
5080 *ndm_flags = ndm->ndm_flags; in valid_fdb_get_strict()
5081 *brport_idx = ndm->ndm_ifindex; in valid_fdb_get_strict()
5093 return -EINVAL; in valid_fdb_get_strict()
5106 return -EINVAL; in valid_fdb_get_strict()
5118 struct net *net = sock_net(in_skb->sk); in rtnl_fdb_get()
5135 return -EINVAL; in rtnl_fdb_get()
5142 return -ENODEV; in rtnl_fdb_get()
5149 return -EINVAL; in rtnl_fdb_get()
5155 return -EINVAL; in rtnl_fdb_get()
5157 ops = br_dev->netdev_ops; in rtnl_fdb_get()
5164 return -EINVAL; in rtnl_fdb_get()
5169 return -EINVAL; in rtnl_fdb_get()
5171 ops = br_dev->netdev_ops; in rtnl_fdb_get()
5175 return -EINVAL; in rtnl_fdb_get()
5177 ops = dev->netdev_ops; in rtnl_fdb_get()
5183 return -ENODEV; in rtnl_fdb_get()
5186 if (!ops || !ops->ndo_fdb_get) { in rtnl_fdb_get()
5188 return -EOPNOTSUPP; in rtnl_fdb_get()
5193 return -ENOBUFS; in rtnl_fdb_get()
5197 err = ops->ndo_fdb_get(skb, tb, dev, addr, vid, in rtnl_fdb_get()
5199 nlh->nlmsg_seq, extack); in rtnl_fdb_get()
5229 u8 operstate = netif_running(dev) ? dev->operstate : IF_OPER_DOWN; in ndo_dflt_bridge_getlink()
5235 return -EMSGSIZE; in ndo_dflt_bridge_getlink()
5238 ifm->ifi_family = AF_BRIDGE; in ndo_dflt_bridge_getlink()
5239 ifm->__ifi_pad = 0; in ndo_dflt_bridge_getlink()
5240 ifm->ifi_type = dev->type; in ndo_dflt_bridge_getlink()
5241 ifm->ifi_index = dev->ifindex; in ndo_dflt_bridge_getlink()
5242 ifm->ifi_flags = netif_get_flags(dev); in ndo_dflt_bridge_getlink()
5243 ifm->ifi_change = 0; in ndo_dflt_bridge_getlink()
5246 if (nla_put_string(skb, IFLA_IFNAME, dev->name) || in ndo_dflt_bridge_getlink()
5247 nla_put_u32(skb, IFLA_MTU, dev->mtu) || in ndo_dflt_bridge_getlink()
5250 nla_put_u32(skb, IFLA_MASTER, br_dev->ifindex)) || in ndo_dflt_bridge_getlink()
5251 (dev->addr_len && in ndo_dflt_bridge_getlink()
5252 nla_put(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr)) || in ndo_dflt_bridge_getlink()
5253 (dev->ifindex != dev_get_iflink(dev) && in ndo_dflt_bridge_getlink()
5316 return err ? err : -EMSGSIZE; in ndo_dflt_bridge_getlink()
5333 return -EINVAL; in valid_bridge_getlink_req()
5336 if (ifm->__ifi_pad || ifm->ifi_type || ifm->ifi_flags || in valid_bridge_getlink_req()
5337 ifm->ifi_change || ifm->ifi_index) { in valid_bridge_getlink_req()
5339 return -EINVAL; in valid_bridge_getlink_req()
5366 return -EINVAL; in valid_bridge_getlink_req()
5376 const struct nlmsghdr *nlh = cb->nlh; in rtnl_bridge_getlink()
5377 struct net *net = sock_net(skb->sk); in rtnl_bridge_getlink()
5380 u32 portid = NETLINK_CB(cb->skb).portid; in rtnl_bridge_getlink()
5381 u32 seq = nlh->nlmsg_seq; in rtnl_bridge_getlink()
5385 err = valid_bridge_getlink_req(nlh, cb->strict_check, &filter_mask, in rtnl_bridge_getlink()
5386 cb->extack); in rtnl_bridge_getlink()
5387 if (err < 0 && cb->strict_check) in rtnl_bridge_getlink()
5392 const struct net_device_ops *ops = dev->netdev_ops; in rtnl_bridge_getlink()
5395 if (br_dev && br_dev->netdev_ops->ndo_bridge_getlink) { in rtnl_bridge_getlink()
5396 if (idx >= cb->args[0]) { in rtnl_bridge_getlink()
5397 err = br_dev->netdev_ops->ndo_bridge_getlink( in rtnl_bridge_getlink()
5400 if (err < 0 && err != -EOPNOTSUPP) { in rtnl_bridge_getlink()
5401 if (likely(skb->len)) in rtnl_bridge_getlink()
5410 if (ops->ndo_bridge_getlink) { in rtnl_bridge_getlink()
5411 if (idx >= cb->args[0]) { in rtnl_bridge_getlink()
5412 err = ops->ndo_bridge_getlink(skb, portid, in rtnl_bridge_getlink()
5416 if (err < 0 && err != -EOPNOTSUPP) { in rtnl_bridge_getlink()
5417 if (likely(skb->len)) in rtnl_bridge_getlink()
5426 err = skb->len; in rtnl_bridge_getlink()
5429 cb->args[0] = idx; in rtnl_bridge_getlink()
5453 int err = -EOPNOTSUPP; in rtnl_bridge_notify()
5455 if (!dev->netdev_ops->ndo_bridge_getlink) in rtnl_bridge_notify()
5460 err = -ENOMEM; in rtnl_bridge_notify()
5464 err = dev->netdev_ops->ndo_bridge_getlink(skb, 0, 0, dev, 0, 0); in rtnl_bridge_notify()
5472 if (!skb->len) in rtnl_bridge_notify()
5478 WARN_ON(err == -EMSGSIZE); in rtnl_bridge_notify()
5488 struct net *net = sock_net(skb->sk); in rtnl_bridge_setlink()
5492 int rem, err = -EOPNOTSUPP; in rtnl_bridge_setlink()
5496 return -EINVAL; in rtnl_bridge_setlink()
5499 if (ifm->ifi_family != AF_BRIDGE) in rtnl_bridge_setlink()
5500 return -EPFNOSUPPORT; in rtnl_bridge_setlink()
5502 dev = __dev_get_by_index(net, ifm->ifi_index); in rtnl_bridge_setlink()
5505 return -ENODEV; in rtnl_bridge_setlink()
5513 return -EINVAL; in rtnl_bridge_setlink()
5521 return -EINVAL; in rtnl_bridge_setlink()
5529 if (!br_dev || !br_dev->netdev_ops->ndo_bridge_setlink) { in rtnl_bridge_setlink()
5530 err = -EOPNOTSUPP; in rtnl_bridge_setlink()
5534 err = br_dev->netdev_ops->ndo_bridge_setlink(dev, nlh, flags, in rtnl_bridge_setlink()
5543 if (!dev->netdev_ops->ndo_bridge_setlink) in rtnl_bridge_setlink()
5544 err = -EOPNOTSUPP; in rtnl_bridge_setlink()
5546 err = dev->netdev_ops->ndo_bridge_setlink(dev, nlh, in rtnl_bridge_setlink()
5568 struct net *net = sock_net(skb->sk); in rtnl_bridge_dellink()
5572 int rem, err = -EOPNOTSUPP; in rtnl_bridge_dellink()
5577 return -EINVAL; in rtnl_bridge_dellink()
5580 if (ifm->ifi_family != AF_BRIDGE) in rtnl_bridge_dellink()
5581 return -EPFNOSUPPORT; in rtnl_bridge_dellink()
5583 dev = __dev_get_by_index(net, ifm->ifi_index); in rtnl_bridge_dellink()
5586 return -ENODEV; in rtnl_bridge_dellink()
5594 return -EINVAL; in rtnl_bridge_dellink()
5605 if (!br_dev || !br_dev->netdev_ops->ndo_bridge_dellink) { in rtnl_bridge_dellink()
5606 err = -EOPNOTSUPP; in rtnl_bridge_dellink()
5610 err = br_dev->netdev_ops->ndo_bridge_dellink(dev, nlh, flags); in rtnl_bridge_dellink()
5618 if (!dev->netdev_ops->ndo_bridge_dellink) in rtnl_bridge_dellink()
5619 err = -EOPNOTSUPP; in rtnl_bridge_dellink()
5621 err = dev->netdev_ops->ndo_bridge_dellink(dev, nlh, in rtnl_bridge_dellink()
5649 return dev->netdev_ops && in rtnl_offload_xstats_have_ndo()
5650 dev->netdev_ops->ndo_has_offload_stats && in rtnl_offload_xstats_have_ndo()
5651 dev->netdev_ops->ndo_get_offload_stats && in rtnl_offload_xstats_have_ndo()
5652 dev->netdev_ops->ndo_has_offload_stats(dev, attr_id); in rtnl_offload_xstats_have_ndo()
5672 return -ENODATA; in rtnl_offload_xstats_fill_ndo()
5677 return -EMSGSIZE; in rtnl_offload_xstats_fill_ndo()
5682 err = dev->netdev_ops->ndo_get_offload_stats(attr_id, dev, attr_data); in rtnl_offload_xstats_fill_ndo()
5726 ru->request = request; in rtnl_offload_xstats_get_stats()
5727 ru->used = used; in rtnl_offload_xstats_get_stats()
5736 struct nlattr *nest; in rtnl_offload_xstats_fill_hw_s_info_one() local
5738 nest = nla_nest_start(skb, attr_id); in rtnl_offload_xstats_fill_hw_s_info_one()
5739 if (!nest) in rtnl_offload_xstats_fill_hw_s_info_one()
5740 return -EMSGSIZE; in rtnl_offload_xstats_fill_hw_s_info_one()
5742 if (nla_put_u8(skb, IFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST, ru->request)) in rtnl_offload_xstats_fill_hw_s_info_one()
5745 if (nla_put_u8(skb, IFLA_OFFLOAD_XSTATS_HW_S_INFO_USED, ru->used)) in rtnl_offload_xstats_fill_hw_s_info_one()
5748 nla_nest_end(skb, nest); in rtnl_offload_xstats_fill_hw_s_info_one()
5752 nla_nest_cancel(skb, nest); in rtnl_offload_xstats_fill_hw_s_info_one()
5753 return -EMSGSIZE; in rtnl_offload_xstats_fill_hw_s_info_one()
5762 struct nlattr *nest; in rtnl_offload_xstats_fill_hw_s_info() local
5769 nest = nla_nest_start(skb, IFLA_OFFLOAD_XSTATS_HW_S_INFO); in rtnl_offload_xstats_fill_hw_s_info()
5770 if (!nest) in rtnl_offload_xstats_fill_hw_s_info()
5771 return -EMSGSIZE; in rtnl_offload_xstats_fill_hw_s_info()
5778 nla_nest_end(skb, nest); in rtnl_offload_xstats_fill_hw_s_info()
5782 nla_nest_cancel(skb, nest); in rtnl_offload_xstats_fill_hw_s_info()
5783 return -EMSGSIZE; in rtnl_offload_xstats_fill_hw_s_info()
5803 } else if (err != -ENODATA) { in rtnl_offload_xstats_fill()
5834 return -EMSGSIZE; in rtnl_offload_xstats_fill()
5847 return -ENODATA; in rtnl_offload_xstats_fill()
5920 unsigned int filter_mask = filters->mask[0]; in rtnl_fill_statsinfo()
5931 return -EMSGSIZE; in rtnl_fill_statsinfo()
5934 ifsm->family = PF_UNSPEC; in rtnl_fill_statsinfo()
5935 ifsm->pad1 = 0; in rtnl_fill_statsinfo()
5936 ifsm->pad2 = 0; in rtnl_fill_statsinfo()
5937 ifsm->ifindex = dev->ifindex; in rtnl_fill_statsinfo()
5938 ifsm->filter_mask = filter_mask; in rtnl_fill_statsinfo()
5947 err = -EMSGSIZE; in rtnl_fill_statsinfo()
5956 const struct rtnl_link_ops *ops = dev->rtnl_link_ops; in rtnl_fill_statsinfo()
5958 if (ops && ops->fill_linkxstats) { in rtnl_fill_statsinfo()
5963 err = -EMSGSIZE; in rtnl_fill_statsinfo()
5967 err = ops->fill_linkxstats(skb, dev, prividx, *idxattr); in rtnl_fill_statsinfo()
5982 ops = master->rtnl_link_ops; in rtnl_fill_statsinfo()
5983 if (ops && ops->fill_linkxstats) { in rtnl_fill_statsinfo()
5988 err = -EMSGSIZE; in rtnl_fill_statsinfo()
5992 err = ops->fill_linkxstats(skb, dev, prividx, *idxattr); in rtnl_fill_statsinfo()
6004 off_filter_mask = filters->mask[IFLA_STATS_LINK_OFFLOAD_XSTATS]; in rtnl_fill_statsinfo()
6009 err = -EMSGSIZE; in rtnl_fill_statsinfo()
6015 if (err == -ENODATA) in rtnl_fill_statsinfo()
6020 if (err && err != -ENODATA) in rtnl_fill_statsinfo()
6031 err = -EMSGSIZE; in rtnl_fill_statsinfo()
6037 if (af_ops->fill_stats_af) { in rtnl_fill_statsinfo()
6041 af_ops->family); in rtnl_fill_statsinfo()
6044 err = -EMSGSIZE; in rtnl_fill_statsinfo()
6047 err = af_ops->fill_stats_af(skb, dev); in rtnl_fill_statsinfo()
6049 if (err == -ENODATA) { in rtnl_fill_statsinfo()
6084 unsigned int filter_mask = filters->mask[0]; in if_nlmsg_stats_size()
6090 const struct rtnl_link_ops *ops = dev->rtnl_link_ops; in if_nlmsg_stats_size()
6093 if (ops && ops->get_linkxstats_size) { in if_nlmsg_stats_size()
6094 size += nla_total_size(ops->get_linkxstats_size(dev, in if_nlmsg_stats_size()
6109 ops = master->rtnl_link_ops; in if_nlmsg_stats_size()
6110 if (ops && ops->get_linkxstats_size) { in if_nlmsg_stats_size()
6113 size += nla_total_size(ops->get_linkxstats_size(dev, in if_nlmsg_stats_size()
6123 off_filter_mask = filters->mask[IFLA_STATS_LINK_OFFLOAD_XSTATS]; in if_nlmsg_stats_size()
6135 if (af_ops->get_stats_af_size) { in if_nlmsg_stats_size()
6137 af_ops->get_stats_af_size(dev)); in if_nlmsg_stats_size()
6149 #define RTNL_STATS_OFFLOAD_XSTATS_VALID ((1 << __IFLA_OFFLOAD_XSTATS_MAX) - 1)
6183 if (!(filters->mask[0] & IFLA_STATS_FILTER_BIT(at))) { in rtnl_stats_get_parse_filters()
6185 return -EINVAL; in rtnl_stats_get_parse_filters()
6187 filters->mask[at] = nla_get_u32(tb[at]); in rtnl_stats_get_parse_filters()
6203 filters->mask[0] = filter_mask; in rtnl_stats_get_parse()
6204 for (i = 1; i < ARRAY_SIZE(filters->mask); i++) in rtnl_stats_get_parse()
6205 filters->mask[i] = -1U; in rtnl_stats_get_parse()
6230 return -EINVAL; in rtnl_valid_stats_req()
6239 if (ifsm->pad1 || ifsm->pad2 || (is_dump && ifsm->ifindex)) { in rtnl_valid_stats_req()
6241 return -EINVAL; in rtnl_valid_stats_req()
6243 if (ifsm->filter_mask >= IFLA_STATS_FILTER_BIT(IFLA_STATS_MAX + 1)) { in rtnl_valid_stats_req()
6245 return -EINVAL; in rtnl_valid_stats_req()
6255 struct net *net = sock_net(skb->sk); in rtnl_stats_get()
6268 if (ifsm->ifindex > 0) in rtnl_stats_get()
6269 dev = __dev_get_by_index(net, ifsm->ifindex); in rtnl_stats_get()
6271 return -EINVAL; in rtnl_stats_get()
6274 return -ENODEV; in rtnl_stats_get()
6276 if (!ifsm->filter_mask) { in rtnl_stats_get()
6278 return -EINVAL; in rtnl_stats_get()
6281 err = rtnl_stats_get_parse(nlh, ifsm->filter_mask, &filters, extack); in rtnl_stats_get()
6287 return -ENOBUFS; in rtnl_stats_get()
6290 NETLINK_CB(skb).portid, nlh->nlmsg_seq, 0, in rtnl_stats_get()
6293 /* -EMSGSIZE implies BUG in if_nlmsg_stats_size */ in rtnl_stats_get()
6294 WARN_ON(err == -EMSGSIZE); in rtnl_stats_get()
6305 struct netlink_ext_ack *extack = cb->extack; in rtnl_stats_dump()
6307 struct net *net = sock_net(skb->sk); in rtnl_stats_dump()
6314 } *ctx = (void *)cb->ctx; in rtnl_stats_dump()
6318 cb->seq = net->dev_base_seq; in rtnl_stats_dump()
6320 err = rtnl_valid_stats_req(cb->nlh, cb->strict_check, true, extack); in rtnl_stats_dump()
6324 ifsm = nlmsg_data(cb->nlh); in rtnl_stats_dump()
6325 if (!ifsm->filter_mask) { in rtnl_stats_dump()
6327 return -EINVAL; in rtnl_stats_dump()
6330 err = rtnl_stats_get_parse(cb->nlh, ifsm->filter_mask, &filters, in rtnl_stats_dump()
6335 for_each_netdev_dump(net, dev, ctx->ifindex) { in rtnl_stats_dump()
6337 NETLINK_CB(cb->skb).portid, in rtnl_stats_dump()
6338 cb->nlh->nlmsg_seq, 0, in rtnl_stats_dump()
6340 &ctx->idxattr, &ctx->prividx, in rtnl_stats_dump()
6345 WARN_ON((err == -EMSGSIZE) && (skb->len == 0)); in rtnl_stats_dump()
6349 ctx->prividx = 0; in rtnl_stats_dump()
6350 ctx->idxattr = 0; in rtnl_stats_dump()
6363 int err = -ENOBUFS; in rtnl_offload_xstats_notify()
6398 struct net *net = sock_net(skb->sk); in rtnl_stats_set()
6410 if (ifsm->family != AF_UNSPEC) { in rtnl_stats_set()
6412 return -EINVAL; in rtnl_stats_set()
6415 if (ifsm->ifindex > 0) in rtnl_stats_set()
6416 dev = __dev_get_by_index(net, ifsm->ifindex); in rtnl_stats_set()
6418 return -EINVAL; in rtnl_stats_set()
6421 return -ENODEV; in rtnl_stats_set()
6423 if (ifsm->filter_mask) { in rtnl_stats_set()
6425 return -EINVAL; in rtnl_stats_set()
6443 else if (err != -EALREADY) in rtnl_stats_set()
6466 return -EINVAL; in rtnl_mdb_valid_dump_req()
6469 if (bpm->ifindex) { in rtnl_mdb_valid_dump_req()
6471 return -EINVAL; in rtnl_mdb_valid_dump_req()
6475 return -EINVAL; in rtnl_mdb_valid_dump_req()
6487 struct rtnl_mdb_dump_ctx *ctx = (void *)cb->ctx; in rtnl_mdb_dump()
6488 struct net *net = sock_net(skb->sk); in rtnl_mdb_dump()
6495 if (cb->strict_check) { in rtnl_mdb_dump()
6496 err = rtnl_mdb_valid_dump_req(cb->nlh, cb->extack); in rtnl_mdb_dump()
6501 s_idx = ctx->idx; in rtnl_mdb_dump()
6507 if (!dev->netdev_ops->ndo_mdb_dump) in rtnl_mdb_dump()
6510 err = dev->netdev_ops->ndo_mdb_dump(dev, skb, cb); in rtnl_mdb_dump()
6511 if (err == -EMSGSIZE) in rtnl_mdb_dump()
6514 * counters since they are all maintained per-device. in rtnl_mdb_dump()
6516 memset(cb->ctx, 0, sizeof(cb->ctx)); in rtnl_mdb_dump()
6517 cb->prev_seq = 0; in rtnl_mdb_dump()
6518 cb->seq = 0; in rtnl_mdb_dump()
6524 ctx->idx = idx; in rtnl_mdb_dump()
6525 return skb->len; in rtnl_mdb_dump()
6535 return -EINVAL; in rtnl_validate_mdb_entry_get()
6538 if (entry->ifindex) { in rtnl_validate_mdb_entry_get()
6540 return -EINVAL; in rtnl_validate_mdb_entry_get()
6543 if (entry->state) { in rtnl_validate_mdb_entry_get()
6545 return -EINVAL; in rtnl_validate_mdb_entry_get()
6548 if (entry->flags) { in rtnl_validate_mdb_entry_get()
6550 return -EINVAL; in rtnl_validate_mdb_entry_get()
6553 if (entry->vid >= VLAN_VID_MASK) { in rtnl_validate_mdb_entry_get()
6555 return -EINVAL; in rtnl_validate_mdb_entry_get()
6558 if (entry->addr.proto != htons(ETH_P_IP) && in rtnl_validate_mdb_entry_get()
6559 entry->addr.proto != htons(ETH_P_IPV6) && in rtnl_validate_mdb_entry_get()
6560 entry->addr.proto != 0) { in rtnl_validate_mdb_entry_get()
6562 return -EINVAL; in rtnl_validate_mdb_entry_get()
6579 struct net *net = sock_net(in_skb->sk); in rtnl_mdb_get()
6590 if (!bpm->ifindex) { in rtnl_mdb_get()
6592 return -EINVAL; in rtnl_mdb_get()
6595 dev = __dev_get_by_index(net, bpm->ifindex); in rtnl_mdb_get()
6598 return -ENODEV; in rtnl_mdb_get()
6603 return -EINVAL; in rtnl_mdb_get()
6606 if (!dev->netdev_ops->ndo_mdb_get) { in rtnl_mdb_get()
6608 return -EOPNOTSUPP; in rtnl_mdb_get()
6611 return dev->netdev_ops->ndo_mdb_get(dev, tb, NETLINK_CB(in_skb).portid, in rtnl_mdb_get()
6612 nlh->nlmsg_seq, extack); in rtnl_mdb_get()
6622 return -EINVAL; in rtnl_validate_mdb_entry()
6625 if (entry->ifindex == 0) { in rtnl_validate_mdb_entry()
6627 return -EINVAL; in rtnl_validate_mdb_entry()
6630 if (entry->addr.proto == htons(ETH_P_IP)) { in rtnl_validate_mdb_entry()
6631 if (!ipv4_is_multicast(entry->addr.u.ip4) && in rtnl_validate_mdb_entry()
6632 !ipv4_is_zeronet(entry->addr.u.ip4)) { in rtnl_validate_mdb_entry()
6634 return -EINVAL; in rtnl_validate_mdb_entry()
6636 if (ipv4_is_local_multicast(entry->addr.u.ip4)) { in rtnl_validate_mdb_entry()
6638 return -EINVAL; in rtnl_validate_mdb_entry()
6641 } else if (entry->addr.proto == htons(ETH_P_IPV6)) { in rtnl_validate_mdb_entry()
6642 if (ipv6_addr_is_ll_all_nodes(&entry->addr.u.ip6)) { in rtnl_validate_mdb_entry()
6643 NL_SET_ERR_MSG(extack, "IPv6 entry group address is link-local all nodes"); in rtnl_validate_mdb_entry()
6644 return -EINVAL; in rtnl_validate_mdb_entry()
6647 } else if (entry->addr.proto == 0) { in rtnl_validate_mdb_entry()
6649 if (!is_multicast_ether_addr(entry->addr.u.mac_addr)) { in rtnl_validate_mdb_entry()
6651 return -EINVAL; in rtnl_validate_mdb_entry()
6655 return -EINVAL; in rtnl_validate_mdb_entry()
6658 if (entry->state != MDB_PERMANENT && entry->state != MDB_TEMPORARY) { in rtnl_validate_mdb_entry()
6660 return -EINVAL; in rtnl_validate_mdb_entry()
6662 if (entry->vid >= VLAN_VID_MASK) { in rtnl_validate_mdb_entry()
6664 return -EINVAL; in rtnl_validate_mdb_entry()
6682 struct net *net = sock_net(skb->sk); in rtnl_mdb_add()
6693 if (!bpm->ifindex) { in rtnl_mdb_add()
6695 return -EINVAL; in rtnl_mdb_add()
6698 dev = __dev_get_by_index(net, bpm->ifindex); in rtnl_mdb_add()
6701 return -ENODEV; in rtnl_mdb_add()
6706 return -EINVAL; in rtnl_mdb_add()
6709 if (!dev->netdev_ops->ndo_mdb_add) { in rtnl_mdb_add()
6711 return -EOPNOTSUPP; in rtnl_mdb_add()
6714 return dev->netdev_ops->ndo_mdb_add(dev, tb, nlh->nlmsg_flags, extack); in rtnl_mdb_add()
6725 return -EINVAL; in rtnl_validate_mdb_entry_del_bulk()
6728 if (entry->state != MDB_PERMANENT && entry->state != MDB_TEMPORARY) { in rtnl_validate_mdb_entry_del_bulk()
6730 return -EINVAL; in rtnl_validate_mdb_entry_del_bulk()
6733 if (entry->flags) { in rtnl_validate_mdb_entry_del_bulk()
6735 return -EINVAL; in rtnl_validate_mdb_entry_del_bulk()
6738 if (entry->vid >= VLAN_N_VID - 1) { in rtnl_validate_mdb_entry_del_bulk()
6740 return -EINVAL; in rtnl_validate_mdb_entry_del_bulk()
6743 if (memcmp(&entry->addr, &zero_entry.addr, sizeof(entry->addr))) { in rtnl_validate_mdb_entry_del_bulk()
6745 return -EINVAL; in rtnl_validate_mdb_entry_del_bulk()
6761 bool del_bulk = !!(nlh->nlmsg_flags & NLM_F_BULK); in rtnl_mdb_del()
6763 struct net *net = sock_net(skb->sk); in rtnl_mdb_del()
6779 if (!bpm->ifindex) { in rtnl_mdb_del()
6781 return -EINVAL; in rtnl_mdb_del()
6784 dev = __dev_get_by_index(net, bpm->ifindex); in rtnl_mdb_del()
6787 return -ENODEV; in rtnl_mdb_del()
6792 return -EINVAL; in rtnl_mdb_del()
6796 if (!dev->netdev_ops->ndo_mdb_del_bulk) { in rtnl_mdb_del()
6798 return -EOPNOTSUPP; in rtnl_mdb_del()
6800 return dev->netdev_ops->ndo_mdb_del_bulk(dev, tb, extack); in rtnl_mdb_del()
6803 if (!dev->netdev_ops->ndo_mdb_del) { in rtnl_mdb_del()
6805 return -EOPNOTSUPP; in rtnl_mdb_del()
6808 return dev->netdev_ops->ndo_mdb_del(dev, tb, extack); in rtnl_mdb_del()
6815 const bool needs_lock = !(cb->flags & RTNL_FLAG_DUMP_UNLOCKED); in rtnl_dumpit()
6816 rtnl_dumpit_func dumpit = cb->data; in rtnl_dumpit()
6819 /* Previous iteration have already finished, avoid calling->dumpit() in rtnl_dumpit()
6834 if (cb->flags & RTNL_FLAG_DUMP_SPLIT_NLM_DONE) { in rtnl_dumpit()
6835 if (err < 0 && err != -EMSGSIZE) in rtnl_dumpit()
6838 cb->data = NULL; in rtnl_dumpit()
6840 return skb->len; in rtnl_dumpit()
6849 if (control->flags & RTNL_FLAG_DUMP_SPLIT_NLM_DONE || in rtnetlink_dump_start()
6850 !(control->flags & RTNL_FLAG_DUMP_UNLOCKED)) { in rtnetlink_dump_start()
6851 WARN_ON(control->data); in rtnetlink_dump_start()
6852 control->data = control->dump; in rtnetlink_dump_start()
6853 control->dump = rtnl_dumpit; in rtnetlink_dump_start()
6862 struct net *net = sock_net(skb->sk); in rtnetlink_rcv_msg()
6866 int err = -EOPNOTSUPP; in rtnetlink_rcv_msg()
6872 type = nlh->nlmsg_type; in rtnetlink_rcv_msg()
6874 return -EOPNOTSUPP; in rtnetlink_rcv_msg()
6876 type -= RTM_BASE; in rtnetlink_rcv_msg()
6882 family = ((struct rtgenmsg *)nlmsg_data(nlh))->rtgen_family; in rtnetlink_rcv_msg()
6886 return -EPERM; in rtnetlink_rcv_msg()
6889 if (kind == RTNL_KIND_GET && (nlh->nlmsg_flags & NLM_F_DUMP)) { in rtnetlink_rcv_msg()
6895 if (!link || !link->dumpit) { in rtnetlink_rcv_msg()
6898 if (!link || !link->dumpit) in rtnetlink_rcv_msg()
6901 owner = link->owner; in rtnetlink_rcv_msg()
6902 dumpit = link->dumpit; in rtnetlink_rcv_msg()
6903 flags = link->flags; in rtnetlink_rcv_msg()
6905 if (type == RTM_GETLINK - RTM_BASE) in rtnetlink_rcv_msg()
6911 err = -EPROTONOSUPPORT; in rtnetlink_rcv_msg()
6915 rtnl = net->rtnl; in rtnetlink_rcv_msg()
6933 if (!link || !link->doit) { in rtnetlink_rcv_msg()
6936 if (!link || !link->doit) in rtnetlink_rcv_msg()
6940 owner = link->owner; in rtnetlink_rcv_msg()
6942 err = -EPROTONOSUPPORT; in rtnetlink_rcv_msg()
6946 flags = link->flags; in rtnetlink_rcv_msg()
6947 if (kind == RTNL_KIND_DEL && (nlh->nlmsg_flags & NLM_F_BULK) && in rtnetlink_rcv_msg()
6955 doit = link->doit; in rtnetlink_rcv_msg()
6966 if (link && link->doit) in rtnetlink_rcv_msg()
6967 err = link->doit(skb, nlh, extack); in rtnetlink_rcv_msg()
6980 return -EOPNOTSUPP; in rtnetlink_rcv_msg()
6993 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) in rtnetlink_bind()
6994 return -EPERM; in rtnetlink_bind()
7044 return -ENOMEM; in rtnetlink_net_init()
7045 net->rtnl = sk; in rtnetlink_net_init()
7051 netlink_kernel_release(net->rtnl); in rtnetlink_net_exit()
7052 net->rtnl = NULL; in rtnetlink_net_exit()