void update_filter_win(WINDOW *win) { int l, i, t, col = 2; box(win, 0 , 0); print_centered(win, 0, 57, " Edit Filters "); for (t = 0; t < WLAN_NUM_TYPES; t++) { l = 2; wattron(win, get_packet_type_color(WLAN_FRAME_FC(t, 0))); wattron(win, A_BOLD); if (t == 0) mvwprintw(win, l++, col, "m: [%c] Management", CHECKED(conf.filter_stype[t] & 0xffff)); else if (t == 1) mvwprintw(win, l++, col, "c: [%c] Control", CHECKED(conf.filter_stype[t] & 0xffff)); else mvwprintw(win, l++, col, "d: [%c] Data", CHECKED(conf.filter_stype[t] & 0xffff)); wattroff(win, A_BOLD); for (i = 0; i < WLAN_NUM_STYPES; i++) { if (stype_names[t][i].c != '-') mvwprintw(win, l++, col, "%c: [%c] %s", stype_names[t][i].c, CHECKED(conf.filter_stype[t] & BIT(i)), stype_names[t][i].name); } col += 19; } l = 15; wattron(win, RED); mvwprintw(win, l++, 21, "*: [%c] Bad FCS", CHECKED(conf.filter_badfcs)); wattroff(win, RED); wattron(win, A_BOLD); mvwprintw(win, l++, 21, "0: [%c] All Off", CHECKED(conf.filter_off)); wattroff(win, A_BOLD); l = SECOND_ROW-1; wattron(win, A_BOLD); mvwprintw(win, l++, 2, "Higher Level Protocols"); wattroff(win, A_BOLD); wattron(win, WHITE); mvwprintw(win, l++, 2, "r: [%c] ARP", CHECKED(conf.filter_pkt & PKT_TYPE_ARP)); mvwprintw(win, l++, 2, "M: [%c] ICMP/PING", CHECKED(conf.filter_pkt & PKT_TYPE_ICMP)); mvwprintw(win, l++, 2, "i: [%c] IP", CHECKED(conf.filter_pkt & PKT_TYPE_IP)); l = SECOND_ROW; mvwprintw(win, l++, 21, "V: [%c] UDP", CHECKED(conf.filter_pkt & PKT_TYPE_UDP)); mvwprintw(win, l++, 21, "W: [%c] TCP", CHECKED(conf.filter_pkt & PKT_TYPE_TCP)); l = SECOND_ROW; mvwprintw(win, l++, 40, "I: [%c] OLSR", CHECKED(conf.filter_pkt & PKT_TYPE_OLSR)); mvwprintw(win, l++, 40, "K: [%c] BATMAN", CHECKED(conf.filter_pkt & PKT_TYPE_BATMAN)); mvwprintw(win, l++, 40, "Z: [%c] Meshz", CHECKED(conf.filter_pkt & PKT_TYPE_MESHZ)); l = THIRD_ROW; wattron(win, A_BOLD); mvwprintw(win, l++, MAC_COL, "Source MAC Addresses"); wattroff(win, A_BOLD); for (i = 0; i < MAX_FILTERMAC; i++) { mvwprintw(win, l++, MAC_COL, "%d: [%c] " MAC_FMT, i+1, CHECKED(conf.filtermac_enabled[i]), MAC_PAR(conf.filtermac[i])); } l = THIRD_ROW; wattron(win, A_BOLD); mvwprintw(win, l++, MODE_COL, "BSSID"); wattroff(win, A_BOLD); mvwprintw(win, l++, MODE_COL, "_: [%c] " MAC_FMT, CHECKED(MAC_NOT_EMPTY(conf.filterbssid)), MAC_PAR(conf.filterbssid)); l++; wattron(win, A_BOLD); mvwprintw(win, l++, MODE_COL, "Mode"); wattroff(win, A_BOLD); mvwprintw(win, l++, MODE_COL, "!: [%c] Access Point", CHECKED(conf.filter_mode & WLAN_MODE_AP)); mvwprintw(win, l++, MODE_COL, "@: [%c] Station", CHECKED(conf.filter_mode & WLAN_MODE_STA)); mvwprintw(win, l++, MODE_COL, "#: [%c] IBSS (Ad-hoc)", CHECKED(conf.filter_mode & WLAN_MODE_IBSS)); mvwprintw(win, l++, MODE_COL, "%: [%c] WDS/4ADDR", CHECKED(conf.filter_mode & WLAN_MODE_4ADDR)); mvwprintw(win, l++, MODE_COL, "^: [%c] Unknown", CHECKED(conf.filter_mode & WLAN_MODE_UNKNOWN)); wattroff(win, WHITE); print_centered(win, ++l, FILTER_WIN_WIDTH, "[ Press key or ENTER ]"); wrefresh(win); }
int filter_input(WINDOW *win, int c) { char buf[18]; int i; switch (c) { case 'm': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_MGMT); if (conf.filter_pkt & PKT_TYPE_MGMT) conf.filter_pkt |= PKT_TYPE_ALL_MGMT; else conf.filter_pkt &= ~PKT_TYPE_ALL_MGMT; break; case 'b': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_BEACON); break; case 'p': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_PROBE); break; case 'a': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_ASSOC); break; case 'u': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_AUTH); break; case 'c': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_CTRL); if (conf.filter_pkt & PKT_TYPE_CTRL) conf.filter_pkt |= PKT_TYPE_ALL_CTRL; else conf.filter_pkt &= ~PKT_TYPE_ALL_CTRL; break; case 'r': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_CTS | PKT_TYPE_RTS); break; case 'k': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_ACK); break; case 'd': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_DATA); if (conf.filter_pkt & PKT_TYPE_DATA) conf.filter_pkt |= PKT_TYPE_ALL_DATA; else conf.filter_pkt &= ~PKT_TYPE_ALL_DATA; break; case 'q': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_QDATA); break; case 'n': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_NULL); break; case 'R': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_ARP); break; case 'P': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_ICMP); break; case 'I': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_IP); break; case 'U': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_UDP); break; case 'T': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_TCP); break; case 'O': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_OLSR|PKT_TYPE_OLSR_LQ|PKT_TYPE_OLSR_GW); break; case 'B': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_BATMAN); break; case 'M': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_MESHZ); break; case 's': echo(); print_centered(win, FILTER_MAX, 57, "[ Enter new BSSID and ENTER ]"); mvwprintw(win, 5, MAC_COL + 4, ">"); mvwgetnstr(win, 5, MAC_COL + 7, buf, 17); noecho(); convert_string_to_mac(buf, conf.filterbssid); break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': i = c - '1'; if (MAC_NOT_EMPTY(conf.filtermac[i]) && conf.filtermac_enabled[i]) { conf.filtermac_enabled[i] = 0; } else { echo(); print_centered(win, FILTER_MAX, 57, "[ Enter new MAC %d and ENTER ]", i+1); mvwprintw(win, 9 + i, MAC_COL + 4, ">"); mvwgetnstr(win, 9 + i, MAC_COL + 7, buf, 17); noecho(); /* just enable old MAC if user pressed return only */ if (*buf == '\0' && MAC_NOT_EMPTY(conf.filtermac[i])) conf.filtermac_enabled[i] = 1; else { convert_string_to_mac(buf, conf.filtermac[i]); if (MAC_NOT_EMPTY(conf.filtermac[i])) conf.filtermac_enabled[i] = true; } } break; case 'o': conf.filter_off = conf.filter_off ? 0 : 1; break; default: return 0; } /* convenience: */ /* if one of the individual mgmt frames is deselected we dont want to see all mgmt frames */ if ((conf.filter_pkt & PKT_TYPE_ALL_MGMT) != PKT_TYPE_ALL_MGMT) conf.filter_pkt = conf.filter_pkt & ~PKT_TYPE_MGMT; /* same for ctl */ if ((conf.filter_pkt & PKT_TYPE_ALL_CTRL) != PKT_TYPE_ALL_CTRL) conf.filter_pkt = conf.filter_pkt & ~PKT_TYPE_CTRL; /* same for data */ if ((conf.filter_pkt & PKT_TYPE_ALL_DATA) != PKT_TYPE_ALL_DATA) conf.filter_pkt = conf.filter_pkt & ~PKT_TYPE_DATA; /* recalculate filter flag */ conf.do_macfilter = 0; for (i = 0; i < MAX_FILTERMAC; i++) { if (conf.filtermac_enabled[i]) conf.do_macfilter = 1; } net_send_filter_config(); update_filter_win(win); return 1; }
bool filter_input(WINDOW *win, int c) { char buf[18]; int i, t; switch (c) { case 'm': TOGGLE_BITSET(conf.filter_stype[WLAN_FRAME_TYPE_MGMT], 0xffff, uint16_t); break; case 'c': TOGGLE_BITSET(conf.filter_stype[WLAN_FRAME_TYPE_CTRL], 0xffff, uint16_t); break; case 'd': TOGGLE_BITSET(conf.filter_stype[WLAN_FRAME_TYPE_DATA], 0xffff, uint16_t); break; case 'r': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_ARP); break; case 'M': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_ICMP); break; case 'i': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_IP); break; case 'V': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_UDP); break; case 'W': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_TCP); break; case 'I': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_OLSR); break; case 'K': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_BATMAN); break; case 'Z': TOGGLE_BIT(conf.filter_pkt, PKT_TYPE_MESHZ); break; case '!': TOGGLE_BIT(conf.filter_mode, WLAN_MODE_AP); break; case '@': TOGGLE_BIT(conf.filter_mode, WLAN_MODE_STA); break; case '#': TOGGLE_BIT(conf.filter_mode, WLAN_MODE_IBSS); break; case '%': TOGGLE_BIT(conf.filter_mode, WLAN_MODE_4ADDR); break; case '^': TOGGLE_BIT(conf.filter_mode, WLAN_MODE_UNKNOWN); break; case '_': echo(); print_centered(win, FILTER_WIN_HEIGHT-1, FILTER_WIN_WIDTH, "[ Enter new BSSID and ENTER ]"); mvwprintw(win, THIRD_ROW + 1, MODE_COL + 4, ">"); mvwgetnstr(win, THIRD_ROW + 1, MODE_COL + 7, buf, 17); noecho(); convert_string_to_mac(buf, conf.filterbssid); break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': i = c - '1'; if (MAC_NOT_EMPTY(conf.filtermac[i]) && conf.filtermac_enabled[i]) { conf.filtermac_enabled[i] = 0; } else { echo(); print_centered(win, FILTER_WIN_HEIGHT-1, FILTER_WIN_WIDTH, "[ Enter new MAC %d and ENTER ]", i+1); mvwprintw(win, THIRD_ROW + 1 + i, MAC_COL + 4, ">"); mvwgetnstr(win, THIRD_ROW + 1 + i, MAC_COL + 7, buf, 17); noecho(); /* just enable old MAC if user pressed return only */ if (*buf == '\0' && MAC_NOT_EMPTY(conf.filtermac[i])) conf.filtermac_enabled[i] = 1; else { convert_string_to_mac(buf, conf.filtermac[i]); if (MAC_NOT_EMPTY(conf.filtermac[i])) conf.filtermac_enabled[i] = true; } } break; case '0': conf.filter_off = conf.filter_off ? 0 : 1; break; case '*': conf.filter_badfcs = conf.filter_badfcs ? 0 : 1; break; default: for (t = 0; t < WLAN_NUM_TYPES; t++) { for (i = 0; i < WLAN_NUM_STYPES; i++) { if (stype_names[t][i].c == c) { TOGGLE_BIT(conf.filter_stype[t], BIT(i)); goto out; } } } return false; // not found } out: /* recalculate filter flag */ conf.do_macfilter = 0; for (i = 0; i < MAX_FILTERMAC; i++) { if (conf.filtermac_enabled[i]) conf.do_macfilter = 1; } net_send_filter_config(); update_filter_win(win); return true; }