Wifi: add socket init/deinit code.

Remove ad-hoc client/server stuff from wifi settings dialog as
they're going to be useless.
This commit is contained in:
luigi__ 2009-08-23 12:55:10 +00:00
parent a8ff7220cc
commit adeec7e38f
4 changed files with 87 additions and 45 deletions

View File

@ -432,8 +432,6 @@ extern struct TCommonSettings {
strcpy(Firmware, "firmware.bin"); strcpy(Firmware, "firmware.bin");
wifi.mode = 0; wifi.mode = 0;
wifi.adhocMode = 0;
strcpy(wifi.adhocServerName, "");
wifi.infraBridgeAdapter = 0; wifi.infraBridgeAdapter = 0;
for(int i=0;i<16;i++) for(int i=0;i<16;i++)
@ -456,10 +454,6 @@ extern struct TCommonSettings {
struct _Wifi { struct _Wifi {
int mode; int mode;
int adhocMode;
char adhocServerName[64];
int infraBridgeAdapter; int infraBridgeAdapter;
} wifi; } wifi;

View File

@ -27,12 +27,31 @@
#ifdef EXPERIMENTAL_WIFI #ifdef EXPERIMENTAL_WIFI
#ifdef WIN32 #ifdef WIN32
#include "windriver.h" #include <winsock2.h>
#define socket_t SOCKET
#define sockaddr_t SOCKADDR
#include "windriver.h"
#else #else
#include "pcap/pcap.h" #include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define socket_t int
#define sockaddr_t struct sockaddr
#define closesocket close
#include "pcap/pcap.h"
#endif #endif
#ifndef INVALID_SOCKET
#define INVALID_SOCKET (socket_t)-1
#endif
#define BASEPORT 7000
bool wifi_netEnabled = false; bool wifi_netEnabled = false;
socket_t wifi_socket = INVALID_SOCKET;
sockaddr_t sendAddr;
pcap_t *wifi_bridge = NULL; pcap_t *wifi_bridge = NULL;
#endif #endif
@ -257,7 +276,7 @@ WifiComInterface* wifiCom;
// 3: medium logging, for debugging, shows lots of stuff // 3: medium logging, for debugging, shows lots of stuff
// 4: high logging, for debugging, shows almost everything, may slow down // 4: high logging, for debugging, shows almost everything, may slow down
// 5: highest logging, for debugging, shows everything, may slow down a lot // 5: highest logging, for debugging, shows everything, may slow down a lot
#define WIFI_LOGGING_LEVEL 0 #define WIFI_LOGGING_LEVEL 3
#define WIFI_LOG_USE_LOGC 0 #define WIFI_LOG_USE_LOGC 0
@ -359,7 +378,7 @@ static u32 reflect(u32 ref, char ch)
return value; return value;
} }
static u32 WIFI_getCRC32(u8 *data, int len) static u32 WIFI_calcCRC32(u8 *data, int len)
{ {
u32 crc = 0xFFFFFFFF; u32 crc = 0xFFFFFFFF;
@ -1268,13 +1287,68 @@ void WIFI_usTrigger()
*******************************************************************************/ *******************************************************************************/
#define ADHOC_MAGIC "NDSWIFI\0"
#define ADHOC_PROTOCOL_VERSION 0x0100 // v1.0
typedef struct _Adhoc_PacketHeader
{
char magic[8]; // "NDSWIFI\0" (null terminated string)
u16 version; // Ad-hoc protocol version (for example 0x0502 = v5.2)
u16 packetLen; // Length of the packet
} Adhoc_PacketHeader;
bool Adhoc_Init() bool Adhoc_Init()
{ {
int res;
// Create an UDP socket
wifi_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (wifi_socket < 0)
{
WIFI_LOG(1, "Ad-hoc: Failed to create socket.\n");
return false;
}
// Bind the socket to any address on port 7000
sockaddr_t saddr;
saddr.sa_family = AF_INET;
*(u32*)&saddr.sa_data[2] = htonl(INADDR_ANY);
*(u16*)&saddr.sa_data[0] = htons(BASEPORT);
res = bind(wifi_socket, &saddr, sizeof(sockaddr_t));
if (res < 0)
{
WIFI_LOG(1, "Ad-hoc: failed to bind the socket.\n");
closesocket(wifi_socket); wifi_socket = INVALID_SOCKET;
return false;
}
// Enable broadcast mode
// Not doing so results in failure when sendto'ing to broadcast address
BOOL opt = TRUE;
res = setsockopt(wifi_socket, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof(BOOL));
if (res < 0)
{
WIFI_LOG(1, "Ad-hoc: failed to enable broadcast mode.\n");
closesocket(wifi_socket); wifi_socket = INVALID_SOCKET;
return false;
}
// Prepare an address structure for sending packets
sendAddr.sa_family = AF_INET;
*(u32*)&saddr.sa_data[2] = htonl(INADDR_BROADCAST);
*(u16*)&saddr.sa_data[0] = htons(BASEPORT);
WIFI_LOG(1, "Ad-hoc: initialization successful.\n");
return true; return true;
} }
void Adhoc_DeInit() void Adhoc_DeInit()
{ {
if (wifi_socket >= 0)
closesocket(wifi_socket);
} }
void Adhoc_Reset() void Adhoc_Reset()
@ -1295,9 +1369,9 @@ void Adhoc_usTrigger()
*******************************************************************************/ *******************************************************************************/
u8 SoftAP_MACAddr[6] = {0x00, 0xF0, 0x1A, 0x2B, 0x3C, 0x4D}; const u8 SoftAP_MACAddr[6] = {0x00, 0xF0, 0x1A, 0x2B, 0x3C, 0x4D};
u8 SoftAP_Beacon[] = { const u8 SoftAP_Beacon[] = {
/* 802.11 header */ /* 802.11 header */
0x80, 0x00, // Frame control 0x80, 0x00, // Frame control
0x00, 0x00, // Duration ID 0x00, 0x00, // Duration ID
@ -1318,7 +1392,7 @@ u8 SoftAP_Beacon[] = {
0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00
}; };
u8 SoftAP_ProbeResponse[] = { const u8 SoftAP_ProbeResponse[] = {
/* 802.11 header */ /* 802.11 header */
0x50, 0x00, // Frame control 0x50, 0x00, // Frame control
0x00, 0x00, // Duration ID 0x00, 0x00, // Duration ID
@ -1338,7 +1412,7 @@ u8 SoftAP_ProbeResponse[] = {
0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00
}; };
u8 SoftAP_AuthFrame[] = { const u8 SoftAP_AuthFrame[] = {
/* 802.11 header */ /* 802.11 header */
0xB0, 0x00, // Frame control 0xB0, 0x00, // Frame control
0x00, 0x00, // Duration ID 0x00, 0x00, // Duration ID
@ -1356,7 +1430,7 @@ u8 SoftAP_AuthFrame[] = {
0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00
}; };
u8 SoftAP_AssocResponse[] = { const u8 SoftAP_AssocResponse[] = {
/* 802.11 header */ /* 802.11 header */
0x10, 0x00, // Frame control 0x10, 0x00, // Frame control
0x00, 0x00, // Duration ID 0x00, 0x00, // Duration ID
@ -1496,7 +1570,7 @@ void SoftAP_SendPacket(u8 *packet, u32 len)
*(u64*)&wifiMac.SoftAP.curPacket[12 + 24] = timestamp; *(u64*)&wifiMac.SoftAP.curPacket[12 + 24] = timestamp;
// And the CRC32 (FCS) // And the CRC32 (FCS)
u32 crc32 = WIFI_getCRC32(&wifiMac.SoftAP.curPacket[12], (packetLen - 4)); u32 crc32 = WIFI_calcCRC32(&wifiMac.SoftAP.curPacket[12], (packetLen - 4));
*(u32*)&wifiMac.SoftAP.curPacket[12 + packetLen - 4] = crc32; *(u32*)&wifiMac.SoftAP.curPacket[12 + packetLen - 4] = crc32;
// Let's prepare to send // Let's prepare to send
@ -1521,7 +1595,7 @@ void SoftAP_SendPacket(u8 *packet, u32 len)
memcpy(&wifiMac.SoftAP.curPacket[12 + 4], FW_Mac, 6); memcpy(&wifiMac.SoftAP.curPacket[12 + 4], FW_Mac, 6);
// And the CRC32 (FCS) // And the CRC32 (FCS)
u32 crc32 = WIFI_getCRC32(&wifiMac.SoftAP.curPacket[12], (packetLen - 4)); u32 crc32 = WIFI_calcCRC32(&wifiMac.SoftAP.curPacket[12], (packetLen - 4));
*(u32*)&wifiMac.SoftAP.curPacket[12 + packetLen - 4] = crc32; *(u32*)&wifiMac.SoftAP.curPacket[12 + packetLen - 4] = crc32;
// Let's prepare to send // Let's prepare to send
@ -1546,7 +1620,7 @@ void SoftAP_SendPacket(u8 *packet, u32 len)
memcpy(&wifiMac.SoftAP.curPacket[12 + 4], FW_Mac, 6); memcpy(&wifiMac.SoftAP.curPacket[12 + 4], FW_Mac, 6);
// And the CRC32 (FCS) // And the CRC32 (FCS)
u32 crc32 = WIFI_getCRC32(&wifiMac.SoftAP.curPacket[12], (packetLen - 4)); u32 crc32 = WIFI_calcCRC32(&wifiMac.SoftAP.curPacket[12], (packetLen - 4));
*(u32*)&wifiMac.SoftAP.curPacket[12 + packetLen - 4] = crc32; *(u32*)&wifiMac.SoftAP.curPacket[12 + packetLen - 4] = crc32;
// Let's prepare to send // Let's prepare to send
@ -1617,7 +1691,7 @@ INLINE void SoftAP_SendBeacon()
*(u64*)&wifiMac.SoftAP.curPacket[12 + 24] = timestamp; *(u64*)&wifiMac.SoftAP.curPacket[12 + 24] = timestamp;
// And the CRC32 (FCS) // And the CRC32 (FCS)
u32 crc32 = WIFI_getCRC32(&wifiMac.SoftAP.curPacket[12], (packetLen - 4)); u32 crc32 = WIFI_calcCRC32(&wifiMac.SoftAP.curPacket[12], (packetLen - 4));
*(u32*)&wifiMac.SoftAP.curPacket[12 + packetLen - 4] = crc32; *(u32*)&wifiMac.SoftAP.curPacket[12 + packetLen - 4] = crc32;
// Let's prepare to send // Let's prepare to send

View File

@ -1869,8 +1869,6 @@ int _main()
CommonSettings.BootFromFirmware = GetPrivateProfileBool("Firmware", "BootFromFirmware", FALSE, IniName); CommonSettings.BootFromFirmware = GetPrivateProfileBool("Firmware", "BootFromFirmware", FALSE, IniName);
CommonSettings.wifi.mode = GetPrivateProfileInt("Wifi", "Mode", 0, IniName); CommonSettings.wifi.mode = GetPrivateProfileInt("Wifi", "Mode", 0, IniName);
CommonSettings.wifi.adhocMode = GetPrivateProfileInt("Wifi", "AdhocMode", 0, IniName);
GetPrivateProfileString("Wifi", "AdhocServerName", "", CommonSettings.wifi.adhocServerName, 64, IniName);
CommonSettings.wifi.infraBridgeAdapter = GetPrivateProfileInt("Wifi", "BridgeAdapter", 0, IniName); CommonSettings.wifi.infraBridgeAdapter = GetPrivateProfileInt("Wifi", "BridgeAdapter", 0, IniName);
video.currentfilter = GetPrivateProfileInt("Video", "Filter", video.NONE, IniName); video.currentfilter = GetPrivateProfileInt("Video", "Filter", video.NONE, IniName);
@ -4296,12 +4294,6 @@ LRESULT CALLBACK WifiSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM
HWND cur; HWND cur;
CheckRadioButton(hDlg, IDC_WIFIMODE0, IDC_WIFIMODE1, IDC_WIFIMODE0 + CommonSettings.wifi.mode); CheckRadioButton(hDlg, IDC_WIFIMODE0, IDC_WIFIMODE1, IDC_WIFIMODE0 + CommonSettings.wifi.mode);
CheckRadioButton(hDlg, IDC_ADHOC_SERVER, IDC_ADHOC_CLIENT, CommonSettings.wifi.adhocMode ? IDC_ADHOC_CLIENT:IDC_ADHOC_SERVER);
cur = GetDlgItem(hDlg, IDC_ADHOC_SERVERNAME);
SetWindowText(cur, CommonSettings.wifi.adhocServerName);
EnableWindow(cur, (CommonSettings.wifi.adhocMode == 1) ? TRUE:FALSE);
#if 0 #if 0
if(PCAP::pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) if(PCAP::pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{ {
@ -4323,14 +4315,6 @@ LRESULT CALLBACK WifiSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM
{ {
switch(LOWORD(wParam)) switch(LOWORD(wParam))
{ {
case IDC_ADHOC_SERVER:
case IDC_ADHOC_CLIENT:
{
HWND cur = GetDlgItem(hDlg, IDC_ADHOC_SERVERNAME);
EnableWindow(cur, (LOWORD(wParam) == IDC_ADHOC_CLIENT) ? TRUE:FALSE);
}
return TRUE;
case IDOK: case IDOK:
{ {
int val = 0; int val = 0;
@ -4355,16 +4339,6 @@ LRESULT CALLBACK WifiSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM
WritePrivateProfileInt("Wifi", "Mode", CommonSettings.wifi.mode, IniName); WritePrivateProfileInt("Wifi", "Mode", CommonSettings.wifi.mode, IniName);
#endif #endif
if (IsDlgButtonChecked(hDlg, IDC_ADHOC_SERVER))
CommonSettings.wifi.adhocMode = 0;
else
CommonSettings.wifi.adhocMode = 1;
WritePrivateProfileInt("Wifi", "AdhocMode", CommonSettings.wifi.adhocMode, IniName);
cur = GetDlgItem(hDlg, IDC_ADHOC_SERVERNAME);
GetWindowText(cur, CommonSettings.wifi.adhocServerName, 64);
WritePrivateProfileString("Wifi", "AdhocServerName", CommonSettings.wifi.adhocServerName, IniName);
if(val == IDYES) if(val == IDYES)
{ {
NDS_Reset(); NDS_Reset();

Binary file not shown.