GNU Linux-libre 5.15.54-gnu
[releases.git] / drivers / net / bonding / bond_netlink.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * drivers/net/bond/bond_netlink.c - Netlink interface for bonding
4  * Copyright (c) 2013 Jiri Pirko <jiri@resnulli.us>
5  * Copyright (c) 2013 Scott Feldman <sfeldma@cumulusnetworks.com>
6  */
7
8 #include <linux/module.h>
9 #include <linux/errno.h>
10 #include <linux/netdevice.h>
11 #include <linux/etherdevice.h>
12 #include <linux/if_link.h>
13 #include <linux/if_ether.h>
14 #include <net/netlink.h>
15 #include <net/rtnetlink.h>
16 #include <net/bonding.h>
17
18 static size_t bond_get_slave_size(const struct net_device *bond_dev,
19                                   const struct net_device *slave_dev)
20 {
21         return nla_total_size(sizeof(u8)) +     /* IFLA_BOND_SLAVE_STATE */
22                 nla_total_size(sizeof(u8)) +    /* IFLA_BOND_SLAVE_MII_STATUS */
23                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_SLAVE_LINK_FAILURE_COUNT */
24                 nla_total_size(MAX_ADDR_LEN) +  /* IFLA_BOND_SLAVE_PERM_HWADDR */
25                 nla_total_size(sizeof(u16)) +   /* IFLA_BOND_SLAVE_QUEUE_ID */
26                 nla_total_size(sizeof(u16)) +   /* IFLA_BOND_SLAVE_AD_AGGREGATOR_ID */
27                 nla_total_size(sizeof(u8)) +    /* IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE */
28                 nla_total_size(sizeof(u16)) +   /* IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE */
29                 0;
30 }
31
32 static int bond_fill_slave_info(struct sk_buff *skb,
33                                 const struct net_device *bond_dev,
34                                 const struct net_device *slave_dev)
35 {
36         struct slave *slave = bond_slave_get_rtnl(slave_dev);
37
38         if (nla_put_u8(skb, IFLA_BOND_SLAVE_STATE, bond_slave_state(slave)))
39                 goto nla_put_failure;
40
41         if (nla_put_u8(skb, IFLA_BOND_SLAVE_MII_STATUS, slave->link))
42                 goto nla_put_failure;
43
44         if (nla_put_u32(skb, IFLA_BOND_SLAVE_LINK_FAILURE_COUNT,
45                         slave->link_failure_count))
46                 goto nla_put_failure;
47
48         if (nla_put(skb, IFLA_BOND_SLAVE_PERM_HWADDR,
49                     slave_dev->addr_len, slave->perm_hwaddr))
50                 goto nla_put_failure;
51
52         if (nla_put_u16(skb, IFLA_BOND_SLAVE_QUEUE_ID, slave->queue_id))
53                 goto nla_put_failure;
54
55         if (BOND_MODE(slave->bond) == BOND_MODE_8023AD) {
56                 const struct aggregator *agg;
57                 const struct port *ad_port;
58
59                 ad_port = &SLAVE_AD_INFO(slave)->port;
60                 agg = SLAVE_AD_INFO(slave)->port.aggregator;
61                 if (agg) {
62                         if (nla_put_u16(skb, IFLA_BOND_SLAVE_AD_AGGREGATOR_ID,
63                                         agg->aggregator_identifier))
64                                 goto nla_put_failure;
65                         if (nla_put_u8(skb,
66                                        IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE,
67                                        ad_port->actor_oper_port_state))
68                                 goto nla_put_failure;
69                         if (nla_put_u16(skb,
70                                         IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE,
71                                         ad_port->partner_oper.port_state))
72                                 goto nla_put_failure;
73                 }
74         }
75
76         return 0;
77
78 nla_put_failure:
79         return -EMSGSIZE;
80 }
81
82 static const struct nla_policy bond_policy[IFLA_BOND_MAX + 1] = {
83         [IFLA_BOND_MODE]                = { .type = NLA_U8 },
84         [IFLA_BOND_ACTIVE_SLAVE]        = { .type = NLA_U32 },
85         [IFLA_BOND_MIIMON]              = { .type = NLA_U32 },
86         [IFLA_BOND_UPDELAY]             = { .type = NLA_U32 },
87         [IFLA_BOND_DOWNDELAY]           = { .type = NLA_U32 },
88         [IFLA_BOND_USE_CARRIER]         = { .type = NLA_U8 },
89         [IFLA_BOND_ARP_INTERVAL]        = { .type = NLA_U32 },
90         [IFLA_BOND_ARP_IP_TARGET]       = { .type = NLA_NESTED },
91         [IFLA_BOND_ARP_VALIDATE]        = { .type = NLA_U32 },
92         [IFLA_BOND_ARP_ALL_TARGETS]     = { .type = NLA_U32 },
93         [IFLA_BOND_PRIMARY]             = { .type = NLA_U32 },
94         [IFLA_BOND_PRIMARY_RESELECT]    = { .type = NLA_U8 },
95         [IFLA_BOND_FAIL_OVER_MAC]       = { .type = NLA_U8 },
96         [IFLA_BOND_XMIT_HASH_POLICY]    = { .type = NLA_U8 },
97         [IFLA_BOND_RESEND_IGMP]         = { .type = NLA_U32 },
98         [IFLA_BOND_NUM_PEER_NOTIF]      = { .type = NLA_U8 },
99         [IFLA_BOND_ALL_SLAVES_ACTIVE]   = { .type = NLA_U8 },
100         [IFLA_BOND_MIN_LINKS]           = { .type = NLA_U32 },
101         [IFLA_BOND_LP_INTERVAL]         = { .type = NLA_U32 },
102         [IFLA_BOND_PACKETS_PER_SLAVE]   = { .type = NLA_U32 },
103         [IFLA_BOND_AD_LACP_ACTIVE]      = { .type = NLA_U8 },
104         [IFLA_BOND_AD_LACP_RATE]        = { .type = NLA_U8 },
105         [IFLA_BOND_AD_SELECT]           = { .type = NLA_U8 },
106         [IFLA_BOND_AD_INFO]             = { .type = NLA_NESTED },
107         [IFLA_BOND_AD_ACTOR_SYS_PRIO]   = { .type = NLA_U16 },
108         [IFLA_BOND_AD_USER_PORT_KEY]    = { .type = NLA_U16 },
109         [IFLA_BOND_AD_ACTOR_SYSTEM]     = { .type = NLA_BINARY,
110                                             .len  = ETH_ALEN },
111         [IFLA_BOND_TLB_DYNAMIC_LB]      = { .type = NLA_U8 },
112         [IFLA_BOND_PEER_NOTIF_DELAY]    = { .type = NLA_U32 },
113 };
114
115 static const struct nla_policy bond_slave_policy[IFLA_BOND_SLAVE_MAX + 1] = {
116         [IFLA_BOND_SLAVE_QUEUE_ID]      = { .type = NLA_U16 },
117 };
118
119 static int bond_validate(struct nlattr *tb[], struct nlattr *data[],
120                          struct netlink_ext_ack *extack)
121 {
122         if (tb[IFLA_ADDRESS]) {
123                 if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
124                         return -EINVAL;
125                 if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS])))
126                         return -EADDRNOTAVAIL;
127         }
128         return 0;
129 }
130
131 static int bond_slave_changelink(struct net_device *bond_dev,
132                                  struct net_device *slave_dev,
133                                  struct nlattr *tb[], struct nlattr *data[],
134                                  struct netlink_ext_ack *extack)
135 {
136         struct bonding *bond = netdev_priv(bond_dev);
137         struct bond_opt_value newval;
138         int err;
139
140         if (!data)
141                 return 0;
142
143         if (data[IFLA_BOND_SLAVE_QUEUE_ID]) {
144                 u16 queue_id = nla_get_u16(data[IFLA_BOND_SLAVE_QUEUE_ID]);
145                 char queue_id_str[IFNAMSIZ + 7];
146
147                 /* queue_id option setting expects slave_name:queue_id */
148                 snprintf(queue_id_str, sizeof(queue_id_str), "%s:%u\n",
149                          slave_dev->name, queue_id);
150                 bond_opt_initstr(&newval, queue_id_str);
151                 err = __bond_opt_set(bond, BOND_OPT_QUEUE_ID, &newval);
152                 if (err)
153                         return err;
154         }
155
156         return 0;
157 }
158
159 static int bond_changelink(struct net_device *bond_dev, struct nlattr *tb[],
160                            struct nlattr *data[],
161                            struct netlink_ext_ack *extack)
162 {
163         struct bonding *bond = netdev_priv(bond_dev);
164         struct bond_opt_value newval;
165         int miimon = 0;
166         int err;
167
168         if (!data)
169                 return 0;
170
171         if (data[IFLA_BOND_MODE]) {
172                 int mode = nla_get_u8(data[IFLA_BOND_MODE]);
173
174                 bond_opt_initval(&newval, mode);
175                 err = __bond_opt_set(bond, BOND_OPT_MODE, &newval);
176                 if (err)
177                         return err;
178         }
179         if (data[IFLA_BOND_ACTIVE_SLAVE]) {
180                 int ifindex = nla_get_u32(data[IFLA_BOND_ACTIVE_SLAVE]);
181                 struct net_device *slave_dev;
182                 char *active_slave = "";
183
184                 if (ifindex != 0) {
185                         slave_dev = __dev_get_by_index(dev_net(bond_dev),
186                                                        ifindex);
187                         if (!slave_dev)
188                                 return -ENODEV;
189                         active_slave = slave_dev->name;
190                 }
191                 bond_opt_initstr(&newval, active_slave);
192                 err = __bond_opt_set(bond, BOND_OPT_ACTIVE_SLAVE, &newval);
193                 if (err)
194                         return err;
195         }
196         if (data[IFLA_BOND_MIIMON]) {
197                 miimon = nla_get_u32(data[IFLA_BOND_MIIMON]);
198
199                 bond_opt_initval(&newval, miimon);
200                 err = __bond_opt_set(bond, BOND_OPT_MIIMON, &newval);
201                 if (err)
202                         return err;
203         }
204         if (data[IFLA_BOND_UPDELAY]) {
205                 int updelay = nla_get_u32(data[IFLA_BOND_UPDELAY]);
206
207                 bond_opt_initval(&newval, updelay);
208                 err = __bond_opt_set(bond, BOND_OPT_UPDELAY, &newval);
209                 if (err)
210                         return err;
211         }
212         if (data[IFLA_BOND_DOWNDELAY]) {
213                 int downdelay = nla_get_u32(data[IFLA_BOND_DOWNDELAY]);
214
215                 bond_opt_initval(&newval, downdelay);
216                 err = __bond_opt_set(bond, BOND_OPT_DOWNDELAY, &newval);
217                 if (err)
218                         return err;
219         }
220         if (data[IFLA_BOND_PEER_NOTIF_DELAY]) {
221                 int delay = nla_get_u32(data[IFLA_BOND_PEER_NOTIF_DELAY]);
222
223                 bond_opt_initval(&newval, delay);
224                 err = __bond_opt_set(bond, BOND_OPT_PEER_NOTIF_DELAY, &newval);
225                 if (err)
226                         return err;
227         }
228         if (data[IFLA_BOND_USE_CARRIER]) {
229                 int use_carrier = nla_get_u8(data[IFLA_BOND_USE_CARRIER]);
230
231                 bond_opt_initval(&newval, use_carrier);
232                 err = __bond_opt_set(bond, BOND_OPT_USE_CARRIER, &newval);
233                 if (err)
234                         return err;
235         }
236         if (data[IFLA_BOND_ARP_INTERVAL]) {
237                 int arp_interval = nla_get_u32(data[IFLA_BOND_ARP_INTERVAL]);
238
239                 if (arp_interval && miimon) {
240                         netdev_err(bond->dev, "ARP monitoring cannot be used with MII monitoring\n");
241                         return -EINVAL;
242                 }
243
244                 bond_opt_initval(&newval, arp_interval);
245                 err = __bond_opt_set(bond, BOND_OPT_ARP_INTERVAL, &newval);
246                 if (err)
247                         return err;
248         }
249         if (data[IFLA_BOND_ARP_IP_TARGET]) {
250                 struct nlattr *attr;
251                 int i = 0, rem;
252
253                 bond_option_arp_ip_targets_clear(bond);
254                 nla_for_each_nested(attr, data[IFLA_BOND_ARP_IP_TARGET], rem) {
255                         __be32 target;
256
257                         if (nla_len(attr) < sizeof(target))
258                                 return -EINVAL;
259
260                         target = nla_get_be32(attr);
261
262                         bond_opt_initval(&newval, (__force u64)target);
263                         err = __bond_opt_set(bond, BOND_OPT_ARP_TARGETS,
264                                              &newval);
265                         if (err)
266                                 break;
267                         i++;
268                 }
269                 if (i == 0 && bond->params.arp_interval)
270                         netdev_warn(bond->dev, "Removing last arp target with arp_interval on\n");
271                 if (err)
272                         return err;
273         }
274         if (data[IFLA_BOND_ARP_VALIDATE]) {
275                 int arp_validate = nla_get_u32(data[IFLA_BOND_ARP_VALIDATE]);
276
277                 if (arp_validate && miimon) {
278                         netdev_err(bond->dev, "ARP validating cannot be used with MII monitoring\n");
279                         return -EINVAL;
280                 }
281
282                 bond_opt_initval(&newval, arp_validate);
283                 err = __bond_opt_set(bond, BOND_OPT_ARP_VALIDATE, &newval);
284                 if (err)
285                         return err;
286         }
287         if (data[IFLA_BOND_ARP_ALL_TARGETS]) {
288                 int arp_all_targets =
289                         nla_get_u32(data[IFLA_BOND_ARP_ALL_TARGETS]);
290
291                 bond_opt_initval(&newval, arp_all_targets);
292                 err = __bond_opt_set(bond, BOND_OPT_ARP_ALL_TARGETS, &newval);
293                 if (err)
294                         return err;
295         }
296         if (data[IFLA_BOND_PRIMARY]) {
297                 int ifindex = nla_get_u32(data[IFLA_BOND_PRIMARY]);
298                 struct net_device *dev;
299                 char *primary = "";
300
301                 dev = __dev_get_by_index(dev_net(bond_dev), ifindex);
302                 if (dev)
303                         primary = dev->name;
304
305                 bond_opt_initstr(&newval, primary);
306                 err = __bond_opt_set(bond, BOND_OPT_PRIMARY, &newval);
307                 if (err)
308                         return err;
309         }
310         if (data[IFLA_BOND_PRIMARY_RESELECT]) {
311                 int primary_reselect =
312                         nla_get_u8(data[IFLA_BOND_PRIMARY_RESELECT]);
313
314                 bond_opt_initval(&newval, primary_reselect);
315                 err = __bond_opt_set(bond, BOND_OPT_PRIMARY_RESELECT, &newval);
316                 if (err)
317                         return err;
318         }
319         if (data[IFLA_BOND_FAIL_OVER_MAC]) {
320                 int fail_over_mac =
321                         nla_get_u8(data[IFLA_BOND_FAIL_OVER_MAC]);
322
323                 bond_opt_initval(&newval, fail_over_mac);
324                 err = __bond_opt_set(bond, BOND_OPT_FAIL_OVER_MAC, &newval);
325                 if (err)
326                         return err;
327         }
328         if (data[IFLA_BOND_XMIT_HASH_POLICY]) {
329                 int xmit_hash_policy =
330                         nla_get_u8(data[IFLA_BOND_XMIT_HASH_POLICY]);
331
332                 bond_opt_initval(&newval, xmit_hash_policy);
333                 err = __bond_opt_set(bond, BOND_OPT_XMIT_HASH, &newval);
334                 if (err)
335                         return err;
336         }
337         if (data[IFLA_BOND_RESEND_IGMP]) {
338                 int resend_igmp =
339                         nla_get_u32(data[IFLA_BOND_RESEND_IGMP]);
340
341                 bond_opt_initval(&newval, resend_igmp);
342                 err = __bond_opt_set(bond, BOND_OPT_RESEND_IGMP, &newval);
343                 if (err)
344                         return err;
345         }
346         if (data[IFLA_BOND_NUM_PEER_NOTIF]) {
347                 int num_peer_notif =
348                         nla_get_u8(data[IFLA_BOND_NUM_PEER_NOTIF]);
349
350                 bond_opt_initval(&newval, num_peer_notif);
351                 err = __bond_opt_set(bond, BOND_OPT_NUM_PEER_NOTIF, &newval);
352                 if (err)
353                         return err;
354         }
355         if (data[IFLA_BOND_ALL_SLAVES_ACTIVE]) {
356                 int all_slaves_active =
357                         nla_get_u8(data[IFLA_BOND_ALL_SLAVES_ACTIVE]);
358
359                 bond_opt_initval(&newval, all_slaves_active);
360                 err = __bond_opt_set(bond, BOND_OPT_ALL_SLAVES_ACTIVE, &newval);
361                 if (err)
362                         return err;
363         }
364         if (data[IFLA_BOND_MIN_LINKS]) {
365                 int min_links =
366                         nla_get_u32(data[IFLA_BOND_MIN_LINKS]);
367
368                 bond_opt_initval(&newval, min_links);
369                 err = __bond_opt_set(bond, BOND_OPT_MINLINKS, &newval);
370                 if (err)
371                         return err;
372         }
373         if (data[IFLA_BOND_LP_INTERVAL]) {
374                 int lp_interval =
375                         nla_get_u32(data[IFLA_BOND_LP_INTERVAL]);
376
377                 bond_opt_initval(&newval, lp_interval);
378                 err = __bond_opt_set(bond, BOND_OPT_LP_INTERVAL, &newval);
379                 if (err)
380                         return err;
381         }
382         if (data[IFLA_BOND_PACKETS_PER_SLAVE]) {
383                 int packets_per_slave =
384                         nla_get_u32(data[IFLA_BOND_PACKETS_PER_SLAVE]);
385
386                 bond_opt_initval(&newval, packets_per_slave);
387                 err = __bond_opt_set(bond, BOND_OPT_PACKETS_PER_SLAVE, &newval);
388                 if (err)
389                         return err;
390         }
391
392         if (data[IFLA_BOND_AD_LACP_ACTIVE]) {
393                 int lacp_active = nla_get_u8(data[IFLA_BOND_AD_LACP_ACTIVE]);
394
395                 bond_opt_initval(&newval, lacp_active);
396                 err = __bond_opt_set(bond, BOND_OPT_LACP_ACTIVE, &newval);
397                 if (err)
398                         return err;
399         }
400
401         if (data[IFLA_BOND_AD_LACP_RATE]) {
402                 int lacp_rate =
403                         nla_get_u8(data[IFLA_BOND_AD_LACP_RATE]);
404
405                 bond_opt_initval(&newval, lacp_rate);
406                 err = __bond_opt_set(bond, BOND_OPT_LACP_RATE, &newval);
407                 if (err)
408                         return err;
409         }
410         if (data[IFLA_BOND_AD_SELECT]) {
411                 int ad_select =
412                         nla_get_u8(data[IFLA_BOND_AD_SELECT]);
413
414                 bond_opt_initval(&newval, ad_select);
415                 err = __bond_opt_set(bond, BOND_OPT_AD_SELECT, &newval);
416                 if (err)
417                         return err;
418         }
419         if (data[IFLA_BOND_AD_ACTOR_SYS_PRIO]) {
420                 int actor_sys_prio =
421                         nla_get_u16(data[IFLA_BOND_AD_ACTOR_SYS_PRIO]);
422
423                 bond_opt_initval(&newval, actor_sys_prio);
424                 err = __bond_opt_set(bond, BOND_OPT_AD_ACTOR_SYS_PRIO, &newval);
425                 if (err)
426                         return err;
427         }
428         if (data[IFLA_BOND_AD_USER_PORT_KEY]) {
429                 int port_key =
430                         nla_get_u16(data[IFLA_BOND_AD_USER_PORT_KEY]);
431
432                 bond_opt_initval(&newval, port_key);
433                 err = __bond_opt_set(bond, BOND_OPT_AD_USER_PORT_KEY, &newval);
434                 if (err)
435                         return err;
436         }
437         if (data[IFLA_BOND_AD_ACTOR_SYSTEM]) {
438                 if (nla_len(data[IFLA_BOND_AD_ACTOR_SYSTEM]) != ETH_ALEN)
439                         return -EINVAL;
440
441                 bond_opt_initval(&newval,
442                                  nla_get_u64(data[IFLA_BOND_AD_ACTOR_SYSTEM]));
443                 err = __bond_opt_set(bond, BOND_OPT_AD_ACTOR_SYSTEM, &newval);
444                 if (err)
445                         return err;
446         }
447         if (data[IFLA_BOND_TLB_DYNAMIC_LB]) {
448                 int dynamic_lb = nla_get_u8(data[IFLA_BOND_TLB_DYNAMIC_LB]);
449
450                 bond_opt_initval(&newval, dynamic_lb);
451                 err = __bond_opt_set(bond, BOND_OPT_TLB_DYNAMIC_LB, &newval);
452                 if (err)
453                         return err;
454         }
455
456         return 0;
457 }
458
459 static int bond_newlink(struct net *src_net, struct net_device *bond_dev,
460                         struct nlattr *tb[], struct nlattr *data[],
461                         struct netlink_ext_ack *extack)
462 {
463         int err;
464
465         err = bond_changelink(bond_dev, tb, data, extack);
466         if (err < 0)
467                 return err;
468
469         err = register_netdevice(bond_dev);
470         if (!err) {
471                 struct bonding *bond = netdev_priv(bond_dev);
472
473                 netif_carrier_off(bond_dev);
474                 bond_work_init_all(bond);
475         }
476
477         return err;
478 }
479
480 static size_t bond_get_size(const struct net_device *bond_dev)
481 {
482         return nla_total_size(sizeof(u8)) +     /* IFLA_BOND_MODE */
483                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_ACTIVE_SLAVE */
484                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_MIIMON */
485                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_UPDELAY */
486                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_DOWNDELAY */
487                 nla_total_size(sizeof(u8)) +    /* IFLA_BOND_USE_CARRIER */
488                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_ARP_INTERVAL */
489                                                 /* IFLA_BOND_ARP_IP_TARGET */
490                 nla_total_size(sizeof(struct nlattr)) +
491                 nla_total_size(sizeof(u32)) * BOND_MAX_ARP_TARGETS +
492                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_ARP_VALIDATE */
493                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_ARP_ALL_TARGETS */
494                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_PRIMARY */
495                 nla_total_size(sizeof(u8)) +    /* IFLA_BOND_PRIMARY_RESELECT */
496                 nla_total_size(sizeof(u8)) +    /* IFLA_BOND_FAIL_OVER_MAC */
497                 nla_total_size(sizeof(u8)) +    /* IFLA_BOND_XMIT_HASH_POLICY */
498                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_RESEND_IGMP */
499                 nla_total_size(sizeof(u8)) +    /* IFLA_BOND_NUM_PEER_NOTIF */
500                 nla_total_size(sizeof(u8)) +   /* IFLA_BOND_ALL_SLAVES_ACTIVE */
501                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_MIN_LINKS */
502                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_LP_INTERVAL */
503                 nla_total_size(sizeof(u32)) +  /* IFLA_BOND_PACKETS_PER_SLAVE */
504                 nla_total_size(sizeof(u8)) +    /* IFLA_BOND_AD_LACP_ACTIVE */
505                 nla_total_size(sizeof(u8)) +    /* IFLA_BOND_AD_LACP_RATE */
506                 nla_total_size(sizeof(u8)) +    /* IFLA_BOND_AD_SELECT */
507                 nla_total_size(sizeof(struct nlattr)) + /* IFLA_BOND_AD_INFO */
508                 nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_AGGREGATOR */
509                 nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_NUM_PORTS */
510                 nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_ACTOR_KEY */
511                 nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_INFO_PARTNER_KEY*/
512                 nla_total_size(ETH_ALEN) +    /* IFLA_BOND_AD_INFO_PARTNER_MAC*/
513                 nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_ACTOR_SYS_PRIO */
514                 nla_total_size(sizeof(u16)) + /* IFLA_BOND_AD_USER_PORT_KEY */
515                 nla_total_size(ETH_ALEN) + /* IFLA_BOND_AD_ACTOR_SYSTEM */
516                 nla_total_size(sizeof(u8)) + /* IFLA_BOND_TLB_DYNAMIC_LB */
517                 nla_total_size(sizeof(u32)) +   /* IFLA_BOND_PEER_NOTIF_DELAY */
518                 0;
519 }
520
521 static int bond_option_active_slave_get_ifindex(struct bonding *bond)
522 {
523         const struct net_device *slave;
524         int ifindex;
525
526         rcu_read_lock();
527         slave = bond_option_active_slave_get_rcu(bond);
528         ifindex = slave ? slave->ifindex : 0;
529         rcu_read_unlock();
530         return ifindex;
531 }
532
533 static int bond_fill_info(struct sk_buff *skb,
534                           const struct net_device *bond_dev)
535 {
536         struct bonding *bond = netdev_priv(bond_dev);
537         unsigned int packets_per_slave;
538         int ifindex, i, targets_added;
539         struct nlattr *targets;
540         struct slave *primary;
541
542         if (nla_put_u8(skb, IFLA_BOND_MODE, BOND_MODE(bond)))
543                 goto nla_put_failure;
544
545         ifindex = bond_option_active_slave_get_ifindex(bond);
546         if (ifindex && nla_put_u32(skb, IFLA_BOND_ACTIVE_SLAVE, ifindex))
547                 goto nla_put_failure;
548
549         if (nla_put_u32(skb, IFLA_BOND_MIIMON, bond->params.miimon))
550                 goto nla_put_failure;
551
552         if (nla_put_u32(skb, IFLA_BOND_UPDELAY,
553                         bond->params.updelay * bond->params.miimon))
554                 goto nla_put_failure;
555
556         if (nla_put_u32(skb, IFLA_BOND_DOWNDELAY,
557                         bond->params.downdelay * bond->params.miimon))
558                 goto nla_put_failure;
559
560         if (nla_put_u32(skb, IFLA_BOND_PEER_NOTIF_DELAY,
561                         bond->params.peer_notif_delay * bond->params.miimon))
562                 goto nla_put_failure;
563
564         if (nla_put_u8(skb, IFLA_BOND_USE_CARRIER, bond->params.use_carrier))
565                 goto nla_put_failure;
566
567         if (nla_put_u32(skb, IFLA_BOND_ARP_INTERVAL, bond->params.arp_interval))
568                 goto nla_put_failure;
569
570         targets = nla_nest_start_noflag(skb, IFLA_BOND_ARP_IP_TARGET);
571         if (!targets)
572                 goto nla_put_failure;
573
574         targets_added = 0;
575         for (i = 0; i < BOND_MAX_ARP_TARGETS; i++) {
576                 if (bond->params.arp_targets[i]) {
577                         if (nla_put_be32(skb, i, bond->params.arp_targets[i]))
578                                 goto nla_put_failure;
579                         targets_added = 1;
580                 }
581         }
582
583         if (targets_added)
584                 nla_nest_end(skb, targets);
585         else
586                 nla_nest_cancel(skb, targets);
587
588         if (nla_put_u32(skb, IFLA_BOND_ARP_VALIDATE, bond->params.arp_validate))
589                 goto nla_put_failure;
590
591         if (nla_put_u32(skb, IFLA_BOND_ARP_ALL_TARGETS,
592                         bond->params.arp_all_targets))
593                 goto nla_put_failure;
594
595         primary = rtnl_dereference(bond->primary_slave);
596         if (primary &&
597             nla_put_u32(skb, IFLA_BOND_PRIMARY, primary->dev->ifindex))
598                 goto nla_put_failure;
599
600         if (nla_put_u8(skb, IFLA_BOND_PRIMARY_RESELECT,
601                        bond->params.primary_reselect))
602                 goto nla_put_failure;
603
604         if (nla_put_u8(skb, IFLA_BOND_FAIL_OVER_MAC,
605                        bond->params.fail_over_mac))
606                 goto nla_put_failure;
607
608         if (nla_put_u8(skb, IFLA_BOND_XMIT_HASH_POLICY,
609                        bond->params.xmit_policy))
610                 goto nla_put_failure;
611
612         if (nla_put_u32(skb, IFLA_BOND_RESEND_IGMP,
613                         bond->params.resend_igmp))
614                 goto nla_put_failure;
615
616         if (nla_put_u8(skb, IFLA_BOND_NUM_PEER_NOTIF,
617                        bond->params.num_peer_notif))
618                 goto nla_put_failure;
619
620         if (nla_put_u8(skb, IFLA_BOND_ALL_SLAVES_ACTIVE,
621                        bond->params.all_slaves_active))
622                 goto nla_put_failure;
623
624         if (nla_put_u32(skb, IFLA_BOND_MIN_LINKS,
625                         bond->params.min_links))
626                 goto nla_put_failure;
627
628         if (nla_put_u32(skb, IFLA_BOND_LP_INTERVAL,
629                         bond->params.lp_interval))
630                 goto nla_put_failure;
631
632         packets_per_slave = bond->params.packets_per_slave;
633         if (nla_put_u32(skb, IFLA_BOND_PACKETS_PER_SLAVE,
634                         packets_per_slave))
635                 goto nla_put_failure;
636
637         if (nla_put_u8(skb, IFLA_BOND_AD_LACP_ACTIVE,
638                        bond->params.lacp_active))
639                 goto nla_put_failure;
640
641         if (nla_put_u8(skb, IFLA_BOND_AD_LACP_RATE,
642                        bond->params.lacp_fast))
643                 goto nla_put_failure;
644
645         if (nla_put_u8(skb, IFLA_BOND_AD_SELECT,
646                        bond->params.ad_select))
647                 goto nla_put_failure;
648
649         if (nla_put_u8(skb, IFLA_BOND_TLB_DYNAMIC_LB,
650                        bond->params.tlb_dynamic_lb))
651                 goto nla_put_failure;
652
653         if (BOND_MODE(bond) == BOND_MODE_8023AD) {
654                 struct ad_info info;
655
656                 if (capable(CAP_NET_ADMIN)) {
657                         if (nla_put_u16(skb, IFLA_BOND_AD_ACTOR_SYS_PRIO,
658                                         bond->params.ad_actor_sys_prio))
659                                 goto nla_put_failure;
660
661                         if (nla_put_u16(skb, IFLA_BOND_AD_USER_PORT_KEY,
662                                         bond->params.ad_user_port_key))
663                                 goto nla_put_failure;
664
665                         if (nla_put(skb, IFLA_BOND_AD_ACTOR_SYSTEM,
666                                     ETH_ALEN, &bond->params.ad_actor_system))
667                                 goto nla_put_failure;
668                 }
669                 if (!bond_3ad_get_active_agg_info(bond, &info)) {
670                         struct nlattr *nest;
671
672                         nest = nla_nest_start_noflag(skb, IFLA_BOND_AD_INFO);
673                         if (!nest)
674                                 goto nla_put_failure;
675
676                         if (nla_put_u16(skb, IFLA_BOND_AD_INFO_AGGREGATOR,
677                                         info.aggregator_id))
678                                 goto nla_put_failure;
679                         if (nla_put_u16(skb, IFLA_BOND_AD_INFO_NUM_PORTS,
680                                         info.ports))
681                                 goto nla_put_failure;
682                         if (nla_put_u16(skb, IFLA_BOND_AD_INFO_ACTOR_KEY,
683                                         info.actor_key))
684                                 goto nla_put_failure;
685                         if (nla_put_u16(skb, IFLA_BOND_AD_INFO_PARTNER_KEY,
686                                         info.partner_key))
687                                 goto nla_put_failure;
688                         if (nla_put(skb, IFLA_BOND_AD_INFO_PARTNER_MAC,
689                                     sizeof(info.partner_system),
690                                     &info.partner_system))
691                                 goto nla_put_failure;
692
693                         nla_nest_end(skb, nest);
694                 }
695         }
696
697         return 0;
698
699 nla_put_failure:
700         return -EMSGSIZE;
701 }
702
703 static size_t bond_get_linkxstats_size(const struct net_device *dev, int attr)
704 {
705         switch (attr) {
706         case IFLA_STATS_LINK_XSTATS:
707         case IFLA_STATS_LINK_XSTATS_SLAVE:
708                 break;
709         default:
710                 return 0;
711         }
712
713         return bond_3ad_stats_size() + nla_total_size(0);
714 }
715
716 static int bond_fill_linkxstats(struct sk_buff *skb,
717                                 const struct net_device *dev,
718                                 int *prividx, int attr)
719 {
720         struct nlattr *nla __maybe_unused;
721         struct slave *slave = NULL;
722         struct nlattr *nest, *nest2;
723         struct bonding *bond;
724
725         switch (attr) {
726         case IFLA_STATS_LINK_XSTATS:
727                 bond = netdev_priv(dev);
728                 break;
729         case IFLA_STATS_LINK_XSTATS_SLAVE:
730                 slave = bond_slave_get_rtnl(dev);
731                 if (!slave)
732                         return 0;
733                 bond = slave->bond;
734                 break;
735         default:
736                 return -EINVAL;
737         }
738
739         nest = nla_nest_start_noflag(skb, LINK_XSTATS_TYPE_BOND);
740         if (!nest)
741                 return -EMSGSIZE;
742         if (BOND_MODE(bond) == BOND_MODE_8023AD) {
743                 struct bond_3ad_stats *stats;
744
745                 if (slave)
746                         stats = &SLAVE_AD_INFO(slave)->stats;
747                 else
748                         stats = &BOND_AD_INFO(bond).stats;
749
750                 nest2 = nla_nest_start_noflag(skb, BOND_XSTATS_3AD);
751                 if (!nest2) {
752                         nla_nest_end(skb, nest);
753                         return -EMSGSIZE;
754                 }
755
756                 if (bond_3ad_stats_fill(skb, stats)) {
757                         nla_nest_cancel(skb, nest2);
758                         nla_nest_end(skb, nest);
759                         return -EMSGSIZE;
760                 }
761                 nla_nest_end(skb, nest2);
762         }
763         nla_nest_end(skb, nest);
764
765         return 0;
766 }
767
768 struct rtnl_link_ops bond_link_ops __read_mostly = {
769         .kind                   = "bond",
770         .priv_size              = sizeof(struct bonding),
771         .setup                  = bond_setup,
772         .maxtype                = IFLA_BOND_MAX,
773         .policy                 = bond_policy,
774         .validate               = bond_validate,
775         .newlink                = bond_newlink,
776         .changelink             = bond_changelink,
777         .get_size               = bond_get_size,
778         .fill_info              = bond_fill_info,
779         .get_num_tx_queues      = bond_get_num_tx_queues,
780         .get_num_rx_queues      = bond_get_num_tx_queues, /* Use the same number
781                                                              as for TX queues */
782         .fill_linkxstats        = bond_fill_linkxstats,
783         .get_linkxstats_size    = bond_get_linkxstats_size,
784         .slave_maxtype          = IFLA_BOND_SLAVE_MAX,
785         .slave_policy           = bond_slave_policy,
786         .slave_changelink       = bond_slave_changelink,
787         .get_slave_size         = bond_get_slave_size,
788         .fill_slave_info        = bond_fill_slave_info,
789 };
790
791 int __init bond_netlink_init(void)
792 {
793         return rtnl_link_register(&bond_link_ops);
794 }
795
796 void bond_netlink_fini(void)
797 {
798         rtnl_link_unregister(&bond_link_ops);
799 }
800
801 MODULE_ALIAS_RTNL_LINK("bond");