]>
Commit | Line | Data |
---|---|---|
730d3f61 JP |
1 | /* |
2 | * iplink_bond_slave.c Bonding slave device support | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or | |
5 | * modify it under the terms of the GNU General Public License | |
6 | * as published by the Free Software Foundation; either version | |
7 | * 2 of the License, or (at your option) any later version. | |
8 | * | |
9 | * Authors: Jiri Pirko <jiri@resnulli.us> | |
10 | */ | |
11 | ||
12 | #include <stdio.h> | |
13 | #include <sys/socket.h> | |
14 | #include <linux/if_bonding.h> | |
15 | ||
16 | #include "rt_names.h" | |
17 | #include "utils.h" | |
18 | #include "ip_common.h" | |
19 | ||
25c93faa PS |
20 | static void print_explain(FILE *f) |
21 | { | |
22 | fprintf(f, "Usage: ... bond_slave [ queue_id ID ]\n"); | |
23 | } | |
24 | ||
25 | static void explain(void) | |
26 | { | |
27 | print_explain(stderr); | |
28 | } | |
29 | ||
730d3f61 JP |
30 | static const char *slave_states[] = { |
31 | [BOND_STATE_ACTIVE] = "ACTIVE", | |
32 | [BOND_STATE_BACKUP] = "BACKUP", | |
33 | }; | |
34 | ||
35 | static void print_slave_state(FILE *f, struct rtattr *tb) | |
36 | { | |
37 | unsigned int state = rta_getattr_u8(tb); | |
38 | ||
56f5daac | 39 | if (state >= ARRAY_SIZE(slave_states)) |
707cce5a | 40 | print_int(PRINT_ANY, "state_index", "state %d ", state); |
730d3f61 | 41 | else |
707cce5a JF |
42 | print_string(PRINT_ANY, |
43 | "state", | |
44 | "state %s ", | |
45 | slave_states[state]); | |
730d3f61 JP |
46 | } |
47 | ||
48 | static const char *slave_mii_status[] = { | |
49 | [BOND_LINK_UP] = "UP", | |
50 | [BOND_LINK_FAIL] = "GOING_DOWN", | |
51 | [BOND_LINK_DOWN] = "DOWN", | |
52 | [BOND_LINK_BACK] = "GOING_BACK", | |
53 | }; | |
54 | ||
55 | static void print_slave_mii_status(FILE *f, struct rtattr *tb) | |
56 | { | |
57 | unsigned int status = rta_getattr_u8(tb); | |
58 | ||
56f5daac | 59 | if (status >= ARRAY_SIZE(slave_mii_status)) |
707cce5a JF |
60 | print_int(PRINT_ANY, |
61 | "mii_status_index", | |
62 | "mii_status %d ", | |
63 | status); | |
730d3f61 | 64 | else |
707cce5a JF |
65 | print_string(PRINT_ANY, |
66 | "mii_status", | |
67 | "mii_status %s ", | |
68 | slave_mii_status[status]); | |
730d3f61 JP |
69 | } |
70 | ||
71 | static void bond_slave_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) | |
72 | { | |
73 | SPRINT_BUF(b1); | |
74 | if (!tb) | |
75 | return; | |
76 | ||
77 | if (tb[IFLA_BOND_SLAVE_STATE]) | |
78 | print_slave_state(f, tb[IFLA_BOND_SLAVE_STATE]); | |
79 | ||
80 | if (tb[IFLA_BOND_SLAVE_MII_STATUS]) | |
81 | print_slave_mii_status(f, tb[IFLA_BOND_SLAVE_MII_STATUS]); | |
82 | ||
83 | if (tb[IFLA_BOND_SLAVE_LINK_FAILURE_COUNT]) | |
707cce5a JF |
84 | print_int(PRINT_ANY, |
85 | "link_failure_count", | |
86 | "link_failure_count %d ", | |
87 | rta_getattr_u32(tb[IFLA_BOND_SLAVE_LINK_FAILURE_COUNT])); | |
730d3f61 JP |
88 | |
89 | if (tb[IFLA_BOND_SLAVE_PERM_HWADDR]) | |
707cce5a JF |
90 | print_string(PRINT_ANY, |
91 | "perm_hwaddr", | |
92 | "perm_hwaddr %s ", | |
93 | ll_addr_n2a(RTA_DATA(tb[IFLA_BOND_SLAVE_PERM_HWADDR]), | |
94 | RTA_PAYLOAD(tb[IFLA_BOND_SLAVE_PERM_HWADDR]), | |
95 | 0, b1, sizeof(b1))); | |
730d3f61 JP |
96 | |
97 | if (tb[IFLA_BOND_SLAVE_QUEUE_ID]) | |
707cce5a JF |
98 | print_int(PRINT_ANY, |
99 | "queue_id", | |
100 | "queue_id %d ", | |
101 | rta_getattr_u16(tb[IFLA_BOND_SLAVE_QUEUE_ID])); | |
730d3f61 JP |
102 | |
103 | if (tb[IFLA_BOND_SLAVE_AD_AGGREGATOR_ID]) | |
707cce5a JF |
104 | print_int(PRINT_ANY, |
105 | "ad_aggregator_id", | |
106 | "ad_aggregator_id %d ", | |
107 | rta_getattr_u16(tb[IFLA_BOND_SLAVE_AD_AGGREGATOR_ID])); | |
7d6bc3b8 NA |
108 | |
109 | if (tb[IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE]) | |
707cce5a JF |
110 | print_int(PRINT_ANY, |
111 | "ad_actor_oper_port_state", | |
112 | "ad_actor_oper_port_state %d ", | |
113 | rta_getattr_u8(tb[IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE])); | |
7d6bc3b8 NA |
114 | |
115 | if (tb[IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE]) | |
707cce5a JF |
116 | print_int(PRINT_ANY, |
117 | "ad_partner_oper_port_state", | |
118 | "ad_partner_oper_port_state %d ", | |
119 | rta_getattr_u16(tb[IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE])); | |
730d3f61 JP |
120 | } |
121 | ||
620ddeda NA |
122 | static int bond_slave_parse_opt(struct link_util *lu, int argc, char **argv, |
123 | struct nlmsghdr *n) | |
124 | { | |
125 | __u16 queue_id; | |
126 | ||
127 | while (argc > 0) { | |
128 | if (matches(*argv, "queue_id") == 0) { | |
129 | NEXT_ARG(); | |
130 | if (get_u16(&queue_id, *argv, 0)) | |
131 | invarg("queue_id is invalid", *argv); | |
132 | addattr16(n, 1024, IFLA_BOND_SLAVE_QUEUE_ID, queue_id); | |
25c93faa PS |
133 | } else { |
134 | if (matches(*argv, "help") != 0) | |
135 | fprintf(stderr, | |
136 | "bond_slave: unknown option \"%s\"?\n", | |
137 | *argv); | |
138 | explain(); | |
139 | return -1; | |
620ddeda NA |
140 | } |
141 | argc--, argv++; | |
142 | } | |
143 | ||
144 | return 0; | |
145 | } | |
146 | ||
25c93faa PS |
147 | static void bond_slave_print_help(struct link_util *lu, int argc, char **argv, |
148 | FILE *f) | |
149 | { | |
150 | print_explain(f); | |
151 | } | |
152 | ||
730d3f61 | 153 | struct link_util bond_slave_link_util = { |
22a84711 | 154 | .id = "bond_slave", |
730d3f61 JP |
155 | .maxattr = IFLA_BOND_SLAVE_MAX, |
156 | .print_opt = bond_slave_print_opt, | |
620ddeda | 157 | .parse_opt = bond_slave_parse_opt, |
25c93faa | 158 | .print_help = bond_slave_print_help, |
730d3f61 | 159 | }; |