Subversion Repositories Kolibri OS

Rev

Rev 837 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 837 Rev 914
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
2
;;                                                                 ;;
3
;;  IP.INC                                                         ;;
3
;;  IP.INC                                                         ;;
4
;;                                                                 ;;
4
;;                                                                 ;;
5
;;  IP Processes for Menuet OS  TCP/IP stack                       ;;
5
;;  IP Processes for Menuet OS  TCP/IP stack                       ;;
6
;;                                                                 ;;
6
;;                                                                 ;;
7
;;  Version 0.3  29 August 2002                                    ;;
7
;;  Version 0.3  29 August 2002                                    ;;
8
;;                                                                 ;;
8
;;                                                                 ;;
9
;;  Copyright 2002 Mike Hibbett, mikeh@oceanfree.net               ;;
9
;;  Copyright 2002 Mike Hibbett, mikeh@oceanfree.net               ;;
10
;;                                                                 ;;
10
;;                                                                 ;;
11
;;  See file COPYING for details                                   ;;
11
;;  See file COPYING for details                                   ;;
12
;;                                                                 ;;
12
;;                                                                 ;;
13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14
 
14
 
15
$Revision: 593 $
15
$Revision: 914 $
16
 
16
 
17
 
17
 
18
; IP underlying protocols numbers
18
; IP underlying protocols numbers
19
PROTOCOL_ICMP     equ      1
19
PROTOCOL_ICMP     equ      1
20
PROTOCOL_TCP      equ      6
20
PROTOCOL_TCP      equ      6
21
PROTOCOL_UDP      equ      17
21
PROTOCOL_UDP      equ      17
22
 
22
 
23
struc IP_PACKET
23
struc IP_PACKET
24
{  .VersionAndIHL           db   ?  ;+00 - Version[0-3 bits] and IHL(header length)[4-7 bits]
24
{  .VersionAndIHL           db   ?  ;+00 - Version[0-3 bits] and IHL(header length)[4-7 bits]
25
   .TypeOfService           db   ?  ;+01
25
   .TypeOfService           db   ?  ;+01
26
   .TotalLength             dw   ?  ;+02
26
   .TotalLength             dw   ?  ;+02
27
   .Identification          dw   ?  ;+04
27
   .Identification          dw   ?  ;+04
28
   .FlagsAndFragmentOffset  dw   ?  ;+06 - Flags[0-2] and FragmentOffset[3-15]
28
   .FlagsAndFragmentOffset  dw   ?  ;+06 - Flags[0-2] and FragmentOffset[3-15]
29
   .TimeToLive              db   ?  ;+08
29
   .TimeToLive              db   ?  ;+08
30
   .Protocol                db   ?  ;+09
30
   .Protocol                db   ?  ;+09
31
   .HeaderChecksum          dw   ?  ;+10
31
   .HeaderChecksum          dw   ?  ;+10
32
   .SourceAddress           dd   ?  ;+12
32
   .SourceAddress           dd   ?  ;+12
33
   .DestinationAddress      dd   ?  ;+16
33
   .DestinationAddress      dd   ?  ;+16
34
   .DataOrOptional          dd   ?  ;+20
34
   .DataOrOptional          dd   ?  ;+20
35
}
35
}
36
 
36
 
37
virtual at 0
37
virtual at 0
38
  IP_PACKET IP_PACKET
38
  IP_PACKET IP_PACKET
39
end virtual
39
end virtual
40
 
40
 
41
 
41
 
42
;*******************************************************************
42
;*******************************************************************
43
;   Interface
43
;   Interface
44
;
44
;
45
;       ip_rx       processes all packets received by the network layer
45
;       ip_rx       processes all packets received by the network layer
46
;                   It calls the appropriate protocol handler
46
;                   It calls the appropriate protocol handler
47
;
47
;
48
;
48
;
49
;
49
;
50
;*******************************************************************
50
;*******************************************************************
51
 
51
 
52
 
52
 
53
;
53
;
54
;   IP Packet after reception - Normal IP packet format
54
;   IP Packet after reception - Normal IP packet format
55
;
55
;
56
;           0               1               2               3
56
;           0               1               2               3
57
;    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
57
;    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
58
;
58
;
59
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60
;0  |Version|  IHL  |Type of Service|       Total Length            |
60
;0  |Version|  IHL  |Type of Service|       Total Length            |
61
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
61
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62
;4  |         Identification        |Flags|      Fragment Offset    |
62
;4  |         Identification        |Flags|      Fragment Offset    |
63
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
64
;8  |  Time to Live |    Protocol   |         Header Checksum       |
64
;8  |  Time to Live |    Protocol   |         Header Checksum       |
65
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
66
;12 |                       Source Address                          |
66
;12 |                       Source Address                          |
67
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
67
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68
;16 |                    Destination Address                        |
68
;16 |                    Destination Address                        |
69
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69
;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
70
;20 |      Data                                                     |
70
;20 |      Data                                                     |
71
;   +-+-+-..........                                               -+
71
;   +-+-+-..........                                               -+
72
;
72
;
73
;
73
;
74
;    [smb] attention! according to RFC 791 IP packet may have 'options' sections,
74
;    [smb] attention! according to RFC 791 IP packet may have 'options' sections,
75
; so we can't simply think, that data have offset 20. We must calculate offset from
75
; so we can't simply think, that data have offset 20. We must calculate offset from
76
; IHL field
76
; IHL field
77
;
77
;
78
macro	GET_IHL reg, header_addr
78
macro	GET_IHL reg, header_addr
79
{
79
{
80
	movzx	reg, byte [header_addr]
80
	movzx	reg, byte [header_addr]
81
	
81
	
82
	; we need 4-7 bits, so....
82
	; we need 4-7 bits, so....
83
	and	reg, 0x0000000F
83
	and	reg, 0x0000000F
84
	
84
	
85
	; IHL keeps number of octets, so we need to << 2 'reg'
85
	; IHL keeps number of octets, so we need to << 2 'reg'
86
	shl     reg, 2
86
	shl     reg, 2
87
}
87
}
88
 
88
 
-
 
89
 
-
 
90
include "tcp.inc"
-
 
91
include "udp.inc"
-
 
92
include "icmp.inc"
89
 
93
 
90
;***************************************************************************
94
;***************************************************************************
91
;   Function
95
;   Function
92
;      ip_rx
96
;      ip_rx
93
;
97
;
94
;   Description
98
;   Description
95
;       This is a kernel function, called by stack_handler
99
;       This is a kernel function, called by stack_handler
96
;       Processes all IP-packets received by the network layer
100
;       Processes all IP-packets received by the network layer
97
;       It calls the appropriate protocol handler
101
;       It calls the appropriate protocol handler
98
;
102
;
99
;***************************************************************************
103
;***************************************************************************
100
proc ip_rx stdcall
104
proc ip_rx stdcall
101
local buffer_number dd ?
105
local buffer_number dd ?
102
 
106
 
103
    ; Look for a buffer to tx
107
    ; Look for a buffer to tx
104
    mov     eax, IPIN_QUEUE
108
    mov     eax, IPIN_QUEUE
105
    call    dequeue
109
    call    dequeue
106
    cmp     ax, NO_BUFFER
110
    cmp     ax, NO_BUFFER
107
    je      .exit         ; Exit if no buffer available
111
    je      .exit         ; Exit if no buffer available
108
 
112
 
109
    mov     [buffer_number], eax    ;save buffer number
113
    mov     [buffer_number], eax    ;save buffer number
110
 
114
 
111
    ; convert buffer pointer eax to the absolute address
115
    ; convert buffer pointer eax to the absolute address
112
    imul    eax, IPBUFFSIZE
116
    imul    eax, IPBUFFSIZE
113
    add     eax, IPbuffs
117
    add     eax, IPbuffs
114
 
118
 
115
    mov     ebx, eax  ; ebx=pointer to IP_PACKET
119
    mov     ebx, eax  ; ebx=pointer to IP_PACKET
-
 
120
 
-
 
121
;        DEBUGF  1, "K : ip_rx - proto: %u\n", [ebx + IP_PACKET.Protocol]:1
116
 
122
 
117
    ; Validate the IP checksum
123
    ; Validate the IP checksum
118
    mov     dx, word[ebx + IP_PACKET.HeaderChecksum]
124
    mov     dx, word[ebx + IP_PACKET.HeaderChecksum]
119
    xchg    dh,dl          ; Get the checksum in intel format
125
    xchg    dh,dl          ; Get the checksum in intel format
120
  
126
  
121
    mov     [ebx + IP_PACKET.HeaderChecksum], word 0  ; clear checksum field - need to when
127
    mov     [ebx + IP_PACKET.HeaderChecksum], 0  ; clear checksum field - need to when
122
                                ; recalculating checksum
128
                                ; recalculating checksum
123
    ;  this needs two data pointers and two size #.
129
    ;  this needs two data pointers and two size #.
124
    ;  2nd pointer can be of length 0
130
    ;  2nd pointer can be of length 0
125
 
131
 
126
    GET_IHL ecx, ebx + IP_PACKET.VersionAndIHL ;get packet length in ecx
132
    GET_IHL ecx, ebx + IP_PACKET.VersionAndIHL ;get packet length in ecx
127
    stdcall checksum_jb, ebx, ecx   ;buf_ptr, buf_size
133
    stdcall checksum_jb, ebx, ecx   ;buf_ptr, buf_size
128
    cmp     dx, ax
134
    cmp     dx, ax
-
 
135
 
-
 
136
;        DEBUGF  1, "K : ip_rx - checksums: %x - %x\n", dx, ax
-
 
137
 
129
 
138
    jnz     .dump.1  ;if CHECKSUM isn't valid then dump packet
-
 
139
    mov     edx, ebx ; EDX (IP-BUFFER POINTER) WILL BE USED FOR *_rx HANDLERS BELOW!!!
130
    mov     edx, ebx ; EDX (IP-BUFFER POINTER) WILL BE USED FOR *_rx HANDLERS BELOW!!!
140
 
131
    jnz     .dump  ;if CHECKSUM isn't valid then dump packet
141
;        DEBUGF  1, "K : ip_rx - dest: %x - %x\n", [ebx + IP_PACKET.DestinationAddress], [stack_ip]
132
 
142
 
133
    ; Validate the IP address, if it isn't broadcast
143
    ; Validate the IP address, if it isn't broadcast
134
    mov     eax, [stack_ip]
144
    mov     eax, [stack_ip]
135
    cmp     dword[ebx + IP_PACKET.DestinationAddress], eax
145
    cmp     dword[ebx + IP_PACKET.DestinationAddress], eax
136
    je      @f
146
    je      @f
137
 
147
 
138
    ; If the IP address is 255.255.255.255, accept it
148
    ; If the IP address is 255.255.255.255, accept it
139
    ; - it is a broadcast packet, which we need for dhcp
149
    ; - it is a broadcast packet, which we need for dhcp
-
 
150
 
140
    cmp     dword[ebx + IP_PACKET.DestinationAddress], 0xffffffff
151
	mov	eax, [ebx + IP_PACKET.DestinationAddress]
-
 
152
	cmp	eax, 0xffffffff
-
 
153
	;je      @f
-
 
154
	;mov     ecx, [stack_ip]
-
 
155
	;and     eax, [subnet_mask]
-
 
156
	;and     ecx, [subnet_mask]
-
 
157
	;cmp     eax, ecx
141
    jne     .dump
158
	;jne     .dump.2
-
 
159
	;mov     eax, [ebx + IP_PACKET.DestinationAddress]
-
 
160
	;or      eax, [subnet_mask]
-
 
161
	;cmp     eax, 0xffffffff
-
 
162
	jne	.dump.2
142
 
163
 
143
  @@:
164
  @@:
144
    mov     al, [ebx + IP_PACKET.VersionAndIHL]
165
    mov     al, [ebx + IP_PACKET.VersionAndIHL]
145
    and     al, 0x0f  ;get IHL(header length)
166
    and     al, 0x0f  ;get IHL(header length)
146
    cmp     al, 0x05  ;if IHL!= 5*4(20 bytes)
167
    cmp     al, 0x05  ;if IHL!= 5*4(20 bytes)
-
 
168
;        DEBUGF  1, "K : ip_rx - ihl: %x - 05\n", al
147
    jnz     .dump     ;then dump it
169
    jnz     .dump.3	;then dump it
148
 
170
 
149
    cmp     byte[ebx + IP_PACKET.TimeToLive], byte 0
-
 
-
 
171
;        DEBUGF  1, "K : ip_rx - ttl: %x - 00\n", [ebx + IP_PACKET.TimeToLive]:2
-
 
172
 
-
 
173
    cmp     [ebx + IP_PACKET.TimeToLive], 0
150
    je      .dump     ;if TTL==0 then dump it
174
    je	    .dump.4	;if TTL==0 then dump it
151
 
175
 
-
 
176
    mov     ax, [ebx + IP_PACKET.FlagsAndFragmentOffset]
152
    mov     ax, word[ebx + IP_PACKET.FlagsAndFragmentOffset]
177
    and     ax, 0xFFBF   ;get flags
153
    and     ax, 0xFFBF   ;get flags
178
;        DEBUGF  1, "K : ip_rx - flags: %x - 0000\n", ax
154
    cmp     ax, 0        ;if some flags was set then we dump this packet
179
    cmp     ax, 0        ;if some flags was set then we dump this packet
155
    jnz     .dump        ;the flags should be used for fragmented packets
180
    jnz     .dump.5	   ;the flags should be used for fragmented packets
156
 
181
 
157
    ; Check the protocol, and call the appropriate handler
182
    ; Check the protocol, and call the appropriate handler
158
    ; Each handler will re-use or free the queue buffer as appropriate
183
    ; Each handler will re-use or free the queue buffer as appropriate
159
 
184
 
160
    mov     al, [ebx + IP_PACKET.Protocol]
185
    mov     al, [ebx + IP_PACKET.Protocol]
161
 
186
 
162
    cmp     al , PROTOCOL_TCP
187
    cmp     al , PROTOCOL_TCP
163
    jne     .not_tcp
188
    jne     .not_tcp
164
    DEBUGF  1,"K : ip_rx - TCP packet\n"
189
;    DEBUGF  1,"K : ip_rx - TCP packet\n"
165
    mov     eax, dword[buffer_number]
190
    mov     eax, dword[buffer_number]
166
    call    tcp_rx
191
    call    tcp_rx
167
    jmp     .exit
192
    jmp     .exit
168
 
193
 
169
  .not_tcp:
194
  .not_tcp:
170
    cmp     al, PROTOCOL_UDP
195
    cmp     al, PROTOCOL_UDP
171
    jne     .not_udp
196
    jne     .not_udp
172
    DEBUGF  1,"K : ip_rx - UDP packet\n"
197
;    DEBUGF  1,"K : ip_rx - UDP packet\n"
173
    mov     eax, dword[buffer_number]
198
    mov     eax, dword[buffer_number]
174
    call    udp_rx
199
    call    udp_rx
175
    jmp     .exit
200
    jmp     .exit
176
 
201
 
177
  .not_udp:
202
  .not_udp:
178
    cmp     al , PROTOCOL_ICMP
203
    cmp     al, PROTOCOL_ICMP
179
    jne     .dump              ;protocol ain't supported
204
    jne     .dump.6		 ;protocol ain't supported
180
 
205
 
181
    DEBUGF  1,"K : ip_rx - ICMP packet\n"
206
;    DEBUGF  1,"K : ip_rx - ICMP packet\n"
182
    ;GET_IHL ecx, ebx + IP_PACKET.VersionAndIHL ;get packet length in ecx
207
    ;GET_IHL ecx, ebx + IP_PACKET.VersionAndIHL ;get packet length in ecx
183
    mov     eax, dword[buffer_number]
208
    mov     eax, dword[buffer_number]
184
    stdcall icmp_rx,eax,ebx,ecx  ;buffer_number,IPPacketBase,IPHeaderLength
209
    stdcall icmp_rx,eax,ebx,ecx  ;buffer_number,IPPacketBase,IPHeaderLength
185
    jmp     .exit
210
    jmp     .exit
186
 
211
 
-
 
212
 
-
 
213
  .dump.1:
-
 
214
	DEBUGF	1, "K : ip_rx - dumped (checksum: 0x%x-0x%x)\n", dx, ax
-
 
215
	jmp	.dump.x
187
 
216
 
-
 
217
  .dump.2:
-
 
218
	DEBUGF	1, "K : ip_rx - dumped (ip: %u.%u.%u.%u)\n", [ebx + IP_PACKET.DestinationAddress + 0]:1, [ebx + IP_PACKET.DestinationAddress + 1]:1, [ebx + IP_PACKET.DestinationAddress + 2]:1, [ebx + IP_PACKET.DestinationAddress + 3]:1
-
 
219
	jmp	.dump.x
-
 
220
 
188
.dump:
221
  .dump.3:
-
 
222
	DEBUGF	1, "K : ip_rx - dumped (ihl: %u)\n", al
-
 
223
	jmp	.dump.x
-
 
224
 
189
    ; No protocol handler available, so
225
  .dump.4:
-
 
226
	DEBUGF	1, "K : ip_rx - dumped (ihl: %u)\n", [ebx + IP_PACKET.TimeToLive]
-
 
227
	jmp	.dump.x
-
 
228
 
-
 
229
  .dump.5:
-
 
230
	DEBUGF	1, "K : ip_rx - dumped (flags: 0x%x)\n", ax
-
 
231
	jmp	.dump.x
190
    ; silently dump the packet, freeing up the queue buffer
232
 
-
 
233
  .dump.6:
-
 
234
	DEBUGF	1, "K : ip_rx - dumped (proto: %u)\n", [ebx + IP_PACKET.Protocol]:1
191
 
235
 
192
    inc     dword [dumped_rx_count]
236
  .dump.x:
193
 
237
    inc     dword[dumped_rx_count]
194
    mov     eax, dword[buffer_number]
238
    mov     eax, [buffer_number]
195
    call    freeBuff
239
    call    freeBuff
196
 
240
 
197
  .exit:
241
  .exit:
198
    ret
242
    ret
199
endp
243
endp