Subversion Repositories Kolibri OS

Rev

Rev 387 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
444 serge 1
$Revision: 431 $
2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3
;;                                                              ;;
4
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;                                                              ;;
7
;;  ICMP.INC                                                    ;;
8
;;                                                              ;;
9
;;  Internet Control Message Protocol ( RFC 792 )               ;;
10
;;                                                              ;;
11
;;  Last revision: 11.11.2006                                   ;;
12
;;                                                              ;;
13
;;  This file contains the following:                           ;;
14
;;   icmp_rx - processes ICMP-packets received by the IP layer  ;;
15
;;                                                              ;;
16
;;  Changes history:                                            ;;
17
;;   22.09.2003 - [Mike Hibbett] : mikeh@oceanfree.net          ;;
18
;;   11.11.2006 - [Johnny_B] and [smb]                          ;;
19
;;                                                              ;;
20
;;   Current status:                                            ;;
261 hidnplayr 21
;;	This implemetation of ICMP proto supports message of ECHO type.
444 serge 22
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
261 hidnplayr 23
 
24
 
25
struc ICMP_PACKET
26
{  .Type            db   ?  ;+00
27
   .Code            db   ?  ;+01
28
   .Checksum        dw   ?  ;+02
29
   .Identifier      dw   ?  ;+04
30
   .SequenceNumber  dw   ?  ;+06
31
   .Data            db   ?  ;+08
32
}
33
 
34
virtual at 0
35
  ICMP_PACKET ICMP_PACKET
36
end virtual
37
 
38
 
39
;   Example:
40
;	ECHO message format
41
;
42
;
43
;           0               1               2               3
44
;    0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
45
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46
;   |     Type      |     Code      |          Checksum             |
47
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48
;   |           Identifier          |        Sequence Number        |
49
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50
;   |     Data ...
51
;   +-+-+-+-+-
52
;
53
 
54
;
55
; ICMP types & codes, RFC 792 and FreeBSD's ICMP sources
56
;
57
 
58
ICMP_ECHOREPLY		equ	0		; echo reply message
59
 
60
ICMP_UNREACH		equ	3
444 serge 61
	ICMP_UNREACH_NET	equ	0		; bad net
62
	ICMP_UNREACH_HOST	equ	1		; bad host
63
	ICMP_UNREACH_PROTOCOL	equ	2		; bad protocol
261 hidnplayr 64
	ICMP_UNREACH_PORT	equ	3		; bad port
65
	ICMP_UNREACH_NEEDFRAG	equ	4		; IP_DF caused drop
66
	ICMP_UNREACH_SRCFAIL	equ	5		; src route failed
67
	ICMP_UNREACH_NET_UNKNOWN equ	6		; unknown net
68
	ICMP_UNREACH_HOST_UNKNOWN equ	7		; unknown host
444 serge 69
	ICMP_UNREACH_ISOLATED	equ	8		; src host isolated
70
	ICMP_UNREACH_NET_PROHIB	equ	9		; prohibited access
71
	ICMP_UNREACH_HOST_PROHIB equ	10		; ditto
72
	ICMP_UNREACH_TOSNET	equ	11		; bad tos for net
73
	ICMP_UNREACH_TOSHOST	equ	12		; bad tos for host
74
	ICMP_UNREACH_FILTER_PROHIB equ	13		; admin prohib
75
	ICMP_UNREACH_HOST_PRECEDENCE equ 14		; host prec vio.
76
	ICMP_UNREACH_PRECEDENCE_CUTOFF equ 15		; prec cutoff
261 hidnplayr 77
 
444 serge 78
ICMP_SOURCEQUENCH	equ	4		; packet lost, slow down
261 hidnplayr 79
 
444 serge 80
ICMP_REDIRECT		equ	5		; shorter route, codes:
81
	ICMP_REDIRECT_NET	equ	0		; for network
82
	ICMP_REDIRECT_HOST	equ	1		; for host
83
	ICMP_REDIRECT_TOSNET	equ	2		; for tos and net
84
	ICMP_REDIRECT_TOSHOST	equ	3		; for tos and host
261 hidnplayr 85
 
444 serge 86
ICMP_ALTHOSTADDR	equ	6		; alternate host address
87
ICMP_ECHO		equ	8		; echo service
88
ICMP_ROUTERADVERT	equ	9		; router advertisement
89
	ICMP_ROUTERADVERT_NORMAL equ 0			; normal advertisement
90
	ICMP_ROUTERADVERT_NOROUTE_COMMON equ 16		; selective routing
261 hidnplayr 91
 
444 serge 92
ICMP_ROUTERSOLICIT	equ	10		; router solicitation
93
ICMP_TIMXCEED		equ	11		; time exceeded, code:
94
    ICMP_TIMXCEED_INTRANS	equ	0		; ttl==0 in transit
95
    ICMP_TIMXCEED_REASS	equ	1		; ttl==0 in reass
261 hidnplayr 96
 
444 serge 97
ICMP_PARAMPROB            equ  12		; ip header bad
98
    ICMP_PARAMPROB_ERRATPTR   equ  0		; error at param ptr
99
    ICMP_PARAMPROB_OPTABSENT  equ  1		; req. opt. absent
100
    ICMP_PARAMPROB_LENGTH     equ  2		; bad length
261 hidnplayr 101
 
444 serge 102
ICMP_TSTAMP		equ	13		; timestamp request
103
ICMP_TSTAMPREPLY	equ	14		; timestamp reply
104
ICMP_IREQ		equ	15		; information request
105
ICMP_IREQREPLY		equ	16		; information reply
106
ICMP_MASKREQ		equ	17		; address mask request
107
ICMP_MASKREPLY		equ	18		; address mask reply
108
ICMP_TRACEROUTE		equ	30		; traceroute
109
ICMP_DATACONVERR	equ	31		; data conversion error
110
ICMP_MOBILE_REDIRECT	equ	32		; mobile host redirect
111
ICMP_IPV6_WHEREAREYOU	equ	33		; IPv6 where-are-you
112
 ICMP_IPV6_IAMHERE	equ	34		; IPv6 i-am-here
113
ICMP_MOBILE_REGREQUEST	equ	35		; mobile registration req
114
ICMP_MOBILE_REGREPLY	equ	36		; mobile registreation reply
115
ICMP_SKIP		equ	39		; SKIP
261 hidnplayr 116
 
444 serge 117
ICMP_PHOTURIS		equ	40		; Photuris
118
    ICMP_PHOTURIS_UNKNOWN_INDEX   equ  1		; unknown sec index
119
    ICMP_PHOTURIS_AUTH_FAILED     equ  2		; auth failed
120
    ICMP_PHOTURIS_DECRYPT_FAILED  equ  3		; decrypt failed
121
 
122
 
261 hidnplayr 123
;***************************************************************************
124
;   Function
125
;      icmp_rx  [by Johnny_B]
126
;
127
;   Description
128
;       ICMP protocol handler
129
;       This is a kernel function, called by ip_rx
130
;
131
;  IN:
132
;    buffer_number  - # of IP-buffer. This buffer must be reused or marked as empty afterwards
133
;    IPPacketBase   - IP_PACKET base address
134
;    IPHeaderLength - Header length of IP_PACKET
135
;
136
;  OUT:
137
;    EAX=not defined
138
;
139
;           All used registers will be saved
140
;
141
;***************************************************************************
142
proc icmp_rx  stdcall  uses ebx esi edi,\
143
    buffer_number:DWORD,IPPacketBase:DWORD,IPHeaderLength:DWORD
144
 
145
    mov     esi,[IPPacketBase]   ;esi=IP_PACKET base address
146
    mov     edi, esi
147
    add     edi,[IPHeaderLength] ;edi=ICMP_PACKET base address
148
 
149
    cmp     byte[edi + ICMP_PACKET.Type], ICMP_ECHO ; Is this an echo request? discard if not
150
    jz      .icmp_echo
151
 
152
    mov     eax, [buffer_number]
153
    call    freeBuff
154
    jmp     .exit
155
 
156
  .icmp_echo:
157
 
158
    ; swap the source and destination addresses
159
    mov     ecx, [esi + IP_PACKET.DestinationAddress]
160
    mov     ebx, [esi + IP_PACKET.SourceAddress]
161
    mov     [esi + IP_PACKET.DestinationAddress], ebx
162
    mov     [esi + IP_PACKET.SourceAddress], ecx
163
 
164
    ; recalculate the IP header checksum
165
    mov     eax,[IPHeaderLength]
166
    stdcall checksum_jb,esi,eax   ;buf_ptr,buf_size
167
 
168
    mov     byte[esi + IP_PACKET.HeaderChecksum], ah
169
    mov     byte[esi + IP_PACKET.HeaderChecksum + 1], al      ; ?? correct byte order?
170
 
171
    mov     byte[edi + ICMP_PACKET.Type], ICMP_ECHOREPLY  ; change the request to a response
172
    mov     word[edi + ICMP_PACKET.Checksum], 0  ; clear ICMP checksum prior to re-calc
173
 
174
    ; Calculate the length of the ICMP data ( IP payload)
175
    xor     eax, eax
176
    mov     ah, byte[esi + IP_PACKET.TotalLength]
177
    mov     al, byte[esi + IP_PACKET.TotalLength + 1]
178
    sub     ax, word[IPHeaderLength]  ;ax=ICMP-packet length
179
 
180
    stdcall checksum_jb,edi,eax   ;buf_ptr,buf_size
181
 
182
    mov     byte[edi + ICMP_PACKET.Checksum], ah
183
    mov     byte[edi + ICMP_PACKET.Checksum + 1], al
184
 
185
    ; Queue packet for transmission
186
    mov     ebx, [buffer_number]
187
    mov     eax, NET1OUT_QUEUE
188
    call    queue
189
 
190
  .exit:
191
    ret
444 serge 192
endp