net/mac802154/cfg.c

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

File Facts

System
Linux kernel
Corpus path
net/mac802154/cfg.c
Extension
.c
Size
17851 bytes
Lines
721
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 (ret) {
			eaddr = swab64((__force u64)child->extended_addr);
			dev_err(&sdata->dev->dev,
				"Disassociation with %8phC may have failed (%d)\n",
				&eaddr, ret);
		}

		list_del(&child->node);
	}

	ret = mac802154_send_disassociation_notif(sdata, wpan_dev->parent,
						  IEEE802154_DEVICE_WISHES_TO_LEAVE);
	if (ret) {
		eaddr = swab64((__force u64)wpan_dev->parent->extended_addr);
		dev_err(&sdata->dev->dev,
			"Disassociation from %8phC may have failed (%d)\n",
			&eaddr, ret);
	}

	ret = 0;

	kfree(wpan_dev->parent);
	wpan_dev->parent = NULL;
	wpan_dev->pan_id = cpu_to_le16(IEEE802154_PAN_ID_BROADCAST);
	wpan_dev->short_addr = cpu_to_le16(IEEE802154_ADDR_SHORT_BROADCAST);

	if (local->hw.flags & IEEE802154_HW_AFILT) {
		ret = drv_set_pan_id(local, wpan_dev->pan_id);
		if (ret < 0)
			goto reset_mac_assoc;

		ret = drv_set_short_addr(local, wpan_dev->short_addr);
		if (ret < 0)
			goto reset_mac_assoc;
	}

reset_mac_assoc:
	cfg802154_set_max_associations(wpan_dev, max_assoc);

	return ret;
}

static int mac802154_disassociate_child(struct wpan_phy *wpan_phy,
					struct wpan_dev *wpan_dev,
					struct ieee802154_pan_device *child)
{
	struct ieee802154_sub_if_data *sdata;
	int ret;

	sdata = IEEE802154_WPAN_DEV_TO_SUB_IF(wpan_dev);

	ret = mac802154_send_disassociation_notif(sdata, child,
						  IEEE802154_COORD_WISHES_DEVICE_TO_LEAVE);
	if (ret)
		return ret;

	list_del(&child->node);
	wpan_dev->nchildren--;
	kfree(child);

	return 0;
}

static int mac802154_disassociate(struct wpan_phy *wpan_phy,
				  struct wpan_dev *wpan_dev,
				  struct ieee802154_addr *target)
{
	u64 teaddr = swab64((__force u64)target->extended_addr);
	struct ieee802154_pan_device *pan_device;

	ASSERT_RTNL();

	if (cfg802154_device_is_parent(wpan_dev, target))
		return mac802154_disassociate_from_parent(wpan_phy, wpan_dev);

	pan_device = cfg802154_device_is_child(wpan_dev, target);
	if (pan_device)
		return mac802154_disassociate_child(wpan_phy, wpan_dev,
						    pan_device);

	dev_err(&wpan_dev->netdev->dev,
		"Device %8phC is not associated with us\n", &teaddr);

	return -EINVAL;
}

#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
static void
ieee802154_get_llsec_table(struct wpan_phy *wpan_phy,
			   struct wpan_dev *wpan_dev,

Annotation

Implementation Notes