?? wlan_phoenix.c
字號:
void buffer_alloc_event_handler(void)
{
unsigned int FID;
char i,j;
FID = rd_cf_io16(AllocFID_Register);
j = 1;
for(i=0;i<3;++i)
{
if(TxFID_buffers[i] == FID)
bitset(free_TxFIDs, i);
j = 0;
//printf("\r\nReclaimed Buffer %04X", FID);
}
if(j)
{
if(!(free_TxFIDs & 0x01))
{
TxFID_buffers[0] = FID;
bitset(free_TxFIDs, 0);
}
else if(!(free_TxFIDs & 0x02))
{
TxFID_buffers[1] = FID;
bitset(free_TxFIDs, 1);
}
else if(!(free_TxFIDs & 0x04))
{
TxFID_buffers[2] = FID;
bitset(free_TxFIDs, 2);
}
}
}
//*******************************************************************************************************
//* Perform Housekeeping on Events
//*******************************************************************************************************
void do_event_housekeeping(void)
{
unsigned int evstat_data,FID;
evstat_data = rd_cf_io16(EvStat_Register);
if(evstat_data & EvStat_Tx_Bit_Mask)
{
//printf("\r\nTransmit Event Occurred");
wr_cf_io16(EvStat_Tx_Bit_Mask,EvAck_Register);
}
if(evstat_data & EvStat_TxExc_Bit_Mask)
{
//printf("\r\nTransmit Event Exception Occurred");
wr_cf_io16(EvStat_TxExc_Bit_Mask,EvAck_Register);
}
if(evstat_data & EvStat_Alloc_Bit_Mask)
{
//printf("\r\nBuffer Allocation Event Occurred");
buffer_alloc_event_handler();
wr_cf_io16(EvStat_Tx_Bit_Mask,EvAck_Register);
}
if(evstat_data & EvStat_Cmd_Bit_Mask)
{
//printf("\r\nCommand Completed Event Occurred");
wr_cf_io16(EvStat_Cmd_Bit_Mask,EvAck_Register);
}
if(evstat_data & EvStat_Info_Bit_Mask)
{
//printf("\r\nInformation Frame Received Event Occurred");
FID = rd_cf_io16(InfoFID_Register);
//printf("\r\nInformation FID: %04X", FID);
wr_cf_io16(EvStat_Info_Bit_Mask,EvAck_Register);
}
if(evstat_data & EvStat_InfDrop_Bit_Mask)
{
//printf("\r\nUnsolicited Information Frame Dropped Event Occurred");
wr_cf_io16(EvStat_InfDrop_Bit_Mask,EvAck_Register);
}
if(evstat_data & EvStat_WTErr_Bit_Mask)
{
//printf("\r\nWait Error Event Occurred");
wr_cf_io16(EvStat_WTErr_Bit_Mask,EvAck_Register);
}
}
//******************************************************************
//* IP Protocol Types
//******************************************************************
#define PROT_ICMP 0x01
#define PROT_TCP 0x06
#define PROT_UDP 0x11
//******************************************************************
//* Ethernet Header Layout
//******************************************************************
unsigned int packet[761]; //761
#define enetpacketLen11 0x00
#define enetpacketDest 0x01
#define enetpacketDest01 0x01 //destination mac address
#define enetpacketDest23 0x02
#define enetpacketDest45 0x03
#define enetpacketSrc 0x04
#define enetpacketSrc01 0x04 //source mac address
#define enetpacketSrc23 0x05
#define enetpacketSrc45 0x06
#define enetpacketLen03 0x07
#define enetpacketSnap 0x08
#define enetpacketCntrl 0x09
// 0x0A
#define enetpacketType 0x0B //type/length field
#define enetpacketData 0x0C //IP data area begins here
//******************************************************************
//* ARP Layout
//******************************************************************
#define arp_hwtype 0x0C
#define arp_prtype 0x0D
#define arp_hwprlen 0x0E
#define arp_op 0x0F
#define arp_shaddr 0x10 //arp source mac address
// 0x11
// 0x12
#define arp_sipaddr 0x13 //arp source ip address
// 0x14
#define arp_thaddr 0x15 //arp target mac address
// 0x16
// 0x17
#define arp_tipaddr 0x18 //arp target ip address
// 0x19
//******************************************************************
//* IP Header Layout
//******************************************************************
#define ip_vers_len 0x0C //IP version and header length
//#define ip_tos //IP type of service
#define ip_pktlen 0x0D //packet length
#define ip_id 0x0E //datagram id
#define ip_frag_offset 0x0F //fragment offset
#define ip_ttlproto 0x10 //time to live
//#define ip_proto //protocol (ICMP=1, TCP=6, UDP=11)
#define ip_hdr_cksum 0x11 //header checksum
#define ip_srcaddr 0x12 //IP address of source
// 0X13
#define ip_destaddr 0x14 //IP addess of destination
// 0X15
#define ip_data 0x16 //IP data area
//******************************************************************
//* TCP Header Layout
//******************************************************************
#define TCP_srcport 0x16 //TCP source port
#define TCP_destport 0x17 //TCP destination port
#define TCP_seqnum 0x18 //sequence number
// 0x19
#define TCP_acknum 0x1A //acknowledgement number
// 0x1B
#define TCP_hdrflags 0x1C //4-bit header len and flags
#define TCP_window 0x1D //window size
#define TCP_cksum 0x1E //TCP checksum
#define TCP_urgentptr 0x1F //urgent pointer
#define TCP_data 0x20 //option/data
//******************************************************************
//* TCP Flags
//* IN flags represent incoming bits
//* OUT flags represent outgoing bits
//******************************************************************
#define FIN_IN (packet[TCP_hdrflags] & 0x0100)
#define SYN_IN (packet[TCP_hdrflags] & 0x0200)
#define RST_IN (packet[TCP_hdrflags] & 0x0400)
#define PSH_IN (packet[TCP_hdrflags] & 0x0800)
#define ACK_IN (packet[TCP_hdrflags] & 0x1000)
#define URG_IN (packet[TCP_hdrflags] & 0x2000)
#define FIN_OUT packet[TCP_hdrflags] |= 0x0100 //0000 0001 0000 0000
#define SYN_OUT packet[TCP_hdrflags] |= 0x0200 //0000 0010 0000 0000
#define RST_OUT packet[TCP_hdrflags] |= 0x0400 //0000 0100 0000 0000
#define PSH_OUT packet[TCP_hdrflags] |= 0x0800 //0000 1000 0000 0000
#define ACK_OUT packet[TCP_hdrflags] |= 0x1000 //0001 0000 0000 0000
#define URG_OUT packet[TCP_hdrflags] |= 0x2000 //0010 0000 0000 0000
//******************************************************************
//* ICMP Header
//******************************************************************
#define ICMP_typecode ip_data
//#define ICMP_code ICMP_type+1
#define ICMP_cksum ICMP_typecode+1
#define ICMP_id ICMP_cksum+1
#define ICMP_seqnum ICMP_id+1
#define ICMP_data ICMP_seqnum+1
//******************************************************************
//* UDP Header
//******************************************************************
#define UDP_srcport ip_data
#define UDP_destport UDP_srcport+1
#define UDP_len UDP_destport+1
#define UDP_cksum UDP_len+1
#define UDP_data UDP_cksum+1
//******************************************************************
//* UDP Packet Layout
//******************************************************************
//******************************************************************
//* Ethernet Header Layout
//******************************************************************
unsigned int udp_packet[33];
#define enetpacketLen11 0x00
#define enetpacketDest 0x01
#define enetpacketDest01 0x01 //destination mac address
#define enetpacketest23 0x02
#define enetpacketDest45 0x03
#define enetpacketSrc 0x04
#define enetpacketSrc01 0x04 //source mac address
#define enetpacketSrc23 0x05
#define enetpacketSrc45 0x06
#define enetpacketLen03 0x07
#define enetpacketSnap 0x08
#define enetpacketCntrl 0x09
// 0x0A
#define enetpacketType 0x0B //type/length field
#define enetpacketData 0x0C //IP data area begins here
//******************************************************************
//* IP Header Layout
//******************************************************************
#define ip_vers_len 0x0C //IP version and header length
//#define ip_tos //IP type of service
#define ip_pktlen 0x0D //packet length
#define ip_id 0x0E //datagram id
#define ip_frag_offset 0x0F //fragment offset
#define ip_ttlproto 0x10 //time to live
//#define ip_proto //protocol (ICMP=1, TCP=6, UDP=11)
#define ip_hdr_cksum 0x11 //header checksum
#define ip_srcaddr 0x12 //IP address of source
// 0X13
#define ip_destaddr 0x14 //IP addess of destination
// 0X15
#define ip_data 0x16 //IP data area
//******************************************************************
//* UDP Header
//******************************************************************
#define UDP_srcport ip_data
#define UDP_destport UDP_srcport+1
#define UDP_len UDP_destport+1
#define UDP_cksum UDP_len+1
#define UDP_data UDP_cksum+1
//******************************************************************
//* Get A Frame From the CF Receive Buffer
//* This routine removes an Ethernet frame from the receive buffer.
//******************************************************************
void get_frame()
{
unsigned int temp,i;
char rc,bapnum;
rc = 0;
RxFID = rd_cf_io16(RxFID_Register); // Get the FID of the allocated buffer
bapnum = get_free_bap();
switch(bapnum)
{
case 0:
wr_cf_io16(RxFID,Select0_Register);
wr_cf_io16(rxdatalength_offset,Offset0_Register);
do{
temp = rd_cf_io16(Offset0_Register);
}while(temp & BAP0Busy_Bit_Mask);
//READ 802.11B PACKET DATA LENGTH
packet[enetpacketLen11] = rd_cf_io16(Data0_Register);
//CHECK FOR PACKET DATA LENGTH > 1500 BYTES
if(packet[enetpacketLen11] > 0x05DC)
packet[enetpacketLen11] = 0x05DC;
//GET DESTINATION MAC ADDRESS
for(i=0;i<3;++i)
packet[enetpacketDest+i] = rd_cf_io16(Data0_Register);
//GET SOURCE MAC ADDRESS
for(i=0;i<3;++i)
packet[enetpacketSrc+i] = rd_cf_io16(Data0_Register);
//GET PACKET DATA
for(i=0;i<packet[enetpacketLen11];++i)
packet[enetpacketLen03+i] = rd_cf_io16(Data0_Register);
//ACKNOWLEDGE THAT WE NOW OWN THE FID
wr_cf_io16(EvStat_Rx_Bit_Mask,EvAck_Register );
break;
case 1:
wr_cf_io16(RxFID,Select1_Register);
wr_cf_io16(rxdatalength_offset,Offset1_Register);
do{
temp = rd_cf_io16(Offset1_Register);
}while(temp & BAP0Busy_Bit_Mask);
packet[enetpacketLen11] = rd_cf_io16(Data1_Register); //get data length
if(packet[enetpacketLen11] > 0x05DC)
packet[enetpacketLen11] = 0x05DC;
for(i=0;i<3;++i)
packet[enetpacketDest+i] = rd_cf_io16(Data1_Register);
for(i=0;i<3;++i)
packet[enetpacketSrc+i] = rd_cf_io16(Data1_Register);
for(i=0;i<packet[enetpacketLen11];++i) //removed +1
packet[enetpacketLen03+i] = rd_cf_io16(Data1_Register);
wr_cf_io16(EvStat_Rx_Bit_Mask,EvAck_Register ); // Acknowledge we own the FID
break;
default:
rc = 1;
break;
}
if(!rc)
{
//process an ARP packet
if(packet[enetpacketType] == 0x0608)
{
if(packet[arp_hwtype] == 0x0100 &&
packet[arp_prtype] == 0x0008 &&
packet[arp_hwprlen] == 0x0406 &&
packet[arp_op] == 0x0100 &&
ipaddri[0] == packet[arp_tipaddr] &&
ipaddri[1] == packet[arp_tipaddr+1])
arp();
if(packet[arp_hwtype] == 0x0100 &&
packet[arp_prtype] == 0x0008 &&
packet[arp_hwprlen] == 0x0406 &&
packet[arp_op] == 0x0200 &&
ipaddri[0] == packet[arp_tipaddr] &&
ipaddri[1] == packet[arp_tipaddr+1])
{
for(i=0;i<6;i++)
{
if(i%2)
remotemacaddrc[i] = packet[arp_shaddr+i/2]>>8;
else
remotemacaddrc[i] = packet[arp_shaddr+i/2] & 0xFF;
}
remotemacaddri[0] = make16(remotemacaddrc[1],remotemacaddrc[0]);
remotemacaddri[1] = make16(remotemacaddrc[3],remotemacaddrc[2]);
remotemacaddri[2] = make16(remotemacaddrc[5],remotemacaddrc[4]);
flags.arpflag = 1;
}
}
//process an IP packet
else if(packet[enetpacketType] == 0x0008
&& packet[ip_destaddr] == ipaddri[0]
&& packet[ip_destaddr+1] == ipaddri[1])
{
if(HIGH_BYTE(packet[ip_ttlproto]) == PROT_ICMP)
icmp();
else if(HIGH_BYTE(packet[ip_ttlproto]) == PROT_UDP)
udp();
else if(HIGH_BYTE(packet[ip_ttlproto]) == PROT_TCP)
tcp();
}
}
else
do_event_housekeeping();
}
//******************************************************************
//* Perform ARP Response
//* This routine supplies a requesting computer with the
//* Ethernet modules's MAC (hardware) address.
//******************************************************************
char arp(void)
{
unsigned int TxFID,i;
char rc;
rc = 0;
TxFID = get_free_TxFID();
if(TxFID == 0)
rc = 1;
else
{
for(i=0;i<2;++i)
{
packet[arp_tipaddr+i] = packet[arp_sipaddr+i];
packet[arp_sipaddr+i] = ipaddri[i];
}
for(i=0;i<3;++i)
{
packet[enetpacketDest+i] = packet[enetpacketSrc+i];
packet[arp_thaddr+i] = packet[enetpacketSrc+i];
packet[enetpacketSrc+i] = macaddri[i];
packet[arp_shaddr+i] = macaddri[i];
}
packet[arp_op] = 0x0200; //arp reply
rc = bap_write(TxFID,rxdatalength_offset,(char*)packet, packet[enetpacketLen11]+16);
rc=send_command(TransmitReclaim_Cmd,TxFID);
do_event_housekeeping();
}
return(rc);
}
//******************************************************************
//* Perform ARP Request
//* This routine uses a known remote IP address to get a remote
//* Ethernet modules's MAC (hardware) address.
//******************************************************************
char arp_request(void)
{
unsigned int TxFID,i,bytecount;
char rc;
flags.arpflag = 0;
bytecount = 0x0000;
rc = 0;
TxFID = get_free_TxFID();
if(TxFID == 0)
rc = 1;
else
{
packet[enetpacketSnap] = 0xAAAA; //SAP
packet[enetpacketCntrl] = 0x0003; //unnumbered frame:UI
packet[enetpacketCntrl+1] = 0x0000; //OUI
packet[enetpacketType] = 0x0608; //ARP packet type
packet[arp_hwtype] = 0x0100; //hardware type = 10Mb Ethernet
packet[arp_prtype] = 0x0008; //IP protocol
packet[arp_hwprlen] = 0x0406; //hardware addr len (06)/protocol addr len(04)
packet[arp_op] = 0x0100; //ARP request
bytecount += 16;
for(i=0;i<3;++i)
{
packet[enetpacketDest+i] = 0xFFFF; //target MAC addr
packet[enetpacketSrc+i] = macaddri[i]; //sender's MAC addr
packet[arp_shaddr+i] = macaddri[i]; //sender's MAC addr
packet[arp_thaddr+i] = 0x0000; //target MAC addr
}
bytecount += 24;
for(i=0;i<2;++i)
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -