Wifi: add some socket code for sending and receiving (incomplete).

Cache some regs that will be useful for beacon transmission.
This commit is contained in:
luigi__ 2009-08-23 18:13:16 +00:00
parent adeec7e38f
commit 399f024fcb
3 changed files with 95 additions and 11 deletions

View File

@ -290,8 +290,8 @@ SFORMAT SF_WIFI[]={
{ "W100", 2, 1, &wifiMac.TXCnt},
{ "W110", 2, 1, &wifiMac.TXOpt},
{ "W120", 2, 1, &wifiMac.TXStat},
{ "W130", 2, 1, &wifiMac.BEACONSlot},
{ "W140", 4, 1, &wifiMac.BEACON_enable},
{ "W130", 2, 1, &wifiMac.BeaconAddr},
{ "W140", 4, 1, &wifiMac.BeaconEnable},
{ "W150", 1, 1, &wifiMac.txCurSlot},
{ "W160", 1, 3, &wifiMac.txSlotBusy[0]},
{ "W170", 4, 3, &wifiMac.txSlotAddr[0]},

View File

@ -927,10 +927,15 @@ void WIFI_write16(u32 address, u16 val)
wifiMac.CircBufWrSkip = val ;
break ;
case REG_WIFI_BEACONTRANS:
wifiMac.BEACONSlot = val & 0x7FFF ;
wifiMac.BEACON_enable = (val & 0x8000) != 0 ;
//printf("wifi beacon: enable=%s, addr=%04X\n", (wifiMac.BEACON_enable?"yes":"no"), (wifiMac.BEACONSlot<<1));
wifiMac.BeaconAddr = val & 0x0FFF;
wifiMac.BeaconEnable = (val & 0x8000) != 0;
if (wifiMac.BeaconEnable)
WIFI_LOG(3, "Beacon transmission enabled to send the packet at %08X every %i milliseconds.\n",
0x04804000 + (wifiMac.BeaconAddr << 1), wifiMac.BeaconInterval);
break ;
case REG_WIFI_BEACONPERIOD:
wifiMac.BeaconInterval = val & 0x03FF;
break;
case REG_WIFI_TXLOC1:
case REG_WIFI_TXLOC2:
case REG_WIFI_TXLOC3:
@ -963,6 +968,9 @@ void WIFI_write16(u32 address, u16 val)
emu_halt();
}*/
break ;
case REG_WIFI_TXSEQNO:
wifiMac.TXSeqNo = val & 0x0FFF;
break;
case REG_WIFI_RFIOCNT:
WIFI_setRF_CNT(val) ;
break ;
@ -1290,19 +1298,21 @@ void WIFI_usTrigger()
#define ADHOC_MAGIC "NDSWIFI\0"
#define ADHOC_PROTOCOL_VERSION 0x0100 // v1.0
typedef struct _Adhoc_PacketHeader
typedef struct _Adhoc_FrameHeader
{
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;
} Adhoc_FrameHeader;
bool Adhoc_Init()
{
int res;
wifiMac.Adhoc.usecCounter = 0;
// Create an UDP socket
wifi_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (wifi_socket < 0)
@ -1337,8 +1347,8 @@ bool Adhoc_Init()
// 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);
*(u32*)&sendAddr.sa_data[2] = htonl(INADDR_BROADCAST);
*(u16*)&sendAddr.sa_data[0] = htons(BASEPORT);
WIFI_LOG(1, "Ad-hoc: initialization successful.\n");
@ -1353,14 +1363,79 @@ void Adhoc_DeInit()
void Adhoc_Reset()
{
wifiMac.Adhoc.usecCounter = 0;
}
void Adhoc_SendPacket(u8* packet, u32 len)
{
u32 packetLen = 12 + WIFI_alignedLen(len);
u32 frameLen = sizeof(Adhoc_FrameHeader) + packetLen;
u8* frame = new u8[frameLen];
u8* ptr = frame;
Adhoc_FrameHeader header;
strncpy(header.magic, ADHOC_MAGIC, 8);
header.version = ADHOC_PROTOCOL_VERSION;
header.packetLen = packetLen;
memcpy(ptr, &header, sizeof(Adhoc_FrameHeader));
ptr += sizeof(Adhoc_FrameHeader);
memcpy(ptr, packet, packetLen);
int nbytes = sendto(wifi_socket, (const char*)frame, frameLen, 0, &sendAddr, sizeof(sockaddr_t));
WIFI_LOG(3, "Ad-hoc: sent %i/%i bytes of packet.\n", nbytes, frameLen);
delete frame;
}
void Adhoc_usTrigger()
{
wifiMac.Adhoc.usecCounter++;
// Check every millisecond (approx.) if we received a packet
if (!(wifiMac.Adhoc.usecCounter & 1023))
{
fd_set fd;
struct timeval tv;
FD_ZERO(&fd);
FD_SET(wifi_socket, &fd);
tv.tv_sec = 0;
tv.tv_usec = 0;
if (select(1, &fd, 0, 0, &tv))
{
sockaddr_t fromAddr;
int fromLen = sizeof(sockaddr_t);
u8 buf[1536];
int nbytes = recvfrom(wifi_socket, (char*)buf, 1536, 0, &fromAddr, &fromLen);
// No packet arrived (or there was an error)
if (nbytes <= 0)
return;
WIFI_LOG(3, "Ad-hoc: received a packet of %i bytes from %i.%i.%i.%i (port %i).\n",
nbytes,
(u8)fromAddr.sa_data[2], (u8)fromAddr.sa_data[3],
(u8)fromAddr.sa_data[4], (u8)fromAddr.sa_data[5],
ntohs(*(u16*)&fromAddr.sa_data[0]));
Adhoc_FrameHeader header = *(Adhoc_FrameHeader*)&buf[0];
// Check the magic string in header
if (strncmp(header.magic, ADHOC_MAGIC, 8) != 0)
return;
// Check the ad-hoc protocol version
if (header.version != ADHOC_PROTOCOL_VERSION)
return;
// TODO: handle the packet!
//WIFI_LOG(3, "Ad-hoc: packet is interesting!\n");
}
}
}
/*******************************************************************************

View File

@ -100,6 +100,7 @@
#define REG_WIFI_RFIOBSY 0x180
#define REG_WIFI_RFIOCNT 0x184
#define REG_WIFI_IF_SET 0x21C
#define REG_WIFI_TXSEQNO 0x210
#define REG_WIFI_POWERACK 0x2D0
/* WIFI misc constants */
@ -386,8 +387,10 @@ typedef struct
u16 TXCnt ;
u16 TXOpt ;
u16 TXStat;
u16 BEACONSlot ;
BOOL BEACON_enable ;
u16 BeaconAddr;
BOOL BeaconEnable;
u16 BeaconInterval;
u16 TXSeqNo;
u8 txCurSlot;
u8 txSlotBusy[3];
u32 txSlotAddr[3];
@ -463,6 +466,12 @@ typedef struct
/* others */
u16 randomSeed ;
struct _Adhoc
{
u64 usecCounter;
} Adhoc;
/* SoftAP */
struct _SoftAP
{