1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __NET_RTNETLINK_H 3 #define __NET_RTNETLINK_H 4 5 #include <linux/rtnetlink.h> 6 #include <linux/srcu.h> 7 #include <net/netlink.h> 8 9 typedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, 10 struct netlink_ext_ack *); 11 typedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *); 12 13 enum rtnl_link_flags { 14 RTNL_FLAG_DOIT_UNLOCKED = BIT(0), 15 #define RTNL_FLAG_DOIT_PERNET RTNL_FLAG_DOIT_UNLOCKED 16 RTNL_FLAG_BULK_DEL_SUPPORTED = BIT(1), 17 RTNL_FLAG_DUMP_UNLOCKED = BIT(2), 18 RTNL_FLAG_DUMP_SPLIT_NLM_DONE = BIT(3), /* legacy behavior */ 19 }; 20 21 enum rtnl_kinds { 22 RTNL_KIND_NEW, 23 RTNL_KIND_DEL, 24 RTNL_KIND_GET, 25 RTNL_KIND_SET 26 }; 27 #define RTNL_KIND_MASK 0x3 28 29 static inline enum rtnl_kinds rtnl_msgtype_kind(int msgtype) 30 { 31 return msgtype & RTNL_KIND_MASK; 32 } 33 34 /** 35 * struct rtnl_msg_handler - rtnetlink message type and handlers 36 * 37 * @owner: NULL for built-in, THIS_MODULE for module 38 * @protocol: Protocol family or PF_UNSPEC 39 * @msgtype: rtnetlink message type 40 * @doit: Function pointer called for each request message 41 * @dumpit: Function pointer called for each dump request (NLM_F_DUMP) message 42 * @flags: rtnl_link_flags to modify behaviour of doit/dumpit functions 43 */ 44 struct rtnl_msg_handler { 45 struct module *owner; 46 int protocol; 47 int msgtype; 48 rtnl_doit_func doit; 49 rtnl_dumpit_func dumpit; 50 int flags; 51 }; 52 53 void rtnl_unregister_all(int protocol); 54 55 int __rtnl_register_many(const struct rtnl_msg_handler *handlers, int n); 56 void __rtnl_unregister_many(const struct rtnl_msg_handler *handlers, int n); 57 58 #define rtnl_register_many(handlers) \ 59 __rtnl_register_many(handlers, ARRAY_SIZE(handlers)) 60 #define rtnl_unregister_many(handlers) \ 61 __rtnl_unregister_many(handlers, ARRAY_SIZE(handlers)) 62 63 static inline int rtnl_msg_family(const struct nlmsghdr *nlh) 64 { 65 if (nlmsg_len(nlh) >= sizeof(struct rtgenmsg)) 66 return ((struct rtgenmsg *) nlmsg_data(nlh))->rtgen_family; 67 else 68 return AF_UNSPEC; 69 } 70 71 /** 72 * struct rtnl_link_ops - rtnetlink link operations 73 * 74 * @list: Used internally, protected by RTNL and SRCU 75 * @srcu: Used internally 76 * @kind: Identifier 77 * @netns_refund: Physical device, move to init_net on netns exit 78 * @maxtype: Highest device specific netlink attribute number 79 * @policy: Netlink policy for device specific attribute validation 80 * @validate: Optional validation function for netlink/changelink parameters 81 * @alloc: netdev allocation function, can be %NULL and is then used 82 * in place of alloc_netdev_mqs(), in this case @priv_size 83 * and @setup are unused. Returns a netdev or ERR_PTR(). 84 * @priv_size: sizeof net_device private space 85 * @setup: net_device setup function 86 * @newlink: Function for configuring and registering a new device 87 * @changelink: Function for changing parameters of an existing device 88 * @dellink: Function to remove a device 89 * @get_size: Function to calculate required room for dumping device 90 * specific netlink attributes 91 * @fill_info: Function to dump device specific netlink attributes 92 * @get_xstats_size: Function to calculate required room for dumping device 93 * specific statistics 94 * @fill_xstats: Function to dump device specific statistics 95 * @get_num_tx_queues: Function to determine number of transmit queues 96 * to create when creating a new device. 97 * @get_num_rx_queues: Function to determine number of receive queues 98 * to create when creating a new device. 99 * @get_link_net: Function to get the i/o netns of the device 100 * @get_linkxstats_size: Function to calculate the required room for 101 * dumping device-specific extended link stats 102 * @fill_linkxstats: Function to dump device-specific extended link stats 103 */ 104 struct rtnl_link_ops { 105 struct list_head list; 106 struct srcu_struct srcu; 107 108 const char *kind; 109 110 size_t priv_size; 111 struct net_device *(*alloc)(struct nlattr *tb[], 112 const char *ifname, 113 unsigned char name_assign_type, 114 unsigned int num_tx_queues, 115 unsigned int num_rx_queues); 116 void (*setup)(struct net_device *dev); 117 118 bool netns_refund; 119 unsigned int maxtype; 120 const struct nla_policy *policy; 121 int (*validate)(struct nlattr *tb[], 122 struct nlattr *data[], 123 struct netlink_ext_ack *extack); 124 125 int (*newlink)(struct net *src_net, 126 struct net_device *dev, 127 struct nlattr *tb[], 128 struct nlattr *data[], 129 struct netlink_ext_ack *extack); 130 int (*changelink)(struct net_device *dev, 131 struct nlattr *tb[], 132 struct nlattr *data[], 133 struct netlink_ext_ack *extack); 134 void (*dellink)(struct net_device *dev, 135 struct list_head *head); 136 137 size_t (*get_size)(const struct net_device *dev); 138 int (*fill_info)(struct sk_buff *skb, 139 const struct net_device *dev); 140 141 size_t (*get_xstats_size)(const struct net_device *dev); 142 int (*fill_xstats)(struct sk_buff *skb, 143 const struct net_device *dev); 144 unsigned int (*get_num_tx_queues)(void); 145 unsigned int (*get_num_rx_queues)(void); 146 147 unsigned int slave_maxtype; 148 const struct nla_policy *slave_policy; 149 int (*slave_changelink)(struct net_device *dev, 150 struct net_device *slave_dev, 151 struct nlattr *tb[], 152 struct nlattr *data[], 153 struct netlink_ext_ack *extack); 154 size_t (*get_slave_size)(const struct net_device *dev, 155 const struct net_device *slave_dev); 156 int (*fill_slave_info)(struct sk_buff *skb, 157 const struct net_device *dev, 158 const struct net_device *slave_dev); 159 struct net *(*get_link_net)(const struct net_device *dev); 160 size_t (*get_linkxstats_size)(const struct net_device *dev, 161 int attr); 162 int (*fill_linkxstats)(struct sk_buff *skb, 163 const struct net_device *dev, 164 int *prividx, int attr); 165 }; 166 167 int __rtnl_link_register(struct rtnl_link_ops *ops); 168 void __rtnl_link_unregister(struct rtnl_link_ops *ops); 169 170 int rtnl_link_register(struct rtnl_link_ops *ops); 171 void rtnl_link_unregister(struct rtnl_link_ops *ops); 172 173 /** 174 * struct rtnl_af_ops - rtnetlink address family operations 175 * 176 * @list: Used internally, protected by RTNL and SRCU 177 * @srcu: Used internally 178 * @family: Address family 179 * @fill_link_af: Function to fill IFLA_AF_SPEC with address family 180 * specific netlink attributes. 181 * @get_link_af_size: Function to calculate size of address family specific 182 * netlink attributes. 183 * @validate_link_af: Validate a IFLA_AF_SPEC attribute, must check attr 184 * for invalid configuration settings. 185 * @set_link_af: Function to parse a IFLA_AF_SPEC attribute and modify 186 * net_device accordingly. 187 */ 188 struct rtnl_af_ops { 189 struct list_head list; 190 struct srcu_struct srcu; 191 192 int family; 193 194 int (*fill_link_af)(struct sk_buff *skb, 195 const struct net_device *dev, 196 u32 ext_filter_mask); 197 size_t (*get_link_af_size)(const struct net_device *dev, 198 u32 ext_filter_mask); 199 200 int (*validate_link_af)(const struct net_device *dev, 201 const struct nlattr *attr, 202 struct netlink_ext_ack *extack); 203 int (*set_link_af)(struct net_device *dev, 204 const struct nlattr *attr, 205 struct netlink_ext_ack *extack); 206 int (*fill_stats_af)(struct sk_buff *skb, 207 const struct net_device *dev); 208 size_t (*get_stats_af_size)(const struct net_device *dev); 209 }; 210 211 int rtnl_af_register(struct rtnl_af_ops *ops); 212 void rtnl_af_unregister(struct rtnl_af_ops *ops); 213 214 struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]); 215 struct net_device *rtnl_create_link(struct net *net, const char *ifname, 216 unsigned char name_assign_type, 217 const struct rtnl_link_ops *ops, 218 struct nlattr *tb[], 219 struct netlink_ext_ack *extack); 220 int rtnl_delete_link(struct net_device *dev, u32 portid, const struct nlmsghdr *nlh); 221 int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm, 222 u32 portid, const struct nlmsghdr *nlh); 223 224 int rtnl_nla_parse_ifinfomsg(struct nlattr **tb, const struct nlattr *nla_peer, 225 struct netlink_ext_ack *exterr); 226 struct net *rtnl_get_net_ns_capable(struct sock *sk, int netnsid); 227 228 #define MODULE_ALIAS_RTNL_LINK(kind) MODULE_ALIAS("rtnl-link-" kind) 229 230 #endif 231