Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2731 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
3185 hidnplayr 3
;; Copyright (C) KolibriOS team 2012-2013. All rights reserved.    ;;
2731 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
6
;;  IPv6.INC                                                       ;;
7
;;                                                                 ;;
8
;;  Part of the tcp/ip network stack for KolibriOS                 ;;
9
;;                                                                 ;;
10
;;    Written by hidnplayr@kolibrios.org                           ;;
11
;;                                                                 ;;
12
;;          GNU GENERAL PUBLIC LICENSE                             ;;
13
;;             Version 2, June 1991                                ;;
14
;;                                                                 ;;
15
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
16
 
17
$Revision: 3251 $
18
 
19
 
20
struct  IPv6_header
21
 
22
        VersionTrafficFlow      dd ?    ; Version[0-3], Traffic class[4-11], Flow Label [12-31]
23
        PayloadLength           dw ?    ; 16 bits, unsigned length of payload (extension headers are part of this)
24
        NextHeader              db ?    ; Values are same as in IPv4 'Protocol' field
25
        HopLimit                db ?    ; Decremented by every node, packet is discarded when it reaches 0
26
        SourceAddress           rd 4    ; 128-bit addresses
27
        DestinationAddress      rd 4    ;
3185 hidnplayr 28
        Payload                 rb 0
2731 hidnplayr 29
 
30
ends
31
 
32
 
3185 hidnplayr 33
align 4
34
uglobal
2731 hidnplayr 35
 
3185 hidnplayr 36
        IPv6:
37
        .addresses      rd 4*MAX_NET_DEVICES
38
        .subnet         rd 4*MAX_NET_DEVICES
39
        .dns            rd 4*MAX_NET_DEVICES
40
        .gateway        rd 4*MAX_NET_DEVICES
2731 hidnplayr 41
 
3185 hidnplayr 42
        .packets_tx     rd MAX_NET_DEVICES
43
        .packets_rx     rd MAX_NET_DEVICES
2731 hidnplayr 44
 
3185 hidnplayr 45
endg
46
 
47
 
2731 hidnplayr 48
;-----------------------------------------------------------------
49
;
3185 hidnplayr 50
; IPv6_init
51
;
52
;  This function resets all IP variables
53
;
54
;-----------------------------------------------------------------
55
macro   IPv6_init {
56
 
57
        xor     eax, eax
58
        mov     edi, IPv6
59
        mov     ecx, (4*4*4+2*4)MAX_IP
60
        rep     stosd
61
 
62
}
63
 
64
 
65
 
66
;-----------------------------------------------------------------
67
;
2731 hidnplayr 68
; IPv6_input:
69
;
70
;  Will check if IPv6 Packet isnt damaged
71
;  and call appropriate handler. (TCP/UDP/ICMP/..)
72
;
73
;  It will also re-construct fragmented packets
74
;
75
;  IN:  Pointer to buffer in [esp]
76
;       size of buffer in [esp+4]
77
;       pointer to device struct in ebx
78
;       pointer to IPv6 header in edx
79
;       size of IPv6 packet in ecx
80
;  OUT: /
81
;
82
;-----------------------------------------------------------------
83
align 4
84
IPv6_input:
85
 
3251 hidnplayr 86
        DEBUGF  2,"IPv6_input from: %x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x\n",\
3185 hidnplayr 87
        [edx + IPv6_header.SourceAddress + 0]:2,[edx + IPv6_header.SourceAddress + 1]:2,\
88
        [edx + IPv6_header.SourceAddress + 2]:2,[edx + IPv6_header.SourceAddress + 3]:2,\
89
        [edx + IPv6_header.SourceAddress + 4]:2,[edx + IPv6_header.SourceAddress + 5]:2,\
90
        [edx + IPv6_header.SourceAddress + 6]:2,[edx + IPv6_header.SourceAddress + 7]:2,\
91
        [edx + IPv6_header.SourceAddress + 8]:2,[edx + IPv6_header.SourceAddress + 9]:2,\
92
        [edx + IPv6_header.SourceAddress + 10]:2,[edx + IPv6_header.SourceAddress + 11]:2,\
93
        [edx + IPv6_header.SourceAddress + 12]:2,[edx + IPv6_header.SourceAddress + 13]:2,\
94
        [edx + IPv6_header.SourceAddress + 14]:2,[edx + IPv6_header.SourceAddress + 15]:2
2731 hidnplayr 95
 
3185 hidnplayr 96
        DEBUGF  1,"IPv6_input to: %x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x\n",\
97
        [edx + IPv6_header.DestinationAddress + 0]:2,[edx + IPv6_header.DestinationAddress + 1]:2,\
98
        [edx + IPv6_header.DestinationAddress + 2]:2,[edx + IPv6_header.DestinationAddress + 3]:2,\
99
        [edx + IPv6_header.DestinationAddress + 4]:2,[edx + IPv6_header.DestinationAddress + 5]:2,\
100
        [edx + IPv6_header.DestinationAddress + 6]:2,[edx + IPv6_header.DestinationAddress + 7]:2,\
101
        [edx + IPv6_header.DestinationAddress + 8]:2,[edx + IPv6_header.DestinationAddress + 9]:2,\
102
        [edx + IPv6_header.DestinationAddress + 10]:2,[edx + IPv6_header.DestinationAddress + 11]:2,\
103
        [edx + IPv6_header.DestinationAddress + 12]:2,[edx + IPv6_header.DestinationAddress + 13]:2,\
104
        [edx + IPv6_header.DestinationAddress + 14]:2,[edx + IPv6_header.DestinationAddress + 15]:2
105
 
2731 hidnplayr 106
        sub     ecx, sizeof.IPv6_header
107
        jb      .dump
108
 
3185 hidnplayr 109
        cmp     cx, [edx + IPv6_header.PayloadLength]
2731 hidnplayr 110
        jb      .dump
111
 
112
;-------------------------------------------------------------------
113
; No, it's just a regular IP packet, pass it to the higher protocols
114
 
115
  .handle_it:
3185 hidnplayr 116
        movzx   ecx, [edx + IPv6_header.PayloadLength]
117
        lea     edi, [edx + IPv6_header.SourceAddress]          ; make edi ptr to source and dest IPv6 address
118
        lea     esi, [edx + IPv6_header.Payload]                ; make esi ptr to data
119
        mov     al, [edx + IPv6_header.NextHeader]
2731 hidnplayr 120
 
3185 hidnplayr 121
  .scan:
122
        cmp     al, 59  ; no next
123
        je      .dump
2731 hidnplayr 124
 
3185 hidnplayr 125
        cmp     al, 0
126
        je      .hop_by_hop
2731 hidnplayr 127
 
3185 hidnplayr 128
        cmp     al, 43
129
        je      .routing
2731 hidnplayr 130
 
3185 hidnplayr 131
        cmp     al, 44
132
        je      .fragment
133
 
134
        cmp     al, 60
135
        je      .dest_opts
136
 
2731 hidnplayr 137
;        cmp     al, IP_PROTO_TCP
138
;        je      TCP_input
139
 
140
;        cmp     al, IP_PROTO_UDP
141
;        je      UDP_input
142
 
3185 hidnplayr 143
;        cmp     al, 58
144
;        je      ICMP6_input
2731 hidnplayr 145
 
146
        DEBUGF  2,"IPv6_input - unknown protocol: %u\n", al
147
 
148
  .dump:
3251 hidnplayr 149
        DEBUGF  1,"IPv6_input - dumping\n"
3185 hidnplayr 150
        call    kernel_free
151
        add     esp, 4
2731 hidnplayr 152
 
3185 hidnplayr 153
        ret
154
 
155
  .dump_options:
156
        add     esp, 2+4+4
157
        jmp     .dump
158
 
159
  .nextheader:
160
        pop     esi
161
        pop     ecx
162
        pop     ax
163
        jmp     .scan
164
 
165
;-------------------------
166
; Hop-by-Hop
167
 
168
  .hop_by_hop:
3251 hidnplayr 169
        DEBUGF  1,"IPv6_input - hop by hop\n"
3185 hidnplayr 170
        pushw   [esi]                   ; 8 bit identifier for option type
171
        movzx   eax, byte[esi + 1]      ; Hdr Ext Len
172
        inc     eax                     ; first 8 octets not counted
173
        shl     eax, 3                  ; * 8
174
        sub     ecx, eax
175
        push    ecx
176
        add     eax, esi
177
        push    eax
178
        inc     esi
179
        inc     esi
180
 
181
        mov     al, [esi]
182
 
183
        cmp     al, 0
184
        je      .pad_1
185
 
186
        cmp     al, 1
187
        je      .pad_n
188
 
189
        ; TODO: check with other known options
190
 
191
; unknown option.. discard packet or not?
192
; check highest two bits
193
        test    al, 0xc0        ; discard packet
194
        jnz     .dump_options
195
 
196
  .pad_n:
197
        movzx   eax, byte[esi + 1]
3251 hidnplayr 198
        DEBUGF  1,"IPv6_input - pad %u\n", eax
3185 hidnplayr 199
        inc     esi
200
        inc     esi
201
        add     esi, eax
202
        sub     ecx, eax
203
        jmp     .hop_by_hop
204
 
205
  .pad_1:
3251 hidnplayr 206
        DEBUGF  1,"IPv6_input - pad 1\n"
3185 hidnplayr 207
        inc     esi
208
        dec     ecx
209
        jmp     .hop_by_hop
210
 
211
 
212
 
213
  .dest_opts:
3251 hidnplayr 214
        DEBUGF  1,"IPv6_input - dest opts\n"
3185 hidnplayr 215
        jmp     .nextheader
216
 
217
  .routing:
3251 hidnplayr 218
        DEBUGF  1,"IPv6_input - routing\n"
3185 hidnplayr 219
        pushw   [esi]                   ; 8 bit identifier for option type
220
        movzx   eax, byte[esi + 1]      ; Hdr Ext Len
221
        inc     eax                     ; first 8 octets not counted
222
        shl     eax, 3                  ; * 8
223
        sub     ecx, eax
224
        push    ecx
225
        add     eax, esi
226
        push    eax
227
        inc     esi
228
        inc     esi
229
 
230
        cmp     al, 0
231
        je      .pad_1
232
 
233
        cmp     al, 1
234
        je      .pad_n
235
 
236
        mov     al, [esi]       ; routing type
237
 
238
        jmp     .nextheader
239
 
240
  .fragment:
3251 hidnplayr 241
        DEBUGF  1,"IPv6_input - fragment\n"
3185 hidnplayr 242
 
243
        jmp     .nextheader
244
 
245
 
246
 
247
 
248
 
249
 
250
;---------------------------------------------------------------------------
251
;
252
; IPv6_API
253
;
254
; This function is called by system function 75
255
;
256
; IN:  subfunction number in bl
257
;      device number in bh
258
;      ecx, edx, .. depends on subfunction
259
;
260
; OUT:
261
;
262
;---------------------------------------------------------------------------
263
align 4
264
IPv6_api:
265
 
266
        movzx   eax, bh
267
        shl     eax, 2
268
 
269
        and     ebx, 0x000000ff
270
        cmp     ebx, .number
271
        ja      .error
272
        jmp     dword [.table + 4*ebx]
273
 
274
  .table:
275
        dd      .packets_tx     ; 0
276
        dd      .packets_rx     ; 1
277
;        dd      .read_ip        ; 2
278
;        dd      .write_ip       ; 3
279
;        dd      .read_dns       ; 4
280
;        dd      .write_dns      ; 5
281
;        dd      .read_subnet    ; 6
282
;        dd      .write_subnet   ; 7
283
;        dd      .read_gateway   ; 8
284
;        dd      .write_gateway  ; 9
285
  .number = ($ - .table) / 4 - 1
286
 
287
  .error:
288
        mov     eax, -1
289
        ret
290
 
291
  .packets_tx:
292
        mov     eax, [IPv6.packets_tx + eax]
293
        ret
294
 
295
  .packets_rx:
296
        mov     eax, [IPv6.packets_rx + eax]
297
        ret
298