summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Pedersen <thomas@cozybit.com>2011-09-01 12:32:14 -0700
committerJohn W. Linville <linville@tuxdriver.com>2011-09-14 13:56:16 -0400
commit2157fdd6ae3f760a95c5c50072a1b4ac656eb9f5 (patch)
tree9964525f86c7d6deb9c55a1ebbc8e4f2871a8e60
parent8c771244fbab51661da7dbbabfa5dceffb3e3cce (diff)
downloadlinux-3.10-2157fdd6ae3f760a95c5c50072a1b4ac656eb9f5.tar.gz
linux-3.10-2157fdd6ae3f760a95c5c50072a1b4ac656eb9f5.tar.bz2
linux-3.10-2157fdd6ae3f760a95c5c50072a1b4ac656eb9f5.zip
mac80211: check if mesh frame is in RMC after decrypt
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>
-rw-r--r--net/mac80211/rx.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index f45fd2fedc2..d479d48e8d1 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -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)) {
@@ -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;
}
@@ -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;