]> Git Repo - J-linux.git/blob - drivers/net/bonding/bond_options.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
[J-linux.git] / drivers / net / bonding / bond_options.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * drivers/net/bond/bond_options.c - bonding options
4  * Copyright (c) 2013 Jiri Pirko <[email protected]>
5  * Copyright (c) 2013 Scott Feldman <[email protected]>
6  */
7
8 #include <linux/errno.h>
9 #include <linux/if.h>
10 #include <linux/netdevice.h>
11 #include <linux/spinlock.h>
12 #include <linux/rcupdate.h>
13 #include <linux/ctype.h>
14 #include <linux/inet.h>
15 #include <linux/sched/signal.h>
16
17 #include <net/bonding.h>
18
19 static int bond_option_active_slave_set(struct bonding *bond,
20                                         const struct bond_opt_value *newval);
21 static int bond_option_miimon_set(struct bonding *bond,
22                                   const struct bond_opt_value *newval);
23 static int bond_option_updelay_set(struct bonding *bond,
24                                    const struct bond_opt_value *newval);
25 static int bond_option_downdelay_set(struct bonding *bond,
26                                      const struct bond_opt_value *newval);
27 static int bond_option_peer_notif_delay_set(struct bonding *bond,
28                                             const struct bond_opt_value *newval);
29 static int bond_option_use_carrier_set(struct bonding *bond,
30                                        const struct bond_opt_value *newval);
31 static int bond_option_arp_interval_set(struct bonding *bond,
32                                         const struct bond_opt_value *newval);
33 static int bond_option_arp_ip_target_add(struct bonding *bond, __be32 target);
34 static int bond_option_arp_ip_target_rem(struct bonding *bond, __be32 target);
35 static int bond_option_arp_ip_targets_set(struct bonding *bond,
36                                           const struct bond_opt_value *newval);
37 static int bond_option_arp_validate_set(struct bonding *bond,
38                                         const struct bond_opt_value *newval);
39 static int bond_option_arp_all_targets_set(struct bonding *bond,
40                                            const struct bond_opt_value *newval);
41 static int bond_option_primary_set(struct bonding *bond,
42                                    const struct bond_opt_value *newval);
43 static int bond_option_primary_reselect_set(struct bonding *bond,
44                                             const struct bond_opt_value *newval);
45 static int bond_option_fail_over_mac_set(struct bonding *bond,
46                                          const struct bond_opt_value *newval);
47 static int bond_option_xmit_hash_policy_set(struct bonding *bond,
48                                             const struct bond_opt_value *newval);
49 static int bond_option_resend_igmp_set(struct bonding *bond,
50                                        const struct bond_opt_value *newval);
51 static int bond_option_num_peer_notif_set(struct bonding *bond,
52                                           const struct bond_opt_value *newval);
53 static int bond_option_all_slaves_active_set(struct bonding *bond,
54                                              const struct bond_opt_value *newval);
55 static int bond_option_min_links_set(struct bonding *bond,
56                                      const struct bond_opt_value *newval);
57 static int bond_option_lp_interval_set(struct bonding *bond,
58                                        const struct bond_opt_value *newval);
59 static int bond_option_pps_set(struct bonding *bond,
60                                const struct bond_opt_value *newval);
61 static int bond_option_lacp_rate_set(struct bonding *bond,
62                                      const struct bond_opt_value *newval);
63 static int bond_option_ad_select_set(struct bonding *bond,
64                                      const struct bond_opt_value *newval);
65 static int bond_option_queue_id_set(struct bonding *bond,
66                                     const struct bond_opt_value *newval);
67 static int bond_option_mode_set(struct bonding *bond,
68                                 const struct bond_opt_value *newval);
69 static int bond_option_slaves_set(struct bonding *bond,
70                                   const struct bond_opt_value *newval);
71 static int bond_option_tlb_dynamic_lb_set(struct bonding *bond,
72                                   const struct bond_opt_value *newval);
73 static int bond_option_ad_actor_sys_prio_set(struct bonding *bond,
74                                              const struct bond_opt_value *newval);
75 static int bond_option_ad_actor_system_set(struct bonding *bond,
76                                            const struct bond_opt_value *newval);
77 static int bond_option_ad_user_port_key_set(struct bonding *bond,
78                                             const struct bond_opt_value *newval);
79
80
81 static const struct bond_opt_value bond_mode_tbl[] = {
82         { "balance-rr",    BOND_MODE_ROUNDROBIN,   BOND_VALFLAG_DEFAULT},
83         { "active-backup", BOND_MODE_ACTIVEBACKUP, 0},
84         { "balance-xor",   BOND_MODE_XOR,          0},
85         { "broadcast",     BOND_MODE_BROADCAST,    0},
86         { "802.3ad",       BOND_MODE_8023AD,       0},
87         { "balance-tlb",   BOND_MODE_TLB,          0},
88         { "balance-alb",   BOND_MODE_ALB,          0},
89         { NULL,            -1,                     0},
90 };
91
92 static const struct bond_opt_value bond_pps_tbl[] = {
93         { "default", 1,         BOND_VALFLAG_DEFAULT},
94         { "maxval",  USHRT_MAX, BOND_VALFLAG_MAX},
95         { NULL,      -1,        0},
96 };
97
98 static const struct bond_opt_value bond_xmit_hashtype_tbl[] = {
99         { "layer2",      BOND_XMIT_POLICY_LAYER2,      BOND_VALFLAG_DEFAULT},
100         { "layer3+4",    BOND_XMIT_POLICY_LAYER34,     0},
101         { "layer2+3",    BOND_XMIT_POLICY_LAYER23,     0},
102         { "encap2+3",    BOND_XMIT_POLICY_ENCAP23,     0},
103         { "encap3+4",    BOND_XMIT_POLICY_ENCAP34,     0},
104         { "vlan+srcmac", BOND_XMIT_POLICY_VLAN_SRCMAC, 0},
105         { NULL,          -1,                           0},
106 };
107
108 static const struct bond_opt_value bond_arp_validate_tbl[] = {
109         { "none",               BOND_ARP_VALIDATE_NONE,         BOND_VALFLAG_DEFAULT},
110         { "active",             BOND_ARP_VALIDATE_ACTIVE,       0},
111         { "backup",             BOND_ARP_VALIDATE_BACKUP,       0},
112         { "all",                BOND_ARP_VALIDATE_ALL,          0},
113         { "filter",             BOND_ARP_FILTER,                0},
114         { "filter_active",      BOND_ARP_FILTER_ACTIVE,         0},
115         { "filter_backup",      BOND_ARP_FILTER_BACKUP,         0},
116         { NULL,                 -1,                             0},
117 };
118
119 static const struct bond_opt_value bond_arp_all_targets_tbl[] = {
120         { "any", BOND_ARP_TARGETS_ANY, BOND_VALFLAG_DEFAULT},
121         { "all", BOND_ARP_TARGETS_ALL, 0},
122         { NULL,  -1,                   0},
123 };
124
125 static const struct bond_opt_value bond_fail_over_mac_tbl[] = {
126         { "none",   BOND_FOM_NONE,   BOND_VALFLAG_DEFAULT},
127         { "active", BOND_FOM_ACTIVE, 0},
128         { "follow", BOND_FOM_FOLLOW, 0},
129         { NULL,     -1,              0},
130 };
131
132 static const struct bond_opt_value bond_intmax_tbl[] = {
133         { "off",     0,       BOND_VALFLAG_DEFAULT},
134         { "maxval",  INT_MAX, BOND_VALFLAG_MAX},
135         { NULL,      -1,      0}
136 };
137
138 static const struct bond_opt_value bond_lacp_rate_tbl[] = {
139         { "slow", AD_LACP_SLOW, 0},
140         { "fast", AD_LACP_FAST, 0},
141         { NULL,   -1,           0},
142 };
143
144 static const struct bond_opt_value bond_ad_select_tbl[] = {
145         { "stable",    BOND_AD_STABLE,    BOND_VALFLAG_DEFAULT},
146         { "bandwidth", BOND_AD_BANDWIDTH, 0},
147         { "count",     BOND_AD_COUNT,     0},
148         { NULL,        -1,                0},
149 };
150
151 static const struct bond_opt_value bond_num_peer_notif_tbl[] = {
152         { "off",     0,   0},
153         { "maxval",  255, BOND_VALFLAG_MAX},
154         { "default", 1,   BOND_VALFLAG_DEFAULT},
155         { NULL,      -1,  0}
156 };
157
158 static const struct bond_opt_value bond_primary_reselect_tbl[] = {
159         { "always",  BOND_PRI_RESELECT_ALWAYS,  BOND_VALFLAG_DEFAULT},
160         { "better",  BOND_PRI_RESELECT_BETTER,  0},
161         { "failure", BOND_PRI_RESELECT_FAILURE, 0},
162         { NULL,      -1},
163 };
164
165 static const struct bond_opt_value bond_use_carrier_tbl[] = {
166         { "off", 0,  0},
167         { "on",  1,  BOND_VALFLAG_DEFAULT},
168         { NULL,  -1, 0}
169 };
170
171 static const struct bond_opt_value bond_all_slaves_active_tbl[] = {
172         { "off", 0,  BOND_VALFLAG_DEFAULT},
173         { "on",  1,  0},
174         { NULL,  -1, 0}
175 };
176
177 static const struct bond_opt_value bond_resend_igmp_tbl[] = {
178         { "off",     0,   0},
179         { "maxval",  255, BOND_VALFLAG_MAX},
180         { "default", 1,   BOND_VALFLAG_DEFAULT},
181         { NULL,      -1,  0}
182 };
183
184 static const struct bond_opt_value bond_lp_interval_tbl[] = {
185         { "minval",  1,       BOND_VALFLAG_MIN | BOND_VALFLAG_DEFAULT},
186         { "maxval",  INT_MAX, BOND_VALFLAG_MAX},
187         { NULL,      -1,      0},
188 };
189
190 static const struct bond_opt_value bond_tlb_dynamic_lb_tbl[] = {
191         { "off", 0,  0},
192         { "on",  1,  BOND_VALFLAG_DEFAULT},
193         { NULL,  -1, 0}
194 };
195
196 static const struct bond_opt_value bond_ad_actor_sys_prio_tbl[] = {
197         { "minval",  1,     BOND_VALFLAG_MIN},
198         { "maxval",  65535, BOND_VALFLAG_MAX | BOND_VALFLAG_DEFAULT},
199         { NULL,      -1,    0},
200 };
201
202 static const struct bond_opt_value bond_ad_user_port_key_tbl[] = {
203         { "minval",  0,     BOND_VALFLAG_MIN | BOND_VALFLAG_DEFAULT},
204         { "maxval",  1023,  BOND_VALFLAG_MAX},
205         { NULL,      -1,    0},
206 };
207
208 static const struct bond_option bond_opts[BOND_OPT_LAST] = {
209         [BOND_OPT_MODE] = {
210                 .id = BOND_OPT_MODE,
211                 .name = "mode",
212                 .desc = "bond device mode",
213                 .flags = BOND_OPTFLAG_NOSLAVES | BOND_OPTFLAG_IFDOWN,
214                 .values = bond_mode_tbl,
215                 .set = bond_option_mode_set
216         },
217         [BOND_OPT_PACKETS_PER_SLAVE] = {
218                 .id = BOND_OPT_PACKETS_PER_SLAVE,
219                 .name = "packets_per_slave",
220                 .desc = "Packets to send per slave in RR mode",
221                 .unsuppmodes = BOND_MODE_ALL_EX(BIT(BOND_MODE_ROUNDROBIN)),
222                 .values = bond_pps_tbl,
223                 .set = bond_option_pps_set
224         },
225         [BOND_OPT_XMIT_HASH] = {
226                 .id = BOND_OPT_XMIT_HASH,
227                 .name = "xmit_hash_policy",
228                 .desc = "balance-xor, 802.3ad, and tlb hashing method",
229                 .values = bond_xmit_hashtype_tbl,
230                 .set = bond_option_xmit_hash_policy_set
231         },
232         [BOND_OPT_ARP_VALIDATE] = {
233                 .id = BOND_OPT_ARP_VALIDATE,
234                 .name = "arp_validate",
235                 .desc = "validate src/dst of ARP probes",
236                 .unsuppmodes = BIT(BOND_MODE_8023AD) | BIT(BOND_MODE_TLB) |
237                                BIT(BOND_MODE_ALB),
238                 .values = bond_arp_validate_tbl,
239                 .set = bond_option_arp_validate_set
240         },
241         [BOND_OPT_ARP_ALL_TARGETS] = {
242                 .id = BOND_OPT_ARP_ALL_TARGETS,
243                 .name = "arp_all_targets",
244                 .desc = "fail on any/all arp targets timeout",
245                 .values = bond_arp_all_targets_tbl,
246                 .set = bond_option_arp_all_targets_set
247         },
248         [BOND_OPT_FAIL_OVER_MAC] = {
249                 .id = BOND_OPT_FAIL_OVER_MAC,
250                 .name = "fail_over_mac",
251                 .desc = "For active-backup, do not set all slaves to the same MAC",
252                 .flags = BOND_OPTFLAG_NOSLAVES,
253                 .values = bond_fail_over_mac_tbl,
254                 .set = bond_option_fail_over_mac_set
255         },
256         [BOND_OPT_ARP_INTERVAL] = {
257                 .id = BOND_OPT_ARP_INTERVAL,
258                 .name = "arp_interval",
259                 .desc = "arp interval in milliseconds",
260                 .unsuppmodes = BIT(BOND_MODE_8023AD) | BIT(BOND_MODE_TLB) |
261                                BIT(BOND_MODE_ALB),
262                 .values = bond_intmax_tbl,
263                 .set = bond_option_arp_interval_set
264         },
265         [BOND_OPT_ARP_TARGETS] = {
266                 .id = BOND_OPT_ARP_TARGETS,
267                 .name = "arp_ip_target",
268                 .desc = "arp targets in n.n.n.n form",
269                 .flags = BOND_OPTFLAG_RAWVAL,
270                 .set = bond_option_arp_ip_targets_set
271         },
272         [BOND_OPT_DOWNDELAY] = {
273                 .id = BOND_OPT_DOWNDELAY,
274                 .name = "downdelay",
275                 .desc = "Delay before considering link down, in milliseconds",
276                 .values = bond_intmax_tbl,
277                 .set = bond_option_downdelay_set
278         },
279         [BOND_OPT_UPDELAY] = {
280                 .id = BOND_OPT_UPDELAY,
281                 .name = "updelay",
282                 .desc = "Delay before considering link up, in milliseconds",
283                 .values = bond_intmax_tbl,
284                 .set = bond_option_updelay_set
285         },
286         [BOND_OPT_LACP_RATE] = {
287                 .id = BOND_OPT_LACP_RATE,
288                 .name = "lacp_rate",
289                 .desc = "LACPDU tx rate to request from 802.3ad partner",
290                 .flags = BOND_OPTFLAG_IFDOWN,
291                 .unsuppmodes = BOND_MODE_ALL_EX(BIT(BOND_MODE_8023AD)),
292                 .values = bond_lacp_rate_tbl,
293                 .set = bond_option_lacp_rate_set
294         },
295         [BOND_OPT_MINLINKS] = {
296                 .id = BOND_OPT_MINLINKS,
297                 .name = "min_links",
298                 .desc = "Minimum number of available links before turning on carrier",
299                 .values = bond_intmax_tbl,
300                 .set = bond_option_min_links_set
301         },
302         [BOND_OPT_AD_SELECT] = {
303                 .id = BOND_OPT_AD_SELECT,
304                 .name = "ad_select",
305                 .desc = "803.ad aggregation selection logic",
306                 .flags = BOND_OPTFLAG_IFDOWN,
307                 .values = bond_ad_select_tbl,
308                 .set = bond_option_ad_select_set
309         },
310         [BOND_OPT_NUM_PEER_NOTIF] = {
311                 .id = BOND_OPT_NUM_PEER_NOTIF,
312                 .name = "num_unsol_na",
313                 .desc = "Number of peer notifications to send on failover event",
314                 .values = bond_num_peer_notif_tbl,
315                 .set = bond_option_num_peer_notif_set
316         },
317         [BOND_OPT_MIIMON] = {
318                 .id = BOND_OPT_MIIMON,
319                 .name = "miimon",
320                 .desc = "Link check interval in milliseconds",
321                 .values = bond_intmax_tbl,
322                 .set = bond_option_miimon_set
323         },
324         [BOND_OPT_PRIMARY] = {
325                 .id = BOND_OPT_PRIMARY,
326                 .name = "primary",
327                 .desc = "Primary network device to use",
328                 .flags = BOND_OPTFLAG_RAWVAL,
329                 .unsuppmodes = BOND_MODE_ALL_EX(BIT(BOND_MODE_ACTIVEBACKUP) |
330                                                 BIT(BOND_MODE_TLB) |
331                                                 BIT(BOND_MODE_ALB)),
332                 .set = bond_option_primary_set
333         },
334         [BOND_OPT_PRIMARY_RESELECT] = {
335                 .id = BOND_OPT_PRIMARY_RESELECT,
336                 .name = "primary_reselect",
337                 .desc = "Reselect primary slave once it comes up",
338                 .values = bond_primary_reselect_tbl,
339                 .set = bond_option_primary_reselect_set
340         },
341         [BOND_OPT_USE_CARRIER] = {
342                 .id = BOND_OPT_USE_CARRIER,
343                 .name = "use_carrier",
344                 .desc = "Use netif_carrier_ok (vs MII ioctls) in miimon",
345                 .values = bond_use_carrier_tbl,
346                 .set = bond_option_use_carrier_set
347         },
348         [BOND_OPT_ACTIVE_SLAVE] = {
349                 .id = BOND_OPT_ACTIVE_SLAVE,
350                 .name = "active_slave",
351                 .desc = "Currently active slave",
352                 .flags = BOND_OPTFLAG_RAWVAL,
353                 .unsuppmodes = BOND_MODE_ALL_EX(BIT(BOND_MODE_ACTIVEBACKUP) |
354                                                 BIT(BOND_MODE_TLB) |
355                                                 BIT(BOND_MODE_ALB)),
356                 .set = bond_option_active_slave_set
357         },
358         [BOND_OPT_QUEUE_ID] = {
359                 .id = BOND_OPT_QUEUE_ID,
360                 .name = "queue_id",
361                 .desc = "Set queue id of a slave",
362                 .flags = BOND_OPTFLAG_RAWVAL,
363                 .set = bond_option_queue_id_set
364         },
365         [BOND_OPT_ALL_SLAVES_ACTIVE] = {
366                 .id = BOND_OPT_ALL_SLAVES_ACTIVE,
367                 .name = "all_slaves_active",
368                 .desc = "Keep all frames received on an interface by setting active flag for all slaves",
369                 .values = bond_all_slaves_active_tbl,
370                 .set = bond_option_all_slaves_active_set
371         },
372         [BOND_OPT_RESEND_IGMP] = {
373                 .id = BOND_OPT_RESEND_IGMP,
374                 .name = "resend_igmp",
375                 .desc = "Number of IGMP membership reports to send on link failure",
376                 .values = bond_resend_igmp_tbl,
377                 .set = bond_option_resend_igmp_set
378         },
379         [BOND_OPT_LP_INTERVAL] = {
380                 .id = BOND_OPT_LP_INTERVAL,
381                 .name = "lp_interval",
382                 .desc = "The number of seconds between instances where the bonding driver sends learning packets to each slave's peer switch",
383                 .values = bond_lp_interval_tbl,
384                 .set = bond_option_lp_interval_set
385         },
386         [BOND_OPT_SLAVES] = {
387                 .id = BOND_OPT_SLAVES,
388                 .name = "slaves",
389                 .desc = "Slave membership management",
390                 .flags = BOND_OPTFLAG_RAWVAL,
391                 .set = bond_option_slaves_set
392         },
393         [BOND_OPT_TLB_DYNAMIC_LB] = {
394                 .id = BOND_OPT_TLB_DYNAMIC_LB,
395                 .name = "tlb_dynamic_lb",
396                 .desc = "Enable dynamic flow shuffling",
397                 .unsuppmodes = BOND_MODE_ALL_EX(BIT(BOND_MODE_TLB) | BIT(BOND_MODE_ALB)),
398                 .values = bond_tlb_dynamic_lb_tbl,
399                 .flags = BOND_OPTFLAG_IFDOWN,
400                 .set = bond_option_tlb_dynamic_lb_set,
401         },
402         [BOND_OPT_AD_ACTOR_SYS_PRIO] = {
403                 .id = BOND_OPT_AD_ACTOR_SYS_PRIO,
404                 .name = "ad_actor_sys_prio",
405                 .unsuppmodes = BOND_MODE_ALL_EX(BIT(BOND_MODE_8023AD)),
406                 .values = bond_ad_actor_sys_prio_tbl,
407                 .set = bond_option_ad_actor_sys_prio_set,
408         },
409         [BOND_OPT_AD_ACTOR_SYSTEM] = {
410                 .id = BOND_OPT_AD_ACTOR_SYSTEM,
411                 .name = "ad_actor_system",
412                 .unsuppmodes = BOND_MODE_ALL_EX(BIT(BOND_MODE_8023AD)),
413                 .flags = BOND_OPTFLAG_RAWVAL,
414                 .set = bond_option_ad_actor_system_set,
415         },
416         [BOND_OPT_AD_USER_PORT_KEY] = {
417                 .id = BOND_OPT_AD_USER_PORT_KEY,
418                 .name = "ad_user_port_key",
419                 .unsuppmodes = BOND_MODE_ALL_EX(BIT(BOND_MODE_8023AD)),
420                 .flags = BOND_OPTFLAG_IFDOWN,
421                 .values = bond_ad_user_port_key_tbl,
422                 .set = bond_option_ad_user_port_key_set,
423         },
424         [BOND_OPT_NUM_PEER_NOTIF_ALIAS] = {
425                 .id = BOND_OPT_NUM_PEER_NOTIF_ALIAS,
426                 .name = "num_grat_arp",
427                 .desc = "Number of peer notifications to send on failover event",
428                 .values = bond_num_peer_notif_tbl,
429                 .set = bond_option_num_peer_notif_set
430         },
431         [BOND_OPT_PEER_NOTIF_DELAY] = {
432                 .id = BOND_OPT_PEER_NOTIF_DELAY,
433                 .name = "peer_notif_delay",
434                 .desc = "Delay between each peer notification on failover event, in milliseconds",
435                 .values = bond_intmax_tbl,
436                 .set = bond_option_peer_notif_delay_set
437         }
438 };
439
440 /* Searches for an option by name */
441 const struct bond_option *bond_opt_get_by_name(const char *name)
442 {
443         const struct bond_option *opt;
444         int option;
445
446         for (option = 0; option < BOND_OPT_LAST; option++) {
447                 opt = bond_opt_get(option);
448                 if (opt && !strcmp(opt->name, name))
449                         return opt;
450         }
451
452         return NULL;
453 }
454
455 /* Searches for a value in opt's values[] table */
456 const struct bond_opt_value *bond_opt_get_val(unsigned int option, u64 val)
457 {
458         const struct bond_option *opt;
459         int i;
460
461         opt = bond_opt_get(option);
462         if (WARN_ON(!opt))
463                 return NULL;
464         for (i = 0; opt->values && opt->values[i].string; i++)
465                 if (opt->values[i].value == val)
466                         return &opt->values[i];
467
468         return NULL;
469 }
470
471 /* Searches for a value in opt's values[] table which matches the flagmask */
472 static const struct bond_opt_value *bond_opt_get_flags(const struct bond_option *opt,
473                                                        u32 flagmask)
474 {
475         int i;
476
477         for (i = 0; opt->values && opt->values[i].string; i++)
478                 if (opt->values[i].flags & flagmask)
479                         return &opt->values[i];
480
481         return NULL;
482 }
483
484 /* If maxval is missing then there's no range to check. In case minval is
485  * missing then it's considered to be 0.
486  */
487 static bool bond_opt_check_range(const struct bond_option *opt, u64 val)
488 {
489         const struct bond_opt_value *minval, *maxval;
490
491         minval = bond_opt_get_flags(opt, BOND_VALFLAG_MIN);
492         maxval = bond_opt_get_flags(opt, BOND_VALFLAG_MAX);
493         if (!maxval || (minval && val < minval->value) || val > maxval->value)
494                 return false;
495
496         return true;
497 }
498
499 /**
500  * bond_opt_parse - parse option value
501  * @opt: the option to parse against
502  * @val: value to parse
503  *
504  * This function tries to extract the value from @val and check if it's
505  * a possible match for the option and returns NULL if a match isn't found,
506  * or the struct_opt_value that matched. It also strips the new line from
507  * @val->string if it's present.
508  */
509 const struct bond_opt_value *bond_opt_parse(const struct bond_option *opt,
510                                             struct bond_opt_value *val)
511 {
512         char *p, valstr[BOND_OPT_MAX_NAMELEN + 1] = { 0, };
513         const struct bond_opt_value *tbl;
514         const struct bond_opt_value *ret = NULL;
515         bool checkval;
516         int i, rv;
517
518         /* No parsing if the option wants a raw val */
519         if (opt->flags & BOND_OPTFLAG_RAWVAL)
520                 return val;
521
522         tbl = opt->values;
523         if (!tbl)
524                 goto out;
525
526         /* ULLONG_MAX is used to bypass string processing */
527         checkval = val->value != ULLONG_MAX;
528         if (!checkval) {
529                 if (!val->string)
530                         goto out;
531                 p = strchr(val->string, '\n');
532                 if (p)
533                         *p = '\0';
534                 for (p = val->string; *p; p++)
535                         if (!(isdigit(*p) || isspace(*p)))
536                                 break;
537                 /* The following code extracts the string to match or the value
538                  * and sets checkval appropriately
539                  */
540                 if (*p) {
541                         rv = sscanf(val->string, "%32s", valstr);
542                 } else {
543                         rv = sscanf(val->string, "%llu", &val->value);
544                         checkval = true;
545                 }
546                 if (!rv)
547                         goto out;
548         }
549
550         for (i = 0; tbl[i].string; i++) {
551                 /* Check for exact match */
552                 if (checkval) {
553                         if (val->value == tbl[i].value)
554                                 ret = &tbl[i];
555                 } else {
556                         if (!strcmp(valstr, "default") &&
557                             (tbl[i].flags & BOND_VALFLAG_DEFAULT))
558                                 ret = &tbl[i];
559
560                         if (!strcmp(valstr, tbl[i].string))
561                                 ret = &tbl[i];
562                 }
563                 /* Found an exact match */
564                 if (ret)
565                         goto out;
566         }
567         /* Possible range match */
568         if (checkval && bond_opt_check_range(opt, val->value))
569                 ret = val;
570 out:
571         return ret;
572 }
573
574 /* Check opt's dependencies against bond mode and currently set options */
575 static int bond_opt_check_deps(struct bonding *bond,
576                                const struct bond_option *opt)
577 {
578         struct bond_params *params = &bond->params;
579
580         if (test_bit(params->mode, &opt->unsuppmodes))
581                 return -EACCES;
582         if ((opt->flags & BOND_OPTFLAG_NOSLAVES) && bond_has_slaves(bond))
583                 return -ENOTEMPTY;
584         if ((opt->flags & BOND_OPTFLAG_IFDOWN) && (bond->dev->flags & IFF_UP))
585                 return -EBUSY;
586
587         return 0;
588 }
589
590 static void bond_opt_dep_print(struct bonding *bond,
591                                const struct bond_option *opt)
592 {
593         const struct bond_opt_value *modeval;
594         struct bond_params *params;
595
596         params = &bond->params;
597         modeval = bond_opt_get_val(BOND_OPT_MODE, params->mode);
598         if (test_bit(params->mode, &opt->unsuppmodes))
599                 netdev_err(bond->dev, "option %s: mode dependency failed, not supported in mode %s(%llu)\n",
600                            opt->name, modeval->string, modeval->value);
601 }
602
603 static void bond_opt_error_interpret(struct bonding *bond,
604                                      const struct bond_option *opt,
605                                      int error, const struct bond_opt_value *val)
606 {
607         const struct bond_opt_value *minval, *maxval;
608         char *p;
609
610         switch (error) {
611         case -EINVAL:
612                 if (val) {
613                         if (val->string) {
614                                 /* sometimes RAWVAL opts may have new lines */
615                                 p = strchr(val->string, '\n');
616                                 if (p)
617                                         *p = '\0';
618                                 netdev_err(bond->dev, "option %s: invalid value (%s)\n",
619                                            opt->name, val->string);
620                         } else {
621                                 netdev_err(bond->dev, "option %s: invalid value (%llu)\n",
622                                            opt->name, val->value);
623                         }
624                 }
625                 minval = bond_opt_get_flags(opt, BOND_VALFLAG_MIN);
626                 maxval = bond_opt_get_flags(opt, BOND_VALFLAG_MAX);
627                 if (!maxval)
628                         break;
629                 netdev_err(bond->dev, "option %s: allowed values %llu - %llu\n",
630                            opt->name, minval ? minval->value : 0, maxval->value);
631                 break;
632         case -EACCES:
633                 bond_opt_dep_print(bond, opt);
634                 break;
635         case -ENOTEMPTY:
636                 netdev_err(bond->dev, "option %s: unable to set because the bond device has slaves\n",
637                            opt->name);
638                 break;
639         case -EBUSY:
640                 netdev_err(bond->dev, "option %s: unable to set because the bond device is up\n",
641                            opt->name);
642                 break;
643         default:
644                 break;
645         }
646 }
647
648 /**
649  * __bond_opt_set - set a bonding option
650  * @bond: target bond device
651  * @option: option to set
652  * @val: value to set it to
653  *
654  * This function is used to change the bond's option value, it can be
655  * used for both enabling/changing an option and for disabling it. RTNL lock
656  * must be obtained before calling this function.
657  */
658 int __bond_opt_set(struct bonding *bond,
659                    unsigned int option, struct bond_opt_value *val)
660 {
661         const struct bond_opt_value *retval = NULL;
662         const struct bond_option *opt;
663         int ret = -ENOENT;
664
665         ASSERT_RTNL();
666
667         opt = bond_opt_get(option);
668         if (WARN_ON(!val) || WARN_ON(!opt))
669                 goto out;
670         ret = bond_opt_check_deps(bond, opt);
671         if (ret)
672                 goto out;
673         retval = bond_opt_parse(opt, val);
674         if (!retval) {
675                 ret = -EINVAL;
676                 goto out;
677         }
678         ret = opt->set(bond, retval);
679 out:
680         if (ret)
681                 bond_opt_error_interpret(bond, opt, ret, val);
682
683         return ret;
684 }
685 /**
686  * __bond_opt_set_notify - set a bonding option
687  * @bond: target bond device
688  * @option: option to set
689  * @val: value to set it to
690  *
691  * This function is used to change the bond's option value and trigger
692  * a notification to user sapce. It can be used for both enabling/changing
693  * an option and for disabling it. RTNL lock must be obtained before calling
694  * this function.
695  */
696 int __bond_opt_set_notify(struct bonding *bond,
697                           unsigned int option, struct bond_opt_value *val)
698 {
699         int ret = -ENOENT;
700
701         ASSERT_RTNL();
702
703         ret = __bond_opt_set(bond, option, val);
704
705         if (!ret && (bond->dev->reg_state == NETREG_REGISTERED))
706                 call_netdevice_notifiers(NETDEV_CHANGEINFODATA, bond->dev);
707
708         return ret;
709 }
710
711 /**
712  * bond_opt_tryset_rtnl - try to acquire rtnl and call __bond_opt_set
713  * @bond: target bond device
714  * @option: option to set
715  * @buf: value to set it to
716  *
717  * This function tries to acquire RTNL without blocking and if successful
718  * calls __bond_opt_set. It is mainly used for sysfs option manipulation.
719  */
720 int bond_opt_tryset_rtnl(struct bonding *bond, unsigned int option, char *buf)
721 {
722         struct bond_opt_value optval;
723         int ret;
724
725         if (!rtnl_trylock())
726                 return restart_syscall();
727         bond_opt_initstr(&optval, buf);
728         ret = __bond_opt_set_notify(bond, option, &optval);
729         rtnl_unlock();
730
731         return ret;
732 }
733
734 /**
735  * bond_opt_get - get a pointer to an option
736  * @option: option for which to return a pointer
737  *
738  * This function checks if option is valid and if so returns a pointer
739  * to its entry in the bond_opts[] option array.
740  */
741 const struct bond_option *bond_opt_get(unsigned int option)
742 {
743         if (!BOND_OPT_VALID(option))
744                 return NULL;
745
746         return &bond_opts[option];
747 }
748
749 static bool bond_set_xfrm_features(struct bonding *bond)
750 {
751         if (!IS_ENABLED(CONFIG_XFRM_OFFLOAD))
752                 return false;
753
754         if (BOND_MODE(bond) == BOND_MODE_ACTIVEBACKUP)
755                 bond->dev->wanted_features |= BOND_XFRM_FEATURES;
756         else
757                 bond->dev->wanted_features &= ~BOND_XFRM_FEATURES;
758
759         return true;
760 }
761
762 static bool bond_set_tls_features(struct bonding *bond)
763 {
764         if (!IS_ENABLED(CONFIG_TLS_DEVICE))
765                 return false;
766
767         if (bond_sk_check(bond))
768                 bond->dev->wanted_features |= BOND_TLS_FEATURES;
769         else
770                 bond->dev->wanted_features &= ~BOND_TLS_FEATURES;
771
772         return true;
773 }
774
775 static int bond_option_mode_set(struct bonding *bond,
776                                 const struct bond_opt_value *newval)
777 {
778         if (!bond_mode_uses_arp(newval->value)) {
779                 if (bond->params.arp_interval) {
780                         netdev_dbg(bond->dev, "%s mode is incompatible with arp monitoring, start mii monitoring\n",
781                                    newval->string);
782                         /* disable arp monitoring */
783                         bond->params.arp_interval = 0;
784                 }
785
786                 if (!bond->params.miimon) {
787                         /* set miimon to default value */
788                         bond->params.miimon = BOND_DEFAULT_MIIMON;
789                         netdev_dbg(bond->dev, "Setting MII monitoring interval to %d\n",
790                                    bond->params.miimon);
791                 }
792         }
793
794         if (newval->value == BOND_MODE_ALB)
795                 bond->params.tlb_dynamic_lb = 1;
796
797         /* don't cache arp_validate between modes */
798         bond->params.arp_validate = BOND_ARP_VALIDATE_NONE;
799         bond->params.mode = newval->value;
800
801         if (bond->dev->reg_state == NETREG_REGISTERED) {
802                 bool update = false;
803
804                 update |= bond_set_xfrm_features(bond);
805                 update |= bond_set_tls_features(bond);
806
807                 if (update)
808                         netdev_update_features(bond->dev);
809         }
810
811         return 0;
812 }
813
814 static int bond_option_active_slave_set(struct bonding *bond,
815                                         const struct bond_opt_value *newval)
816 {
817         char ifname[IFNAMSIZ] = { 0, };
818         struct net_device *slave_dev;
819         int ret = 0;
820
821         sscanf(newval->string, "%15s", ifname); /* IFNAMSIZ */
822         if (!strlen(ifname) || newval->string[0] == '\n') {
823                 slave_dev = NULL;
824         } else {
825                 slave_dev = __dev_get_by_name(dev_net(bond->dev), ifname);
826                 if (!slave_dev)
827                         return -ENODEV;
828         }
829
830         if (slave_dev) {
831                 if (!netif_is_bond_slave(slave_dev)) {
832                         slave_err(bond->dev, slave_dev, "Device is not bonding slave\n");
833                         return -EINVAL;
834                 }
835
836                 if (bond->dev != netdev_master_upper_dev_get(slave_dev)) {
837                         slave_err(bond->dev, slave_dev, "Device is not our slave\n");
838                         return -EINVAL;
839                 }
840         }
841
842         block_netpoll_tx();
843         /* check to see if we are clearing active */
844         if (!slave_dev) {
845                 netdev_dbg(bond->dev, "Clearing current active slave\n");
846                 RCU_INIT_POINTER(bond->curr_active_slave, NULL);
847                 bond_select_active_slave(bond);
848         } else {
849                 struct slave *old_active = rtnl_dereference(bond->curr_active_slave);
850                 struct slave *new_active = bond_slave_get_rtnl(slave_dev);
851
852                 BUG_ON(!new_active);
853
854                 if (new_active == old_active) {
855                         /* do nothing */
856                         slave_dbg(bond->dev, new_active->dev, "is already the current active slave\n");
857                 } else {
858                         if (old_active && (new_active->link == BOND_LINK_UP) &&
859                             bond_slave_is_up(new_active)) {
860                                 slave_dbg(bond->dev, new_active->dev, "Setting as active slave\n");
861                                 bond_change_active_slave(bond, new_active);
862                         } else {
863                                 slave_err(bond->dev, new_active->dev, "Could not set as active slave; either %s is down or the link is down\n",
864                                           new_active->dev->name);
865                                 ret = -EINVAL;
866                         }
867                 }
868         }
869         unblock_netpoll_tx();
870
871         return ret;
872 }
873
874 /* There are two tricky bits here.  First, if MII monitoring is activated, then
875  * we must disable ARP monitoring.  Second, if the timer isn't running, we must
876  * start it.
877  */
878 static int bond_option_miimon_set(struct bonding *bond,
879                                   const struct bond_opt_value *newval)
880 {
881         netdev_dbg(bond->dev, "Setting MII monitoring interval to %llu\n",
882                    newval->value);
883         bond->params.miimon = newval->value;
884         if (bond->params.updelay)
885                 netdev_dbg(bond->dev, "Note: Updating updelay (to %d) since it is a multiple of the miimon value\n",
886                            bond->params.updelay * bond->params.miimon);
887         if (bond->params.downdelay)
888                 netdev_dbg(bond->dev, "Note: Updating downdelay (to %d) since it is a multiple of the miimon value\n",
889                            bond->params.downdelay * bond->params.miimon);
890         if (bond->params.peer_notif_delay)
891                 netdev_dbg(bond->dev, "Note: Updating peer_notif_delay (to %d) since it is a multiple of the miimon value\n",
892                            bond->params.peer_notif_delay * bond->params.miimon);
893         if (newval->value && bond->params.arp_interval) {
894                 netdev_dbg(bond->dev, "MII monitoring cannot be used with ARP monitoring - disabling ARP monitoring...\n");
895                 bond->params.arp_interval = 0;
896                 if (bond->params.arp_validate)
897                         bond->params.arp_validate = BOND_ARP_VALIDATE_NONE;
898         }
899         if (bond->dev->flags & IFF_UP) {
900                 /* If the interface is up, we may need to fire off
901                  * the MII timer. If the interface is down, the
902                  * timer will get fired off when the open function
903                  * is called.
904                  */
905                 if (!newval->value) {
906                         cancel_delayed_work_sync(&bond->mii_work);
907                 } else {
908                         cancel_delayed_work_sync(&bond->arp_work);
909                         queue_delayed_work(bond->wq, &bond->mii_work, 0);
910                 }
911         }
912
913         return 0;
914 }
915
916 /* Set up, down and peer notification delays. These must be multiples
917  * of the MII monitoring value, and are stored internally as the
918  * multiplier. Thus, we must translate to MS for the real world.
919  */
920 static int _bond_option_delay_set(struct bonding *bond,
921                                   const struct bond_opt_value *newval,
922                                   const char *name,
923                                   int *target)
924 {
925         int value = newval->value;
926
927         if (!bond->params.miimon) {
928                 netdev_err(bond->dev, "Unable to set %s as MII monitoring is disabled\n",
929                            name);
930                 return -EPERM;
931         }
932         if ((value % bond->params.miimon) != 0) {
933                 netdev_warn(bond->dev,
934                             "%s (%d) is not a multiple of miimon (%d), value rounded to %d ms\n",
935                             name,
936                             value, bond->params.miimon,
937                             (value / bond->params.miimon) *
938                             bond->params.miimon);
939         }
940         *target = value / bond->params.miimon;
941         netdev_dbg(bond->dev, "Setting %s to %d\n",
942                    name,
943                    *target * bond->params.miimon);
944
945         return 0;
946 }
947
948 static int bond_option_updelay_set(struct bonding *bond,
949                                    const struct bond_opt_value *newval)
950 {
951         return _bond_option_delay_set(bond, newval, "up delay",
952                                       &bond->params.updelay);
953 }
954
955 static int bond_option_downdelay_set(struct bonding *bond,
956                                      const struct bond_opt_value *newval)
957 {
958         return _bond_option_delay_set(bond, newval, "down delay",
959                                       &bond->params.downdelay);
960 }
961
962 static int bond_option_peer_notif_delay_set(struct bonding *bond,
963                                             const struct bond_opt_value *newval)
964 {
965         int ret = _bond_option_delay_set(bond, newval,
966                                          "peer notification delay",
967                                          &bond->params.peer_notif_delay);
968         return ret;
969 }
970
971 static int bond_option_use_carrier_set(struct bonding *bond,
972                                        const struct bond_opt_value *newval)
973 {
974         netdev_dbg(bond->dev, "Setting use_carrier to %llu\n",
975                    newval->value);
976         bond->params.use_carrier = newval->value;
977
978         return 0;
979 }
980
981 /* There are two tricky bits here.  First, if ARP monitoring is activated, then
982  * we must disable MII monitoring.  Second, if the ARP timer isn't running,
983  * we must start it.
984  */
985 static int bond_option_arp_interval_set(struct bonding *bond,
986                                         const struct bond_opt_value *newval)
987 {
988         netdev_dbg(bond->dev, "Setting ARP monitoring interval to %llu\n",
989                    newval->value);
990         bond->params.arp_interval = newval->value;
991         if (newval->value) {
992                 if (bond->params.miimon) {
993                         netdev_dbg(bond->dev, "ARP monitoring cannot be used with MII monitoring. Disabling MII monitoring\n");
994                         bond->params.miimon = 0;
995                 }
996                 if (!bond->params.arp_targets[0])
997                         netdev_dbg(bond->dev, "ARP monitoring has been set up, but no ARP targets have been specified\n");
998         }
999         if (bond->dev->flags & IFF_UP) {
1000                 /* If the interface is up, we may need to fire off
1001                  * the ARP timer.  If the interface is down, the
1002                  * timer will get fired off when the open function
1003                  * is called.
1004                  */
1005                 if (!newval->value) {
1006                         if (bond->params.arp_validate)
1007                                 bond->recv_probe = NULL;
1008                         cancel_delayed_work_sync(&bond->arp_work);
1009                 } else {
1010                         /* arp_validate can be set only in active-backup mode */
1011                         bond->recv_probe = bond_arp_rcv;
1012                         cancel_delayed_work_sync(&bond->mii_work);
1013                         queue_delayed_work(bond->wq, &bond->arp_work, 0);
1014                 }
1015         }
1016
1017         return 0;
1018 }
1019
1020 static void _bond_options_arp_ip_target_set(struct bonding *bond, int slot,
1021                                             __be32 target,
1022                                             unsigned long last_rx)
1023 {
1024         __be32 *targets = bond->params.arp_targets;
1025         struct list_head *iter;
1026         struct slave *slave;
1027
1028         if (slot >= 0 && slot < BOND_MAX_ARP_TARGETS) {
1029                 bond_for_each_slave(bond, slave, iter)
1030                         slave->target_last_arp_rx[slot] = last_rx;
1031                 targets[slot] = target;
1032         }
1033 }
1034
1035 static int _bond_option_arp_ip_target_add(struct bonding *bond, __be32 target)
1036 {
1037         __be32 *targets = bond->params.arp_targets;
1038         int ind;
1039
1040         if (!bond_is_ip_target_ok(target)) {
1041                 netdev_err(bond->dev, "invalid ARP target %pI4 specified for addition\n",
1042                            &target);
1043                 return -EINVAL;
1044         }
1045
1046         if (bond_get_targets_ip(targets, target) != -1) { /* dup */
1047                 netdev_err(bond->dev, "ARP target %pI4 is already present\n",
1048                            &target);
1049                 return -EINVAL;
1050         }
1051
1052         ind = bond_get_targets_ip(targets, 0); /* first free slot */
1053         if (ind == -1) {
1054                 netdev_err(bond->dev, "ARP target table is full!\n");
1055                 return -EINVAL;
1056         }
1057
1058         netdev_dbg(bond->dev, "Adding ARP target %pI4\n", &target);
1059
1060         _bond_options_arp_ip_target_set(bond, ind, target, jiffies);
1061
1062         return 0;
1063 }
1064
1065 static int bond_option_arp_ip_target_add(struct bonding *bond, __be32 target)
1066 {
1067         return _bond_option_arp_ip_target_add(bond, target);
1068 }
1069
1070 static int bond_option_arp_ip_target_rem(struct bonding *bond, __be32 target)
1071 {
1072         __be32 *targets = bond->params.arp_targets;
1073         struct list_head *iter;
1074         struct slave *slave;
1075         unsigned long *targets_rx;
1076         int ind, i;
1077
1078         if (!bond_is_ip_target_ok(target)) {
1079                 netdev_err(bond->dev, "invalid ARP target %pI4 specified for removal\n",
1080                            &target);
1081                 return -EINVAL;
1082         }
1083
1084         ind = bond_get_targets_ip(targets, target);
1085         if (ind == -1) {
1086                 netdev_err(bond->dev, "unable to remove nonexistent ARP target %pI4\n",
1087                            &target);
1088                 return -EINVAL;
1089         }
1090
1091         if (ind == 0 && !targets[1] && bond->params.arp_interval)
1092                 netdev_warn(bond->dev, "Removing last arp target with arp_interval on\n");
1093
1094         netdev_dbg(bond->dev, "Removing ARP target %pI4\n", &target);
1095
1096         bond_for_each_slave(bond, slave, iter) {
1097                 targets_rx = slave->target_last_arp_rx;
1098                 for (i = ind; (i < BOND_MAX_ARP_TARGETS-1) && targets[i+1]; i++)
1099                         targets_rx[i] = targets_rx[i+1];
1100                 targets_rx[i] = 0;
1101         }
1102         for (i = ind; (i < BOND_MAX_ARP_TARGETS-1) && targets[i+1]; i++)
1103                 targets[i] = targets[i+1];
1104         targets[i] = 0;
1105
1106         return 0;
1107 }
1108
1109 void bond_option_arp_ip_targets_clear(struct bonding *bond)
1110 {
1111         int i;
1112
1113         for (i = 0; i < BOND_MAX_ARP_TARGETS; i++)
1114                 _bond_options_arp_ip_target_set(bond, i, 0, 0);
1115 }
1116
1117 static int bond_option_arp_ip_targets_set(struct bonding *bond,
1118                                           const struct bond_opt_value *newval)
1119 {
1120         int ret = -EPERM;
1121         __be32 target;
1122
1123         if (newval->string) {
1124                 if (!in4_pton(newval->string+1, -1, (u8 *)&target, -1, NULL)) {
1125                         netdev_err(bond->dev, "invalid ARP target %pI4 specified\n",
1126                                    &target);
1127                         return ret;
1128                 }
1129                 if (newval->string[0] == '+')
1130                         ret = bond_option_arp_ip_target_add(bond, target);
1131                 else if (newval->string[0] == '-')
1132                         ret = bond_option_arp_ip_target_rem(bond, target);
1133                 else
1134                         netdev_err(bond->dev, "no command found in arp_ip_targets file - use +<addr> or -<addr>\n");
1135         } else {
1136                 target = newval->value;
1137                 ret = bond_option_arp_ip_target_add(bond, target);
1138         }
1139
1140         return ret;
1141 }
1142
1143 static int bond_option_arp_validate_set(struct bonding *bond,
1144                                         const struct bond_opt_value *newval)
1145 {
1146         netdev_dbg(bond->dev, "Setting arp_validate to %s (%llu)\n",
1147                    newval->string, newval->value);
1148         bond->params.arp_validate = newval->value;
1149
1150         return 0;
1151 }
1152
1153 static int bond_option_arp_all_targets_set(struct bonding *bond,
1154                                            const struct bond_opt_value *newval)
1155 {
1156         netdev_dbg(bond->dev, "Setting arp_all_targets to %s (%llu)\n",
1157                    newval->string, newval->value);
1158         bond->params.arp_all_targets = newval->value;
1159
1160         return 0;
1161 }
1162
1163 static int bond_option_primary_set(struct bonding *bond,
1164                                    const struct bond_opt_value *newval)
1165 {
1166         char *p, *primary = newval->string;
1167         struct list_head *iter;
1168         struct slave *slave;
1169
1170         block_netpoll_tx();
1171
1172         p = strchr(primary, '\n');
1173         if (p)
1174                 *p = '\0';
1175         /* check to see if we are clearing primary */
1176         if (!strlen(primary)) {
1177                 netdev_dbg(bond->dev, "Setting primary slave to None\n");
1178                 RCU_INIT_POINTER(bond->primary_slave, NULL);
1179                 memset(bond->params.primary, 0, sizeof(bond->params.primary));
1180                 bond_select_active_slave(bond);
1181                 goto out;
1182         }
1183
1184         bond_for_each_slave(bond, slave, iter) {
1185                 if (strncmp(slave->dev->name, primary, IFNAMSIZ) == 0) {
1186                         slave_dbg(bond->dev, slave->dev, "Setting as primary slave\n");
1187                         rcu_assign_pointer(bond->primary_slave, slave);
1188                         strcpy(bond->params.primary, slave->dev->name);
1189                         bond->force_primary = true;
1190                         bond_select_active_slave(bond);
1191                         goto out;
1192                 }
1193         }
1194
1195         if (rtnl_dereference(bond->primary_slave)) {
1196                 netdev_dbg(bond->dev, "Setting primary slave to None\n");
1197                 RCU_INIT_POINTER(bond->primary_slave, NULL);
1198                 bond_select_active_slave(bond);
1199         }
1200         strncpy(bond->params.primary, primary, IFNAMSIZ);
1201         bond->params.primary[IFNAMSIZ - 1] = 0;
1202
1203         netdev_dbg(bond->dev, "Recording %s as primary, but it has not been enslaved yet\n",
1204                    primary);
1205
1206 out:
1207         unblock_netpoll_tx();
1208
1209         return 0;
1210 }
1211
1212 static int bond_option_primary_reselect_set(struct bonding *bond,
1213                                             const struct bond_opt_value *newval)
1214 {
1215         netdev_dbg(bond->dev, "Setting primary_reselect to %s (%llu)\n",
1216                    newval->string, newval->value);
1217         bond->params.primary_reselect = newval->value;
1218
1219         block_netpoll_tx();
1220         bond_select_active_slave(bond);
1221         unblock_netpoll_tx();
1222
1223         return 0;
1224 }
1225
1226 static int bond_option_fail_over_mac_set(struct bonding *bond,
1227                                          const struct bond_opt_value *newval)
1228 {
1229         netdev_dbg(bond->dev, "Setting fail_over_mac to %s (%llu)\n",
1230                    newval->string, newval->value);
1231         bond->params.fail_over_mac = newval->value;
1232
1233         return 0;
1234 }
1235
1236 static int bond_option_xmit_hash_policy_set(struct bonding *bond,
1237                                             const struct bond_opt_value *newval)
1238 {
1239         netdev_dbg(bond->dev, "Setting xmit hash policy to %s (%llu)\n",
1240                    newval->string, newval->value);
1241         bond->params.xmit_policy = newval->value;
1242
1243         if (bond->dev->reg_state == NETREG_REGISTERED)
1244                 if (bond_set_tls_features(bond))
1245                         netdev_update_features(bond->dev);
1246
1247         return 0;
1248 }
1249
1250 static int bond_option_resend_igmp_set(struct bonding *bond,
1251                                        const struct bond_opt_value *newval)
1252 {
1253         netdev_dbg(bond->dev, "Setting resend_igmp to %llu\n",
1254                    newval->value);
1255         bond->params.resend_igmp = newval->value;
1256
1257         return 0;
1258 }
1259
1260 static int bond_option_num_peer_notif_set(struct bonding *bond,
1261                                    const struct bond_opt_value *newval)
1262 {
1263         bond->params.num_peer_notif = newval->value;
1264
1265         return 0;
1266 }
1267
1268 static int bond_option_all_slaves_active_set(struct bonding *bond,
1269                                              const struct bond_opt_value *newval)
1270 {
1271         struct list_head *iter;
1272         struct slave *slave;
1273
1274         if (newval->value == bond->params.all_slaves_active)
1275                 return 0;
1276         bond->params.all_slaves_active = newval->value;
1277         bond_for_each_slave(bond, slave, iter) {
1278                 if (!bond_is_active_slave(slave)) {
1279                         if (newval->value)
1280                                 slave->inactive = 0;
1281                         else
1282                                 slave->inactive = 1;
1283                 }
1284         }
1285
1286         return 0;
1287 }
1288
1289 static int bond_option_min_links_set(struct bonding *bond,
1290                                      const struct bond_opt_value *newval)
1291 {
1292         netdev_dbg(bond->dev, "Setting min links value to %llu\n",
1293                    newval->value);
1294         bond->params.min_links = newval->value;
1295         bond_set_carrier(bond);
1296
1297         return 0;
1298 }
1299
1300 static int bond_option_lp_interval_set(struct bonding *bond,
1301                                        const struct bond_opt_value *newval)
1302 {
1303         bond->params.lp_interval = newval->value;
1304
1305         return 0;
1306 }
1307
1308 static int bond_option_pps_set(struct bonding *bond,
1309                                const struct bond_opt_value *newval)
1310 {
1311         netdev_dbg(bond->dev, "Setting packets per slave to %llu\n",
1312                    newval->value);
1313         bond->params.packets_per_slave = newval->value;
1314         if (newval->value > 0) {
1315                 bond->params.reciprocal_packets_per_slave =
1316                         reciprocal_value(newval->value);
1317         } else {
1318                 /* reciprocal_packets_per_slave is unused if
1319                  * packets_per_slave is 0 or 1, just initialize it
1320                  */
1321                 bond->params.reciprocal_packets_per_slave =
1322                         (struct reciprocal_value) { 0 };
1323         }
1324
1325         return 0;
1326 }
1327
1328 static int bond_option_lacp_rate_set(struct bonding *bond,
1329                                      const struct bond_opt_value *newval)
1330 {
1331         netdev_dbg(bond->dev, "Setting LACP rate to %s (%llu)\n",
1332                    newval->string, newval->value);
1333         bond->params.lacp_fast = newval->value;
1334         bond_3ad_update_lacp_rate(bond);
1335
1336         return 0;
1337 }
1338
1339 static int bond_option_ad_select_set(struct bonding *bond,
1340                                      const struct bond_opt_value *newval)
1341 {
1342         netdev_dbg(bond->dev, "Setting ad_select to %s (%llu)\n",
1343                    newval->string, newval->value);
1344         bond->params.ad_select = newval->value;
1345
1346         return 0;
1347 }
1348
1349 static int bond_option_queue_id_set(struct bonding *bond,
1350                                     const struct bond_opt_value *newval)
1351 {
1352         struct slave *slave, *update_slave;
1353         struct net_device *sdev;
1354         struct list_head *iter;
1355         char *delim;
1356         int ret = 0;
1357         u16 qid;
1358
1359         /* delim will point to queue id if successful */
1360         delim = strchr(newval->string, ':');
1361         if (!delim)
1362                 goto err_no_cmd;
1363
1364         /* Terminate string that points to device name and bump it
1365          * up one, so we can read the queue id there.
1366          */
1367         *delim = '\0';
1368         if (sscanf(++delim, "%hd\n", &qid) != 1)
1369                 goto err_no_cmd;
1370
1371         /* Check buffer length, valid ifname and queue id */
1372         if (!dev_valid_name(newval->string) ||
1373             qid > bond->dev->real_num_tx_queues)
1374                 goto err_no_cmd;
1375
1376         /* Get the pointer to that interface if it exists */
1377         sdev = __dev_get_by_name(dev_net(bond->dev), newval->string);
1378         if (!sdev)
1379                 goto err_no_cmd;
1380
1381         /* Search for thes slave and check for duplicate qids */
1382         update_slave = NULL;
1383         bond_for_each_slave(bond, slave, iter) {
1384                 if (sdev == slave->dev)
1385                         /* We don't need to check the matching
1386                          * slave for dups, since we're overwriting it
1387                          */
1388                         update_slave = slave;
1389                 else if (qid && qid == slave->queue_id) {
1390                         goto err_no_cmd;
1391                 }
1392         }
1393
1394         if (!update_slave)
1395                 goto err_no_cmd;
1396
1397         /* Actually set the qids for the slave */
1398         update_slave->queue_id = qid;
1399
1400 out:
1401         return ret;
1402
1403 err_no_cmd:
1404         netdev_dbg(bond->dev, "invalid input for queue_id set\n");
1405         ret = -EPERM;
1406         goto out;
1407
1408 }
1409
1410 static int bond_option_slaves_set(struct bonding *bond,
1411                                   const struct bond_opt_value *newval)
1412 {
1413         char command[IFNAMSIZ + 1] = { 0, };
1414         struct net_device *dev;
1415         char *ifname;
1416         int ret;
1417
1418         sscanf(newval->string, "%16s", command); /* IFNAMSIZ*/
1419         ifname = command + 1;
1420         if ((strlen(command) <= 1) ||
1421             (command[0] != '+' && command[0] != '-') ||
1422             !dev_valid_name(ifname))
1423                 goto err_no_cmd;
1424
1425         dev = __dev_get_by_name(dev_net(bond->dev), ifname);
1426         if (!dev) {
1427                 netdev_dbg(bond->dev, "interface %s does not exist!\n",
1428                            ifname);
1429                 ret = -ENODEV;
1430                 goto out;
1431         }
1432
1433         switch (command[0]) {
1434         case '+':
1435                 slave_dbg(bond->dev, dev, "Enslaving interface\n");
1436                 ret = bond_enslave(bond->dev, dev, NULL);
1437                 break;
1438
1439         case '-':
1440                 slave_dbg(bond->dev, dev, "Releasing interface\n");
1441                 ret = bond_release(bond->dev, dev);
1442                 break;
1443
1444         default:
1445                 /* should not run here. */
1446                 goto err_no_cmd;
1447         }
1448
1449 out:
1450         return ret;
1451
1452 err_no_cmd:
1453         netdev_err(bond->dev, "no command found in slaves file - use +ifname or -ifname\n");
1454         ret = -EPERM;
1455         goto out;
1456 }
1457
1458 static int bond_option_tlb_dynamic_lb_set(struct bonding *bond,
1459                                           const struct bond_opt_value *newval)
1460 {
1461         netdev_dbg(bond->dev, "Setting dynamic-lb to %s (%llu)\n",
1462                    newval->string, newval->value);
1463         bond->params.tlb_dynamic_lb = newval->value;
1464
1465         return 0;
1466 }
1467
1468 static int bond_option_ad_actor_sys_prio_set(struct bonding *bond,
1469                                              const struct bond_opt_value *newval)
1470 {
1471         netdev_dbg(bond->dev, "Setting ad_actor_sys_prio to %llu\n",
1472                    newval->value);
1473
1474         bond->params.ad_actor_sys_prio = newval->value;
1475         bond_3ad_update_ad_actor_settings(bond);
1476
1477         return 0;
1478 }
1479
1480 static int bond_option_ad_actor_system_set(struct bonding *bond,
1481                                            const struct bond_opt_value *newval)
1482 {
1483         u8 macaddr[ETH_ALEN];
1484         u8 *mac;
1485
1486         if (newval->string) {
1487                 if (!mac_pton(newval->string, macaddr))
1488                         goto err;
1489                 mac = macaddr;
1490         } else {
1491                 mac = (u8 *)&newval->value;
1492         }
1493
1494         if (!is_valid_ether_addr(mac))
1495                 goto err;
1496
1497         netdev_dbg(bond->dev, "Setting ad_actor_system to %pM\n", mac);
1498         ether_addr_copy(bond->params.ad_actor_system, mac);
1499         bond_3ad_update_ad_actor_settings(bond);
1500
1501         return 0;
1502
1503 err:
1504         netdev_err(bond->dev, "Invalid ad_actor_system MAC address.\n");
1505         return -EINVAL;
1506 }
1507
1508 static int bond_option_ad_user_port_key_set(struct bonding *bond,
1509                                             const struct bond_opt_value *newval)
1510 {
1511         netdev_dbg(bond->dev, "Setting ad_user_port_key to %llu\n",
1512                    newval->value);
1513
1514         bond->params.ad_user_port_key = newval->value;
1515         return 0;
1516 }
This page took 0.121564 seconds and 4 git commands to generate.