Skip to content

Commit

Permalink
mac80211: check if mesh frame is in RMC after decrypt
Browse files Browse the repository at this point in the history
To check whether a frame is in the RMC, we need access to the mesh
header.  This header is encrypted in encrypted data frames, so make this
check after the frame has been decrypted.

Signed-off-by: Thomas Pedersen <thomas@cozybit.com>
Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Thomas Pedersen authored and John W. Linville committed Sep 14, 2011
1 parent 8c77124 commit 2157fdd
Showing 1 changed file with 6 additions and 9 deletions.
15 changes: 6 additions & 9 deletions net/mac80211/rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,6 @@ static ieee80211_rx_result
ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)
{
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
unsigned int hdrlen = ieee80211_hdrlen(hdr->frame_control);
char *dev_addr = rx->sdata->vif.addr;

if (ieee80211_is_data(hdr->frame_control)) {
Expand Down Expand Up @@ -524,14 +523,6 @@ ieee80211_rx_mesh_check(struct ieee80211_rx_data *rx)

}

#define msh_h_get(h, l) ((struct ieee80211s_hdr *) ((u8 *)h + l))

if (ieee80211_is_data(hdr->frame_control) &&
is_multicast_ether_addr(hdr->addr1) &&
mesh_rmc_check(hdr->addr3, msh_h_get(hdr, hdrlen), rx->sdata))
return RX_DROP_MONITOR;
#undef msh_h_get

return RX_CONTINUE;
}

Expand Down Expand Up @@ -1840,6 +1831,12 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
hdrlen = ieee80211_hdrlen(hdr->frame_control);
mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen);

/* frame is in RMC, don't forward */
if (ieee80211_is_data(hdr->frame_control) &&
is_multicast_ether_addr(hdr->addr1) &&
mesh_rmc_check(hdr->addr3, mesh_hdr, rx->sdata))
return RX_DROP_MONITOR;

if (!ieee80211_is_data(hdr->frame_control))
return RX_CONTINUE;

Expand Down

0 comments on commit 2157fdd

Please sign in to comment.