Commit 32edc40a authored by Phoebe Buckheister's avatar Phoebe Buckheister Committed by David S. Miller

ieee802154: change _cb handling slightly

The current mac_cb handling of ieee802154 is rather awkward and limited.
Decompose the single flags field into multiple fields with the meanings
of each subfield of the flags field to make future extensions (for
example, link-layer security) easier. Also don't set the frame sequence
number in upper layers, since that's a thing the MAC is supposed to set
on frame transmit - we set it on header creation, but assuming that
upper layers do not blindly duplicate our headers, this is fine.
Signed-off-by: default avatarPhoebe Buckheister <phoebe.buckheister@itwm.fraunhofer.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8c84296f
...@@ -222,8 +222,9 @@ static inline void ieee802154_addr_to_sa(struct ieee802154_addr_sa *sa, ...@@ -222,8 +222,9 @@ static inline void ieee802154_addr_to_sa(struct ieee802154_addr_sa *sa,
*/ */
struct ieee802154_mac_cb { struct ieee802154_mac_cb {
u8 lqi; u8 lqi;
u8 flags; u8 type;
u8 seq; bool ackreq;
bool secen;
struct ieee802154_addr source; struct ieee802154_addr source;
struct ieee802154_addr dest; struct ieee802154_addr dest;
}; };
...@@ -233,24 +234,12 @@ static inline struct ieee802154_mac_cb *mac_cb(struct sk_buff *skb) ...@@ -233,24 +234,12 @@ static inline struct ieee802154_mac_cb *mac_cb(struct sk_buff *skb)
return (struct ieee802154_mac_cb *)skb->cb; return (struct ieee802154_mac_cb *)skb->cb;
} }
#define MAC_CB_FLAG_TYPEMASK ((1 << 3) - 1) static inline struct ieee802154_mac_cb *mac_cb_init(struct sk_buff *skb)
#define MAC_CB_FLAG_ACKREQ (1 << 3)
#define MAC_CB_FLAG_SECEN (1 << 4)
static inline bool mac_cb_is_ackreq(struct sk_buff *skb)
{
return mac_cb(skb)->flags & MAC_CB_FLAG_ACKREQ;
}
static inline bool mac_cb_is_secen(struct sk_buff *skb)
{ {
return mac_cb(skb)->flags & MAC_CB_FLAG_SECEN; BUILD_BUG_ON(sizeof(struct ieee802154_mac_cb) > sizeof(skb->cb));
}
static inline int mac_cb_type(struct sk_buff *skb) memset(skb->cb, 0, sizeof(struct ieee802154_mac_cb));
{ return mac_cb(skb);
return mac_cb(skb)->flags & MAC_CB_FLAG_TYPEMASK;
} }
#define IEEE802154_MAC_SCAN_ED 0 #define IEEE802154_MAC_SCAN_ED 0
......
...@@ -92,6 +92,7 @@ static int lowpan_header_create(struct sk_buff *skb, ...@@ -92,6 +92,7 @@ static int lowpan_header_create(struct sk_buff *skb,
const u8 *saddr = _saddr; const u8 *saddr = _saddr;
const u8 *daddr = _daddr; const u8 *daddr = _daddr;
struct ieee802154_addr sa, da; struct ieee802154_addr sa, da;
struct ieee802154_mac_cb *cb = mac_cb_init(skb);
/* TODO: /* TODO:
* if this package isn't ipv6 one, where should it be routed? * if this package isn't ipv6 one, where should it be routed?
...@@ -115,8 +116,7 @@ static int lowpan_header_create(struct sk_buff *skb, ...@@ -115,8 +116,7 @@ static int lowpan_header_create(struct sk_buff *skb,
* from MAC subif of the 'dev' and 'real_dev' network devices, but * from MAC subif of the 'dev' and 'real_dev' network devices, but
* this isn't implemented in mainline yet, so currently we assign 0xff * this isn't implemented in mainline yet, so currently we assign 0xff
*/ */
mac_cb(skb)->flags = IEEE802154_FC_TYPE_DATA; cb->type = IEEE802154_FC_TYPE_DATA;
mac_cb(skb)->seq = ieee802154_mlme_ops(dev)->get_dsn(dev);
/* prepare wpan address data */ /* prepare wpan address data */
sa.mode = IEEE802154_ADDR_LONG; sa.mode = IEEE802154_ADDR_LONG;
...@@ -135,11 +135,10 @@ static int lowpan_header_create(struct sk_buff *skb, ...@@ -135,11 +135,10 @@ static int lowpan_header_create(struct sk_buff *skb,
} else { } else {
da.mode = IEEE802154_ADDR_LONG; da.mode = IEEE802154_ADDR_LONG;
da.extended_addr = ieee802154_devaddr_from_raw(daddr); da.extended_addr = ieee802154_devaddr_from_raw(daddr);
/* request acknowledgment */
mac_cb(skb)->flags |= MAC_CB_FLAG_ACKREQ;
} }
cb->ackreq = !lowpan_is_addr_broadcast(daddr);
return dev_hard_header(skb, lowpan_dev_info(dev)->real_dev, return dev_hard_header(skb, lowpan_dev_info(dev)->real_dev,
type, (void *)&da, (void *)&sa, 0); type, (void *)&da, (void *)&sa, 0);
} }
......
...@@ -209,6 +209,7 @@ static int dgram_sendmsg(struct kiocb *iocb, struct sock *sk, ...@@ -209,6 +209,7 @@ static int dgram_sendmsg(struct kiocb *iocb, struct sock *sk,
struct net_device *dev; struct net_device *dev;
unsigned int mtu; unsigned int mtu;
struct sk_buff *skb; struct sk_buff *skb;
struct ieee802154_mac_cb *cb;
struct dgram_sock *ro = dgram_sk(sk); struct dgram_sock *ro = dgram_sk(sk);
int hlen, tlen; int hlen, tlen;
int err; int err;
...@@ -249,18 +250,15 @@ static int dgram_sendmsg(struct kiocb *iocb, struct sock *sk, ...@@ -249,18 +250,15 @@ static int dgram_sendmsg(struct kiocb *iocb, struct sock *sk,
skb_reset_network_header(skb); skb_reset_network_header(skb);
mac_cb(skb)->flags = IEEE802154_FC_TYPE_DATA; cb = mac_cb_init(skb);
if (ro->want_ack) cb->type = IEEE802154_FC_TYPE_DATA;
mac_cb(skb)->flags |= MAC_CB_FLAG_ACKREQ; cb->ackreq = ro->want_ack;
mac_cb(skb)->seq = ieee802154_mlme_ops(dev)->get_dsn(dev);
err = dev_hard_header(skb, dev, ETH_P_IEEE802154, &ro->dst_addr, err = dev_hard_header(skb, dev, ETH_P_IEEE802154, &ro->dst_addr,
ro->bound ? &ro->src_addr : NULL, size); ro->bound ? &ro->src_addr : NULL, size);
if (err < 0) if (err < 0)
goto out_skb; goto out_skb;
skb_reset_mac_header(skb);
err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size); err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
if (err < 0) if (err < 0)
goto out_skb; goto out_skb;
......
...@@ -59,8 +59,6 @@ mac802154_subif_rx(struct ieee802154_dev *hw, struct sk_buff *skb, u8 lqi) ...@@ -59,8 +59,6 @@ mac802154_subif_rx(struct ieee802154_dev *hw, struct sk_buff *skb, u8 lqi)
skb->protocol = htons(ETH_P_IEEE802154); skb->protocol = htons(ETH_P_IEEE802154);
skb_reset_mac_header(skb); skb_reset_mac_header(skb);
BUILD_BUG_ON(sizeof(struct ieee802154_mac_cb) > sizeof(skb->cb));
if (!(priv->hw.flags & IEEE802154_HW_OMIT_CKSUM)) { if (!(priv->hw.flags & IEEE802154_HW_OMIT_CKSUM)) {
u16 crc; u16 crc;
......
...@@ -192,15 +192,17 @@ static int mac802154_header_create(struct sk_buff *skb, ...@@ -192,15 +192,17 @@ static int mac802154_header_create(struct sk_buff *skb,
{ {
struct ieee802154_hdr hdr; struct ieee802154_hdr hdr;
struct mac802154_sub_if_data *priv = netdev_priv(dev); struct mac802154_sub_if_data *priv = netdev_priv(dev);
struct ieee802154_mac_cb *cb = mac_cb(skb);
int hlen; int hlen;
if (!daddr) if (!daddr)
return -EINVAL; return -EINVAL;
memset(&hdr.fc, 0, sizeof(hdr.fc)); memset(&hdr.fc, 0, sizeof(hdr.fc));
hdr.fc.type = mac_cb_type(skb); hdr.fc.type = cb->type;
hdr.fc.security_enabled = mac_cb_is_secen(skb); hdr.fc.security_enabled = cb->secen;
hdr.fc.ack_request = mac_cb_is_ackreq(skb); hdr.fc.ack_request = cb->ackreq;
hdr.seq = ieee802154_mlme_ops(dev)->get_dsn(dev);
if (!saddr) { if (!saddr) {
spin_lock_bh(&priv->mib_lock); spin_lock_bh(&priv->mib_lock);
...@@ -391,12 +393,12 @@ mac802154_subif_frame(struct mac802154_sub_if_data *sdata, struct sk_buff *skb) ...@@ -391,12 +393,12 @@ mac802154_subif_frame(struct mac802154_sub_if_data *sdata, struct sk_buff *skb)
sdata->dev->stats.rx_packets++; sdata->dev->stats.rx_packets++;
sdata->dev->stats.rx_bytes += skb->len; sdata->dev->stats.rx_bytes += skb->len;
switch (mac_cb_type(skb)) { switch (mac_cb(skb)->type) {
case IEEE802154_FC_TYPE_DATA: case IEEE802154_FC_TYPE_DATA:
return mac802154_process_data(sdata->dev, skb); return mac802154_process_data(sdata->dev, skb);
default: default:
pr_warn("ieee802154: bad frame received (type = %d)\n", pr_warn("ieee802154: bad frame received (type = %d)\n",
mac_cb_type(skb)); mac_cb(skb)->type);
kfree_skb(skb); kfree_skb(skb);
return NET_RX_DROP; return NET_RX_DROP;
} }
...@@ -423,6 +425,7 @@ static int mac802154_parse_frame_start(struct sk_buff *skb) ...@@ -423,6 +425,7 @@ static int mac802154_parse_frame_start(struct sk_buff *skb)
{ {
int hlen; int hlen;
struct ieee802154_hdr hdr; struct ieee802154_hdr hdr;
struct ieee802154_mac_cb *cb = mac_cb_init(skb);
hlen = ieee802154_hdr_pull(skb, &hdr); hlen = ieee802154_hdr_pull(skb, &hdr);
if (hlen < 0) if (hlen < 0)
...@@ -433,18 +436,15 @@ static int mac802154_parse_frame_start(struct sk_buff *skb) ...@@ -433,18 +436,15 @@ static int mac802154_parse_frame_start(struct sk_buff *skb)
pr_debug("fc: %04x dsn: %02x\n", le16_to_cpup((__le16 *)&hdr.fc), pr_debug("fc: %04x dsn: %02x\n", le16_to_cpup((__le16 *)&hdr.fc),
hdr.seq); hdr.seq);
mac_cb(skb)->flags = hdr.fc.type; cb->type = hdr.fc.type;
cb->ackreq = hdr.fc.ack_request;
if (hdr.fc.ack_request) cb->secen = hdr.fc.security_enabled;
mac_cb(skb)->flags |= MAC_CB_FLAG_ACKREQ;
if (hdr.fc.security_enabled)
mac_cb(skb)->flags |= MAC_CB_FLAG_SECEN;
mac802154_print_addr("destination", &hdr.dest); mac802154_print_addr("destination", &hdr.dest);
mac802154_print_addr("source", &hdr.source); mac802154_print_addr("source", &hdr.source);
mac_cb(skb)->source = hdr.source; cb->source = hdr.source;
mac_cb(skb)->dest = hdr.dest; cb->dest = hdr.dest;
if (hdr.fc.security_enabled) { if (hdr.fc.security_enabled) {
u64 key; u64 key;
......
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