Subversion Repositories Kolibri OS

Rev

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"