Skip to content

Commit

Permalink
mac802154: Follow the number of associated devices
Browse files Browse the repository at this point in the history
Track the count of associated devices. Limit the number of associations
using the value provided by the user if any. If we reach the maximum
number of associations, we tell the device we are at capacity. If the
user do not want to accept any more associations, it may specify the
value 0 to the maximum number of associations, which will lead to an
access denied error status returned to the peers trying to associate.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Acked-by: Stefan Schmidt <stefan@datenfreihafen.org>
Acked-by: Alexander Aring <aahringo@redhat.com>
Link: https://lore.kernel.org/linux-wpan/20230927181214.129346-10-miquel.raynal@bootlin.com
  • Loading branch information
miquelraynal committed Nov 20, 2023
1 parent ce93b93 commit 80f8bf9
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 10 deletions.
1 change: 1 addition & 0 deletions include/net/cfg802154.h
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,7 @@ struct wpan_dev {
struct ieee802154_pan_device *parent;
struct list_head children;
unsigned int max_associations;
unsigned int nchildren;
};

#define to_phy(_dev) container_of(_dev, struct wpan_phy, dev)
Expand Down
2 changes: 2 additions & 0 deletions net/ieee802154/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,8 @@ static void cfg802154_free_peer_structures(struct wpan_dev *wpan_dev)
kfree(child);
}

wpan_dev->nchildren = 0;

mutex_unlock(&wpan_dev->association_lock);
}

Expand Down
1 change: 1 addition & 0 deletions net/mac802154/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,7 @@ static int mac802154_disassociate_child(struct wpan_phy *wpan_phy,
return ret;

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

return 0;
Expand Down
33 changes: 23 additions & 10 deletions net/mac802154/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -800,20 +800,32 @@ int mac802154_process_association_req(struct ieee802154_sub_if_data *sdata,
child->mode = IEEE802154_EXTENDED_ADDRESSING;
ceaddr = swab64((__force u64)child->extended_addr);

assoc_resp_pl.status = IEEE802154_ASSOCIATION_SUCCESSFUL;
if (assoc_req_pl.alloc_addr) {
assoc_resp_pl.short_addr = cfg802154_get_free_short_addr(wpan_dev);
child->mode = IEEE802154_SHORT_ADDRESSING;
if (wpan_dev->nchildren >= wpan_dev->max_associations) {
if (!wpan_dev->max_associations)
assoc_resp_pl.status = IEEE802154_PAN_ACCESS_DENIED;
else
assoc_resp_pl.status = IEEE802154_PAN_AT_CAPACITY;
assoc_resp_pl.short_addr = cpu_to_le16(IEEE802154_ADDR_SHORT_BROADCAST);
dev_dbg(&sdata->dev->dev,
"Refusing ASSOC REQ from child %8phC, %s\n", &ceaddr,
assoc_resp_pl.status == IEEE802154_PAN_ACCESS_DENIED ?
"access denied" : "too many children");
} else {
assoc_resp_pl.short_addr = cpu_to_le16(IEEE802154_ADDR_SHORT_UNSPEC);
assoc_resp_pl.status = IEEE802154_ASSOCIATION_SUCCESSFUL;
if (assoc_req_pl.alloc_addr) {
assoc_resp_pl.short_addr = cfg802154_get_free_short_addr(wpan_dev);
child->mode = IEEE802154_SHORT_ADDRESSING;
} else {
assoc_resp_pl.short_addr = cpu_to_le16(IEEE802154_ADDR_SHORT_UNSPEC);
}
child->short_addr = assoc_resp_pl.short_addr;
dev_dbg(&sdata->dev->dev,
"Accepting ASSOC REQ from child %8phC, providing short address 0x%04x\n",
&ceaddr, le16_to_cpu(child->short_addr));
}
child->short_addr = assoc_resp_pl.short_addr;
dev_dbg(&sdata->dev->dev,
"Accepting ASSOC REQ from child %8phC, providing short address 0x%04x\n",
&ceaddr, le16_to_cpu(child->short_addr));

ret = mac802154_send_association_resp_locked(sdata, child, &assoc_resp_pl);
if (ret) {
if (ret || assoc_resp_pl.status != IEEE802154_ASSOCIATION_SUCCESSFUL) {
kfree(child);
goto unlock;
}
Expand All @@ -834,6 +846,7 @@ int mac802154_process_association_req(struct ieee802154_sub_if_data *sdata,
}

list_add(&child->node, &wpan_dev->children);
wpan_dev->nchildren++;

unlock:
mutex_unlock(&wpan_dev->association_lock);
Expand Down

0 comments on commit 80f8bf9

Please sign in to comment.