BOOTLOADER
Main Page
Data Structures
Files
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
bootloader
middleware
ethernet
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
19
IP_CONTROL
IpCtrl
;
20
void
F_EthernetIpInit
(
void
);
21
INT8U
F_EthernetIpInUseCheck
(
void
);
22
INT8U
F_EthernetIpAllocate
(
INT16U
UserId);
23
INT8U
F_EthernetIpRelease
(
INT16U
UserId);
24
INT8U
F_EthernetIpPacketReceive
(
ETHBUFFER
*pBuffer);
25
INT8U
F_EthernetIpSend
(
ETHBUFFER
*pBuffer,
INT8U
*pIpAddress,
INT8U
Protocol);
26
void
F_EthernetIpBufferReserve
(
ETHBUFFER
*pBuffer);
27
INT8U
*
F_EthernetIpSourceIpGet
(
ETHBUFFER
*pBuffer);
28
INT16U
F_EthernetIpFastCheckSum
(
INT8U
*pIph,
INT32U
Ihl);
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
;
38
IpCtrl.
State
=
EthernetIpIdleState
;
39
}
40
void
F_EthernetIpSvc
(
void
){}
41
INT8U
F_EthernetIpInUseCheck
(
void
){
42
if
(IpCtrl.
InUse
==
TRUE
)
return
TRUE
;
43
else
return
FALSE
;
44
}
45
INT8U
F_EthernetIpAllocate
(
INT16U
UserId){
46
if
(IpCtrl.
InUse
==
FALSE
){
47
IpCtrl.
InUse
=
TRUE
;
48
IpCtrl.
UserId
=UserId;
49
return
TRUE
;
50
}
51
else
return
FALSE
;
52
}
53
INT8U
F_EthernetIpRelease
(
INT16U
UserId){
54
if
((IpCtrl.
InUse
==
TRUE
)&&(IpCtrl.
UserId
==UserId)){
55
IpCtrl.
InUse
=
FALSE
;
56
return
TRUE
;
57
}
58
else
return
FALSE
;
59
}
60
INT8U
F_EthernetIpIpAddressSet
(
INT16U
UserId,
INT8U
*pIpAddress){
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
}
70
INT16U
F_EthernetIpFastCheckSum
(
INT8U
*pIph,
INT32U
Ihl){
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
}*/
114
INT16U
F_EthernetIpCheckSum
(
INT8U
* ptr,
INT32U
len)
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
}
128
INT8U
F_EthernetIpPacketReceive
(
ETHBUFFER
*pBuffer){
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
152
memcpy
(IpCtrl.
SourceIp
,pIpHead->
SourceAddress
,
ETHERNET_IP_LENGTH
);
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
158
F_EthernetUdpPacketReceive
(pBuffer);
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
}
218
void
F_EthernetIpBufferReserve
(
ETHBUFFER
*pBuffer){
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
Generated on Wed Jun 13 2012 00:03:10 for BOOTLOADER by
1.8.1.1