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: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
b0c42cd7b2
commit
863e88f255
|
@ -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 {
|
||||||
|
|
||||||
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 {
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
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, ¶ms, changed);
|
rc = ops->llsec->set_params(dev, ¶ms, changed);
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
{
|
{
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
/* 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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue