void enableNifi() { Wifi_InitDefault(false); // Wifi_SetPromiscuousMode: Allows the DS to enter or leave a "promsicuous" mode, in which // all data that can be received is forwarded to the arm9 for user processing. // Best used with Wifi_RawSetPacketHandler, to allow user code to use the data // (well, the lib won't use 'em, so they're just wasting CPU otherwise.) // int enable: 0 to disable promiscuous mode, nonzero to engage Wifi_SetPromiscuousMode(1); // Wifi_EnableWifi: Instructs the ARM7 to go into a basic "active" mode, not actually // associated to an AP, but actively receiving and potentially transmitting Wifi_EnableWifi(); // Wifi_RawSetPacketHandler: Set a handler to process all raw incoming packets // WifiPacketHandler wphfunc: Pointer to packet handler (see WifiPacketHandler definition for more info) Wifi_RawSetPacketHandler(packetHandler); // Wifi_SetChannel: If the wifi system is not connected or connecting to an access point, instruct // the chipset to change channel // int channel: the channel to change to, in the range of 1-13 Wifi_SetChannel(10); transferWaiting = false; nifiEnabled = true; }
void wardriving_loop() { int num_aps, i, index, flags, pressed; touchPosition touchXY; Wifi_AccessPoint cur_ap; u32 lasttick; char state, display_state; /* Vars for AP_DISPLAY */ int entry_n; struct AP_HT_Entry *entry = NULL; print_to_debug("Setting scan mode..."); Wifi_ScanMode(); state = STATE_SCANNING; display_state = STATE_CONNECTING; for (i = 0; i < 3; i++) { sizes[i] = DEFAULT_ALLOC_SIZE; num[i] = num_null[i] = 0; first_null[i] = -1; ap[i] = (struct AP_HT_Entry **) malloc(sizes[i] * sizeof(struct AP_HT_Entry *)); if (ap[i] == NULL) abort_msg("alloc failed"); } flags = DISP_WPA | DISP_OPN | DISP_WEP; memset(modes, 0, sizeof(modes)); strcpy(modes, "OPN+WEP+WPA"); index = 0; TIMER0_CR = TIMER_ENABLE | TIMER_DIV_1024; TIMER1_CR = TIMER_ENABLE | TIMER_CASCADE; lasttick = tick(); while (1) { switch (state) { case STATE_SCANNING: curtick = tick(); /* Wait for VBL just before key handling and redraw */ swiWaitForVBlank(); scanKeys(); pressed = keysDown(); /* Handle stylus press to display more detailed infos * handle this before AP insertion, to avoid race * conditions */ if (pressed & KEY_TOUCH) { touchRead(&touchXY); /* Entry number : 8 pixels for text, 3 lines */ entry_n = touchXY.py / 8 / 3; entry = cur_entries[entry_n]; #ifdef DEBUG printf_to_debug("Entry : Y : %d\n", entry_n); printf_to_debug("SSID : %s\n", entry->ap->ssid); #endif if (entry) { state = STATE_AP_DISPLAY; //display_state = STATE_PACKET_INIT; display_state = STATE_CONNECTING; print_to_debug("Packet scan mode"); print_to_debug(" A : try to connect"); print_to_debug(" B : back to scan"); break; } } num_aps = Wifi_GetNumAP(); for (i = 0; i < num_aps; i++) { if (Wifi_GetAPData(i, &cur_ap) != WIFI_RETURN_OK) continue; insert_ap(&cur_ap); } /* Check timeouts every second */ if (timeout && (curtick - lasttick > 1000)) { lasttick = tick(); clean_timeouts(lasttick); } if (pressed & KEY_RIGHT) timeout += 5000; if (pressed & KEY_LEFT && timeout > 0) timeout -= 5000; if (pressed & KEY_DOWN) index++; if (pressed & KEY_UP && index > 0) index--; if (pressed & KEY_R && (index + (DISPLAY_LINES - 1)) <= numap) index += DISPLAY_LINES - 1; if (pressed & KEY_L && index >= DISPLAY_LINES - 1) index -= DISPLAY_LINES - 1; if (pressed & KEY_B) flags ^= DISP_OPN; if (pressed & KEY_A) flags ^= DISP_WEP; if (pressed & KEY_X) flags ^= DISP_WPA; /* Update modes string */ if (pressed & KEY_B || pressed & KEY_A || pressed & KEY_X) { modes[0] = 0; if (flags & DISP_OPN) strcat(modes, "OPN+"); if (flags & DISP_WEP) strcat(modes, "WEP+"); if (flags & DISP_WPA) strcat(modes, "WPA+"); modes[strlen(modes) - 1] = 0; /* remove the + */ } display_list(index, flags); break; case STATE_AP_DISPLAY: switch (display_state) { case STATE_CONNECTING: /* TODO: * 1) default to packet display * 2) try DHCP [DONE] * 3) try default IPs * 4) handle WEP ? */ /* Try to connect */ if (!(entry->ap->flags & WFLAG_APDATA_WPA) && !(entry->ap->flags & WFLAG_APDATA_WEP)) { print_to_debug ("Trying to connect to :"); print_to_debug(entry->ap->ssid); if (entry->ap->rssi <= 40) print_to_debug ("Warning : weak signal"); print_to_debug("Press B to cancel"); switch (connect_ap(entry->ap)) { case ASSOCSTATUS_ASSOCIATED: display_state = STATE_CONNECTED_FIRST; break; default: print_to_debug("Cnx failed"); state = STATE_SCANNING; Wifi_ScanMode(); } } else { print_to_debug ("WEP/WPA AP not supported"); state = STATE_SCANNING; break; } break; case STATE_CONNECTED_FIRST: display_ap(entry->ap, 1); display_state = STATE_CONNECTED; break; case STATE_CONNECTED: display_ap(entry->ap, 0); break; case STATE_PACKET_INIT: memcpy(mac_filter, entry->ap->macaddr, 6); Wifi_SetChannel(entry->ap->channel); Wifi_RawSetPacketHandler(cap_handler); Wifi_SetPromiscuousMode(1); display_state = STATE_PACKET; break; case STATE_PACKET: Wifi_Update(); if (valid_packet) print_to_debug("Un paquet !\n"); else print_to_debug("No paquet !\n"); break; } scanKeys(); if (keysDown() & KEY_A && state == STATE_PACKET) { state = STATE_CONNECTING; } if (keysDown() & KEY_B) { print_to_debug("Back to scan mode"); state = STATE_SCANNING; Wifi_RawSetPacketHandler(NULL); Wifi_SetPromiscuousMode(0); Wifi_ScanMode(); } swiWaitForVBlank(); break; } } }