diff options
author | Luis Carlos Cobo <luisca@cozybit.com> | 2008-08-05 13:34:52 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-08-07 09:49:04 -0400 |
commit | e32f85f7b917456265d4c30d15f734c4912cfa6a (patch) | |
tree | 14d48a5e3d4b279966f2c15b0a3e5f909bc71d58 /net/mac80211/mesh_pathtbl.c | |
parent | eda0c003d1ff14c99d8476b482377ccfaf967b6c (diff) |
mac80211: fix use of skb->cb for mesh forwarding
Now we deal with mesh forwarding before the 802.11->802.3 conversion, thus
eliminating a few unnecessary steps. The next hop lookup is called from
ieee80211_master_start_xmit() instead of subif_start_xmit(). Until the next hop
is found, RA in the frame will be all zeroes for frames originating from the
device. For forwarded frames, RA will contain the TA of the received frame,
which will be necessary to send a path error if a next hop is not found.
Signed-off-by: Luis Carlos Cobo <luisca@cozybit.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/mesh_pathtbl.c')
-rw-r--r-- | net/mac80211/mesh_pathtbl.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/net/mac80211/mesh_pathtbl.c b/net/mac80211/mesh_pathtbl.c index 5f88a2e6ee50..838ee60492ad 100644 --- a/net/mac80211/mesh_pathtbl.c +++ b/net/mac80211/mesh_pathtbl.c | |||
@@ -388,18 +388,15 @@ void mesh_path_tx_pending(struct mesh_path *mpath) | |||
388 | void mesh_path_discard_frame(struct sk_buff *skb, struct net_device *dev) | 388 | void mesh_path_discard_frame(struct sk_buff *skb, struct net_device *dev) |
389 | { | 389 | { |
390 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 390 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
391 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
391 | struct mesh_path *mpath; | 392 | struct mesh_path *mpath; |
392 | u32 dsn = 0; | 393 | u32 dsn = 0; |
393 | 394 | ||
394 | if (skb->pkt_type == PACKET_OTHERHOST) { | 395 | if (memcmp(hdr->addr4, dev->dev_addr, ETH_ALEN) != 0) { |
395 | struct ieee80211s_hdr *prev_meshhdr; | ||
396 | int mshhdrlen; | ||
397 | u8 *ra, *da; | 396 | u8 *ra, *da; |
398 | 397 | ||
399 | prev_meshhdr = ((struct ieee80211s_hdr *)skb->cb); | 398 | da = hdr->addr3; |
400 | mshhdrlen = ieee80211_get_mesh_hdrlen(prev_meshhdr); | 399 | ra = hdr->addr2; |
401 | da = skb->data; | ||
402 | ra = MESH_PREQ(skb); | ||
403 | mpath = mesh_path_lookup(da, dev); | 400 | mpath = mesh_path_lookup(da, dev); |
404 | if (mpath) | 401 | if (mpath) |
405 | dsn = ++mpath->dsn; | 402 | dsn = ++mpath->dsn; |