int ieee80211_hdr(struct ieee80211_frame *wh) { struct ieee80211_frame_addr4 *w4; switch (wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) { case IEEE80211_FC1_DIR_NODS: TCARR(wh->i_addr2); PRINTF("%s", etheraddr_string(wh->i_addr2)); TCARR(wh->i_addr1); PRINTF(" > %s", etheraddr_string(wh->i_addr1)); TCARR(wh->i_addr3); PRINTF(", bssid %s", etheraddr_string(wh->i_addr3)); break; case IEEE80211_FC1_DIR_TODS: TCARR(wh->i_addr2); PRINTF("%s", etheraddr_string(wh->i_addr2)); TCARR(wh->i_addr3); PRINTF(" > %s", etheraddr_string(wh->i_addr3)); TCARR(wh->i_addr1); PRINTF(", bssid %s, > DS", etheraddr_string(wh->i_addr1)); break; case IEEE80211_FC1_DIR_FROMDS: TCARR(wh->i_addr3); PRINTF("%s", etheraddr_string(wh->i_addr3)); TCARR(wh->i_addr1); PRINTF(" > %s", etheraddr_string(wh->i_addr1)); TCARR(wh->i_addr2); PRINTF(", bssid %s, DS >", etheraddr_string(wh->i_addr2)); break; case IEEE80211_FC1_DIR_DSTODS: w4 = (struct ieee80211_frame_addr4 *) wh; TCARR(w4->i_addr4); PRINTF("%s", etheraddr_string(w4->i_addr4)); TCARR(w4->i_addr3); PRINTF(" > %s", etheraddr_string(w4->i_addr3)); TCARR(w4->i_addr2); PRINTF(", bssid %s", etheraddr_string(w4->i_addr2)); TCARR(w4->i_addr1); PRINTF(" > %s, DS > DS", etheraddr_string(w4->i_addr1)); break; } if (vflag) { TCARR(wh->i_seq); PRINTF(" (seq %u)", letoh16(*(u_int16_t *)&wh->i_seq[0])); } return (0); trunc: /* Truncated elements in frame */ return (1); }
int ieee80211_hdr(struct ieee80211_frame *wh) { struct ieee80211_frame_addr4 *w4; switch (wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) { case IEEE80211_FC1_DIR_NODS: TCARR(wh->i_addr2); printf("%s", etheraddr_string(wh->i_addr2)); TCARR(wh->i_addr1); printf(" > %s", etheraddr_string(wh->i_addr1)); TCARR(wh->i_addr3); printf(", bssid %s", etheraddr_string(wh->i_addr3)); break; case IEEE80211_FC1_DIR_TODS: TCARR(wh->i_addr2); printf("%s", etheraddr_string(wh->i_addr2)); TCARR(wh->i_addr3); printf(" > %s", etheraddr_string(wh->i_addr3)); TCARR(wh->i_addr1); printf(", bssid %s, > DS", etheraddr_string(wh->i_addr1)); break; case IEEE80211_FC1_DIR_FROMDS: TCARR(wh->i_addr3); printf("%s", etheraddr_string(wh->i_addr3)); TCARR(wh->i_addr1); printf(" > %s", etheraddr_string(wh->i_addr1)); TCARR(wh->i_addr2); printf(", bssid %s, DS >", etheraddr_string(wh->i_addr2)); break; case IEEE80211_FC1_DIR_DSTODS: w4 = (struct ieee80211_frame_addr4 *) wh; TCARR(w4->i_addr4); printf("%s", etheraddr_string(w4->i_addr4)); TCARR(w4->i_addr3); printf(" > %s", etheraddr_string(w4->i_addr3)); TCARR(w4->i_addr2); printf(", bssid %s", etheraddr_string(w4->i_addr2)); TCARR(w4->i_addr1); printf(" > %s, DS > DS", etheraddr_string(w4->i_addr1)); break; } if (vflag) { u_int16_t seq; TCARR(wh->i_seq); bcopy(wh->i_seq, &seq, sizeof(u_int16_t)); printf(" (seq %u): ", letoh16(seq)); } else printf(": "); return (0); trunc: /* Truncated elements in frame */ return (1); }
int ieee80211_frame(struct ieee80211_frame *wh) { u_int8_t subtype, type, *frm; TCARR(wh->i_fc); type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; frm = (u_int8_t *)&wh[1]; switch (type) { case IEEE80211_FC0_TYPE_DATA: PRINTF(": data"); break; case IEEE80211_FC0_TYPE_MGT: PRINTF(": %s", ieee80211_mgt_subtype_name[ subtype >> IEEE80211_FC0_SUBTYPE_SHIFT]); switch (subtype) { case IEEE80211_FC0_SUBTYPE_BEACON: case IEEE80211_FC0_SUBTYPE_PROBE_RESP: if (ieee80211_elements(wh) != 0) goto trunc; break; case IEEE80211_FC0_SUBTYPE_AUTH: TCHECK2(*frm, 2); /* Auth Algorithm */ switch (IEEE80211_AUTH_ALGORITHM(frm)) { case IEEE80211_AUTH_ALG_OPEN: TCHECK2(*frm, 4); /* Auth Transaction */ switch (IEEE80211_AUTH_TRANSACTION(frm)) { case IEEE80211_AUTH_OPEN_REQUEST: PRINTF(" request"); break; case IEEE80211_AUTH_OPEN_RESPONSE: PRINTF(" response"); break; } break; case IEEE80211_AUTH_ALG_SHARED: TCHECK2(*frm, 4); /* Auth Transaction */ switch (IEEE80211_AUTH_TRANSACTION(frm)) { case IEEE80211_AUTH_SHARED_REQUEST: PRINTF(" request"); break; case IEEE80211_AUTH_SHARED_CHALLENGE: PRINTF(" challenge"); break; case IEEE80211_AUTH_SHARED_RESPONSE: PRINTF(" response"); break; case IEEE80211_AUTH_SHARED_PASS: PRINTF(" pass"); break; } break; case IEEE80211_AUTH_ALG_LEAP: PRINTF(" (leap)"); break; } break; } break; default: PRINTF(": type#%d", type); break; } if (wh->i_fc[1] & IEEE80211_FC1_WEP) PRINTF(", WEP"); return (0); trunc: /* Truncated 802.11 frame */ return (1); }