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) {
115 seq_printf(seq
, "ARP Polling Interval (ms): %d\n",
116 bond
->params
.arp_interval
);
118 seq_printf(seq
, "ARP IP target/s (n.n.n.n form):");
120 for (i
= 0; (i
< BOND_MAX_ARP_TARGETS
); i
++) {
121 if (!bond
->params
.arp_targets
[i
])
124 seq_printf(seq
, ",");
125 seq_printf(seq
, " %pI4", &bond
->params
.arp_targets
[i
]);
128 seq_printf(seq
, "\n");
131 if (BOND_MODE(bond
) == BOND_MODE_8023AD
) {
132 struct ad_info ad_info
;
134 seq_puts(seq
, "\n802.3ad info\n");
135 seq_printf(seq
, "LACP rate: %s\n",
136 (bond
->params
.lacp_fast
) ? "fast" : "slow");
137 seq_printf(seq
, "Min links: %d\n", bond
->params
.min_links
);
138 optval
= bond_opt_get_val(BOND_OPT_AD_SELECT
,
139 bond
->params
.ad_select
);
140 seq_printf(seq
, "Aggregator selection policy (ad_select): %s\n",
142 if (capable(CAP_NET_ADMIN
)) {
143 seq_printf(seq
, "System priority: %d\n",
144 BOND_AD_INFO(bond
).system
.sys_priority
);
145 seq_printf(seq
, "System MAC address: %pM\n",
146 &BOND_AD_INFO(bond
).system
.sys_mac_addr
);
148 if (__bond_3ad_get_active_agg_info(bond
, &ad_info
)) {
150 "bond %s has no active aggregator\n",
153 seq_printf(seq
, "Active Aggregator Info:\n");
155 seq_printf(seq
, "\tAggregator ID: %d\n",
156 ad_info
.aggregator_id
);
157 seq_printf(seq
, "\tNumber of ports: %d\n",
159 seq_printf(seq
, "\tActor Key: %d\n",
161 seq_printf(seq
, "\tPartner Key: %d\n",
162 ad_info
.partner_key
);
163 seq_printf(seq
, "\tPartner Mac Address: %pM\n",
164 ad_info
.partner_system
);
170 static void bond_info_show_slave(struct seq_file
*seq
,
171 const struct slave
*slave
)
173 struct bonding
*bond
= PDE_DATA(file_inode(seq
->file
));
175 seq_printf(seq
, "\nSlave Interface: %s\n", slave
->dev
->name
);
176 seq_printf(seq
, "MII Status: %s\n", bond_slave_link_status(slave
->link
));
177 if (slave
->speed
== SPEED_UNKNOWN
)
178 seq_printf(seq
, "Speed: %s\n", "Unknown");
180 seq_printf(seq
, "Speed: %d Mbps\n", slave
->speed
);
182 if (slave
->duplex
== DUPLEX_UNKNOWN
)
183 seq_printf(seq
, "Duplex: %s\n", "Unknown");
185 seq_printf(seq
, "Duplex: %s\n", slave
->duplex
? "full" : "half");
187 seq_printf(seq
, "Link Failure Count: %u\n",
188 slave
->link_failure_count
);
190 seq_printf(seq
, "Permanent HW addr: %*phC\n",
191 slave
->dev
->addr_len
, slave
->perm_hwaddr
);
192 seq_printf(seq
, "Slave queue ID: %d\n", slave
->queue_id
);
194 if (BOND_MODE(bond
) == BOND_MODE_8023AD
) {
195 const struct port
*port
= &SLAVE_AD_INFO(slave
)->port
;
196 const struct aggregator
*agg
= port
->aggregator
;
199 seq_printf(seq
, "Aggregator ID: %d\n",
200 agg
->aggregator_identifier
);
201 seq_printf(seq
, "Actor Churn State: %s\n",
202 bond_3ad_churn_desc(port
->sm_churn_actor_state
));
203 seq_printf(seq
, "Partner Churn State: %s\n",
204 bond_3ad_churn_desc(port
->sm_churn_partner_state
));
205 seq_printf(seq
, "Actor Churned Count: %d\n",
206 port
->churn_actor_count
);
207 seq_printf(seq
, "Partner Churned Count: %d\n",
208 port
->churn_partner_count
);
210 if (capable(CAP_NET_ADMIN
)) {
211 seq_puts(seq
, "details actor lacp pdu:\n");
212 seq_printf(seq
, " system priority: %d\n",
213 port
->actor_system_priority
);
214 seq_printf(seq
, " system mac address: %pM\n",
215 &port
->actor_system
);
216 seq_printf(seq
, " port key: %d\n",
217 port
->actor_oper_port_key
);
218 seq_printf(seq
, " port priority: %d\n",
219 port
->actor_port_priority
);
220 seq_printf(seq
, " port number: %d\n",
221 port
->actor_port_number
);
222 seq_printf(seq
, " port state: %d\n",
223 port
->actor_oper_port_state
);
225 seq_puts(seq
, "details partner lacp pdu:\n");
226 seq_printf(seq
, " system priority: %d\n",
227 port
->partner_oper
.system_priority
);
228 seq_printf(seq
, " system mac address: %pM\n",
229 &port
->partner_oper
.system
);
230 seq_printf(seq
, " oper key: %d\n",
231 port
->partner_oper
.key
);
232 seq_printf(seq
, " port priority: %d\n",
233 port
->partner_oper
.port_priority
);
234 seq_printf(seq
, " port number: %d\n",
235 port
->partner_oper
.port_number
);
236 seq_printf(seq
, " port state: %d\n",
237 port
->partner_oper
.port_state
);
240 seq_puts(seq
, "Aggregator ID: N/A\n");
245 static int bond_info_seq_show(struct seq_file
*seq
, void *v
)
247 if (v
== SEQ_START_TOKEN
) {
248 seq_printf(seq
, "%s\n", bond_version
);
249 bond_info_show_master(seq
);
251 bond_info_show_slave(seq
, v
);
256 static const struct seq_operations bond_info_seq_ops
= {
257 .start
= bond_info_seq_start
,
258 .next
= bond_info_seq_next
,
259 .stop
= bond_info_seq_stop
,
260 .show
= bond_info_seq_show
,
263 void bond_create_proc_entry(struct bonding
*bond
)
265 struct net_device
*bond_dev
= bond
->dev
;
266 struct bond_net
*bn
= net_generic(dev_net(bond_dev
), bond_net_id
);
269 bond
->proc_entry
= proc_create_seq_data(bond_dev
->name
, 0444,
270 bn
->proc_dir
, &bond_info_seq_ops
, bond
);
271 if (bond
->proc_entry
== NULL
)
272 netdev_warn(bond_dev
, "Cannot create /proc/net/%s/%s\n",
273 DRV_NAME
, bond_dev
->name
);
275 memcpy(bond
->proc_file_name
, bond_dev
->name
, IFNAMSIZ
);
279 void bond_remove_proc_entry(struct bonding
*bond
)
281 struct net_device
*bond_dev
= bond
->dev
;
282 struct bond_net
*bn
= net_generic(dev_net(bond_dev
), bond_net_id
);
284 if (bn
->proc_dir
&& bond
->proc_entry
) {
285 remove_proc_entry(bond
->proc_file_name
, bn
->proc_dir
);
286 memset(bond
->proc_file_name
, 0, IFNAMSIZ
);
287 bond
->proc_entry
= NULL
;
291 /* Create the bonding directory under /proc/net, if doesn't exist yet.
292 * Caller must hold rtnl_lock.
294 void __net_init
bond_create_proc_dir(struct bond_net
*bn
)
297 bn
->proc_dir
= proc_mkdir(DRV_NAME
, bn
->net
->proc_net
);
299 pr_warn("Warning: Cannot create /proc/net/%s\n",
304 /* Destroy the bonding directory under /proc/net, if empty.
305 * Caller must hold rtnl_lock.
307 void __net_exit
bond_destroy_proc_dir(struct bond_net
*bn
)
310 remove_proc_entry(DRV_NAME
, bn
->net
->proc_net
);