Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1171 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
3251 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved.    ;;
1171 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
6
;;  STACK.INC                                                      ;;
7
;;                                                                 ;;
1763 hidnplayr 8
;;  TCP/IP stack for KolibriOS                                     ;;
1171 hidnplayr 9
;;                                                                 ;;
10
;;    Written by hidnplayr@kolibrios.org                           ;;
11
;;                                                                 ;;
1763 hidnplayr 12
;;     Some parts of code are based on the work of:                ;;
13
;;      Mike Hibbett (menuetos network stack)                      ;;
14
;;      Eugen Brasoveanu (solar os network stack and drivers)      ;;
15
;;      mike.dld (kolibrios socket code)                           ;;
1171 hidnplayr 16
;;                                                                 ;;
1763 hidnplayr 17
;;     TCP part is based on 4.4BSD                                 ;;
18
;;                                                                 ;;
1171 hidnplayr 19
;;          GNU GENERAL PUBLIC LICENSE                             ;;
20
;;             Version 2, June 1991                                ;;
21
;;                                                                 ;;
22
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1159 hidnplayr 23
 
1206 hidnplayr 24
$Revision: 3340 $
1159 hidnplayr 25
 
26
uglobal
2366 hidnplayr 27
        net_10ms        dd ?
28
        net_tmr_count   dw ?
1159 hidnplayr 29
endg
30
 
2731 hidnplayr 31
MAX_NET_DEVICES         = 16
1159 hidnplayr 32
 
2731 hidnplayr 33
MIN_EPHEMERAL_PORT      = 49152
2995 hidnplayr 34
MIN_EPHEMERAL_PORT_N    = 0x00C0        ; same in Network byte order (FIXME)
2731 hidnplayr 35
MAX_EPHEMERAL_PORT      = 61000
2995 hidnplayr 36
MAX_EPHEMERAL_PORT_N    = 0x48EE        ; same in Network byte order (FIXME)
1159 hidnplayr 37
 
1514 hidnplayr 38
; Ethernet protocol numbers
2731 hidnplayr 39
ETHER_ARP               = 0x0608
40
ETHER_IPv4              = 0x0008
41
ETHER_IPv6              = 0xDD86
42
ETHER_PPP_DISCOVERY     = 0x6388
43
ETHER_PPP_SESSION       = 0x6488
1185 hidnplayr 44
 
2931 hidnplayr 45
; PPP protocol numbers
46
PPP_IPv4                = 0x2100
2964 hidnplayr 47
PPP_IPV6                = 0x5780
2931 hidnplayr 48
 
1514 hidnplayr 49
;Protocol family
2731 hidnplayr 50
AF_UNSPEC               = 0
3251 hidnplayr 51
AF_LOCAL                = 1
2731 hidnplayr 52
AF_INET4                = 2
53
AF_INET6                = 10
2931 hidnplayr 54
AF_PPP                  = 777
1159 hidnplayr 55
 
1514 hidnplayr 56
; Internet protocol numbers
2731 hidnplayr 57
IP_PROTO_IP             = 0
58
IP_PROTO_ICMP           = 1
59
IP_PROTO_TCP            = 6
60
IP_PROTO_UDP            = 17
1159 hidnplayr 61
 
2931 hidnplayr 62
; PPP protocol number
63
PPP_PROTO_ETHERNET      = 666
64
 
1200 hidnplayr 65
; Socket types
2731 hidnplayr 66
SOCK_STREAM             = 1
67
SOCK_DGRAM              = 2
68
SOCK_RAW                = 3
1200 hidnplayr 69
 
1514 hidnplayr 70
; Socket options
2731 hidnplayr 71
SO_ACCEPTCON            = 1 shl 0
72
SO_BROADCAST            = 1 shl 1
73
SO_DEBUG                = 1 shl 2
74
SO_DONTROUTE            = 1 shl 3
75
SO_KEEPALIVE            = 1 shl 4
76
SO_OOBINLINE            = 1 shl 5
77
SO_REUSEADDR            = 1 shl 6
78
SO_REUSEPORT            = 1 shl 7
79
SO_USELOOPBACK          = 1 shl 8
2877 hidnplayr 80
SO_BINDTODEVICE         = 1 shl 9
1159 hidnplayr 81
 
3257 hidnplayr 82
SO_BLOCK                = 1 shl 10    ; TO BE REMOVED
83
SO_NONBLOCK             = 1 shl 31
2994 hidnplayr 84
 
2877 hidnplayr 85
; Socket level
86
SOL_SOCKET              = 0
1885 hidnplayr 87
 
2877 hidnplayr 88
 
1773 hidnplayr 89
; Socket States
3257 hidnplayr 90
SS_NOFDREF              = 0x0001      ; no file table ref any more
91
SS_ISCONNECTED          = 0x0002      ; socket connected to a peer
92
SS_ISCONNECTING         = 0x0004      ; in process of connecting to peer
93
SS_ISDISCONNECTING      = 0x0008      ; in process of disconnecting
94
SS_CANTSENDMORE         = 0x0010      ; can't send more data to peer
95
SS_CANTRCVMORE          = 0x0020      ; can't receive more data from peer
96
SS_RCVATMARK            = 0x0040      ; at mark on input
97
SS_ISABORTING           = 0x0080      ; aborting fd references - close()
98
SS_RESTARTSYS           = 0x0100      ; restart blocked system calls
99
SS_ISDISCONNECTED       = 0x0800      ; socket disconnected from peer
1773 hidnplayr 100
 
3257 hidnplayr 101
SS_ASYNC                = 0x0100      ; async i/o notify
102
SS_ISCONFIRMING         = 0x0200      ; deciding to accept connection req
103
SS_MORETOCOME           = 0x0400
1773 hidnplayr 104
 
3257 hidnplayr 105
SS_BLOCKED              = 0x8000
1773 hidnplayr 106
 
3257 hidnplayr 107
 
2731 hidnplayr 108
SOCKET_MAXDATA          = 4096*32     ; must be 4096*(power of 2) where 'power of 2' is at least 8
1254 hidnplayr 109
 
1514 hidnplayr 110
; Network driver types
2914 hidnplayr 111
NET_TYPE_LOOPBACK       = 0
2731 hidnplayr 112
NET_TYPE_ETH            = 1
113
NET_TYPE_SLIP           = 2
1254 hidnplayr 114
 
2731 hidnplayr 115
MAX_backlog             = 20          ; maximum backlog for stream sockets
1254 hidnplayr 116
 
1716 hidnplayr 117
; Error Codes
2731 hidnplayr 118
ENOBUFS                 = 55
119
ECONNREFUSED            = 61
120
ECONNRESET              = 52
121
ETIMEDOUT               = 60
122
ECONNABORTED            = 53
1529 hidnplayr 123
 
2731 hidnplayr 124
; Api protocol numbers
125
API_ETH                 = 0
126
API_IPv4                = 1
127
API_ICMP                = 2
128
API_UDP                 = 3
129
API_TCP                 = 4
130
API_ARP                 = 5
131
API_PPPOE               = 6
3185 hidnplayr 132
API_IPv6                = 7
1716 hidnplayr 133
 
2924 hidnplayr 134
HWACC_TCP_IPv4          = 1 shl 0
135
 
2366 hidnplayr 136
struct  NET_DEVICE
1254 hidnplayr 137
 
2366 hidnplayr 138
        type            dd ?    ; Type field
139
        mtu             dd ?    ; Maximal Transmission Unit
140
        name            dd ?    ; Ptr to 0 terminated string
1519 hidnplayr 141
 
2366 hidnplayr 142
        unload          dd ?    ; Ptrs to driver functions
143
        reset           dd ?    ;
144
        transmit        dd ?    ;
1519 hidnplayr 145
 
2366 hidnplayr 146
        bytes_tx        dq ?    ; Statistics, updated by the driver
147
        bytes_rx        dq ?    ;
148
        packets_tx      dd ?    ;
149
        packets_rx      dd ?    ;
1519 hidnplayr 150
 
2305 hidnplayr 151
;       hwacc           dd ?    ; bitmask stating available hardware accelerations (offload engines)
1519 hidnplayr 152
 
2305 hidnplayr 153
ends
1529 hidnplayr 154
 
1254 hidnplayr 155
 
1514 hidnplayr 156
; Exactly as it says..
1318 hidnplayr 157
macro pseudo_random reg {
2366 hidnplayr 158
        add     reg, [esp]
159
        rol     reg, 5
160
        xor     reg, [timer_ticks]
161
        add     reg, [CPU_FREQ]
162
        imul    reg, 214013
163
        xor     reg, 0xdeadbeef
164
        rol     reg, 9
1514 hidnplayr 165
}
1318 hidnplayr 166
 
3249 hidnplayr 167
; Network to Hardware byte order (dword)
1543 hidnplayr 168
macro ntohd reg {
1318 hidnplayr 169
 
2366 hidnplayr 170
        rol     word reg, 8
171
        rol     dword reg, 16
172
        rol     word reg , 8
1514 hidnplayr 173
 
1318 hidnplayr 174
}
175
 
3249 hidnplayr 176
; Network to Hardware byte order (word)
1543 hidnplayr 177
macro ntohw reg {
1514 hidnplayr 178
 
2366 hidnplayr 179
        rol     word reg, 8
1514 hidnplayr 180
 
181
}
182
 
2382 hidnplayr 183
 
1159 hidnplayr 184
include "queue.inc"
1514 hidnplayr 185
 
2914 hidnplayr 186
include "loopback.inc"
1514 hidnplayr 187
include "ethernet.inc"
1719 hidnplayr 188
 
2931 hidnplayr 189
include "PPPoE.inc"
1514 hidnplayr 190
 
1187 hidnplayr 191
include "ARP.inc"
192
include "IPv4.inc"
3185 hidnplayr 193
include "IPv6.inc"
1514 hidnplayr 194
 
195
include "icmp.inc"
196
include "udp.inc"
1249 hidnplayr 197
include "tcp.inc"
1159 hidnplayr 198
 
1514 hidnplayr 199
include "socket.inc"
200
 
201
 
202
 
203
align 4
204
uglobal
205
 
2366 hidnplayr 206
        NET_RUNNING     dd  ?
207
        NET_DEFAULT     dd  ?
208
        NET_DRV_LIST    rd  MAX_NET_DEVICES
1514 hidnplayr 209
 
210
endg
211
 
212
 
1257 hidnplayr 213
;-----------------------------------------------------------------
1159 hidnplayr 214
;
215
; stack_init
216
;
217
;  This function calls all network init procedures
218
;
219
;  IN:  /
220
;  OUT: /
221
;
1257 hidnplayr 222
;-----------------------------------------------------------------
1159 hidnplayr 223
align 4
224
stack_init:
225
 
1514 hidnplayr 226
; Init the network drivers list
2366 hidnplayr 227
        xor     eax, eax
228
        mov     edi, NET_RUNNING
229
        mov     ecx, (MAX_NET_DEVICES + 2)
230
        rep     stosd
1514 hidnplayr 231
 
2960 hidnplayr 232
        PPPoE_init
1514 hidnplayr 233
 
2366 hidnplayr 234
        IPv4_init
2731 hidnplayr 235
;        IPv6_init
2366 hidnplayr 236
        ICMP_init
1514 hidnplayr 237
 
2366 hidnplayr 238
        ARP_init
239
        UDP_init
240
        TCP_init
1514 hidnplayr 241
 
2366 hidnplayr 242
        SOCKET_init
1514 hidnplayr 243
 
2366 hidnplayr 244
        mov     [net_tmr_count], 0
1159 hidnplayr 245
 
2366 hidnplayr 246
        ret
1159 hidnplayr 247
 
248
 
1257 hidnplayr 249
;-----------------------------------------------------------------
1159 hidnplayr 250
;
251
; stack_handler
252
;
1514 hidnplayr 253
;  This function is called in kernel loop
1159 hidnplayr 254
;
255
;  IN:  /
256
;  OUT: /
257
;
1257 hidnplayr 258
;-----------------------------------------------------------------
1159 hidnplayr 259
align 4
260
stack_handler:
261
 
2366 hidnplayr 262
        cmp     [NET_RUNNING], 0
263
        je      .exit
1159 hidnplayr 264
 
3251 hidnplayr 265
        call    TCP_process_input       ; de-queue TCP ragments and process them
266
 
2366 hidnplayr 267
        ; Test for 10ms tick
268
        mov     eax, [timer_ticks]
269
        cmp     eax, [net_10ms]
270
        je      .exit
271
        mov     [net_10ms], eax
1159 hidnplayr 272
 
2366 hidnplayr 273
        test    [net_10ms], 0x0f        ; 160ms
274
        jnz     .exit
1249 hidnplayr 275
 
2366 hidnplayr 276
        TCP_timer_160ms
1159 hidnplayr 277
 
2366 hidnplayr 278
        test    [net_10ms], 0x3f        ; 640ms
279
        jnz     .exit
1519 hidnplayr 280
 
2366 hidnplayr 281
        TCP_timer_640ms
282
        ARP_decrease_entry_ttls
283
        IPv4_decrease_fragment_ttls
1159 hidnplayr 284
 
285
  .exit:
2366 hidnplayr 286
        ret
1159 hidnplayr 287
 
288
 
1514 hidnplayr 289
 
3340 hidnplayr 290
align 4
291
NET_link_changed:
292
 
293
align 4
294
NET_send_event:
295
 
296
; Send event to all applications
297
        push    edi ecx
298
        mov     edi, SLOT_BASE
299
        mov     ecx, [TASK_COUNT]
300
  .loop:
301
        add     edi, 256
302
        or      [edi + APPDATA.event_mask], EVENT_NETWORK2
303
        loop    .loop
304
        pop     ecx edi
305
 
306
;        call    change_task
307
 
308
        ret
309
 
310
 
311
 
1249 hidnplayr 312
;-----------------------------------------------------------------
313
;
2220 hidnplayr 314
; NET_add_device:
1514 hidnplayr 315
;
316
;  This function is called by the network drivers,
317
;  to register each running NIC to the kernel
318
;
319
;  IN:  Pointer to device structure in ebx
320
;  OUT: Device num in eax, -1 on error
321
;
322
;-----------------------------------------------------------------
323
align 4
324
NET_add_device:
325
 
2366 hidnplayr 326
        DEBUGF  1,"NET_Add_Device: %x\n", ebx   ;;; TODO: use mutex to lock net device list
1514 hidnplayr 327
 
2366 hidnplayr 328
        mov     eax, [NET_RUNNING]
329
        cmp     eax, MAX_NET_DEVICES
330
        jae     .error
1514 hidnplayr 331
 
332
;----------------------------------
333
; Check if device is already listed
2366 hidnplayr 334
        mov     eax, ebx
335
        mov     ecx, MAX_NET_DEVICES    ; We need to check whole list because a device may be removed without re-organizing list
336
        mov     edi, NET_DRV_LIST
1514 hidnplayr 337
 
2366 hidnplayr 338
        repne   scasd                   ; See if device is already in the list
339
        jz      .error
1514 hidnplayr 340
 
341
;----------------------------
342
; Find empty slot in the list
2366 hidnplayr 343
        xor     eax, eax
344
        mov     ecx, MAX_NET_DEVICES
345
        mov     edi, NET_DRV_LIST
1514 hidnplayr 346
 
2366 hidnplayr 347
        repne   scasd
348
        jnz     .error
1514 hidnplayr 349
 
2366 hidnplayr 350
        sub     edi, 4
1514 hidnplayr 351
 
2220 hidnplayr 352
;-----------------------------
353
; Add device to the found slot
2366 hidnplayr 354
        mov     [edi], ebx              ; add device to list
1514 hidnplayr 355
 
2366 hidnplayr 356
        mov     eax, edi                ; Calculate device number in eax
357
        sub     eax, NET_DRV_LIST
358
        shr     eax, 2
1514 hidnplayr 359
 
2366 hidnplayr 360
        inc     [NET_RUNNING]           ; Indicate that one more network device is up and running
1514 hidnplayr 361
 
2366 hidnplayr 362
        cmp     eax, 1                  ; If it's the first network device, try to set it as default
363
        jne     @f
364
        push    eax
365
        call    NET_set_default
366
        pop     eax
2220 hidnplayr 367
       @@:
1514 hidnplayr 368
 
3340 hidnplayr 369
        call    NET_send_event
370
 
2366 hidnplayr 371
        DEBUGF  1,"Device number: %u\n", eax
372
        ret
1514 hidnplayr 373
 
2220 hidnplayr 374
  .error:
2366 hidnplayr 375
        or      eax, -1
376
        DEBUGF  2,"Adding network device failed\n"
377
        ret
1514 hidnplayr 378
 
379
 
380
 
2220 hidnplayr 381
;-----------------------------------------------------------------
382
;
383
; NET_set_default
384
;
385
;  API to set the default interface
386
;
387
;  IN:  Device num in eax
388
;  OUT: Device num in eax, -1 on error
389
;
390
;-----------------------------------------------------------------
391
align 4
392
NET_set_default:
1514 hidnplayr 393
 
2891 hidnplayr 394
        DEBUGF  1,"NET_set_default: device=%x\n", eax
1514 hidnplayr 395
 
2366 hidnplayr 396
        cmp     eax, MAX_NET_DEVICES
397
        jae     .error
1514 hidnplayr 398
 
2366 hidnplayr 399
        cmp     [NET_DRV_LIST+eax*4], 0
400
        je      .error
2220 hidnplayr 401
 
2366 hidnplayr 402
        mov     [NET_DEFAULT], eax
2220 hidnplayr 403
 
2891 hidnplayr 404
        DEBUGF  1,"NET_set_default: succes\n"
2366 hidnplayr 405
        ret
1514 hidnplayr 406
 
407
  .error:
2366 hidnplayr 408
        or      eax, -1
2891 hidnplayr 409
        DEBUGF  1,"NET_set_default: failed\n"
2366 hidnplayr 410
        ret
1514 hidnplayr 411
 
412
 
413
;-----------------------------------------------------------------
414
;
415
; NET_Remove_Device:
416
;
417
;  This function is called by etwork drivers,
418
;  to unregister network devices from the kernel
2891 hidnplayr 419
;
1514 hidnplayr 420
;  IN:  Pointer to device structure in ebx
421
;  OUT: eax: -1 on error
422
;
423
;-----------------------------------------------------------------
424
align 4
425
NET_remove_device:
426
 
2366 hidnplayr 427
        cmp     [NET_RUNNING], 0
428
        je      .error
1514 hidnplayr 429
 
2366 hidnplayr 430
        cmp     [NET_DRV_LIST], ebx
431
        jne     @f
432
        mov     [NET_DRV_LIST], 0
433
        cmp     [NET_RUNNING], 1
434
        je      @f
435
        ; there are still active devices, find one and make it default
436
        xor     eax, eax
437
        mov     ecx, MAX_NET_DEVICES
438
        mov     edi, NET_DRV_LIST
439
        repe    scasd
440
        je      @f
441
        shr     edi, 2
442
        dec     edi
443
        mov     [NET_DEFAULT], edi
2220 hidnplayr 444
       @@:
445
 
1514 hidnplayr 446
;----------------------------
447
; Find the driver in the list
448
 
2366 hidnplayr 449
        mov     eax, ebx
450
        mov     ecx, MAX_NET_DEVICES
451
        mov     edi, NET_DRV_LIST+4
1514 hidnplayr 452
 
2366 hidnplayr 453
        repne   scasd
454
        jnz     .error
1514 hidnplayr 455
 
456
;------------------------
457
; Remove it from the list
458
 
2366 hidnplayr 459
        xor     eax, eax
460
        mov     dword [edi-4], eax
1514 hidnplayr 461
 
3340 hidnplayr 462
        call    NET_send_event
463
 
2366 hidnplayr 464
        dec     [NET_RUNNING]
465
        ret
1514 hidnplayr 466
 
467
  .error:
2366 hidnplayr 468
        or      eax, -1
469
        ret
1514 hidnplayr 470
 
471
 
472
 
473
;-----------------------------------------------------------------
474
;
475
; NET_ptr_to_num
476
;
477
; IN:  ebx = ptr to device struct
478
; OUT: edi = -1 on error, device number otherwise
479
;
480
;-----------------------------------------------------------------
481
align 4
482
NET_ptr_to_num:
2366 hidnplayr 483
        push    ecx
1514 hidnplayr 484
 
2366 hidnplayr 485
        mov     ecx, MAX_NET_DEVICES
486
        mov     edi, NET_DRV_LIST
1514 hidnplayr 487
 
488
  .loop:
2366 hidnplayr 489
        cmp     ebx, [edi]
490
        jz      .found
491
        add     edi, 4
492
        dec     ecx
493
        jnz     .loop
1514 hidnplayr 494
 
2366 hidnplayr 495
        ; repnz  scasd could work too if eax is used instead of ebx!
1514 hidnplayr 496
 
2366 hidnplayr 497
        or      edi, -1
1514 hidnplayr 498
 
2366 hidnplayr 499
        pop     ecx
500
        ret
1514 hidnplayr 501
 
502
  .found:
2366 hidnplayr 503
        sub     edi, NET_DRV_LIST
504
        shr     edi, 2
1514 hidnplayr 505
 
2366 hidnplayr 506
        pop     ecx
507
        ret
1514 hidnplayr 508
 
509
;-----------------------------------------------------------------
510
;
1249 hidnplayr 511
; checksum_1
512
;
1482 hidnplayr 513
;  This is the first of two functions needed to calculate a checksum.
1249 hidnplayr 514
;
1473 hidnplayr 515
;  IN:  edx = start offset for semi-checksum
1249 hidnplayr 516
;       esi = pointer to data
517
;       ecx = data size
518
;  OUT: edx = semi-checksum
519
;
1473 hidnplayr 520
;
521
; Code was optimized by diamond
522
;
1249 hidnplayr 523
;-----------------------------------------------------------------
524
align 4
525
checksum_1:
1159 hidnplayr 526
 
2366 hidnplayr 527
        shr     ecx, 1
528
        pushf
529
        jz      .no_2
1159 hidnplayr 530
 
2366 hidnplayr 531
        shr     ecx, 1
532
        pushf
533
        jz      .no_4
1473 hidnplayr 534
 
2366 hidnplayr 535
        shr     ecx, 1
536
        pushf
537
        jz      .no_8
1473 hidnplayr 538
 
539
  .loop:
2366 hidnplayr 540
        add     dl, [esi+1]
541
        adc     dh, [esi+0]
1473 hidnplayr 542
 
2366 hidnplayr 543
        adc     dl, [esi+3]
544
        adc     dh, [esi+2]
1473 hidnplayr 545
 
2366 hidnplayr 546
        adc     dl, [esi+5]
547
        adc     dh, [esi+4]
1473 hidnplayr 548
 
2366 hidnplayr 549
        adc     dl, [esi+7]
550
        adc     dh, [esi+6]
1473 hidnplayr 551
 
2366 hidnplayr 552
        adc     edx, 0
553
        add     esi, 8
1473 hidnplayr 554
 
2366 hidnplayr 555
        dec     ecx
556
        jnz     .loop
1473 hidnplayr 557
 
2366 hidnplayr 558
        adc     edx, 0
1473 hidnplayr 559
 
560
  .no_8:
2366 hidnplayr 561
        popf
562
        jnc     .no_4
1473 hidnplayr 563
 
2366 hidnplayr 564
        add     dl, [esi+1]
565
        adc     dh, [esi+0]
1473 hidnplayr 566
 
2366 hidnplayr 567
        adc     dl, [esi+3]
568
        adc     dh, [esi+2]
1473 hidnplayr 569
 
2366 hidnplayr 570
        adc     edx, 0
571
        add     esi, 4
1473 hidnplayr 572
 
573
  .no_4:
2366 hidnplayr 574
        popf
575
        jnc     .no_2
1473 hidnplayr 576
 
2366 hidnplayr 577
        add     dl, [esi+1]
578
        adc     dh, [esi+0]
1473 hidnplayr 579
 
2366 hidnplayr 580
        adc     edx, 0
581
        inc     esi
582
        inc     esi
1473 hidnplayr 583
 
584
  .no_2:
2366 hidnplayr 585
        popf
586
        jnc     .end
1159 hidnplayr 587
 
2366 hidnplayr 588
        add     dh, [esi+0]
589
        adc     edx, 0
1473 hidnplayr 590
  .end:
2366 hidnplayr 591
        ret
1159 hidnplayr 592
 
1249 hidnplayr 593
;-----------------------------------------------------------------
594
;
595
; checksum_2
596
;
597
;  This function calculates the final ip/tcp/udp checksum for you
598
;
599
;  IN:  edx = semi-checksum
600
;  OUT: dx = checksum (in INET byte order)
601
;
602
;-----------------------------------------------------------------
603
align 4
604
checksum_2:
605
 
2366 hidnplayr 606
        mov     ecx, edx
607
        shr     ecx, 16
608
        and     edx, 0xffff
609
        add     edx, ecx
1249 hidnplayr 610
 
2366 hidnplayr 611
        mov     ecx, edx
612
        shr     ecx, 16
613
        add     dx, cx
614
        test    dx, dx          ; it seems that ZF is not set when CF is set :(
615
        not     dx
616
        jnz     .not_zero
617
        dec     dx
1249 hidnplayr 618
  .not_zero:
2366 hidnplayr 619
        xchg    dl, dh
1249 hidnplayr 620
 
3251 hidnplayr 621
        DEBUGF  1,"Checksum: %x\n", dx
1249 hidnplayr 622
 
2366 hidnplayr 623
        ret
1249 hidnplayr 624
 
625
 
626
 
1159 hidnplayr 627
;----------------------------------------------------------------
628
;
3146 hidnplayr 629
;  System function to work with network devices (75)
1159 hidnplayr 630
;
631
;----------------------------------------------------------------
632
align 4
2366 hidnplayr 633
sys_network:                    ; FIXME: make default device easily accessible
1159 hidnplayr 634
 
2366 hidnplayr 635
        cmp     ebx, -1
636
        jne     @f
1196 hidnplayr 637
 
2366 hidnplayr 638
        mov     eax, [NET_RUNNING]
639
        jmp     .return
1196 hidnplayr 640
 
641
   @@:
2366 hidnplayr 642
        cmp     bh, MAX_NET_DEVICES             ; Check if device number exists
643
        jae     .doesnt_exist
1159 hidnplayr 644
 
2366 hidnplayr 645
        mov     esi, ebx
646
        and     esi, 0x0000ff00
647
        shr     esi, 6
1159 hidnplayr 648
 
2366 hidnplayr 649
        cmp     dword [esi + NET_DRV_LIST], 0   ; check if driver is running
650
        je      .doesnt_exist
1159 hidnplayr 651
 
2621 hidnplayr 652
        mov     eax, [esi + NET_DRV_LIST]
2220 hidnplayr 653
 
2621 hidnplayr 654
        and     ebx, 0x000000ff
655
        cmp     ebx, .number
656
        ja      .doesnt_exist
657
        jmp     dword [.table + 4*ebx]
2220 hidnplayr 658
 
2621 hidnplayr 659
  .table:
660
        dd      .get_type               ; 0
661
        dd      .get_dev_name           ; 1
662
        dd      .reset                  ; 2
663
        dd      .stop                   ; 3
664
        dd      .get_ptr                ; 4
665
        dd      .get_drv_name           ; 5
666
        dd      .set_default            ; 6
667
  .number = ($ - .table) / 4 - 1
1514 hidnplayr 668
 
2621 hidnplayr 669
  .get_type:                            ; 0 = Get device type (ethernet/token ring/...)
670
 
671
        mov     eax, [eax + NET_DEVICE.type]
2366 hidnplayr 672
        jmp     .return
1159 hidnplayr 673
 
674
 
2621 hidnplayr 675
  .get_dev_name:                        ; 1 = Get device name
1159 hidnplayr 676
 
2621 hidnplayr 677
        mov     esi, [eax + NET_DEVICE.name]
2366 hidnplayr 678
        mov     edi, ecx
1159 hidnplayr 679
 
2621 hidnplayr 680
        mov     ecx, 64/4 ; max length
681
        rep     movsd
1159 hidnplayr 682
 
2366 hidnplayr 683
        xor     eax, eax
684
        jmp     .return
1159 hidnplayr 685
 
2621 hidnplayr 686
  .reset:                               ; 2 = Reset the device
1159 hidnplayr 687
 
2621 hidnplayr 688
        call    [eax + NET_DEVICE.reset]
2366 hidnplayr 689
        jmp     .return
1192 hidnplayr 690
 
2621 hidnplayr 691
  .stop:                                ; 3 = Stop driver for this device
1192 hidnplayr 692
 
2621 hidnplayr 693
        call    [eax + NET_DEVICE.unload]
2366 hidnplayr 694
        jmp     .return
1192 hidnplayr 695
 
696
 
2621 hidnplayr 697
  .get_ptr:                             ; 4 = Get driver pointer
698
 
2366 hidnplayr 699
        jmp     .return
1249 hidnplayr 700
 
701
 
2621 hidnplayr 702
  .get_drv_name:                        ; 5 = Get driver name
1249 hidnplayr 703
 
2366 hidnplayr 704
        xor     eax, eax
705
        jmp     .return
2220 hidnplayr 706
 
707
 
2621 hidnplayr 708
  .set_default:                         ; 6 = Set default device
2220 hidnplayr 709
 
2366 hidnplayr 710
        call    NET_set_default
711
        jmp     .return
2220 hidnplayr 712
 
1159 hidnplayr 713
  .doesnt_exist:
2366 hidnplayr 714
        mov     eax, -1
1159 hidnplayr 715
 
1192 hidnplayr 716
  .return:
2621 hidnplayr 717
        mov     [esp+32], eax
2366 hidnplayr 718
        ret
1159 hidnplayr 719
 
720
 
721
;----------------------------------------------------------------
722
;
2731 hidnplayr 723
;  System function to work with protocols  (76)
1159 hidnplayr 724
;
725
;----------------------------------------------------------------
726
align 4
727
sys_protocols:
2366 hidnplayr 728
        cmp     bh, MAX_NET_DEVICES             ; Check if device number exists
729
        jae     .doesnt_exist
1159 hidnplayr 730
 
2366 hidnplayr 731
        mov     esi, ebx
732
        and     esi, 0x0000ff00
733
        shr     esi, 6                          ; now we have the device num * 4 in esi
734
        cmp     [esi + NET_DRV_LIST], 0         ; check if driver is running
735
        je      .doesnt_exist
1159 hidnplayr 736
 
2366 hidnplayr 737
        push    .return                         ; return address (we will be using jumps instead of calls)
1159 hidnplayr 738
 
2366 hidnplayr 739
        mov     eax, ebx                        ; set ax to protocol number
740
        shr     eax, 16                         ;
1159 hidnplayr 741
 
2731 hidnplayr 742
        cmp     ax, API_ETH
743
        je      ETH_api
744
 
745
        cmp     ax, API_IPv4
2614 hidnplayr 746
        je      IPv4_api
1159 hidnplayr 747
 
2731 hidnplayr 748
        cmp     ax, API_ICMP
2614 hidnplayr 749
        je      ICMP_api
1159 hidnplayr 750
 
2731 hidnplayr 751
        cmp     ax, API_UDP
2614 hidnplayr 752
        je      UDP_api
1159 hidnplayr 753
 
2731 hidnplayr 754
        cmp     ax, API_TCP
2614 hidnplayr 755
        je      TCP_api
1159 hidnplayr 756
 
2731 hidnplayr 757
        cmp     ax, API_ARP
2614 hidnplayr 758
        je      ARP_api
1159 hidnplayr 759
 
2931 hidnplayr 760
        cmp     ax, API_PPPOE
761
        je      PPPoE_api
2614 hidnplayr 762
 
3185 hidnplayr 763
        cmp     ax, API_IPv6
764
        je      IPv6_api
765
 
2366 hidnplayr 766
        add     esp, 4                           ; if we reached here, no function was called, so we need to balance stack
1159 hidnplayr 767
 
768
  .doesnt_exist:
2366 hidnplayr 769
        mov     eax, -1
1159 hidnplayr 770
 
771
  .return:
2614 hidnplayr 772
        mov     [esp+28+4], eax                 ; return eax value to the program
2366 hidnplayr 773
        ret