BOOTLOADER
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
ethernet.c
Go to the documentation of this file.
1 /******************************************************
2 * Function: etherent request handler
3 *
4 * File: etherent.c
5 * Author: Book Chen
6 * Date: 2008.07.18
7 *******************************************************
8 */
9 //======
10 // Project: myethernet
11 // Function: ethernet stack
12 // IP: internet protocol
13 // ARP: adddress resolution protocol
14 // RARP: reverse address resolution protocol
15 // ICMP: internet control message protocol
16 // UDP: user datagram protocol
17 // SNMP: simple network management protocol
18 // TCP: transmission contorl protocol
19 // DNS: domain name system(server)
20 // TFTP: trivial file transfer protocol
21 //
22 // Author: Book Chen
23 // Start time: 2007.06.04
24 //======
25 #include "includes.h"
26 
27 #if(DEBUG_ETHERNET==1)
28  #define DEBUG_ETHERNET_INFO 1
29  #define DEBUG_ETHERNET_DUMP 1
30 #else
31  #define DEBUG_ETHERNET_INFO 0
32  #define DEBUG_ETHERNET_DUMP 0
33 #endif
34 
35 #define EthernetIdleState 0
36 
37 extern void memcpy(void *s1, const void *s2, int n);
39 
40 void F_EthernetInit(void);
41 void F_EthernetSvc(void);
45 INT8U F_EthernetMacAddressSet(INT16U UserId,INT8U *pMacAddress);
46 INT8U F_EthernetIpAddressSet(INT16U UserId,INT8U *pIpAddress);
47 INT8U F_EthernetSend(ETHBUFFER *pBuffer,INT8U *pDestination,INT16U Protocol);
51 INT8U F_EthernetSystemTableUpdate(INT8U *pSystemTable,INT32U Size);
53 INT8U F_EthernetPartitionUpdate(INT8U *pSystemTable,INT32U Size);
54 INT8U F_EthernetFirmwareUpdate(INT8U *pSystemTable,INT32U Size);
55 INT16U F_EthernetUnsignedShortN2H(unsigned short s);
56 INT16U F_EthernetUnsignedShortH2N(unsigned short s);
57 INT32U F_EthernetUnsignedLongN2H(unsigned long l);
58 INT32U F_EthernetUnsignedLongH2N(unsigned long l);
59 
60 void F_EthernetInit(void){
61  EthernetCtrl.MacAddress[0]=0x00;
62  EthernetCtrl.MacAddress[1]=0x00;
63  EthernetCtrl.MacAddress[2]=0x00;
64  EthernetCtrl.MacAddress[3]=0x00;
65  EthernetCtrl.MacAddress[4]=0x00;
66  EthernetCtrl.MacAddress[5]=0x00;
67  EthernetCtrl.IpAddress[0]=0x00;
68  EthernetCtrl.IpAddress[1]=0x00;
69  EthernetCtrl.IpAddress[2]=0x00;
70  EthernetCtrl.IpAddress[3]=0x00;
71  EthernetCtrl.Id=ID_ETHERNET;
72  EthernetCtrl.InUse=FALSE;
73  EthernetCtrl.Status=0;
74  EthernetCtrl.State=EthernetIdleState;
75 }
76 void F_EthernetSvc(void){}
78  if(EthernetCtrl.InUse==TRUE) return TRUE;
79  else return FALSE;
80 }
82  if(EthernetCtrl.InUse==FALSE){
83  EthernetCtrl.InUse=TRUE;
84  EthernetCtrl.UserId=UserId;
85  return TRUE;
86  }
87  else return FALSE;
88 }
90  if(EthernetCtrl.InUse==TRUE){
91  EthernetCtrl.InUse=FALSE;
92  return TRUE;
93  }
94  else return FALSE;
95 }
97  if((EthernetCtrl.InUse==TRUE)&&(EthernetCtrl.UserId==UserId)){
98  EthernetCtrl.MacAddress[0]=pMacAddress[0];
99  EthernetCtrl.MacAddress[1]=pMacAddress[1];
100  EthernetCtrl.MacAddress[2]=pMacAddress[2];
101  EthernetCtrl.MacAddress[3]=pMacAddress[3];
102  EthernetCtrl.MacAddress[4]=pMacAddress[4];
103  EthernetCtrl.MacAddress[5]=pMacAddress[5];
104  return TRUE;
105  }
106  else return FALSE;
107 }
109  if((EthernetCtrl.InUse==TRUE)&&(EthernetCtrl.UserId==UserId)){
110  EthernetCtrl.IpAddress[0]=pIpAddress[0];
111  EthernetCtrl.IpAddress[1]=pIpAddress[1];
112  EthernetCtrl.IpAddress[2]=pIpAddress[2];
113  EthernetCtrl.IpAddress[3]=pIpAddress[3];
114  return TRUE;
115  }
116  else return FALSE;
117 }
118 INT8U F_EthernetSend(ETHBUFFER *pBuffer,INT8U *pDestination,INT16U Protocol){
119  ETHERNET_HEAD *pEthernetHead;
120 
121  pEthernetHead=(ETHERNET_HEAD *)F_EthernetBufferPush(pBuffer,ETHERNET_HEAD_LENGTH);
122  memcpy((INT8U *)pEthernetHead->Destination,pDestination,ETHERNET_MAC_LENGTH);
123  memcpy((INT8U *)pEthernetHead->Source,(INT8U *)EthernetCtrl.MacAddress,ETHERNET_MAC_LENGTH);
124  pEthernetHead->Protocol=F_EthernetUnsignedShortH2N(Protocol);
125  #if(DEBUG_ETHERNET_INFO==1)
126  printf("\n tx packet [%4x] ",pBuffer->Length);
127  #if(DEBUG_ETHERNET_DUMP==1)
128  F_EthernetBufferDump((INT8U *)pBuffer->Data,pBuffer->Length);
129  #endif
130  #endif
131  return F_Dm9000PacketTransmit((INT8U *)pBuffer->Data,pBuffer->Length);
132 }
134  INT32U Size;
135 
137  Size=F_Dm9000PacketReceive(pBuffer->pData,1532); // 1532>8+6+6+2+1500+4=1526 ??
138  pBuffer->Length=Size;
139  #if(DEBUG_ETHERNET_INFO==1)
140  printf("\n rx packet [%4x] ",Size);
141  #if(DEBUG_ETHERNET_DUMP==1)
142  F_EthernetBufferDump((INT8U *)pBuffer->Data,Size);
143  #endif
144  #endif
145  return TRUE;
146  }
147  else return FALSE;
148 }
150  ETHBUFFER *pBuffer;
151  ETHERNET_HEAD *pEthernetHead; // 6(destination)+6(source)+2(protocol)
152 
153  pBuffer=F_EthernetBufferAllocate();
154  if(F_EthernetReceive(pBuffer)==TRUE){
155  // broadcast check??
156  pEthernetHead=(ETHERNET_HEAD *)pBuffer->pData; // 8 bytes preamble data?? exclude by cs8900??
157  #if(DEBUG_ETHERNET_INFO==1)
158  /*printf("\n Destination %2x %2x %2x %2x %2x %2x ",pEthernetHead->Destination[0],
159  pEthernetHead->Destination[1],
160  pEthernetHead->Destination[2],
161  pEthernetHead->Destination[3],
162  pEthernetHead->Destination[4],
163  pEthernetHead->Destination[5]);
164  printf("\n Source %2x %2x %2x %2x %2x %2x ",pEthernetHead->Source[0],
165  pEthernetHead->Source[1],
166  pEthernetHead->Source[2],
167  pEthernetHead->Source[3],
168  pEthernetHead->Source[4],
169  pEthernetHead->Source[5]);
170  printf("\n Protocol %4x",F_EthernetUnsignedShortN2H(pEthernetHead->Protocol));
171  printf("\n RxEvent %4x ",Dm9000Ctrl.RxEvent);*/
172  #endif
173  if((pEthernetHead->Destination[0]==0xff)
174  &&(pEthernetHead->Destination[0]==0xff)
175  &&(pEthernetHead->Destination[0]==0xff)
176  &&(pEthernetHead->Destination[0]==0xff)
177  &&(pEthernetHead->Destination[0]==0xff)
178  &&(pEthernetHead->Destination[0]==0xff)){
179  #if(DEBUG_ETHERNET_INFO==1)
180  printf("\n BROADCAST");
181  #endif
183  if(F_EthernetUnsignedShortN2H(pEthernetHead->Protocol)==ETHERNET_P_ARP){ // 0x0806
184  #if(DEBUG_ETHERNET_INFO==1)
185  printf(" ARP");
186  #endif
187  F_EthernetArpPacketReceive2(pBuffer);
188  }
189  else if(F_EthernetUnsignedShortN2H(pEthernetHead->Protocol)==ETHERNET_P_IP){ // 0x0800
190  #if(DEBUG_ETHERNET_INFO==1)
191  printf(" IP ");
192  #endif
193  //F_EthernetIpPacketReceive2(pBuffer);
194  F_EthernetIpPacketReceive(pBuffer);
195  }
196  }
197  else{
198  #if(DEBUG_ETHERNET_INFO==1)
199  printf("\n INDIVIDUAL");
200  #endif
202  if(F_EthernetUnsignedShortN2H(pEthernetHead->Protocol)>0x05dc){ // ethernet II...ethertype
203  #if(DEBUG_ETHERNET_INFO==1)
204  printf("\n ethernet II ");
205  #endif
206  if(F_EthernetUnsignedShortN2H(pEthernetHead->Protocol)==ETHERNET_P_ARP){ // 0x0806
207  #if(DEBUG_ETHERNET_INFO==1)
208  printf(" ARP");
209  #endif
211  }
212  else if(F_EthernetUnsignedShortN2H(pEthernetHead->Protocol)==ETHERNET_P_IP){ // 0x0800
213  #if(DEBUG_ETHERNET_INFO==1)
214  printf(" IP ");
215  #endif
216  F_EthernetIpPacketReceive(pBuffer);
217  }
218  }
219  else{ // IEEE 802.3...frame length (<=0x05dc...1500)
220  #if(DEBUG_ETHERNET_INFO==1)
221  printf("\n IEEE 802.3 no support now");
222  #endif
223  }
224  }
225  }
226  //F_EthernetBufferRelease(pBuffer); // no need
227  return TRUE;
228 }
230  return TRUE;
231 }
233  return TRUE;
234 }
236  return TRUE;
237 }
239  return TRUE;
240 }
242  return TRUE;
243 }
245  return ((s>>8)|(s<<8));
246 }
248  return ((s>>8)|(s<<8));
249 }
251  return (((l>>24)&0x000000ff)|
252  ((l>> 8)&0x0000ff00)|
253  ((l<< 8)&0x00ff0000)|
254  ((l<<24)&0xff000000));
255 }
257  return (((l>>24)&0x000000ff)|
258  ((l>> 8)&0x0000ff00)|
259  ((l<< 8)&0x00ff0000)|
260  ((l<<24)&0xff000000));
261 }
262 
263