Clean up packet managing in SoftAP.

This commit is contained in:
luigi__ 2009-06-01 21:52:50 +00:00
parent c2f70995b4
commit 19fa692af8
1 changed files with 66 additions and 93 deletions

View File

@ -1120,7 +1120,7 @@ void WIFI_usTrigger(wifimac_t *wifi)
u8 SoftAP_MACAddr[6] = {0x00, 0xF0, 0x1A, 0x2B, 0x3C, 0x4D}; u8 SoftAP_MACAddr[6] = {0x00, 0xF0, 0x1A, 0x2B, 0x3C, 0x4D};
u8 SoftAP_Beacon[58] = { 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
@ -1161,7 +1161,7 @@ u8 SoftAP_ProbeResponse[] = {
0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00
}; };
u8 SoftAP_AuthFrame[34] = { 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
@ -1179,7 +1179,7 @@ u8 SoftAP_AuthFrame[34] = {
0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00
}; };
u8 SoftAP_AssocResponse[38] = { 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
@ -1247,6 +1247,9 @@ void WIFI_SoftAP_Shutdown(wifimac_t *wifi)
if(wifi->SoftAP.bridge != NULL) if(wifi->SoftAP.bridge != NULL)
PCAP::pcap_close(wifi->SoftAP.bridge); PCAP::pcap_close(wifi->SoftAP.bridge);
} }
if(wifi->SoftAP.curPacket)
delete wifi->SoftAP.curPacket;
} }
void WIFI_SoftAP_MakeRXHeader(wifimac_t *wifi, u16 flags, u16 xferRate, u16 len, u8 maxRSSI, u8 minRSSI) void WIFI_SoftAP_MakeRXHeader(wifimac_t *wifi, u16 flags, u16 xferRate, u16 len, u8 maxRSSI, u8 minRSSI)
@ -1287,7 +1290,6 @@ void WIFI_SoftAP_RecvPacketFromDS(wifimac_t *wifi, u8 *packet, int len)
int packetLen = sizeof(SoftAP_ProbeResponse); int packetLen = sizeof(SoftAP_ProbeResponse);
int totalLen = (packetLen + 12); int totalLen = (packetLen + 12);
if(wifi->SoftAP.curPacket) delete wifi->SoftAP.curPacket;
wifi->SoftAP.curPacket = new u8[totalLen]; wifi->SoftAP.curPacket = new u8[totalLen];
// Make the RX header // Make the RX header
@ -1322,33 +1324,26 @@ void WIFI_SoftAP_RecvPacketFromDS(wifimac_t *wifi, u8 *packet, int len)
case 0xB: // Authentication case 0xB: // Authentication
{ {
u8 authframe[36]; int packetLen = sizeof(SoftAP_AuthFrame);
int totalLen = (packetLen + 12);
memcpy(authframe, SoftAP_AuthFrame, 34); wifi->SoftAP.curPacket = new u8[totalLen];
memcpy(&authframe[4], FW_Mac, 6);
u32 crc32 = WIFI_getCRC32(authframe, 30);
*(u32*)&authframe[32] = crc32;
if(wifi->SoftAP.curPacket) // Make the RX header
delete wifi->SoftAP.curPacket; WIFI_SoftAP_MakeRXHeader(wifi, 0x0010, 20, packetLen, 0, 0);
wifi->SoftAP.curPacket = new u8[36+12]; // Copy the authentication frame template
memcpy(&wifi->SoftAP.curPacket[12], SoftAP_AuthFrame, packetLen);
wifi->SoftAP.curPacket[0] = 0x10; // Add the MAC address
wifi->SoftAP.curPacket[1] = 0x00; memcpy(&wifi->SoftAP.curPacket[12 + 4], FW_Mac, 6);
wifi->SoftAP.curPacket[2] = 0x40;
wifi->SoftAP.curPacket[3] = 0x00;
wifi->SoftAP.curPacket[4] = 0x01;
wifi->SoftAP.curPacket[5] = 0x00;
wifi->SoftAP.curPacket[6] = 0x14;
wifi->SoftAP.curPacket[7] = 0x00;
wifi->SoftAP.curPacket[8] = 0x20;
wifi->SoftAP.curPacket[9] = 0x00;
wifi->SoftAP.curPacket[10] = 0x00;
wifi->SoftAP.curPacket[11] = 0x00;
memcpy((wifi->SoftAP.curPacket+12), authframe, 36); // And the CRC32 (FCS)
wifi->SoftAP.curPacketSize = 36+12; u32 crc32 = WIFI_getCRC32(&wifi->SoftAP.curPacket[12], (packetLen - 4));
*(u32*)&wifi->SoftAP.curPacket[12 + packetLen - 4] = crc32;
// Let's prepare to send
wifi->SoftAP.curPacketSize = totalLen;
wifi->SoftAP.curPacketPos = 0; wifi->SoftAP.curPacketPos = 0;
wifi->SoftAP.curPacketSending = TRUE; wifi->SoftAP.curPacketSending = TRUE;
} }
@ -1356,33 +1351,26 @@ void WIFI_SoftAP_RecvPacketFromDS(wifimac_t *wifi, u8 *packet, int len)
case 0x0: // Association request case 0x0: // Association request
{ {
u8 assocres[40]; int packetLen = sizeof(SoftAP_AssocResponse);
int totalLen = (packetLen + 12);
memcpy(assocres, SoftAP_AssocResponse, 38); wifi->SoftAP.curPacket = new u8[totalLen];
memcpy(&assocres[4], FW_Mac, 6);
u32 crc32 = WIFI_getCRC32(assocres, 34);
*(u32*)&assocres[36] = crc32;
if(wifi->SoftAP.curPacket) // Make the RX header
delete wifi->SoftAP.curPacket; WIFI_SoftAP_MakeRXHeader(wifi, 0x0010, 20, packetLen, 0, 0);
wifi->SoftAP.curPacket = new u8[40+12]; // Copy the association response template
memcpy(&wifi->SoftAP.curPacket[12], SoftAP_AssocResponse, packetLen);
wifi->SoftAP.curPacket[0] = 0x10; // Add the MAC address
wifi->SoftAP.curPacket[1] = 0x00; memcpy(&wifi->SoftAP.curPacket[12 + 4], FW_Mac, 6);
wifi->SoftAP.curPacket[2] = 0x40;
wifi->SoftAP.curPacket[3] = 0x00;
wifi->SoftAP.curPacket[4] = 0x01;
wifi->SoftAP.curPacket[5] = 0x00;
wifi->SoftAP.curPacket[6] = 0x14;
wifi->SoftAP.curPacket[7] = 0x00;
wifi->SoftAP.curPacket[8] = 0x24;
wifi->SoftAP.curPacket[9] = 0x00;
wifi->SoftAP.curPacket[10] = 0x00;
wifi->SoftAP.curPacket[11] = 0x00;
memcpy((wifi->SoftAP.curPacket+12), assocres, 40); // And the CRC32 (FCS)
wifi->SoftAP.curPacketSize = 36+12; u32 crc32 = WIFI_getCRC32(&wifi->SoftAP.curPacket[12], (packetLen - 4));
*(u32*)&wifi->SoftAP.curPacket[12 + packetLen - 4] = crc32;
// Let's prepare to send
wifi->SoftAP.curPacketSize = totalLen;
wifi->SoftAP.curPacketPos = 0; wifi->SoftAP.curPacketPos = 0;
wifi->SoftAP.curPacketSending = TRUE; wifi->SoftAP.curPacketSending = TRUE;
} }
@ -1393,12 +1381,12 @@ void WIFI_SoftAP_RecvPacketFromDS(wifimac_t *wifi, u8 *packet, int len)
case 0x2: // Data case 0x2: // Data
{ {
/* We convert the packet into an Ethernet packet */ // We convert the packet into an Ethernet packet
int eflen = (alignedLen - 4 - 30 + 14); int eflen = (alignedLen - 4 - 30 + 14);
u8 *ethernetframe = new u8[eflen]; u8 *ethernetframe = new u8[eflen];
/* Destination address */ // Destination address
ethernetframe[0] = packet[28]; ethernetframe[0] = packet[28];
ethernetframe[1] = packet[29]; ethernetframe[1] = packet[29];
ethernetframe[2] = packet[30]; ethernetframe[2] = packet[30];
@ -1406,7 +1394,7 @@ void WIFI_SoftAP_RecvPacketFromDS(wifimac_t *wifi, u8 *packet, int len)
ethernetframe[4] = packet[32]; ethernetframe[4] = packet[32];
ethernetframe[5] = packet[33]; ethernetframe[5] = packet[33];
/* Source address */ // Source address
ethernetframe[6] = packet[22]; ethernetframe[6] = packet[22];
ethernetframe[7] = packet[23]; ethernetframe[7] = packet[23];
ethernetframe[8] = packet[24]; ethernetframe[8] = packet[24];
@ -1414,15 +1402,15 @@ void WIFI_SoftAP_RecvPacketFromDS(wifimac_t *wifi, u8 *packet, int len)
ethernetframe[10] = packet[26]; ethernetframe[10] = packet[26];
ethernetframe[11] = packet[27]; ethernetframe[11] = packet[27];
/* EtherType */ // EtherType
ethernetframe[12] = packet[42]; ethernetframe[12] = packet[42];
ethernetframe[13] = packet[43]; ethernetframe[13] = packet[43];
/* Frame body */ // Frame body
memcpy((ethernetframe + 14), (packet + 44), (alignedLen - 30 - 4)); memcpy((ethernetframe + 14), (packet + 44), (alignedLen - 30 - 4));
/* Checksum */ // Checksum
/* TODO ? */ // TODO ?
if(wifi->netEnabled) //dont try to pcap out the packet unless network is enabled if(wifi->netEnabled) //dont try to pcap out the packet unless network is enabled
PCAP::pcap_sendpacket(wifi->SoftAP.bridge, ethernetframe, eflen); PCAP::pcap_sendpacket(wifi->SoftAP.bridge, ethernetframe, eflen);
@ -1433,48 +1421,31 @@ void WIFI_SoftAP_RecvPacketFromDS(wifimac_t *wifi, u8 *packet, int len)
} }
} }
void WIFI_SoftAP_SendToNetwork(wifimac_t *wifi)
{
//
}
void WIFI_SoftAP_RecvFromNetwork(wifimac_t *wifi)
{
//
}
void WIFI_SoftAP_SendBeacon(wifimac_t *wifi) void WIFI_SoftAP_SendBeacon(wifimac_t *wifi)
{ {
u8 beacon[58]; int packetLen = sizeof(SoftAP_Beacon);
int totalLen = (packetLen + 12);
memcpy(beacon, SoftAP_Beacon, 58); if(wifi->SoftAP.curPacket) delete wifi->SoftAP.curPacket;
wifi->SoftAP.curPacket = new u8[totalLen];
// Make the RX header
WIFI_SoftAP_MakeRXHeader(wifi, 0x0011, 20, packetLen, 0, 0);
// Copy the beacon template
memcpy(&wifi->SoftAP.curPacket[12], SoftAP_Beacon, packetLen);
// Add the timestamp
u64 timestamp = (wifi->SoftAP.usecCounter / 1000); // FIXME: is it correct? u64 timestamp = (wifi->SoftAP.usecCounter / 1000); // FIXME: is it correct?
*(u64*)&beacon[24] = timestamp; *(u64*)&wifi->SoftAP.curPacket[12 + 24] = timestamp;
u32 crc32 = WIFI_getCRC32(beacon, 54);
*(u32*)&beacon[54] = crc32;
if(wifi->SoftAP.curPacket) // And the CRC32 (FCS)
delete wifi->SoftAP.curPacket; u32 crc32 = WIFI_getCRC32(&wifi->SoftAP.curPacket[12], (packetLen - 4));
*(u32*)&wifi->SoftAP.curPacket[12 + packetLen - 4] = crc32;
wifi->SoftAP.curPacket = new u8[58+12]; // Let's prepare to send
wifi->SoftAP.curPacketSize = totalLen;
wifi->SoftAP.curPacket[0] = 0x11; wifi->SoftAP.curPacketPos = 0;
wifi->SoftAP.curPacket[1] = 0x00;
wifi->SoftAP.curPacket[2] = 0x40;
wifi->SoftAP.curPacket[3] = 0x00;
wifi->SoftAP.curPacket[4] = 0x64;
wifi->SoftAP.curPacket[5] = 0x00;
wifi->SoftAP.curPacket[6] = 0x14;
wifi->SoftAP.curPacket[7] = 0x00;
wifi->SoftAP.curPacket[8] = 0x36;
wifi->SoftAP.curPacket[9] = 0x00;
wifi->SoftAP.curPacket[10] = 0x00;
wifi->SoftAP.curPacket[11] = 0x00;
memcpy((wifi->SoftAP.curPacket+12), beacon, 58);
wifi->SoftAP.curPacketSize = 58+12;
wifi->SoftAP.curPacketPos = -4;
wifi->SoftAP.curPacketSending = TRUE; wifi->SoftAP.curPacketSending = TRUE;
} }
@ -1482,7 +1453,7 @@ void WIFI_SoftAP_usTrigger(wifimac_t *wifi)
{ {
wifi->SoftAP.usecCounter++; wifi->SoftAP.usecCounter++;
/* if(!wifi->SoftAP.curPacketSending) if(!wifi->SoftAP.curPacketSending)
{ {
//if(wifi->ioMem[0xD0 >> 1] & 0x0400) //if(wifi->ioMem[0xD0 >> 1] & 0x0400)
{ {
@ -1491,7 +1462,7 @@ void WIFI_SoftAP_usTrigger(wifimac_t *wifi)
WIFI_SoftAP_SendBeacon(wifi); WIFI_SoftAP_SendBeacon(wifi);
} }
} }
}*/ }
/* Given a connection of 2 megabits per second, */ /* Given a connection of 2 megabits per second, */
/* we take ~4 microseconds to transfer a byte, */ /* we take ~4 microseconds to transfer a byte, */
@ -1535,6 +1506,8 @@ void WIFI_SoftAP_usTrigger(wifimac_t *wifi)
wifi->SoftAP.curPacketPos = 0; wifi->SoftAP.curPacketPos = 0;
wifi->SoftAP.curPacketSending = FALSE; wifi->SoftAP.curPacketSending = FALSE;
delete wifi->SoftAP.curPacket;
wifi->RXHWWriteCursorReg = ((wifi->RXHWWriteCursor + 1) & (~1)); wifi->RXHWWriteCursorReg = ((wifi->RXHWWriteCursor + 1) & (~1));
WIFI_triggerIRQ(wifi, 0); WIFI_triggerIRQ(wifi, 0);