net/tipc/bearer.c

Source file repositories/reference/linux-study-clean/net/tipc/bearer.c

File Facts

System
Linux kernel
Corpus path
net/tipc/bearer.c
Extension
.c
Size
33457 bytes
Lines
1379
Domain
Networking Core
Bucket
Sockets, Protocols, Packet Path, And Network Policy
Inferred role
Networking Core: implementation source
Status
source implementation candidate

Why This File Exists

Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.

Dependency Surface

Detected Declarations

Annotated Snippet

if (!b) {
			bearer_id = i;
			continue;
		}
		if (!strcmp(name, b->name)) {
			errstr = "already enabled";
			NL_SET_ERR_MSG(extack, "Already enabled");
			goto rejected;
		}

		if (b->priority == prio &&
		    (++with_this_prio > 2)) {
			pr_warn("Bearer <%s>: already 2 bearers with priority %u\n",
				name, prio);

			if (prio == TIPC_MIN_LINK_PRI) {
				errstr = "cannot adjust to lower";
				NL_SET_ERR_MSG(extack, "Cannot adjust to lower");
				goto rejected;
			}

			pr_warn("Bearer <%s>: trying with adjusted priority\n",
				name);
			prio--;
			bearer_id = MAX_BEARERS;
			i = MAX_BEARERS;
			with_this_prio = 1;
		}
	}

	if (bearer_id >= MAX_BEARERS) {
		errstr = "max 3 bearers permitted";
		NL_SET_ERR_MSG(extack, "Max 3 bearers permitted");
		goto rejected;
	}

	b = kzalloc_obj(*b, GFP_ATOMIC);
	if (!b)
		return -ENOMEM;

	strscpy(b->name, name);
	b->media = m;
	res = m->enable_media(net, b, attr);
	if (res) {
		kfree(b);
		errstr = "failed to enable media";
		NL_SET_ERR_MSG(extack, "Failed to enable media");
		goto rejected;
	}

	b->identity = bearer_id;
	b->tolerance = m->tolerance;
	b->min_win = m->min_win;
	b->max_win = m->max_win;
	b->domain = disc_domain;
	b->net_plane = bearer_id + 'A';
	b->priority = prio;
	refcount_set(&b->refcnt, 1);

	res = tipc_disc_create(net, b, &b->bcast_addr, &skb);
	if (res) {
		bearer_disable(net, b);
		errstr = "failed to create discoverer";
		NL_SET_ERR_MSG(extack, "Failed to create discoverer");
		goto rejected;
	}

	/* Create monitoring data before accepting activate messages */
	if (tipc_mon_create(net, bearer_id)) {
		bearer_disable(net, b);
		kfree_skb(skb);
		return -ENOMEM;
	}

	test_and_set_bit_lock(0, &b->up);
	rcu_assign_pointer(tn->bearer_list[bearer_id], b);
	if (skb)
		tipc_bearer_xmit_skb(net, bearer_id, skb, &b->bcast_addr);

	pr_info("Enabled bearer <%s>, priority %u\n", name, prio);

	return res;
rejected:
	pr_warn("Enabling of bearer <%s> rejected, %s\n", name, errstr);
	return res;
}

/**
 * tipc_reset_bearer - Reset all links established over this bearer
 * @net: the applicable net namespace

Annotation

Implementation Notes