1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/proc_fs.h>
3 #include <linux/ethtool.h>
4 #include <linux/export.h>
5 #include <net/net_namespace.h>
6 #include <net/netns/generic.h>
7 #include <net/bonding.h>
9 #include "bonding_priv.h"
11 static void *bond_info_seq_start(struct seq_file
*seq
, loff_t
*pos
)
14 struct bonding
*bond
= pde_data(file_inode(seq
->file
));
15 struct list_head
*iter
;
22 return SEQ_START_TOKEN
;
24 bond_for_each_slave_rcu(bond
, slave
, iter
)
31 static void *bond_info_seq_next(struct seq_file
*seq
, void *v
, loff_t
*pos
)
33 struct bonding
*bond
= pde_data(file_inode(seq
->file
));
34 struct list_head
*iter
;
39 if (v
== SEQ_START_TOKEN
)
40 return bond_first_slave_rcu(bond
);
42 bond_for_each_slave_rcu(bond
, slave
, iter
) {
52 static void bond_info_seq_stop(struct seq_file
*seq
, void *v
)
58 static void bond_info_show_master(struct seq_file
*seq
)
60 struct bonding
*bond
= pde_data(file_inode(seq
->file
));
61 const struct bond_opt_value
*optval
;
62 struct slave
*curr
, *primary
;
65 curr
= rcu_dereference(bond
->curr_active_slave
);
67 seq_printf(seq
, "Bonding Mode: %s",
68 bond_mode_name(BOND_MODE(bond
)));
70 if (BOND_MODE(bond
) == BOND_MODE_ACTIVEBACKUP
&&
71 bond
->params
.fail_over_mac
) {
72 optval
= bond_opt_get_val(BOND_OPT_FAIL_OVER_MAC
,
73 bond
->params
.fail_over_mac
);
74 seq_printf(seq
, " (fail_over_mac %s)", optval
->string
);
77 seq_printf(seq
, "\n");
79 if (bond_mode_uses_xmit_hash(bond
)) {
80 optval
= bond_opt_get_val(BOND_OPT_XMIT_HASH
,
81 bond
->params
.xmit_policy
);
82 seq_printf(seq
, "Transmit Hash Policy: %s (%d)\n",
83 optval
->string
, bond
->params
.xmit_policy
);
86 if (bond_uses_primary(bond
)) {
87 primary
= rcu_dereference(bond
->primary_slave
);
88 seq_printf(seq
, "Primary Slave: %s",
89 primary
? primary
->dev
->name
: "None");
91 optval
= bond_opt_get_val(BOND_OPT_PRIMARY_RESELECT
,
92 bond
->params
.primary_reselect
);
93 seq_printf(seq
, " (primary_reselect %s)",
97 seq_printf(seq
, "\nCurrently Active Slave: %s\n",
98 (curr
) ? curr
->dev
->name
: "None");
101 seq_printf(seq
, "MII Status: %s\n", netif_carrier_ok(bond
->dev
) ?
103 seq_printf(seq
, "MII Polling Interval (ms): %d\n", bond
->params
.miimon
);
104 seq_printf(seq
, "Up Delay (ms): %d\n",
105 bond
->params
.updelay
* bond
->params
.miimon
);
106 seq_printf(seq
, "Down Delay (ms): %d\n",
107 bond
->params
.downdelay
* bond
->params
.miimon
);
108 seq_printf(seq
, "Peer Notification Delay (ms): %d\n",
109 bond
->params
.peer_notif_delay
* bond
->params
.miimon
);
112 /* ARP information */
113 if (bond
->params
.arp_interval
> 0) {
116 seq_printf(seq
, "ARP Polling Interval (ms): %d\n",
117 bond
->params
.arp_interval
);
118 seq_printf(seq
, "ARP Missed Max: %u\n",
119 bond
->params
.missed_max
);
121 seq_printf(seq
, "ARP IP target/s (n.n.n.n form):");
123 for (i
= 0; (i
< BOND_MAX_ARP_TARGETS
); i
++) {
124 if (!bond
->params
.arp_targets
[i
])
127 seq_printf(seq
, ",");
128 seq_printf(seq
, " %pI4", &bond
->params
.arp_targets
[i
]);
131 seq_printf(seq
, "\n");
133 #if IS_ENABLED(CONFIG_IPV6)
135 seq_printf(seq
, "NS IPv6 target/s (xx::xx form):");
137 for (i
= 0; (i
< BOND_MAX_NS_TARGETS
); i
++) {
138 if (ipv6_addr_any(&bond
->params
.ns_targets
[i
]))
141 seq_printf(seq
, ",");
142 seq_printf(seq
, " %pI6c", &bond
->params
.ns_targets
[i
]);
145 seq_printf(seq
, "\n");
149 if (BOND_MODE(bond
) == BOND_MODE_8023AD
) {
150 struct ad_info ad_info
;
152 seq_puts(seq
, "\n802.3ad info\n");
153 seq_printf(seq
, "LACP active: %s\n",
154 (bond
->params
.lacp_active
) ? "on" : "off");
155 seq_printf(seq
, "LACP rate: %s\n",
156 (bond
->params
.lacp_fast
) ? "fast" : "slow");
157 seq_printf(seq
, "Min links: %d\n", bond
->params
.min_links
);
158 optval
= bond_opt_get_val(BOND_OPT_AD_SELECT
,
159 bond
->params
.ad_select
);
160 seq_printf(seq
, "Aggregator selection policy (ad_select): %s\n",
162 if (capable(CAP_NET_ADMIN
)) {
163 seq_printf(seq
, "System priority: %d\n",
164 BOND_AD_INFO(bond
).system
.sys_priority
);
165 seq_printf(seq
, "System MAC address: %pM\n",
166 &BOND_AD_INFO(bond
).system
.sys_mac_addr
);
168 if (__bond_3ad_get_active_agg_info(bond
, &ad_info
)) {
170 "bond %s has no active aggregator\n",
173 seq_printf(seq
, "Active Aggregator Info:\n");
175 seq_printf(seq
, "\tAggregator ID: %d\n",
176 ad_info
.aggregator_id
);
177 seq_printf(seq
, "\tNumber of ports: %d\n",
179 seq_printf(seq
, "\tActor Key: %d\n",
181 seq_printf(seq
, "\tPartner Key: %d\n",
182 ad_info
.partner_key
);
183 seq_printf(seq
, "\tPartner Mac Address: %pM\n",
184 ad_info
.partner_system
);
190 static void bond_info_show_slave(struct seq_file
*seq
,
191 const struct slave
*slave
)
193 struct bonding
*bond
= pde_data(file_inode(seq
->file
));
195 seq_printf(seq
, "\nSlave Interface: %s\n", slave
->dev
->name
);
196 seq_printf(seq
, "MII Status: %s\n", bond_slave_link_status(slave
->link
));
197 if (slave
->speed
== SPEED_UNKNOWN
)
198 seq_printf(seq
, "Speed: %s\n", "Unknown");
200 seq_printf(seq
, "Speed: %d Mbps\n", slave
->speed
);
202 if (slave
->duplex
== DUPLEX_UNKNOWN
)
203 seq_printf(seq
, "Duplex: %s\n", "Unknown");
205 seq_printf(seq
, "Duplex: %s\n", slave
->duplex
? "full" : "half");
207 seq_printf(seq
, "Link Failure Count: %u\n",
208 slave
->link_failure_count
);
210 seq_printf(seq
, "Permanent HW addr: %*phC\n",
211 slave
->dev
->addr_len
, slave
->perm_hwaddr
);
212 seq_printf(seq
, "Slave queue ID: %d\n", READ_ONCE(slave
->queue_id
));
214 if (BOND_MODE(bond
) == BOND_MODE_8023AD
) {
215 const struct port
*port
= &SLAVE_AD_INFO(slave
)->port
;
216 const struct aggregator
*agg
= port
->aggregator
;
219 seq_printf(seq
, "Aggregator ID: %d\n",
220 agg
->aggregator_identifier
);
221 seq_printf(seq
, "Actor Churn State: %s\n",
222 bond_3ad_churn_desc(port
->sm_churn_actor_state
));
223 seq_printf(seq
, "Partner Churn State: %s\n",
224 bond_3ad_churn_desc(port
->sm_churn_partner_state
));
225 seq_printf(seq
, "Actor Churned Count: %d\n",
226 port
->churn_actor_count
);
227 seq_printf(seq
, "Partner Churned Count: %d\n",
228 port
->churn_partner_count
);
230 if (capable(CAP_NET_ADMIN
)) {
231 seq_puts(seq
, "details actor lacp pdu:\n");
232 seq_printf(seq
, " system priority: %d\n",
233 port
->actor_system_priority
);
234 seq_printf(seq
, " system mac address: %pM\n",
235 &port
->actor_system
);
236 seq_printf(seq
, " port key: %d\n",
237 port
->actor_oper_port_key
);
238 seq_printf(seq
, " port priority: %d\n",
239 port
->actor_port_priority
);
240 seq_printf(seq
, " port number: %d\n",
241 port
->actor_port_number
);
242 seq_printf(seq
, " port state: %d\n",
243 port
->actor_oper_port_state
);
245 seq_puts(seq
, "details partner lacp pdu:\n");
246 seq_printf(seq
, " system priority: %d\n",
247 port
->partner_oper
.system_priority
);
248 seq_printf(seq
, " system mac address: %pM\n",
249 &port
->partner_oper
.system
);
250 seq_printf(seq
, " oper key: %d\n",
251 port
->partner_oper
.key
);
252 seq_printf(seq
, " port priority: %d\n",
253 port
->partner_oper
.port_priority
);
254 seq_printf(seq
, " port number: %d\n",
255 port
->partner_oper
.port_number
);
256 seq_printf(seq
, " port state: %d\n",
257 port
->partner_oper
.port_state
);
260 seq_puts(seq
, "Aggregator ID: N/A\n");
265 static int bond_info_seq_show(struct seq_file
*seq
, void *v
)
267 if (v
== SEQ_START_TOKEN
) {
268 seq_printf(seq
, "%s\n", bond_version
);
269 bond_info_show_master(seq
);
271 bond_info_show_slave(seq
, v
);
276 static const struct seq_operations bond_info_seq_ops
= {
277 .start
= bond_info_seq_start
,
278 .next
= bond_info_seq_next
,
279 .stop
= bond_info_seq_stop
,
280 .show
= bond_info_seq_show
,
283 void bond_create_proc_entry(struct bonding
*bond
)
285 struct net_device
*bond_dev
= bond
->dev
;
286 struct bond_net
*bn
= net_generic(dev_net(bond_dev
), bond_net_id
);
289 bond
->proc_entry
= proc_create_seq_data(bond_dev
->name
, 0444,
290 bn
->proc_dir
, &bond_info_seq_ops
, bond
);
291 if (bond
->proc_entry
== NULL
)
292 netdev_warn(bond_dev
, "Cannot create /proc/net/%s/%s\n",
293 DRV_NAME
, bond_dev
->name
);
295 memcpy(bond
->proc_file_name
, bond_dev
->name
, IFNAMSIZ
);
299 void bond_remove_proc_entry(struct bonding
*bond
)
301 struct net_device
*bond_dev
= bond
->dev
;
302 struct bond_net
*bn
= net_generic(dev_net(bond_dev
), bond_net_id
);
304 if (bn
->proc_dir
&& bond
->proc_entry
) {
305 remove_proc_entry(bond
->proc_file_name
, bn
->proc_dir
);
306 memset(bond
->proc_file_name
, 0, IFNAMSIZ
);
307 bond
->proc_entry
= NULL
;
311 /* Create the bonding directory under /proc/net, if doesn't exist yet.
312 * Caller must hold rtnl_lock.
314 void __net_init
bond_create_proc_dir(struct bond_net
*bn
)
317 bn
->proc_dir
= proc_mkdir(DRV_NAME
, bn
->net
->proc_net
);
319 pr_warn("Warning: Cannot create /proc/net/%s\n",
324 /* Destroy the bonding directory under /proc/net, if empty.
326 void __net_exit
bond_destroy_proc_dir(struct bond_net
*bn
)
329 remove_proc_entry(DRV_NAME
, bn
->net
->proc_net
);