BOOTLOADER
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
ethernetip.c
Go to the documentation of this file.
1 /******************************************************
2 * Function: etherent ip protocol handler
3 *
4 * File: etherentip.c
5 * Author: Book Chen
6 * Date: 2008.07.18
7 *******************************************************
8 */
9 #include "includes.h"
10 
11 #if(DEBUG_ETHERNET_IP==1)
12  #define DEBUG_IP_INFO 1
13 #else
14  #define DEBUG_IP_INFO 0
15 #endif
16 
17 #define EthernetIpIdleState 0
18 
20 void F_EthernetIpInit(void);
25 INT8U F_EthernetIpSend(ETHBUFFER *pBuffer,INT8U *pIpAddress,INT8U Protocol);
29 INT16U F_EthernetIpCheckSum(INT8U *pHead ,INT32U IpHeadLength);
30 
31 void F_EthernetIpInit(void){
32  IpCtrl.IpAddress[0]=0x00;
33  IpCtrl.IpAddress[1]=0x00;
34  IpCtrl.IpAddress[2]=0x00;
35  IpCtrl.IpAddress[3]=0x00;
36  IpCtrl.Id=ID_ETHERNET_IP;
37  IpCtrl.InUse=FALSE;
39 }
40 void F_EthernetIpSvc(void){}
42  if(IpCtrl.InUse==TRUE) return TRUE;
43  else return FALSE;
44 }
46  if(IpCtrl.InUse==FALSE){
47  IpCtrl.InUse=TRUE;
48  IpCtrl.UserId=UserId;
49  return TRUE;
50  }
51  else return FALSE;
52 }
54  if((IpCtrl.InUse==TRUE)&&(IpCtrl.UserId==UserId)){
55  IpCtrl.InUse=FALSE;
56  return TRUE;
57  }
58  else return FALSE;
59 }
61  if((IpCtrl.InUse==TRUE)&&(IpCtrl.UserId==UserId)){
62  IpCtrl.IpAddress[0]=pIpAddress[0];
63  IpCtrl.IpAddress[1]=pIpAddress[1];
64  IpCtrl.IpAddress[2]=pIpAddress[2];
65  IpCtrl.IpAddress[3]=pIpAddress[3];
66  return TRUE;
67  }
68  else return FALSE;
69 }
71  INT32U Sum,Tmp;
72 
73  // ip_fast_csum
74  __asm {
75  ldr Sum,[pIph],#4
76  ldr Tmp,[pIph],#4
77  sub Ihl,Ihl,#5
78  adds Sum,Sum,Tmp
79  ldr Tmp,[pIph],#4
80  adcs Sum,Sum,Tmp
81  ldr Tmp, [pIph], #4
82  adcs Sum, Sum, Tmp
83 l: ldr Tmp, [pIph], #4
84  adcs Sum, Sum, Tmp
85  tst Ihl, #15
86  subne Ihl, Ihl, #1
87  bne l
88  adc Sum,Sum,#0
89  adds Sum,Sum,Sum, lsl #16
90  addcs Sum,Sum,#0x10000
91  mvn Sum,Sum
92  mov Sum,Sum,lsr #16
93  };
94  return Sum;
95 }
96 /*INT16U F_EthernetIpCheckSum(INT8U *pHead ,INT32U IpHeadLength){
97  INT16U i,j;
98  INT32U Sum;
99  INT16U *pData;
100 
101  pData=(INT16U *)pHead; // pointer in INT16U
102  IpHeadLength=IpHeadLength*2; // length in INT16U
103  i=0;
104  j=0;
105  Sum=0;
106  for(i=0;i<IpHeadLength;i=i+2){
107  j=((pData[i]<<8)&0xff00)+(pData[i+1]&0x00ff);
108  Sum=Sum+(INT32U)j;
109  }
110  while(Sum>>16) Sum=(Sum&0xffff)+(Sum>>16);
111  Sum=~Sum; // 1's complement
112  return (INT16U)Sum;
113 }*/
115 {
116  INT32U xsum;
117  INT16U *p = (INT16U *)ptr;
118 
119  len=len*2;
120  xsum = 0;
121  while (len-- > 0)
122  xsum += *p++;
123  xsum = (xsum & 0xffff) + (xsum >> 16);
124  xsum = (xsum & 0xffff) + (xsum >> 16);
125  xsum =~(xsum & 0xffff);
126  return (INT16U)xsum;
127 }
129  IP_HEAD *pIpHead;
130 
131  pIpHead=(IP_HEAD *)pBuffer->pData;
132  #if(DEBUG_IP_INFO==1)
133  printf("\n IP receive");
134  printf("\n IP address %2x %2x %2x %2x ",pIpHead->DestiAddress[0],
135  pIpHead->DestiAddress[1],
136  pIpHead->DestiAddress[2],
137  pIpHead->DestiAddress[3]);
138  printf("\n IP address %2x %2x %2x %2x ",IpCtrl.IpAddress[0],
139  IpCtrl.IpAddress[1],
140  IpCtrl.IpAddress[2],
141  IpCtrl.IpAddress[3]);
142  #endif
143  if((pIpHead->DestiAddress[0]==IpCtrl.IpAddress[0])&&
144  (pIpHead->DestiAddress[1]==IpCtrl.IpAddress[1])&&
145  (pIpHead->DestiAddress[2]==IpCtrl.IpAddress[2])&&
146  (pIpHead->DestiAddress[3]==IpCtrl.IpAddress[3])){
147  pBuffer->Length=F_EthernetUnsignedShortN2H(pIpHead->TotalLength);
148  #if(DEBUG_IP_INFO==1)
149  printf("\n data length %4x ",pBuffer->Length);
150  #endif
151 
153  F_EthernetBufferPull(pBuffer,sizeof(IP_HEAD)); // point to pBuffer.Data[ETHERNET_HEAD+IP_HEAD]
154  if(pIpHead->Protocol==UDP){
155  #if(DEBUG_IP_INFO==1)
156  printf(" UDP ");
157  #endif
159  }
160  else if(pIpHead->Protocol==ICMP){
161  #if(DEBUG_IP_INFO==1)
162  printf(" ICMP ");
163  #endif
164  F_EthernetIcmpPacketReceive(pBuffer);
165  }
166  //else if(pIpHead->Protocol==TCP){
167  // #if(DEBUG_IP_INFO==1)
168  // printf("\n IP TCP ");
169  // #endif
170  // F_EthernetTcpPacketReceive(pBuffer);
171  //}
172  else{
173  #if(DEBUG_IP_INFO==1)
174  printf(" none ");
175  #endif
176  }
177 
178  }
179  else{
180  #if(DEBUG_IP_INFO==1)
181  printf("\n address no match ");
182  #endif
183  }
184  return TRUE;
185 }
186 INT8U F_EthernetIpSend(ETHBUFFER *pBuffer,INT8U *pIpAddress,INT8U Protocol){
187  IP_HEAD *pIpHead;
188  INT16U Id=32;
189  INT8U DestiAddress[ETHERNET_MAC_LENGTH];
190 
191  if(F_EthernetArpAddressGet(pIpAddress,DestiAddress)==FALSE) return FALSE; // ip is not in arp cache
192  pIpHead=(IP_HEAD *)F_EthernetBufferPush(pBuffer,sizeof(IP_HEAD));
193  pIpHead->Ihl=5;
194  pIpHead->Version=4;
195  pIpHead->Tos=0;
196  pIpHead->TotalLength=F_EthernetUnsignedShortH2N(pBuffer->Length);
197  pIpHead->Id=F_EthernetUnsignedShortH2N(Id++); //??
198  pIpHead->FlagOff=0;
199  pIpHead->Ttl=20;
200  pIpHead->Protocol=Protocol;
201  pIpHead->Checksum=0;
202  pIpHead->SourceAddress[0]=IpCtrl.IpAddress[0];
203  pIpHead->SourceAddress[1]=IpCtrl.IpAddress[1];
204  pIpHead->SourceAddress[2]=IpCtrl.IpAddress[2];
205  pIpHead->SourceAddress[3]=IpCtrl.IpAddress[3];
206  pIpHead->DestiAddress[0]=pIpAddress[0];
207  pIpHead->DestiAddress[1]=pIpAddress[1];
208  pIpHead->DestiAddress[2]=pIpAddress[2];
209  pIpHead->DestiAddress[3]=pIpAddress[3];
210  //pIpHead->Checksum=F_EthernetIpFastCheckSum((INT8U *)pIpHead,pIpHead->Ihl);
211  pIpHead->Checksum=F_EthernetIpCheckSum((INT8U *)pIpHead,pIpHead->Ihl);
212  #if(DEBUG_IP_INFO==1)
213  printf("\n LengthIp %4x",pBuffer->Length);
214  #endif
215  F_EthernetSend(pBuffer,DestiAddress,ETHERNET_P_IP);
216  return TRUE;
217 }
219  F_EthernetBufferReserve(pBuffer,sizeof(ETHERNET_HEAD));
220  F_EthernetBufferReserve(pBuffer,sizeof(IP_HEAD));
221 }
222 /*INT8U* F_EthernetIpSourceIpGet(ETHBUFFER *pBuffer){
223  IP_HEAD *pIpHead;
224 
225  //pIpHead=(IP_HEAD *)(pBuffer->Data+ETHERNET_HEAD_LENGTH);
226  pIpHead=(IP_HEAD *)(pBuffer->Data);
227  #if(DEBUG_IP_INFO==1)
228  printf("\n F_EthernetIpSourceIpGet");
229  printf("\n IP address %2x %2x %2x %2x ",pIpHead->SourceAddress[0],
230  pIpHead->SourceAddress[1],
231  pIpHead->SourceAddress[2],
232  pIpHead->SourceAddress[3]);
233  #endif
234  return pIpHead->SourceAddress;
235 }*/
236