On Thu, Jan 27, 2011 at 01:27:57PM +0100, Marek Lindner wrote:
Hi,
- shost = wifi_hdr->addr2;
- if (fc & IEEE80211_FCTL_FROMDS)
shost = wifi_hdr->addr3;
- else if (fc & IEEE80211_FCTL_TODS)
shost = wifi_hdr->addr4;
- dhost = wifi_hdr->addr1;
- if (fc & IEEE80211_FCTL_TODS)
dhost = wifi_hdr->addr3;
What would happen if you happened to pick up a WDS packet? Four addresses in the packet. Do we see sensible addresses?
we should - that is what addr4 is used for but I did not test it. Let me know if it does not work for you.
- hdr_len = 24;
- if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
hdr_len = 30;
Again, WDS? We are now a few bytes out when decoding the rest of the packet.
OK. Sorry. I'm wrong.
What confused me is time spent debugging WDS in madwifi. It has macros similar to what you have:
#define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */ #define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */ #define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */ #define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */
So i was expecting to see something like DSTODS. However the madwifi macros are for the complete DIR field, where as you are looking at individual bits. So
(fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS)
is equivalent to the madwifi IEEE80211_FC1_DIR_DSTODS.
So you header length calculation looks O.K.
Andrew