Rev 1473 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1473 | Rev 1514 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;; ICMP.INC ;; |
6 | ;; ICMP.INC ;; |
7 | ;; ;; |
7 | ;; ;; |
8 | ;; Part of the tcp/ip network stack for KolibriOS ;; |
8 | ;; Part of the tcp/ip network stack for KolibriOS ;; |
Line 15... | Line 15... | ||
15 | ;; Version 2, June 1991 ;; |
15 | ;; Version 2, June 1991 ;; |
16 | ;; ;; |
16 | ;; ;; |
17 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
17 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 18... | Line 18... | ||
18 | 18 | ||
Line 19... | Line 19... | ||
19 | 19 | ||
Line 20... | Line 20... | ||
20 | $Revision: 1473 $ |
20 | $Revision: 1514 $ |
Line 21... | Line 21... | ||
21 | 21 | ||
22 | ; ICMP types & codes |
22 | ; ICMP types & codes |
23 | 23 | ||
24 | ICMP_ECHOREPLY equ 0 ; echo reply message |
24 | ICMP_ECHOREPLY equ 0 ; echo reply message |
25 | 25 | ||
26 | ICMP_UNREACH equ 3 |
26 | ICMP_UNREACH equ 3 |
27 | ICMP_UNREACH_NET equ 0 ; bad net |
27 | ICMP_UNREACH_NET equ 0 ; bad net |
28 | ICMP_UNREACH_HOST equ 1 ; bad host |
28 | ICMP_UNREACH_HOST equ 1 ; bad host |
29 | ICMP_UNREACH_PROTOCOL equ 2 ; bad protocol |
29 | ICMP_UNREACH_PROTOCOL equ 2 ; bad protocol |
30 | ICMP_UNREACH_PORT equ 3 ; bad port |
30 | ICMP_UNREACH_PORT equ 3 ; bad port |
31 | ICMP_UNREACH_NEEDFRAG equ 4 ; IP_DF caused drop |
31 | ICMP_UNREACH_NEEDFRAG equ 4 ; IP_DF caused drop |
32 | ICMP_UNREACH_SRCFAIL equ 5 ; src route failed |
32 | ICMP_UNREACH_SRCFAIL equ 5 ; src route failed |
33 | ICMP_UNREACH_NET_UNKNOWN equ 6 ; unknown net |
33 | ICMP_UNREACH_NET_UNKNOWN equ 6 ; unknown net |
34 | ICMP_UNREACH_HOST_UNKNOWN equ 7 ; unknown host |
34 | ICMP_UNREACH_HOST_UNKNOWN equ 7 ; unknown host |
35 | ICMP_UNREACH_ISOLATED equ 8 ; src host isolated |
35 | ICMP_UNREACH_ISOLATED equ 8 ; src host isolated |
36 | ICMP_UNREACH_NET_PROHIB equ 9 ; prohibited access |
36 | ICMP_UNREACH_NET_PROHIB equ 9 ; prohibited access |
37 | ICMP_UNREACH_HOST_PROHIB equ 10 ; ditto |
37 | ICMP_UNREACH_HOST_PROHIB equ 10 ; ditto |
38 | ICMP_UNREACH_TOSNET equ 11 ; bad tos for net |
38 | ICMP_UNREACH_TOSNET equ 11 ; bad tos for net |
39 | ICMP_UNREACH_TOSHOST equ 12 ; bad tos for host |
39 | ICMP_UNREACH_TOSHOST equ 12 ; bad tos for host |
40 | ICMP_UNREACH_FILTER_PROHIB equ 13 ; admin prohib |
40 | ICMP_UNREACH_FILTER_PROHIB equ 13 ; admin prohib |
41 | ICMP_UNREACH_HOST_PRECEDENCE equ 14 ; host prec vio. |
41 | ICMP_UNREACH_HOST_PRECEDENCE equ 14 ; host prec vio. |
42 | ICMP_UNREACH_PRECEDENCE_CUTOFF equ 15 ; prec cutoff |
42 | ICMP_UNREACH_PRECEDENCE_CUTOFF equ 15 ; prec cutoff |
43 | 43 | ||
44 | ICMP_SOURCEQUENCH equ 4 ; Packet lost, slow down |
44 | ICMP_SOURCEQUENCH equ 4 ; Packet lost, slow down |
45 | 45 | ||
46 | ICMP_REDIRECT equ 5 ; shorter route, codes: |
46 | ICMP_REDIRECT equ 5 ; shorter route, codes: |
47 | ICMP_REDIRECT_NET equ 0 ; for network |
47 | ICMP_REDIRECT_NET equ 0 ; for network |
48 | ICMP_REDIRECT_HOST equ 1 ; for host |
48 | ICMP_REDIRECT_HOST equ 1 ; for host |
49 | ICMP_REDIRECT_TOSNET equ 2 ; for tos and net |
49 | ICMP_REDIRECT_TOSNET equ 2 ; for tos and net |
50 | ICMP_REDIRECT_TOSHOST equ 3 ; for tos and host |
50 | ICMP_REDIRECT_TOSHOST equ 3 ; for tos and host |
51 | 51 | ||
52 | ICMP_ALTHOSTADDR equ 6 ; alternate host address |
52 | ICMP_ALTHOSTADDR equ 6 ; alternate host address |
53 | ICMP_ECHO equ 8 ; echo service |
53 | ICMP_ECHO equ 8 ; echo service |
54 | ICMP_ROUTERADVERT equ 9 ; router advertisement |
54 | ICMP_ROUTERADVERT equ 9 ; router advertisement |
55 | ICMP_ROUTERADVERT_NORMAL equ 0 ; normal advertisement |
55 | ICMP_ROUTERADVERT_NORMAL equ 0 ; normal advertisement |
56 | ICMP_ROUTERADVERT_NOROUTE_COMMON equ 16 ; selective routing |
56 | ICMP_ROUTERADVERT_NOROUTE_COMMON equ 16 ; selective routing |
57 | 57 | ||
58 | ICMP_ROUTERSOLICIT equ 10 ; router solicitation |
58 | ICMP_ROUTERSOLICIT equ 10 ; router solicitation |
59 | ICMP_TIMXCEED equ 11 ; time exceeded, code: |
59 | ICMP_TIMXCEED equ 11 ; time exceeded, code: |
60 | ICMP_TIMXCEED_INTRANS equ 0 ; ttl==0 in transit |
60 | ICMP_TIMXCEED_INTRANS equ 0 ; ttl==0 in transit |
61 | ICMP_TIMXCEED_REASS equ 1 ; ttl==0 in reass |
61 | ICMP_TIMXCEED_REASS equ 1 ; ttl==0 in reass |
62 | 62 | ||
63 | ICMP_PARAMPROB equ 12 ; ip header bad |
63 | ICMP_PARAMPROB equ 12 ; ip header bad |
64 | ICMP_PARAMPROB_ERRATPTR equ 0 ; error at param ptr |
64 | ICMP_PARAMPROB_ERRATPTR equ 0 ; error at param ptr |
65 | ICMP_PARAMPROB_OPTABSENT equ 1 ; req. opt. absent |
65 | ICMP_PARAMPROB_OPTABSENT equ 1 ; req. opt. absent |
66 | ICMP_PARAMPROB_LENGTH equ 2 ; bad length |
66 | ICMP_PARAMPROB_LENGTH equ 2 ; bad length |
67 | 67 | ||
68 | ICMP_TSTAMP equ 13 ; timestamp request |
68 | ICMP_TSTAMP equ 13 ; timestamp request |
69 | ICMP_TSTAMPREPLY equ 14 ; timestamp reply |
69 | ICMP_TSTAMPREPLY equ 14 ; timestamp reply |
70 | ICMP_IREQ equ 15 ; information request |
70 | ICMP_IREQ equ 15 ; information request |
71 | ICMP_IREQREPLY equ 16 ; information reply |
71 | ICMP_IREQREPLY equ 16 ; information reply |
72 | ICMP_MASKREQ equ 17 ; address mask request |
72 | ICMP_MASKREQ equ 17 ; address mask request |
73 | ICMP_MASKREPLY equ 18 ; address mask reply |
73 | ICMP_MASKREPLY equ 18 ; address mask reply |
74 | ICMP_TRACEROUTE equ 30 ; traceroute |
74 | ICMP_TRACEROUTE equ 30 ; traceroute |
75 | ICMP_DATACONVERR equ 31 ; data conversion error |
75 | ICMP_DATACONVERR equ 31 ; data conversion error |
76 | ICMP_MOBILE_REDIRECT equ 32 ; mobile host redirect |
76 | ICMP_MOBILE_REDIRECT equ 32 ; mobile host redirect |
77 | ICMP_IPV6_WHEREAREYOU equ 33 ; IPv6 where-are-you |
77 | ICMP_IPV6_WHEREAREYOU equ 33 ; IPv6 where-are-you |
78 | ICMP_IPV6_IAMHERE equ 34 ; IPv6 i-am-here |
78 | ICMP_IPV6_IAMHERE equ 34 ; IPv6 i-am-here |
79 | ICMP_MOBILE_REGREQUEST equ 35 ; mobile registration req |
79 | ICMP_MOBILE_REGREQUEST equ 35 ; mobile registration req |
80 | ICMP_MOBILE_REGREPLY equ 36 ; mobile registreation reply |
80 | ICMP_MOBILE_REGREPLY equ 36 ; mobile registreation reply |
81 | ICMP_SKIP equ 39 ; SKIP |
81 | ICMP_SKIP equ 39 ; SKIP |
Line 82... | Line 82... | ||
82 | 82 | ||
83 | ICMP_PHOTURIS equ 40 ; Photuris |
83 | ICMP_PHOTURIS equ 40 ; Photuris |
Line 128... | Line 128... | ||
128 | 128 | ||
129 | 129 | ||
130 | 130 | ||
131 | ;----------------------------------------------------------------- |
131 | ;----------------------------------------------------------------- |
132 | ; |
132 | ; |
133 | ; ICMP_Handler: |
133 | ; ICMP_input: |
134 | ; |
134 | ; |
135 | ; this procedure will send reply's to ICMP echo's |
135 | ; This procedure will send reply's to ICMP echo's |
136 | ; and insert packets into sockets when needed ;;; TODO: update this to work with fragmented packets too! |
136 | ; and insert packets into sockets when needed |
137 | ; |
137 | ; |
138 | ; IN: Pointer to buffer in [esp] |
138 | ; IN: Pointer to buffer in [esp] |
139 | ; size of buffer in [esp+4] |
139 | ; size of buffer in [esp+4] |
140 | ; pointer to device struct in ebx |
140 | ; pointer to device struct in ebx |
141 | ; ICMP Packet size in ecx |
141 | ; ICMP Packet size in ecx |
142 | ; pointer to ICMP Packet data in edx |
142 | ; pointer to ICMP Packet data in edx |
143 | ; OUT: / |
143 | ; OUT: / |
144 | ; |
144 | ; |
Line -... | Line 145... | ||
- | 145 | ;----------------------------------------------------------------- |
|
- | 146 | align 4 |
|
145 | ;----------------------------------------------------------------- |
147 | ICMP_input: |
146 | align 4 |
148 | |
147 | ICMP_handler: ;TODO: works only on pure ethernet right now ! |
149 | ;;; TODO: works only on pure ethernet right now ! |
Line 148... | Line 150... | ||
148 | 150 | ||
Line 149... | Line 151... | ||
149 | DEBUGF 1,"ICMP_Handler - buf:%x size:%x dev:%x, size:%x, buf:%x\n", [esp], [esp+4], ebx, ecx, edx |
151 | DEBUGF 1,"ICMP_Handler - start\n" |
Line 150... | Line 152... | ||
150 | cmp byte [edx + ICMP_Packet.Type], ICMP_ECHO ; Is this an echo request? |
152 | cmp byte [edx + ICMP_Packet.Type], ICMP_ECHO ; Is this an echo request? |
151 | jne .check_sockets |
153 | jne .check_sockets |
Line 152... | Line 154... | ||
152 | 154 | ||
153 | ;;; TODO: check checksum! |
155 | ;;; TODO: check checksum! |
154 | 156 | ||
155 | DEBUGF 1,"ICMP_Handler - is echo request, through device:%x\n", ebx |
157 | DEBUGF 1,"ICMP_Handler - echo request\n" |
156 | 158 | ||
Line 205... | Line 207... | ||
205 | call checksum_2 |
207 | call checksum_2 |
206 | mov ax , dx |
208 | mov ax , dx |
207 | pop ecx edx ebx |
209 | pop ecx edx ebx |
208 | mov word [edx + ICMP_Packet.Checksum], ax |
210 | mov word [edx + ICMP_Packet.Checksum], ax |
Line 209... | Line 211... | ||
209 | 211 | ||
210 | jmp ETH_sender ; Send the reply |
- | |
- | 212 | jmp NET_send ; Send the reply |
|
Line 211... | Line 213... | ||
211 | 213 | ; and return to caller of this proc |
|
Line 220... | Line 222... | ||
220 | 222 | ||
221 | mov esi, net_sockets |
223 | mov esi, net_sockets |
222 | .try_more: |
224 | .try_more: |
223 | mov ax , [edx + ICMP_Packet.Identifier] |
225 | mov ax , [edx + ICMP_Packet.Identifier] |
224 | .next_socket: |
226 | .next_socket: |
225 | mov esi, [esi + SOCKET_head.NextPtr] |
227 | mov esi, [esi + SOCKET.NextPtr] |
226 | or esi, esi |
228 | or esi, esi |
227 | jz .dump |
229 | jz .dump |
228 | cmp [esi + SOCKET_head.Type], IP_PROTO_ICMP |
230 | cmp [esi + SOCKET.Type], IP_PROTO_ICMP |
229 | jne .next_socket |
231 | jne .next_socket |
230 | cmp [esi + SOCKET_head.end + IPv4_SOCKET.end + ICMP_SOCKET.Identifier], ax |
232 | cmp [esi + ICMP_SOCKET.Identifier], ax |
Line 231... | Line 233... | ||
231 | jne .next_socket |
233 | jne .next_socket |
232 | 234 | ||
233 | call IPv4_dest_to_dev |
235 | call IPv4_dest_to_dev |
234 | cmp edi,-1 |
236 | cmp edi,-1 |
Line 235... | Line 237... | ||
235 | je .dump |
237 | je .dump |
Line 236... | Line 238... | ||
236 | inc [ICMP_PACKETS_RX+4*edi] |
238 | inc [ICMP_PACKETS_RX+4*edi] |
237 | 239 | ||
Line 238... | Line 240... | ||
238 | DEBUGF 1,"Found valid ICMP packet for socket %x\n", esi |
240 | DEBUGF 1,"Found valid ICMP packet for socket %x\n", esi |
239 | 241 | ||
240 | lea ebx, [esi + SOCKET_head.lock] |
242 | lea ebx, [esi + SOCKET.lock] |
Line 247... | Line 249... | ||
247 | mov eax, esi |
249 | mov eax, esi |
248 | pop esi |
250 | pop esi |
249 | add esp, 4 |
251 | add esp, 4 |
250 | sub edx, esi |
252 | sub edx, esi |
251 | mov edi, edx |
253 | mov edi, edx |
252 | jmp socket_internal_receiver |
254 | ;;; jmp SOCKET_input |
Line 253... | Line 255... | ||
253 | 255 | ||
254 | .dump: |
256 | .dump: |
Line 255... | Line 257... | ||
255 | DEBUGF 1,"ICMP_Handler - dumping\n" |
257 | DEBUGF 1,"ICMP_Handler - dumping\n" |
Line 260... | Line 262... | ||
260 | ret |
262 | ret |
Line 261... | Line 263... | ||
261 | 263 | ||
262 | 264 | ||
263 | ;----------------------------------------------------------------- |
- | |
264 | ; |
- | |
265 | ; ICMP_Handler_fragments: |
- | |
266 | ; |
- | |
267 | ; Called by IP_handler, |
- | |
268 | ; this procedure will send reply's to ICMP echo's etc |
- | |
269 | ; |
- | |
270 | ; IN: Pointer to buffer in [esp] |
- | |
271 | ; size of buffer in [esp+4] |
- | |
272 | ; pointer to device struct in ebx |
- | |
273 | ; ICMP Packet size in ecx |
- | |
274 | ; pointer to ICMP Packet data in edx |
- | |
275 | ; OUT: / |
- | |
276 | ; |
- | |
277 | ;----------------------------------------------------------------- |
- | |
278 | align 4 |
- | |
279 | ICMP_handler_fragments: ; works only on pure ethernet right now ! |
- | |
280 | - | ||
281 | DEBUGF 1,"ICMP_Handler_fragments - start\n" |
- | |
282 | - | ||
283 | cmp ecx, 65500 |
- | |
284 | jg .dump |
- | |
285 | - | ||
286 | cmp byte [edx + ICMP_Packet.Type], ICMP_ECHO ; Is this an echo request? discard if not |
- | |
287 | jne .dump |
- | |
288 | - | ||
289 | mov esi, [esp] |
- | |
290 | - | ||
291 | sub ecx, ICMP_Packet.Data |
- | |
292 | mov eax, [esi + IPv4_Packet.SourceAddress] |
- | |
293 | mov ebx, [esi + IPv4_Packet.DestinationAddress] |
- | |
294 | push word [esi + IPv4_Packet.Identification] |
- | |
295 | - | ||
296 | mov di , [edx + ICMP_Packet.Identifier] |
- | |
297 | shl edi, 16 |
- | |
298 | mov di , [edx + ICMP_Packet.SequenceNumber] |
- | |
299 | - | ||
300 | mov esi, edx |
- | |
301 | add esi, ICMP_Packet.Data |
- | |
302 | pop dx |
- | |
303 | shl edx, 16 |
- | |
304 | mov dx , ICMP_ECHOREPLY shl 8 + 0 ; Type + Code |
- | |
305 | - | ||
306 | call ICMP_create_packet |
- | |
307 | - | ||
308 | .dump: |
- | |
309 | DEBUGF 1,"ICMP_Handler_fragments - end\n" |
- | |
310 | - | ||
311 | call kernel_free |
- | |
312 | add esp, 4 ; pop (balance stack) |
- | |
313 | ret |
- | |
314 | - | ||
315 | - | ||
316 | ;----------------------------------------------------------------- |
265 | ;----------------------------------------------------------------- |
317 | ; |
266 | ; |
318 | ; Note: ICMP only works on top of IP protocol :) |
267 | ; Note: ICMP only works on top of IP protocol :) |
319 | ; |
268 | ; |
320 | ; inputs: |
269 | ; inputs: |
Line 328... | Line 277... | ||
328 | ; esi = data offset |
277 | ; esi = data offset |
329 | ; edi = identifier shl 16 + sequence number |
278 | ; edi = identifier shl 16 + sequence number |
330 | ; |
279 | ; |
331 | ;----------------------------------------------------------------- |
280 | ;----------------------------------------------------------------- |
332 | align 4 |
281 | align 4 |
333 | ICMP_create_packet: |
282 | ICMP_output: |
Line 334... | Line 283... | ||
334 | 283 | ||
Line 335... | Line 284... | ||
335 | DEBUGF 1,"Create ICMP Packet\n" |
284 | DEBUGF 1,"Create ICMP Packet\n" |
Line 336... | Line 285... | ||
336 | 285 | ||
337 | push esi edi edx |
286 | push esi edi edx |
338 | 287 | ||
Line 339... | Line 288... | ||
339 | add ecx, ICMP_Packet.Data |
288 | add ecx, ICMP_Packet.Data |
340 | mov di , IP_PROTO_ICMP |
- | |
341 | shr edx, 16 |
- | |
342 | 289 | mov di , IP_PROTO_ICMP |
|
Line 343... | Line 290... | ||
343 | call IPv4_create_packet |
290 | shr edx, 16 |
Line 344... | Line 291... | ||
344 | 291 | ||
345 | cmp edi, -1 |
292 | call IPv4_create_packet |
Line 370... | Line 317... | ||
370 | rep movsd |
317 | rep movsd |
371 | pop cx |
318 | pop cx |
372 | and cx , 3 |
319 | and cx , 3 |
373 | rep movsb |
320 | rep movsb |
Line 374... | Line 321... | ||
374 | 321 | ||
375 | sub edi, edx ;; TODO: find a better way to remember start of packet |
322 | sub edi, edx ;;; TODO: find a better way to remember start of packet |
376 | mov ecx, [ebx + ETH_DEVICE.transmit] |
323 | mov ecx, [ebx + ETH_DEVICE.transmit] |
377 | push edx edi ecx |
324 | push edx edi ecx |
378 | DEBUGF 1,"Sending ICMP Packet\n" |
325 | DEBUGF 1,"Sending ICMP Packet\n" |