drivers/net/bonding/bond_procfs.c

Source file repositories/reference/linux-study-clean/drivers/net/bonding/bond_procfs.c

File Facts

System
Linux kernel
Corpus path
drivers/net/bonding/bond_procfs.c
Extension
.c
Size
9952 bytes
Lines
341
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (primary) {
			optval = bond_opt_get_val(BOND_OPT_PRIMARY_RESELECT,
					READ_ONCE(bond->params.primary_reselect));
			seq_printf(seq, " (primary_reselect %s)",
				   optval->string);
		}

		seq_printf(seq, "\nCurrently Active Slave: %s\n",
			   (curr) ? curr->dev->name : "None");
	}

	seq_printf(seq, "MII Status: %s\n", netif_carrier_ok(bond->dev) ?
		   "up" : "down");
	miimon = READ_ONCE(bond->params.miimon);
	seq_printf(seq, "MII Polling Interval (ms): %d\n", miimon);
	seq_printf(seq, "Up Delay (ms): %d\n",
		   READ_ONCE(bond->params.updelay) * miimon);
	seq_printf(seq, "Down Delay (ms): %d\n",
		   READ_ONCE(bond->params.downdelay) * miimon);
	seq_printf(seq, "Peer Notification Delay (ms): %d\n",
		   READ_ONCE(bond->params.peer_notif_delay) * miimon);


	/* ARP information */
	arp_interval = READ_ONCE(bond->params.arp_interval);
	if (arp_interval > 0) {
		int printed = 0;

		seq_printf(seq, "ARP Polling Interval (ms): %d\n",
				arp_interval);
		seq_printf(seq, "ARP Missed Max: %u\n",
				READ_ONCE(bond->params.missed_max));

		seq_printf(seq, "ARP IP target/s (n.n.n.n form):");

		for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) {
			__be32 t = READ_ONCE(bond->params.arp_targets[i]);

			if (!t)
				break;
			if (printed)
				seq_printf(seq, ",");
			seq_printf(seq, " %pI4", &t);
			printed = 1;
		}
		seq_printf(seq, "\n");

#if IS_ENABLED(CONFIG_IPV6)
		printed = 0;
		seq_printf(seq, "NS IPv6 target/s (xx::xx form):");

		for (i = 0; (i < BOND_MAX_NS_TARGETS); i++) {
			if (ipv6_addr_any(&bond->params.ns_targets[i]))
				break;
			if (printed)
				seq_printf(seq, ",");
			seq_printf(seq, " %pI6c", &bond->params.ns_targets[i]);
			printed = 1;
		}
		seq_printf(seq, "\n");
#endif
	}

	if (BOND_MODE(bond) == BOND_MODE_8023AD) {
		struct ad_info ad_info;

		seq_puts(seq, "\n802.3ad info\n");
		seq_printf(seq, "LACP active: %s\n",
			   READ_ONCE(bond->params.lacp_active) ? "on" : "off");
		seq_printf(seq, "LACP rate: %s\n",
			   READ_ONCE(bond->params.lacp_fast) ? "fast" : "slow");
		seq_printf(seq, "Min links: %d\n",
			   READ_ONCE(bond->params.min_links));
		optval = bond_opt_get_val(BOND_OPT_AD_SELECT,
					  READ_ONCE(bond->params.ad_select));
		seq_printf(seq, "Aggregator selection policy (ad_select): %s\n",
			   optval->string);
		if (capable(CAP_NET_ADMIN)) {
			seq_printf(seq, "System priority: %d\n",
				   BOND_AD_INFO(bond).system.sys_priority);
			seq_printf(seq, "System MAC address: %pM\n",
				   &BOND_AD_INFO(bond).system.sys_mac_addr);

			if (__bond_3ad_get_active_agg_info(bond, &ad_info)) {
				seq_printf(seq,
					   "bond %s has no active aggregator\n",
					   bond->dev->name);
			} else {
				seq_printf(seq, "Active Aggregator Info:\n");

Annotation

Implementation Notes