Skip to content

Commit

Permalink
6lowpan: move lowpan frag_info out of 802.15.4 headers
Browse files Browse the repository at this point in the history
Fragmentation and reassembly information for 6lowpan is independent from
the 802.15.4 stack and used only by the 6lowpan reassembly process. Move
the ieee802154_frag_info struct to a private are, it needn't be in the
802.15.4 skb control block.

Signed-off-by: Phoebe Buckheister <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Phoebe Buckheister authored and davem330 committed Mar 15, 2014
1 parent ae531b9 commit a13061e
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 17 deletions.
8 changes: 0 additions & 8 deletions include/net/ieee802154_netdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,13 +187,6 @@ static inline void ieee802154_addr_to_sa(struct ieee802154_addr_sa *sa,
}
}


struct ieee802154_frag_info {
__be16 d_tag;
u16 d_size;
u8 d_offset;
};

/*
* A control block of skb passed between the ARPHRD_IEEE802154 device
* and other stack parts.
Expand All @@ -202,7 +195,6 @@ struct ieee802154_mac_cb {
u8 lqi;
u8 flags;
u8 seq;
struct ieee802154_frag_info frag_info;
struct ieee802154_addr source;
struct ieee802154_addr dest;
};
Expand Down
27 changes: 18 additions & 9 deletions net/ieee802154/reassembly.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,17 @@

#include "reassembly.h"

struct lowpan_frag_info {
__be16 d_tag;
u16 d_size;
u8 d_offset;
};

struct lowpan_frag_info *lowpan_cb(struct sk_buff *skb)
{
return (struct lowpan_frag_info *)skb->cb;
}

static struct inet_frags lowpan_frags;

static int lowpan_frag_reasm(struct lowpan_frag_queue *fq,
Expand Down Expand Up @@ -102,7 +113,7 @@ static void lowpan_frag_expire(unsigned long data)
}

static inline struct lowpan_frag_queue *
fq_find(struct net *net, const struct ieee802154_frag_info *frag_info,
fq_find(struct net *net, const struct lowpan_frag_info *frag_info,
const struct ieee802154_addr *src,
const struct ieee802154_addr *dst)
{
Expand Down Expand Up @@ -137,8 +148,8 @@ static int lowpan_frag_queue(struct lowpan_frag_queue *fq,
if (fq->q.last_in & INET_FRAG_COMPLETE)
goto err;

offset = mac_cb(skb)->frag_info.d_offset << 3;
end = mac_cb(skb)->frag_info.d_size;
offset = lowpan_cb(skb)->d_offset << 3;
end = lowpan_cb(skb)->d_size;

/* Is this the final fragment? */
if (offset + skb->len == end) {
Expand All @@ -164,15 +175,13 @@ static int lowpan_frag_queue(struct lowpan_frag_queue *fq,
* this fragment, right?
*/
prev = fq->q.fragments_tail;
if (!prev || mac_cb(prev)->frag_info.d_offset <
mac_cb(skb)->frag_info.d_offset) {
if (!prev || lowpan_cb(prev)->d_offset < lowpan_cb(skb)->d_offset) {
next = NULL;
goto found;
}
prev = NULL;
for (next = fq->q.fragments; next != NULL; next = next->next) {
if (mac_cb(next)->frag_info.d_offset >=
mac_cb(skb)->frag_info.d_offset)
if (lowpan_cb(next)->d_offset >= lowpan_cb(skb)->d_offset)
break; /* bingo! */
prev = next;
}
Expand Down Expand Up @@ -319,7 +328,7 @@ static int lowpan_frag_reasm(struct lowpan_frag_queue *fq, struct sk_buff *prev,
}

static int lowpan_get_frag_info(struct sk_buff *skb, const u8 frag_type,
struct ieee802154_frag_info *frag_info)
struct lowpan_frag_info *frag_info)
{
bool fail;
u8 pattern = 0, low = 0;
Expand All @@ -346,7 +355,7 @@ int lowpan_frag_rcv(struct sk_buff *skb, const u8 frag_type)
{
struct lowpan_frag_queue *fq;
struct net *net = dev_net(skb->dev);
struct ieee802154_frag_info *frag_info = &mac_cb(skb)->frag_info;
struct lowpan_frag_info *frag_info = lowpan_cb(skb);
struct ieee802154_addr source, dest;
int err;

Expand Down

0 comments on commit a13061e

Please sign in to comment.