int duplicate(struct params *p, struct ieee80211_frame *wh, int rc) { struct client *c; int s; if (!frame_type(wh, IEEE80211_FC0_TYPE_DATA, IEEE80211_FC0_SUBTYPE_DATA)) return 0; s = seqno(wh); c = client_find(p, wh->i_addr2); if (!c) { c = malloc(sizeof(*c)); if (!c) err(1, "malloc()"); memset(c, 0, sizeof(*c)); memcpy(c->mac, wh->i_addr2, 6); c->seq = s-1; client_insert(p, c); } if (wh->i_fc[1] & IEEE80211_FC1_RETRY) { if ( (s <= c->seq) && ((c->seq - s ) < 5)) { #if 0 printf("Dup seq %d prev %d\n", s, c->seq); #endif return 1; } } #if 0 do { char mac[3*6]; mac2str(mac, c->mac); printf("%s seq %d prev %d\n", mac, s, c->seq); } while (0); #endif c->seq = s; return 0; }
void generic_process(struct ieee80211_frame *wh, struct params *p, int len) { int type, stype; int dup = 0; #if 0 ack(p, wh); #endif #if 0 if (!for_me(wh, p->mac)) return; #endif /* ignore my own shit */ if (memcmp(wh->i_addr2, p->mac, 6) == 0) { return; } type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; stype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; if (for_me(wh, p->mac) && type == IEEE80211_FC0_TYPE_DATA) { /* sequence number & dups */ if (p->seq_rx == -1) p->seq_rx = seqno(wh); else { int s = seqno(wh); if (s > p->seq_rx) { /* normal case */ if (p->seq_rx + 1 == s) { #if 0 printf("S=%d\n", s); #endif p->seq_rx = s; } else { /* future */ #if 0 printf("Got seq %d, prev %d\n", s, p->seq_rx); #endif p->seq_rx = s; } } else { /* we got pas stuff... */ if (p->seq_rx - s > 1000) { #if 0 printf("Seqno wrap seq %d, last %d\n", s, p->seq_rx); #endif /* seqno wrapping ? */ p->seq_rx = 0; } else { /* dup */ dup = 1; #if 0 printf("Got dup seq %d, last %d\n", s, p->seq_rx); #endif } } } } #if 0 if (wh->i_fc[1] & IEEE80211_FC1_RETRY) { printf("Got retry\n"); } #endif #if 0 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_CTL) { int rc = send_ack(p->tx, wh->i_addr2); if (rc == -1) err(1, "send_ack()"); if (rc != 10) { printf("Wrote ACK %d/%d\n", rc, 10); exit(1); } } #endif /* data frames */ if (type == IEEE80211_FC0_TYPE_DATA && !dup) { char *ptr; char src[6], dst[6]; int rc; if (wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS) { if (memcmp(wh->i_addr2, p->ap, 6) != 0) return; } else { if (memcmp(wh->i_addr1, p->ap, 6) != 0) return; } if (p->state < S_ASSOCIATED) { printf("Got data when not associated!\n"); return; } if (stype != IEEE80211_FC0_SUBTYPE_DATA) { printf("Got weird data frame stype=%d\n", stype >> IEEE80211_FC0_SUBTYPE_SHIFT); return; }