Commit 863e88f2 authored by Alexander Aring's avatar Alexander Aring Committed by Marcel Holtmann

mac802154: move mac pib attributes into wpan_dev

This patch moves all mac pib attributes into the wpan_dev struct.
Furthermore we can easier access these attributes over the netdev
802154_ptr pointer. Currently this is only possible over a complicated
callback structure in mac802154 because subif data structure is
accessable inside mac802154 only.
Signed-off-by: default avatarAlexander Aring <alex.aring@gmail.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent b0c42cd7
...@@ -52,14 +52,9 @@ struct wpan_phy { ...@@ -52,14 +52,9 @@ struct wpan_phy {
u32 channels_supported[32]; u32 channels_supported[32];
s8 transmit_power; s8 transmit_power;
u8 cca_mode; u8 cca_mode;
u8 min_be;
u8 max_be;
u8 csma_retries;
s8 frame_retries;
__le64 perm_extended_addr; __le64 perm_extended_addr;
bool lbt;
s32 cca_ed_level; s32 cca_ed_level;
struct device dev; struct device dev;
...@@ -69,6 +64,25 @@ struct wpan_phy { ...@@ -69,6 +64,25 @@ struct wpan_phy {
struct wpan_dev { struct wpan_dev {
struct wpan_phy *wpan_phy; struct wpan_phy *wpan_phy;
/* MAC PIB */
__le16 pan_id;
__le16 short_addr;
__le64 extended_addr;
/* MAC BSN field */
u8 bsn;
/* MAC DSN field */
u8 dsn;
u8 min_be;
u8 max_be;
u8 csma_retries;
s8 frame_retries;
bool lbt;
bool promiscuous_mode;
}; };
#define to_phy(_dev) container_of(_dev, struct wpan_phy, dev) #define to_phy(_dev) container_of(_dev, struct wpan_phy, dev)
......
...@@ -84,18 +84,8 @@ struct ieee802154_sub_if_data { ...@@ -84,18 +84,8 @@ struct ieee802154_sub_if_data {
spinlock_t mib_lock; spinlock_t mib_lock;
__le16 pan_id;
__le16 short_addr;
__le64 extended_addr;
bool promiscuous_mode;
struct ieee802154_mac_params mac_params; struct ieee802154_mac_params mac_params;
/* MAC BSN field */
u8 bsn;
/* MAC DSN field */
u8 dsn;
/* protects sec from concurrent access by netlink. access by /* protects sec from concurrent access by netlink. access by
* encrypt/decrypt/header_create safe without additional protection. * encrypt/decrypt/header_create safe without additional protection.
*/ */
......
...@@ -35,16 +35,17 @@ static int mac802154_wpan_update_llsec(struct net_device *dev) ...@@ -35,16 +35,17 @@ static int mac802154_wpan_update_llsec(struct net_device *dev)
{ {
struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
struct ieee802154_mlme_ops *ops = ieee802154_mlme_ops(dev); struct ieee802154_mlme_ops *ops = ieee802154_mlme_ops(dev);
struct wpan_dev *wpan_dev = &sdata->wpan_dev;
int rc = 0; int rc = 0;
if (ops->llsec) { if (ops->llsec) {
struct ieee802154_llsec_params params; struct ieee802154_llsec_params params;
int changed = 0; int changed = 0;
params.pan_id = sdata->pan_id; params.pan_id = wpan_dev->pan_id;
changed |= IEEE802154_LLSEC_PARAM_PAN_ID; changed |= IEEE802154_LLSEC_PARAM_PAN_ID;
params.hwaddr = sdata->extended_addr; params.hwaddr = wpan_dev->extended_addr;
changed |= IEEE802154_LLSEC_PARAM_HWADDR; changed |= IEEE802154_LLSEC_PARAM_HWADDR;
rc = ops->llsec->set_params(dev, &params, changed); rc = ops->llsec->set_params(dev, &params, changed);
...@@ -57,6 +58,7 @@ static int ...@@ -57,6 +58,7 @@ static int
mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{ {
struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
struct wpan_dev *wpan_dev = &sdata->wpan_dev;
struct sockaddr_ieee802154 *sa = struct sockaddr_ieee802154 *sa =
(struct sockaddr_ieee802154 *)&ifr->ifr_addr; (struct sockaddr_ieee802154 *)&ifr->ifr_addr;
int err = -ENOIOCTLCMD; int err = -ENOIOCTLCMD;
...@@ -68,8 +70,8 @@ mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -68,8 +70,8 @@ mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{ {
u16 pan_id, short_addr; u16 pan_id, short_addr;
pan_id = le16_to_cpu(sdata->pan_id); pan_id = le16_to_cpu(wpan_dev->pan_id);
short_addr = le16_to_cpu(sdata->short_addr); short_addr = le16_to_cpu(wpan_dev->short_addr);
if (pan_id == IEEE802154_PANID_BROADCAST || if (pan_id == IEEE802154_PANID_BROADCAST ||
short_addr == IEEE802154_ADDR_BROADCAST) { short_addr == IEEE802154_ADDR_BROADCAST) {
err = -EADDRNOTAVAIL; err = -EADDRNOTAVAIL;
...@@ -96,8 +98,8 @@ mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) ...@@ -96,8 +98,8 @@ mac802154_wpan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
break; break;
} }
sdata->pan_id = cpu_to_le16(sa->addr.pan_id); wpan_dev->pan_id = cpu_to_le16(sa->addr.pan_id);
sdata->short_addr = cpu_to_le16(sa->addr.short_addr); wpan_dev->short_addr = cpu_to_le16(sa->addr.short_addr);
err = mac802154_wpan_update_llsec(dev); err = mac802154_wpan_update_llsec(dev);
break; break;
...@@ -121,7 +123,7 @@ static int mac802154_wpan_mac_addr(struct net_device *dev, void *p) ...@@ -121,7 +123,7 @@ static int mac802154_wpan_mac_addr(struct net_device *dev, void *p)
return -EINVAL; return -EINVAL;
memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
sdata->extended_addr = extended_addr; sdata->wpan_dev.extended_addr = extended_addr;
return mac802154_wpan_update_llsec(dev); return mac802154_wpan_update_llsec(dev);
} }
...@@ -172,6 +174,7 @@ static int mac802154_wpan_open(struct net_device *dev) ...@@ -172,6 +174,7 @@ static int mac802154_wpan_open(struct net_device *dev)
int rc; int rc;
struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
struct ieee802154_local *local = sdata->local; struct ieee802154_local *local = sdata->local;
struct wpan_dev *wpan_dev = &sdata->wpan_dev;
struct wpan_phy *phy = sdata->local->phy; struct wpan_phy *phy = sdata->local->phy;
rc = mac802154_slave_open(dev); rc = mac802154_slave_open(dev);
...@@ -181,21 +184,22 @@ static int mac802154_wpan_open(struct net_device *dev) ...@@ -181,21 +184,22 @@ static int mac802154_wpan_open(struct net_device *dev)
mutex_lock(&phy->pib_lock); mutex_lock(&phy->pib_lock);
if (local->hw.flags & IEEE802154_HW_PROMISCUOUS) { if (local->hw.flags & IEEE802154_HW_PROMISCUOUS) {
rc = drv_set_promiscuous_mode(local, sdata->promiscuous_mode); rc = drv_set_promiscuous_mode(local,
wpan_dev->promiscuous_mode);
if (rc < 0) if (rc < 0)
goto out; goto out;
} }
if (local->hw.flags & IEEE802154_HW_AFILT) { if (local->hw.flags & IEEE802154_HW_AFILT) {
rc = drv_set_pan_id(local, sdata->pan_id); rc = drv_set_pan_id(local, wpan_dev->pan_id);
if (rc < 0) if (rc < 0)
goto out; goto out;
rc = drv_set_extended_addr(local, sdata->extended_addr); rc = drv_set_extended_addr(local, wpan_dev->extended_addr);
if (rc < 0) if (rc < 0)
goto out; goto out;
rc = drv_set_short_addr(local, sdata->short_addr); rc = drv_set_short_addr(local, wpan_dev->short_addr);
if (rc < 0) if (rc < 0)
goto out; goto out;
} }
...@@ -288,6 +292,7 @@ static int mac802154_header_create(struct sk_buff *skb, ...@@ -288,6 +292,7 @@ static int mac802154_header_create(struct sk_buff *skb,
{ {
struct ieee802154_hdr hdr; struct ieee802154_hdr hdr;
struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
struct wpan_dev *wpan_dev = &sdata->wpan_dev;
struct ieee802154_mac_cb *cb = mac_cb(skb); struct ieee802154_mac_cb *cb = mac_cb(skb);
int hlen; int hlen;
...@@ -306,17 +311,17 @@ static int mac802154_header_create(struct sk_buff *skb, ...@@ -306,17 +311,17 @@ static int mac802154_header_create(struct sk_buff *skb,
if (!saddr) { if (!saddr) {
spin_lock_bh(&sdata->mib_lock); spin_lock_bh(&sdata->mib_lock);
if (sdata->short_addr == cpu_to_le16(IEEE802154_ADDR_BROADCAST) || if (wpan_dev->short_addr == cpu_to_le16(IEEE802154_ADDR_BROADCAST) ||
sdata->short_addr == cpu_to_le16(IEEE802154_ADDR_UNDEF) || wpan_dev->short_addr == cpu_to_le16(IEEE802154_ADDR_UNDEF) ||
sdata->pan_id == cpu_to_le16(IEEE802154_PANID_BROADCAST)) { wpan_dev->pan_id == cpu_to_le16(IEEE802154_PANID_BROADCAST)) {
hdr.source.mode = IEEE802154_ADDR_LONG; hdr.source.mode = IEEE802154_ADDR_LONG;
hdr.source.extended_addr = sdata->extended_addr; hdr.source.extended_addr = wpan_dev->extended_addr;
} else { } else {
hdr.source.mode = IEEE802154_ADDR_SHORT; hdr.source.mode = IEEE802154_ADDR_SHORT;
hdr.source.short_addr = sdata->short_addr; hdr.source.short_addr = wpan_dev->short_addr;
} }
hdr.source.pan_id = sdata->pan_id; hdr.source.pan_id = wpan_dev->pan_id;
spin_unlock_bh(&sdata->mib_lock); spin_unlock_bh(&sdata->mib_lock);
} else { } else {
...@@ -396,11 +401,13 @@ static void ieee802154_if_setup(struct net_device *dev) ...@@ -396,11 +401,13 @@ static void ieee802154_if_setup(struct net_device *dev)
static int static int
ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type) ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type)
{ {
struct wpan_dev *wpan_dev = &sdata->wpan_dev;
/* set some type-dependent values */ /* set some type-dependent values */
sdata->vif.type = type; sdata->vif.type = type;
get_random_bytes(&sdata->bsn, 1); get_random_bytes(&wpan_dev->bsn, 1);
get_random_bytes(&sdata->dsn, 1); get_random_bytes(&wpan_dev->dsn, 1);
/* defaults per 802.15.4-2011 */ /* defaults per 802.15.4-2011 */
sdata->mac_params.min_be = 3; sdata->mac_params.min_be = 3;
...@@ -409,9 +416,9 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type) ...@@ -409,9 +416,9 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type)
/* for compatibility, actual default is 3 */ /* for compatibility, actual default is 3 */
sdata->mac_params.frame_retries = -1; sdata->mac_params.frame_retries = -1;
ieee802154_be64_to_le64(&sdata->extended_addr, sdata->dev->dev_addr); ieee802154_be64_to_le64(&wpan_dev->extended_addr, sdata->dev->dev_addr);
sdata->pan_id = cpu_to_le16(IEEE802154_PANID_BROADCAST); wpan_dev->pan_id = cpu_to_le16(IEEE802154_PANID_BROADCAST);
sdata->short_addr = cpu_to_le16(IEEE802154_ADDR_BROADCAST); wpan_dev->short_addr = cpu_to_le16(IEEE802154_ADDR_BROADCAST);
switch (type) { switch (type) {
case IEEE802154_DEV_WPAN: case IEEE802154_DEV_WPAN:
...@@ -419,7 +426,7 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type) ...@@ -419,7 +426,7 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type)
sdata->dev->destructor = mac802154_wpan_free; sdata->dev->destructor = mac802154_wpan_free;
sdata->dev->netdev_ops = &mac802154_wpan_ops; sdata->dev->netdev_ops = &mac802154_wpan_ops;
sdata->dev->ml_priv = &mac802154_mlme_wpan; sdata->dev->ml_priv = &mac802154_mlme_wpan;
sdata->promiscuous_mode = false; wpan_dev->promiscuous_mode = false;
spin_lock_init(&sdata->mib_lock); spin_lock_init(&sdata->mib_lock);
mutex_init(&sdata->sec_mtx); mutex_init(&sdata->sec_mtx);
...@@ -429,7 +436,7 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type) ...@@ -429,7 +436,7 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, int type)
case IEEE802154_DEV_MONITOR: case IEEE802154_DEV_MONITOR:
sdata->dev->destructor = free_netdev; sdata->dev->destructor = free_netdev;
sdata->dev->netdev_ops = &mac802154_monitor_ops; sdata->dev->netdev_ops = &mac802154_monitor_ops;
sdata->promiscuous_mode = true; wpan_dev->promiscuous_mode = true;
break; break;
default: default:
BUG(); BUG();
......
...@@ -33,7 +33,7 @@ void mac802154_dev_set_short_addr(struct net_device *dev, __le16 val) ...@@ -33,7 +33,7 @@ void mac802154_dev_set_short_addr(struct net_device *dev, __le16 val)
BUG_ON(dev->type != ARPHRD_IEEE802154); BUG_ON(dev->type != ARPHRD_IEEE802154);
spin_lock_bh(&sdata->mib_lock); spin_lock_bh(&sdata->mib_lock);
sdata->short_addr = val; sdata->wpan_dev.short_addr = val;
spin_unlock_bh(&sdata->mib_lock); spin_unlock_bh(&sdata->mib_lock);
} }
...@@ -45,7 +45,7 @@ __le16 mac802154_dev_get_short_addr(const struct net_device *dev) ...@@ -45,7 +45,7 @@ __le16 mac802154_dev_get_short_addr(const struct net_device *dev)
BUG_ON(dev->type != ARPHRD_IEEE802154); BUG_ON(dev->type != ARPHRD_IEEE802154);
spin_lock_bh(&sdata->mib_lock); spin_lock_bh(&sdata->mib_lock);
ret = sdata->short_addr; ret = sdata->wpan_dev.short_addr;
spin_unlock_bh(&sdata->mib_lock); spin_unlock_bh(&sdata->mib_lock);
return ret; return ret;
...@@ -59,7 +59,7 @@ __le16 mac802154_dev_get_pan_id(const struct net_device *dev) ...@@ -59,7 +59,7 @@ __le16 mac802154_dev_get_pan_id(const struct net_device *dev)
BUG_ON(dev->type != ARPHRD_IEEE802154); BUG_ON(dev->type != ARPHRD_IEEE802154);
spin_lock_bh(&sdata->mib_lock); spin_lock_bh(&sdata->mib_lock);
ret = sdata->pan_id; ret = sdata->wpan_dev.pan_id;
spin_unlock_bh(&sdata->mib_lock); spin_unlock_bh(&sdata->mib_lock);
return ret; return ret;
...@@ -72,7 +72,7 @@ void mac802154_dev_set_pan_id(struct net_device *dev, __le16 val) ...@@ -72,7 +72,7 @@ void mac802154_dev_set_pan_id(struct net_device *dev, __le16 val)
BUG_ON(dev->type != ARPHRD_IEEE802154); BUG_ON(dev->type != ARPHRD_IEEE802154);
spin_lock_bh(&sdata->mib_lock); spin_lock_bh(&sdata->mib_lock);
sdata->pan_id = val; sdata->wpan_dev.pan_id = val;
spin_unlock_bh(&sdata->mib_lock); spin_unlock_bh(&sdata->mib_lock);
} }
...@@ -82,7 +82,7 @@ u8 mac802154_dev_get_dsn(const struct net_device *dev) ...@@ -82,7 +82,7 @@ u8 mac802154_dev_get_dsn(const struct net_device *dev)
BUG_ON(dev->type != ARPHRD_IEEE802154); BUG_ON(dev->type != ARPHRD_IEEE802154);
return sdata->dsn++; return sdata->wpan_dev.dsn++;
} }
void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan) void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan)
......
...@@ -42,6 +42,7 @@ static int ...@@ -42,6 +42,7 @@ static int
ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata, ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata,
struct sk_buff *skb, const struct ieee802154_hdr *hdr) struct sk_buff *skb, const struct ieee802154_hdr *hdr)
{ {
struct wpan_dev *wpan_dev = &sdata->wpan_dev;
__le16 span, sshort; __le16 span, sshort;
int rc; int rc;
...@@ -49,8 +50,8 @@ ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata, ...@@ -49,8 +50,8 @@ ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata,
spin_lock_bh(&sdata->mib_lock); spin_lock_bh(&sdata->mib_lock);
span = sdata->pan_id; span = wpan_dev->pan_id;
sshort = sdata->short_addr; sshort = wpan_dev->short_addr;
switch (mac_cb(skb)->dest.mode) { switch (mac_cb(skb)->dest.mode) {
case IEEE802154_ADDR_NONE: case IEEE802154_ADDR_NONE:
...@@ -65,7 +66,7 @@ ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata, ...@@ -65,7 +66,7 @@ ieee802154_subif_frame(struct ieee802154_sub_if_data *sdata,
if (mac_cb(skb)->dest.pan_id != span && if (mac_cb(skb)->dest.pan_id != span &&
mac_cb(skb)->dest.pan_id != cpu_to_le16(IEEE802154_PANID_BROADCAST)) mac_cb(skb)->dest.pan_id != cpu_to_le16(IEEE802154_PANID_BROADCAST))
skb->pkt_type = PACKET_OTHERHOST; skb->pkt_type = PACKET_OTHERHOST;
else if (mac_cb(skb)->dest.extended_addr == sdata->extended_addr) else if (mac_cb(skb)->dest.extended_addr == wpan_dev->extended_addr)
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
else else
skb->pkt_type = PACKET_OTHERHOST; skb->pkt_type = PACKET_OTHERHOST;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment