net/bridge/br_sysfs_if.c

Source file repositories/reference/linux-study-clean/net/bridge/br_sysfs_if.c

File Facts

System
Linux kernel
Corpus path
net/bridge/br_sysfs_if.c
Extension
.c
Size
11458 bytes
Lines
431
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

struct brport_attribute {
	struct attribute	attr;
	ssize_t (*show)(struct net_bridge_port *, char *);
	int (*store)(struct net_bridge_port *, unsigned long);
	int (*store_raw)(struct net_bridge_port *, char *);
};

#define BRPORT_ATTR_RAW(_name, _mode, _show, _store)			\
const struct brport_attribute brport_attr_##_name = {			\
	.attr		= {.name = __stringify(_name),			\
			   .mode = _mode },				\
	.show		= _show,					\
	.store_raw	= _store,					\
};

#define BRPORT_ATTR(_name, _mode, _show, _store)		\
const struct brport_attribute brport_attr_##_name = { 	        \
	.attr = {.name = __stringify(_name), 			\
		 .mode = _mode },				\
	.show	= _show,					\
	.store	= _store,					\
};

#define BRPORT_ATTR_FLAG(_name, _bitnr)				\
static ssize_t show_##_name(struct net_bridge_port *p, char *buf) \
{								\
	return sysfs_emit(buf, "%d\n", test_bit(_bitnr, &p->flags));	\
}								\
static int store_##_name(struct net_bridge_port *p, unsigned long v) \
{								\
	return store_flag(p, v, _bitnr);				\
}								\
static BRPORT_ATTR(_name, 0644,					\
		   show_##_name, store_##_name)

static int store_flag(struct net_bridge_port *p, unsigned long v,
		      unsigned long bitnr)
{
	unsigned long oflags, flags = READ_ONCE(p->flags);
	struct netlink_ext_ack extack = {0};
	int err;

	oflags = flags;
	if (v)
		__set_bit(bitnr, &flags);
	else
		__clear_bit(bitnr, &flags);

	if (flags == oflags)
		return 0;

	err = br_switchdev_set_port_flag(p, flags, BIT(bitnr), &extack);
	if (err) {
		netdev_err(p->dev, "%s\n", extack._msg);
		return err;
	}
	if (v)
		set_bit(bitnr, &p->flags);
	else
		clear_bit(bitnr, &p->flags);
	br_port_flags_change(p, BIT(bitnr));
	return 0;
}

static ssize_t show_path_cost(struct net_bridge_port *p, char *buf)
{
	return sysfs_emit(buf, "%d\n", READ_ONCE(p->path_cost));
}

static int store_path_cost(struct net_bridge_port *p, unsigned long v)
{
	int ret;

	spin_lock_bh(&p->br->lock);
	ret = br_stp_set_path_cost(p, v);
	spin_unlock_bh(&p->br->lock);
	return ret;
}

static BRPORT_ATTR(path_cost, 0644, show_path_cost, store_path_cost);

static ssize_t show_priority(struct net_bridge_port *p, char *buf)
{
	return sysfs_emit(buf, "%d\n", READ_ONCE(p->priority));
}

static int store_priority(struct net_bridge_port *p, unsigned long v)
{
	int ret;

Annotation

Implementation Notes