mirror of
https://github.com/CTurt/dsgmDSWiFi.git
synced 2025-06-18 22:05:36 -04:00
287 lines
8.6 KiB
C
287 lines
8.6 KiB
C
// DS Wifi interface code
|
|
// Copyright (C) 2005-2006 Stephen Stair - sgstair@akkit.org - http://www.akkit.org
|
|
// wifi_shared.h - Shared structures to be used by arm9 and arm7
|
|
/******************************************************************************
|
|
DSWifi Lib and test materials are licenced under the MIT open source licence:
|
|
Copyright (c) 2005-2006 Stephen Stair
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
this software and associated documentation files (the "Software"), to deal in
|
|
the Software without restriction, including without limitation the rights to
|
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
of the Software, and to permit persons to whom the Software is furnished to do
|
|
so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
SOFTWARE.
|
|
******************************************************************************/
|
|
|
|
#ifndef WIFI_SHARED_H
|
|
#define WIFI_SHARED_H
|
|
|
|
|
|
#include <nds.h>
|
|
|
|
|
|
#define WIFIINIT_OPTION_USELED 0x0002
|
|
|
|
// on spinlock contention, the side unsuccessfully attempting the lock reverts the lock.
|
|
// if the unlocking side sees the lock incorrectly set, the unlocking side will delay until it has reverted to the correct value, then continue unlocking.
|
|
// there should be a delay of at least about ~10-20 cycles between a lock and unlock, to prevent contention.
|
|
#define SPINLOCK_NOBODY 0x0000
|
|
#define SPINLOCK_ARM7 0x0001
|
|
#define SPINLOCK_ARM9 0x0002
|
|
|
|
#define SPINLOCK_OK 0x0000
|
|
#define SPINLOCK_INUSE 0x0001
|
|
#define SPINLOCK_ERROR 0x0002
|
|
|
|
#ifdef ARM7
|
|
#define SPINLOCK_VALUE SPINLOCK_ARM7
|
|
#endif
|
|
#ifdef ARM9
|
|
#define SPINLOCK_VALUE SPINLOCK_ARM9
|
|
#endif
|
|
|
|
|
|
#define Spinlock_Acquire(structtolock) SLasm_Acquire(&((structtolock).spinlock),SPINLOCK_VALUE)
|
|
#define Spinlock_Release(structtolock) SLasm_Release(&((structtolock).spinlock),SPINLOCK_VALUE)
|
|
#define Spinlock_Check(structtolock) (((structtolock).spinlock)!=SPINLOCK_NOBODY)
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
extern u32 SLasm_Acquire(volatile u32 * lockaddr, u32 lockvalue);
|
|
extern u32 SLasm_Release(volatile u32 * lockaddr, u32 lockvalue);
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
|
|
// If for whatever reason you want to ditch SGIP and use your own stack, comment out the following line.
|
|
#define WIFI_USE_TCP_SGIP 1
|
|
|
|
#define WIFI_RXBUFFER_SIZE (1024*12)
|
|
#define WIFI_TXBUFFER_SIZE (1024*24)
|
|
#define WIFI_MAX_AP 32
|
|
#define WIFI_MAX_ASSOC_RETRY 30
|
|
#define WIFI_PS_POLL_CONST 2
|
|
|
|
#define WIFI_MAX_PROBE 4
|
|
|
|
#define WIFI_AP_TIMEOUT 40
|
|
|
|
#define WFLAG_PACKET_DATA 0x0001
|
|
#define WFLAG_PACKET_MGT 0x0002
|
|
#define WFLAG_PACKET_BEACON 0x0004
|
|
#define WFLAG_PACKET_CTRL 0x0008
|
|
|
|
|
|
#define WFLAG_PACKET_ALL 0xFFFF
|
|
|
|
#define WFLAG_ARM7_ACTIVE 0x0001
|
|
#define WFLAG_ARM7_RUNNING 0x0002
|
|
|
|
#define WFLAG_ARM9_ACTIVE 0x0001
|
|
#define WFLAG_ARM9_USELED 0x0002
|
|
#define WFLAG_ARM9_ARM7READY 0x0004
|
|
#define WFLAG_ARM9_NETUP 0x0008
|
|
#define WFLAG_ARM9_NETREADY 0x0010
|
|
|
|
#define WFLAG_ARM9_INITFLAGMASK 0x0002
|
|
|
|
#define WFLAG_IP_GOTDHCP 0x0001
|
|
|
|
// request - request flags
|
|
#define WFLAG_REQ_APCONNECT 0x0001
|
|
#define WFLAG_REQ_APCOPYVALUES 0x0002
|
|
#define WFLAG_REQ_APADHOC 0x0008
|
|
#define WFLAG_REQ_PROMISC 0x0010
|
|
#define WFLAG_REQ_USEWEP 0x0020
|
|
|
|
// request - informational flags
|
|
#define WFLAG_REQ_APCONNECTED 0x8000
|
|
|
|
#define WFLAG_APDATA_ADHOC 0x0001
|
|
#define WFLAG_APDATA_WEP 0x0002
|
|
#define WFLAG_APDATA_WPA 0x0004
|
|
#define WFLAG_APDATA_COMPATIBLE 0x0008
|
|
#define WFLAG_APDATA_EXTCOMPATIBLE 0x0010
|
|
#define WFLAG_APDATA_SHORTPREAMBLE 0x0020
|
|
#define WFLAG_APDATA_ACTIVE 0x8000
|
|
|
|
|
|
enum WIFI_RETURN {
|
|
WIFI_RETURN_OK = 0, // Everything went ok
|
|
WIFI_RETURN_LOCKFAILED = 1, // the spinlock attempt failed (it wasn't retried cause that could lock both cpus- retry again after a delay.
|
|
WIFI_RETURN_ERROR = 2, // There was an error in attempting to complete the requested task.
|
|
WIFI_RETURN_PARAMERROR = 3, // There was an error in the parameters passed to the function.
|
|
};
|
|
|
|
enum WIFI_STATS {
|
|
// software stats
|
|
WSTAT_RXQUEUEDPACKETS, // number of packets queued into the rx fifo
|
|
WSTAT_TXQUEUEDPACKETS, // number of packets queued into the tx fifo
|
|
WSTAT_RXQUEUEDBYTES, // number of bytes queued into the rx fifo
|
|
WSTAT_TXQUEUEDBYTES, // number of bytes queued into the tx fifo
|
|
WSTAT_RXQUEUEDLOST, // number of packets lost due to space limitations in queuing
|
|
WSTAT_TXQUEUEDREJECTED, // number of packets rejected due to space limitations in queuing
|
|
WSTAT_RXPACKETS,
|
|
WSTAT_RXBYTES,
|
|
WSTAT_RXDATABYTES,
|
|
WSTAT_TXPACKETS,
|
|
WSTAT_TXBYTES,
|
|
WSTAT_TXDATABYTES,
|
|
WSTAT_ARM7_UPDATES,
|
|
WSTAT_DEBUG,
|
|
// harware stats (function mostly unknown.)
|
|
WSTAT_HW_1B0,WSTAT_HW_1B1,WSTAT_HW_1B2,WSTAT_HW_1B3,WSTAT_HW_1B4,WSTAT_HW_1B5,WSTAT_HW_1B6,WSTAT_HW_1B7,
|
|
WSTAT_HW_1B8,WSTAT_HW_1B9,WSTAT_HW_1BA,WSTAT_HW_1BB,WSTAT_HW_1BC,WSTAT_HW_1BD,WSTAT_HW_1BE,WSTAT_HW_1BF,
|
|
WSTAT_HW_1C0,WSTAT_HW_1C1,WSTAT_HW_1C4,WSTAT_HW_1C5,
|
|
WSTAT_HW_1D0,WSTAT_HW_1D1,WSTAT_HW_1D2,WSTAT_HW_1D3,WSTAT_HW_1D4,WSTAT_HW_1D5,WSTAT_HW_1D6,WSTAT_HW_1D7,
|
|
WSTAT_HW_1D8,WSTAT_HW_1D9,WSTAT_HW_1DA,WSTAT_HW_1DB,WSTAT_HW_1DC,WSTAT_HW_1DD,WSTAT_HW_1DE,WSTAT_HW_1DF,
|
|
|
|
NUM_WIFI_STATS
|
|
};
|
|
|
|
|
|
enum WIFI_MODE {
|
|
WIFIMODE_DISABLED,
|
|
WIFIMODE_NORMAL,
|
|
WIFIMODE_SCAN,
|
|
WIFIMODE_ASSOCIATE,
|
|
WIFIMODE_ASSOCIATED,
|
|
WIFIMODE_DISASSOCIATE,
|
|
WIFIMODE_CANNOTASSOCIATE,
|
|
};
|
|
enum WIFI_AUTHLEVEL {
|
|
WIFI_AUTHLEVEL_DISCONNECTED,
|
|
WIFI_AUTHLEVEL_AUTHENTICATED,
|
|
WIFI_AUTHLEVEL_ASSOCIATED,
|
|
WIFI_AUTHLEVEL_DEASSOCIATED,
|
|
};
|
|
|
|
enum WEPMODES {
|
|
WEPMODE_NONE = 0,
|
|
WEPMODE_40BIT = 1,
|
|
WEPMODE_128BIT = 2
|
|
};
|
|
|
|
enum WIFI_ASSOCSTATUS {
|
|
ASSOCSTATUS_DISCONNECTED, // not *trying* to connect
|
|
ASSOCSTATUS_SEARCHING, // data given does not completely specify an AP, looking for AP that matches the data.
|
|
ASSOCSTATUS_AUTHENTICATING, // connecting...
|
|
ASSOCSTATUS_ASSOCIATING, // connecting...
|
|
ASSOCSTATUS_ACQUIRINGDHCP, // connected to AP, but getting IP data from DHCP
|
|
ASSOCSTATUS_ASSOCIATED, // Connected! (COMPLETE if Wifi_ConnectAP was called to start)
|
|
ASSOCSTATUS_CANNOTCONNECT, // error in connecting... (COMPLETE if Wifi_ConnectAP was called to start)
|
|
};
|
|
|
|
typedef struct WIFI_TXHEADER {
|
|
u16 enable_flags;
|
|
u16 unknown;
|
|
u16 countup;
|
|
u16 beaconfreq;
|
|
u16 tx_rate;
|
|
u16 tx_length;
|
|
} Wifi_TxHeader;
|
|
|
|
typedef struct WIFI_RXHEADER {
|
|
u16 a;
|
|
u16 b;
|
|
u16 c;
|
|
u16 d;
|
|
u16 byteLength;
|
|
u16 rssi_;
|
|
} Wifi_RxHeader;
|
|
|
|
typedef struct WIFI_ACCESSPOINT {
|
|
char ssid[33]; // 0-32byte data, zero
|
|
char ssid_len;
|
|
u8 bssid[6];
|
|
u8 macaddr[6];
|
|
u16 maxrate; // max rate is measured in steps of 1/2Mbit - 5.5Mbit will be represented as 11, or 0x0B
|
|
u32 timectr;
|
|
u16 rssi;
|
|
u16 flags;
|
|
u32 spinlock;
|
|
u8 channel;
|
|
u8 rssi_past[8];
|
|
u8 base_rates[16]; // terminated by a 0 entry
|
|
} Wifi_AccessPoint;
|
|
|
|
typedef struct WIFI_MAINSTRUCT {
|
|
unsigned long dummy1[8];
|
|
// wifi status
|
|
u16 curChannel, reqChannel;
|
|
u16 curMode, reqMode;
|
|
u16 authlevel,authctr;
|
|
vu32 flags9, flags7;
|
|
u32 reqPacketFlags;
|
|
u16 curReqFlags, reqReqFlags;
|
|
u32 counter7,bootcounter7;
|
|
u16 MacAddr[3];
|
|
u16 authtype;
|
|
u16 iptype,ipflags;
|
|
u32 ip,snmask,gateway;
|
|
|
|
// current AP data
|
|
char ssid7[34],ssid9[34];
|
|
u16 bssid7[3], bssid9[3];
|
|
u8 apmac7[6], apmac9[6];
|
|
char wepmode7, wepmode9;
|
|
char wepkeyid7, wepkeyid9;
|
|
u8 wepkey7[20],wepkey9[20];
|
|
u8 baserates7[16], baserates9[16];
|
|
u8 apchannel7, apchannel9;
|
|
u8 maxrate7;
|
|
u16 ap_rssi;
|
|
u16 pspoll_period;
|
|
|
|
// AP data
|
|
Wifi_AccessPoint aplist[WIFI_MAX_AP];
|
|
|
|
// probe stuff
|
|
u8 probe9_numprobe;
|
|
u8 probe9_ssidlen[WIFI_MAX_PROBE];
|
|
char probe9_ssid[WIFI_MAX_PROBE][32];
|
|
|
|
// WFC data
|
|
u8 wfc_enable[4]; // wep mode, or 0x80 for "enabled"
|
|
Wifi_AccessPoint wfc_ap[3];
|
|
unsigned long wfc_config[3][5]; // ip, snmask, gateway, primarydns, 2nddns
|
|
u8 wfc_wepkey[3][16];
|
|
|
|
|
|
// wifi data
|
|
u32 rxbufIn, rxbufOut; // bufIn/bufOut have 2-byte granularity.
|
|
u16 rxbufData[WIFI_RXBUFFER_SIZE/2]; // send raw 802.11 data through! rxbuffer is for rx'd data, arm7->arm9 transfer
|
|
|
|
u32 txbufIn, txbufOut;
|
|
u16 txbufData[WIFI_TXBUFFER_SIZE/2]; // tx buffer is for data to tx, arm9->arm7 transfer
|
|
|
|
// stats data
|
|
u32 stats[NUM_WIFI_STATS];
|
|
|
|
u16 debug[30];
|
|
|
|
u32 random; // semirandom number updated at the convenience of the arm7. use for initial seeds & such.
|
|
|
|
unsigned long dummy2[8];
|
|
|
|
} Wifi_MainStruct;
|
|
|
|
|
|
|
|
#endif
|
|
|