net/mac80211/cfg.c

Source file repositories/reference/linux-study-clean/net/mac80211/cfg.c

File Facts

System
Linux kernel
Corpus path
net/mac80211/cfg.c
Extension
.c
Size
168157 bytes
Lines
6106
Domain
Networking Core
Bucket
Sockets, Protocols, Packet Path, And Network Policy
Inferred role
Networking Core: exported/initcall integration point
Status
integration 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

ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR)) {
		/* This is copied in when the VIF is activated */
		ieee80211_set_mu_mimo_follow(sdata, params);

		if (monitor_sdata)
			ieee80211_set_mu_mimo_follow(monitor_sdata, params);
	}

	if (params->flags) {
		if (ieee80211_sdata_running(sdata)) {
			ieee80211_adjust_monitor_flags(sdata, -1);
			sdata->u.mntr.flags = params->flags;
			ieee80211_adjust_monitor_flags(sdata, 1);

			ieee80211_configure_filter(local);
		} else {
			/*
			 * Because the interface is down, ieee80211_do_stop
			 * and ieee80211_do_open take care of "everything"
			 * mentioned in the comment above.
			 */
			sdata->u.mntr.flags = params->flags;
		}
	}

	return 0;
}

static int ieee80211_set_ap_mbssid_options(struct ieee80211_sub_if_data *sdata,
					   struct cfg80211_mbssid_config *params,
					   struct ieee80211_bss_conf *link_conf)
{
	struct ieee80211_sub_if_data *tx_sdata;
	struct ieee80211_bss_conf *old;

	link_conf->bssid_index = 0;
	link_conf->nontransmitted = false;
	link_conf->ema_ap = false;
	link_conf->bssid_indicator = 0;

	if (sdata->vif.type != NL80211_IFTYPE_AP || !params->tx_wdev)
		return -EINVAL;

	old = sdata_dereference(link_conf->tx_bss_conf, sdata);
	if (old)
		return -EALREADY;

	tx_sdata = IEEE80211_WDEV_TO_SUB_IF(params->tx_wdev);
	if (!tx_sdata)
		return -EINVAL;

	if (tx_sdata == sdata) {
		rcu_assign_pointer(link_conf->tx_bss_conf, link_conf);
	} else {
		struct ieee80211_bss_conf *tx_bss_conf;

		tx_bss_conf = sdata_dereference(tx_sdata->vif.link_conf[params->tx_link_id],
						sdata);
		if (rcu_access_pointer(tx_bss_conf->tx_bss_conf) != tx_bss_conf)
			return -EINVAL;

		rcu_assign_pointer(link_conf->tx_bss_conf, tx_bss_conf);

		link_conf->nontransmitted = true;
		link_conf->bssid_index = params->index;
		link_conf->bssid_indicator = tx_bss_conf->bssid_indicator;
	}
	if (params->ema)
		link_conf->ema_ap = true;

	return 0;
}

static struct wireless_dev *ieee80211_add_iface(struct wiphy *wiphy,
						const char *name,
						unsigned char name_assign_type,
						enum nl80211_iftype type,
						struct vif_params *params)
{
	struct ieee80211_local *local = wiphy_priv(wiphy);
	struct wireless_dev *wdev;
	struct ieee80211_sub_if_data *sdata;
	int err;

	err = ieee80211_if_add(local, name, name_assign_type, &wdev, type, params);
	if (err)
		return ERR_PTR(err);

	sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);

Annotation

Implementation Notes