Subversion Repositories Kolibri OS

Rev

Rev 3340 | 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: 3346 $
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
 
3346 hidnplayr 151
        state           dd ?    ; link state (0 = no link)
152
        hwacc           dd ?    ; bitmask stating enabled HW accelerations (offload engines)
1519 hidnplayr 153
 
2305 hidnplayr 154
ends
1529 hidnplayr 155
 
1254 hidnplayr 156
 
1514 hidnplayr 157
; Exactly as it says..
1318 hidnplayr 158
macro pseudo_random reg {
2366 hidnplayr 159
        add     reg, [esp]
160
        rol     reg, 5
161
        xor     reg, [timer_ticks]
162
        add     reg, [CPU_FREQ]
163
        imul    reg, 214013
164
        xor     reg, 0xdeadbeef
165
        rol     reg, 9
1514 hidnplayr 166
}
1318 hidnplayr 167
 
3249 hidnplayr 168
; Network to Hardware byte order (dword)
1543 hidnplayr 169
macro ntohd reg {
1318 hidnplayr 170
 
2366 hidnplayr 171
        rol     word reg, 8
172
        rol     dword reg, 16
173
        rol     word reg , 8
1514 hidnplayr 174
 
1318 hidnplayr 175
}
176
 
3249 hidnplayr 177
; Network to Hardware byte order (word)
1543 hidnplayr 178
macro ntohw reg {
1514 hidnplayr 179
 
2366 hidnplayr 180
        rol     word reg, 8
1514 hidnplayr 181
 
182
}
183
 
2382 hidnplayr 184
 
1159 hidnplayr 185
include "queue.inc"
1514 hidnplayr 186
 
2914 hidnplayr 187
include "loopback.inc"
1514 hidnplayr 188
include "ethernet.inc"
1719 hidnplayr 189
 
2931 hidnplayr 190
include "PPPoE.inc"
1514 hidnplayr 191
 
1187 hidnplayr 192
include "ARP.inc"
193
include "IPv4.inc"
3185 hidnplayr 194
include "IPv6.inc"
1514 hidnplayr 195
 
196
include "icmp.inc"
197
include "udp.inc"
1249 hidnplayr 198
include "tcp.inc"
1159 hidnplayr 199
 
1514 hidnplayr 200
include "socket.inc"
201
 
202
 
203
 
204
align 4
205
uglobal
206
 
2366 hidnplayr 207
        NET_RUNNING     dd  ?
208
        NET_DEFAULT     dd  ?
209
        NET_DRV_LIST    rd  MAX_NET_DEVICES
1514 hidnplayr 210
 
211
endg
212
 
213
 
1257 hidnplayr 214
;-----------------------------------------------------------------
1159 hidnplayr 215
;
216
; stack_init
217
;
218
;  This function calls all network init procedures
219
;
220
;  IN:  /
221
;  OUT: /
222
;
1257 hidnplayr 223
;-----------------------------------------------------------------
1159 hidnplayr 224
align 4
225
stack_init:
226
 
1514 hidnplayr 227
; Init the network drivers list
2366 hidnplayr 228
        xor     eax, eax
229
        mov     edi, NET_RUNNING
230
        mov     ecx, (MAX_NET_DEVICES + 2)
231
        rep     stosd
1514 hidnplayr 232
 
2960 hidnplayr 233
        PPPoE_init
1514 hidnplayr 234
 
2366 hidnplayr 235
        IPv4_init
2731 hidnplayr 236
;        IPv6_init
2366 hidnplayr 237
        ICMP_init
1514 hidnplayr 238
 
2366 hidnplayr 239
        ARP_init
240
        UDP_init
241
        TCP_init
1514 hidnplayr 242
 
2366 hidnplayr 243
        SOCKET_init
1514 hidnplayr 244
 
2366 hidnplayr 245
        mov     [net_tmr_count], 0
1159 hidnplayr 246
 
2366 hidnplayr 247
        ret
1159 hidnplayr 248
 
249
 
1257 hidnplayr 250
;-----------------------------------------------------------------
1159 hidnplayr 251
;
252
; stack_handler
253
;
1514 hidnplayr 254
;  This function is called in kernel loop
1159 hidnplayr 255
;
256
;  IN:  /
257
;  OUT: /
258
;
1257 hidnplayr 259
;-----------------------------------------------------------------
1159 hidnplayr 260
align 4
261
stack_handler:
262
 
2366 hidnplayr 263
        cmp     [NET_RUNNING], 0
264
        je      .exit
1159 hidnplayr 265
 
3251 hidnplayr 266
        call    TCP_process_input       ; de-queue TCP ragments and process them
267
 
2366 hidnplayr 268
        ; Test for 10ms tick
269
        mov     eax, [timer_ticks]
270
        cmp     eax, [net_10ms]
271
        je      .exit
272
        mov     [net_10ms], eax
1159 hidnplayr 273
 
2366 hidnplayr 274
        test    [net_10ms], 0x0f        ; 160ms
275
        jnz     .exit
1249 hidnplayr 276
 
2366 hidnplayr 277
        TCP_timer_160ms
1159 hidnplayr 278
 
2366 hidnplayr 279
        test    [net_10ms], 0x3f        ; 640ms
280
        jnz     .exit
1519 hidnplayr 281
 
2366 hidnplayr 282
        TCP_timer_640ms
283
        ARP_decrease_entry_ttls
284
        IPv4_decrease_fragment_ttls
1159 hidnplayr 285
 
286
  .exit:
2366 hidnplayr 287
        ret
1159 hidnplayr 288
 
289
 
1514 hidnplayr 290
 
3340 hidnplayr 291
align 4
292
NET_link_changed:
293
 
3346 hidnplayr 294
        DEBUGF  1,"NET_link_changed: %x\n", ebx
295
 
3340 hidnplayr 296
align 4
297
NET_send_event:
298
 
3346 hidnplayr 299
        DEBUGF  1,"NET_send_event\n"
300
 
3340 hidnplayr 301
; Send event to all applications
302
        push    edi ecx
303
        mov     edi, SLOT_BASE
304
        mov     ecx, [TASK_COUNT]
305
  .loop:
306
        add     edi, 256
307
        or      [edi + APPDATA.event_mask], EVENT_NETWORK2
308
        loop    .loop
309
        pop     ecx edi
310
 
311
;        call    change_task
312
 
313
        ret
314
 
315
 
316
 
1249 hidnplayr 317
;-----------------------------------------------------------------
318
;
2220 hidnplayr 319
; NET_add_device:
1514 hidnplayr 320
;
321
;  This function is called by the network drivers,
322
;  to register each running NIC to the kernel
323
;
324
;  IN:  Pointer to device structure in ebx
325
;  OUT: Device num in eax, -1 on error
326
;
327
;-----------------------------------------------------------------
328
align 4
329
NET_add_device:
330
 
2366 hidnplayr 331
        DEBUGF  1,"NET_Add_Device: %x\n", ebx   ;;; TODO: use mutex to lock net device list
1514 hidnplayr 332
 
2366 hidnplayr 333
        mov     eax, [NET_RUNNING]
334
        cmp     eax, MAX_NET_DEVICES
335
        jae     .error
1514 hidnplayr 336
 
337
;----------------------------------
338
; Check if device is already listed
2366 hidnplayr 339
        mov     eax, ebx
340
        mov     ecx, MAX_NET_DEVICES    ; We need to check whole list because a device may be removed without re-organizing list
341
        mov     edi, NET_DRV_LIST
1514 hidnplayr 342
 
2366 hidnplayr 343
        repne   scasd                   ; See if device is already in the list
344
        jz      .error
1514 hidnplayr 345
 
346
;----------------------------
347
; Find empty slot in the list
2366 hidnplayr 348
        xor     eax, eax
349
        mov     ecx, MAX_NET_DEVICES
350
        mov     edi, NET_DRV_LIST
1514 hidnplayr 351
 
2366 hidnplayr 352
        repne   scasd
353
        jnz     .error
1514 hidnplayr 354
 
2366 hidnplayr 355
        sub     edi, 4
1514 hidnplayr 356
 
2220 hidnplayr 357
;-----------------------------
358
; Add device to the found slot
2366 hidnplayr 359
        mov     [edi], ebx              ; add device to list
1514 hidnplayr 360
 
2366 hidnplayr 361
        mov     eax, edi                ; Calculate device number in eax
362
        sub     eax, NET_DRV_LIST
363
        shr     eax, 2
1514 hidnplayr 364
 
2366 hidnplayr 365
        inc     [NET_RUNNING]           ; Indicate that one more network device is up and running
1514 hidnplayr 366
 
2366 hidnplayr 367
        cmp     eax, 1                  ; If it's the first network device, try to set it as default
368
        jne     @f
369
        push    eax
370
        call    NET_set_default
371
        pop     eax
2220 hidnplayr 372
       @@:
1514 hidnplayr 373
 
3340 hidnplayr 374
        call    NET_send_event
375
 
2366 hidnplayr 376
        DEBUGF  1,"Device number: %u\n", eax
377
        ret
1514 hidnplayr 378
 
2220 hidnplayr 379
  .error:
2366 hidnplayr 380
        or      eax, -1
381
        DEBUGF  2,"Adding network device failed\n"
382
        ret
1514 hidnplayr 383
 
384
 
385
 
2220 hidnplayr 386
;-----------------------------------------------------------------
387
;
388
; NET_set_default
389
;
390
;  API to set the default interface
391
;
392
;  IN:  Device num in eax
393
;  OUT: Device num in eax, -1 on error
394
;
395
;-----------------------------------------------------------------
396
align 4
397
NET_set_default:
1514 hidnplayr 398
 
2891 hidnplayr 399
        DEBUGF  1,"NET_set_default: device=%x\n", eax
1514 hidnplayr 400
 
2366 hidnplayr 401
        cmp     eax, MAX_NET_DEVICES
402
        jae     .error
1514 hidnplayr 403
 
2366 hidnplayr 404
        cmp     [NET_DRV_LIST+eax*4], 0
405
        je      .error
2220 hidnplayr 406
 
2366 hidnplayr 407
        mov     [NET_DEFAULT], eax
2220 hidnplayr 408
 
2891 hidnplayr 409
        DEBUGF  1,"NET_set_default: succes\n"
2366 hidnplayr 410
        ret
1514 hidnplayr 411
 
412
  .error:
2366 hidnplayr 413
        or      eax, -1
2891 hidnplayr 414
        DEBUGF  1,"NET_set_default: failed\n"
2366 hidnplayr 415
        ret
1514 hidnplayr 416
 
417
 
418
;-----------------------------------------------------------------
419
;
420
; NET_Remove_Device:
421
;
422
;  This function is called by etwork drivers,
423
;  to unregister network devices from the kernel
2891 hidnplayr 424
;
1514 hidnplayr 425
;  IN:  Pointer to device structure in ebx
426
;  OUT: eax: -1 on error
427
;
428
;-----------------------------------------------------------------
429
align 4
430
NET_remove_device:
431
 
2366 hidnplayr 432
        cmp     [NET_RUNNING], 0
433
        je      .error
1514 hidnplayr 434
 
2366 hidnplayr 435
        cmp     [NET_DRV_LIST], ebx
436
        jne     @f
437
        mov     [NET_DRV_LIST], 0
438
        cmp     [NET_RUNNING], 1
439
        je      @f
440
        ; there are still active devices, find one and make it default
441
        xor     eax, eax
442
        mov     ecx, MAX_NET_DEVICES
443
        mov     edi, NET_DRV_LIST
444
        repe    scasd
445
        je      @f
446
        shr     edi, 2
447
        dec     edi
448
        mov     [NET_DEFAULT], edi
2220 hidnplayr 449
       @@:
450
 
1514 hidnplayr 451
;----------------------------
452
; Find the driver in the list
453
 
2366 hidnplayr 454
        mov     eax, ebx
455
        mov     ecx, MAX_NET_DEVICES
456
        mov     edi, NET_DRV_LIST+4
1514 hidnplayr 457
 
2366 hidnplayr 458
        repne   scasd
459
        jnz     .error
1514 hidnplayr 460
 
461
;------------------------
462
; Remove it from the list
463
 
2366 hidnplayr 464
        xor     eax, eax
465
        mov     dword [edi-4], eax
1514 hidnplayr 466
 
3340 hidnplayr 467
        call    NET_send_event
468
 
2366 hidnplayr 469
        dec     [NET_RUNNING]
470
        ret
1514 hidnplayr 471
 
472
  .error:
2366 hidnplayr 473
        or      eax, -1
474
        ret
1514 hidnplayr 475
 
476
 
477
 
478
;-----------------------------------------------------------------
479
;
480
; NET_ptr_to_num
481
;
482
; IN:  ebx = ptr to device struct
483
; OUT: edi = -1 on error, device number otherwise
484
;
485
;-----------------------------------------------------------------
486
align 4
487
NET_ptr_to_num:
2366 hidnplayr 488
        push    ecx
1514 hidnplayr 489
 
2366 hidnplayr 490
        mov     ecx, MAX_NET_DEVICES
491
        mov     edi, NET_DRV_LIST
1514 hidnplayr 492
 
493
  .loop:
2366 hidnplayr 494
        cmp     ebx, [edi]
495
        jz      .found
496
        add     edi, 4
497
        dec     ecx
498
        jnz     .loop
1514 hidnplayr 499
 
2366 hidnplayr 500
        ; repnz  scasd could work too if eax is used instead of ebx!
1514 hidnplayr 501
 
2366 hidnplayr 502
        or      edi, -1
1514 hidnplayr 503
 
2366 hidnplayr 504
        pop     ecx
505
        ret
1514 hidnplayr 506
 
507
  .found:
2366 hidnplayr 508
        sub     edi, NET_DRV_LIST
509
        shr     edi, 2
1514 hidnplayr 510
 
2366 hidnplayr 511
        pop     ecx
512
        ret
1514 hidnplayr 513
 
514
;-----------------------------------------------------------------
515
;
1249 hidnplayr 516
; checksum_1
517
;
1482 hidnplayr 518
;  This is the first of two functions needed to calculate a checksum.
1249 hidnplayr 519
;
1473 hidnplayr 520
;  IN:  edx = start offset for semi-checksum
1249 hidnplayr 521
;       esi = pointer to data
522
;       ecx = data size
523
;  OUT: edx = semi-checksum
524
;
1473 hidnplayr 525
;
526
; Code was optimized by diamond
527
;
1249 hidnplayr 528
;-----------------------------------------------------------------
529
align 4
530
checksum_1:
1159 hidnplayr 531
 
2366 hidnplayr 532
        shr     ecx, 1
533
        pushf
534
        jz      .no_2
1159 hidnplayr 535
 
2366 hidnplayr 536
        shr     ecx, 1
537
        pushf
538
        jz      .no_4
1473 hidnplayr 539
 
2366 hidnplayr 540
        shr     ecx, 1
541
        pushf
542
        jz      .no_8
1473 hidnplayr 543
 
544
  .loop:
2366 hidnplayr 545
        add     dl, [esi+1]
546
        adc     dh, [esi+0]
1473 hidnplayr 547
 
2366 hidnplayr 548
        adc     dl, [esi+3]
549
        adc     dh, [esi+2]
1473 hidnplayr 550
 
2366 hidnplayr 551
        adc     dl, [esi+5]
552
        adc     dh, [esi+4]
1473 hidnplayr 553
 
2366 hidnplayr 554
        adc     dl, [esi+7]
555
        adc     dh, [esi+6]
1473 hidnplayr 556
 
2366 hidnplayr 557
        adc     edx, 0
558
        add     esi, 8
1473 hidnplayr 559
 
2366 hidnplayr 560
        dec     ecx
561
        jnz     .loop
1473 hidnplayr 562
 
2366 hidnplayr 563
        adc     edx, 0
1473 hidnplayr 564
 
565
  .no_8:
2366 hidnplayr 566
        popf
567
        jnc     .no_4
1473 hidnplayr 568
 
2366 hidnplayr 569
        add     dl, [esi+1]
570
        adc     dh, [esi+0]
1473 hidnplayr 571
 
2366 hidnplayr 572
        adc     dl, [esi+3]
573
        adc     dh, [esi+2]
1473 hidnplayr 574
 
2366 hidnplayr 575
        adc     edx, 0
576
        add     esi, 4
1473 hidnplayr 577
 
578
  .no_4:
2366 hidnplayr 579
        popf
580
        jnc     .no_2
1473 hidnplayr 581
 
2366 hidnplayr 582
        add     dl, [esi+1]
583
        adc     dh, [esi+0]
1473 hidnplayr 584
 
2366 hidnplayr 585
        adc     edx, 0
586
        inc     esi
587
        inc     esi
1473 hidnplayr 588
 
589
  .no_2:
2366 hidnplayr 590
        popf
591
        jnc     .end
1159 hidnplayr 592
 
2366 hidnplayr 593
        add     dh, [esi+0]
594
        adc     edx, 0
1473 hidnplayr 595
  .end:
2366 hidnplayr 596
        ret
1159 hidnplayr 597
 
1249 hidnplayr 598
;-----------------------------------------------------------------
599
;
600
; checksum_2
601
;
602
;  This function calculates the final ip/tcp/udp checksum for you
603
;
604
;  IN:  edx = semi-checksum
605
;  OUT: dx = checksum (in INET byte order)
606
;
607
;-----------------------------------------------------------------
608
align 4
609
checksum_2:
610
 
2366 hidnplayr 611
        mov     ecx, edx
612
        shr     ecx, 16
613
        and     edx, 0xffff
614
        add     edx, ecx
1249 hidnplayr 615
 
2366 hidnplayr 616
        mov     ecx, edx
617
        shr     ecx, 16
618
        add     dx, cx
619
        test    dx, dx          ; it seems that ZF is not set when CF is set :(
620
        not     dx
621
        jnz     .not_zero
622
        dec     dx
1249 hidnplayr 623
  .not_zero:
2366 hidnplayr 624
        xchg    dl, dh
1249 hidnplayr 625
 
3251 hidnplayr 626
        DEBUGF  1,"Checksum: %x\n", dx
1249 hidnplayr 627
 
2366 hidnplayr 628
        ret
1249 hidnplayr 629
 
630
 
631
 
1159 hidnplayr 632
;----------------------------------------------------------------
633
;
3146 hidnplayr 634
;  System function to work with network devices (75)
1159 hidnplayr 635
;
636
;----------------------------------------------------------------
637
align 4
2366 hidnplayr 638
sys_network:                    ; FIXME: make default device easily accessible
1159 hidnplayr 639
 
2366 hidnplayr 640
        cmp     ebx, -1
641
        jne     @f
1196 hidnplayr 642
 
2366 hidnplayr 643
        mov     eax, [NET_RUNNING]
644
        jmp     .return
1196 hidnplayr 645
 
646
   @@:
2366 hidnplayr 647
        cmp     bh, MAX_NET_DEVICES             ; Check if device number exists
648
        jae     .doesnt_exist
1159 hidnplayr 649
 
2366 hidnplayr 650
        mov     esi, ebx
651
        and     esi, 0x0000ff00
652
        shr     esi, 6
1159 hidnplayr 653
 
2366 hidnplayr 654
        cmp     dword [esi + NET_DRV_LIST], 0   ; check if driver is running
655
        je      .doesnt_exist
1159 hidnplayr 656
 
2621 hidnplayr 657
        mov     eax, [esi + NET_DRV_LIST]
2220 hidnplayr 658
 
2621 hidnplayr 659
        and     ebx, 0x000000ff
660
        cmp     ebx, .number
661
        ja      .doesnt_exist
662
        jmp     dword [.table + 4*ebx]
2220 hidnplayr 663
 
2621 hidnplayr 664
  .table:
665
        dd      .get_type               ; 0
666
        dd      .get_dev_name           ; 1
667
        dd      .reset                  ; 2
668
        dd      .stop                   ; 3
669
        dd      .get_ptr                ; 4
670
        dd      .get_drv_name           ; 5
671
        dd      .set_default            ; 6
672
  .number = ($ - .table) / 4 - 1
1514 hidnplayr 673
 
2621 hidnplayr 674
  .get_type:                            ; 0 = Get device type (ethernet/token ring/...)
675
 
676
        mov     eax, [eax + NET_DEVICE.type]
2366 hidnplayr 677
        jmp     .return
1159 hidnplayr 678
 
679
 
2621 hidnplayr 680
  .get_dev_name:                        ; 1 = Get device name
1159 hidnplayr 681
 
2621 hidnplayr 682
        mov     esi, [eax + NET_DEVICE.name]
2366 hidnplayr 683
        mov     edi, ecx
1159 hidnplayr 684
 
2621 hidnplayr 685
        mov     ecx, 64/4 ; max length
686
        rep     movsd
1159 hidnplayr 687
 
2366 hidnplayr 688
        xor     eax, eax
689
        jmp     .return
1159 hidnplayr 690
 
2621 hidnplayr 691
  .reset:                               ; 2 = Reset the device
1159 hidnplayr 692
 
2621 hidnplayr 693
        call    [eax + NET_DEVICE.reset]
2366 hidnplayr 694
        jmp     .return
1192 hidnplayr 695
 
2621 hidnplayr 696
  .stop:                                ; 3 = Stop driver for this device
1192 hidnplayr 697
 
2621 hidnplayr 698
        call    [eax + NET_DEVICE.unload]
2366 hidnplayr 699
        jmp     .return
1192 hidnplayr 700
 
701
 
2621 hidnplayr 702
  .get_ptr:                             ; 4 = Get driver pointer
703
 
2366 hidnplayr 704
        jmp     .return
1249 hidnplayr 705
 
706
 
2621 hidnplayr 707
  .get_drv_name:                        ; 5 = Get driver name
1249 hidnplayr 708
 
2366 hidnplayr 709
        xor     eax, eax
710
        jmp     .return
2220 hidnplayr 711
 
712
 
2621 hidnplayr 713
  .set_default:                         ; 6 = Set default device
2220 hidnplayr 714
 
2366 hidnplayr 715
        call    NET_set_default
716
        jmp     .return
2220 hidnplayr 717
 
1159 hidnplayr 718
  .doesnt_exist:
2366 hidnplayr 719
        mov     eax, -1
1159 hidnplayr 720
 
1192 hidnplayr 721
  .return:
2621 hidnplayr 722
        mov     [esp+32], eax
2366 hidnplayr 723
        ret
1159 hidnplayr 724
 
725
 
726
;----------------------------------------------------------------
727
;
2731 hidnplayr 728
;  System function to work with protocols  (76)
1159 hidnplayr 729
;
730
;----------------------------------------------------------------
731
align 4
732
sys_protocols:
2366 hidnplayr 733
        cmp     bh, MAX_NET_DEVICES             ; Check if device number exists
734
        jae     .doesnt_exist
1159 hidnplayr 735
 
2366 hidnplayr 736
        mov     esi, ebx
737
        and     esi, 0x0000ff00
738
        shr     esi, 6                          ; now we have the device num * 4 in esi
739
        cmp     [esi + NET_DRV_LIST], 0         ; check if driver is running
740
        je      .doesnt_exist
1159 hidnplayr 741
 
2366 hidnplayr 742
        push    .return                         ; return address (we will be using jumps instead of calls)
1159 hidnplayr 743
 
2366 hidnplayr 744
        mov     eax, ebx                        ; set ax to protocol number
745
        shr     eax, 16                         ;
1159 hidnplayr 746
 
2731 hidnplayr 747
        cmp     ax, API_ETH
748
        je      ETH_api
749
 
750
        cmp     ax, API_IPv4
2614 hidnplayr 751
        je      IPv4_api
1159 hidnplayr 752
 
2731 hidnplayr 753
        cmp     ax, API_ICMP
2614 hidnplayr 754
        je      ICMP_api
1159 hidnplayr 755
 
2731 hidnplayr 756
        cmp     ax, API_UDP
2614 hidnplayr 757
        je      UDP_api
1159 hidnplayr 758
 
2731 hidnplayr 759
        cmp     ax, API_TCP
2614 hidnplayr 760
        je      TCP_api
1159 hidnplayr 761
 
2731 hidnplayr 762
        cmp     ax, API_ARP
2614 hidnplayr 763
        je      ARP_api
1159 hidnplayr 764
 
2931 hidnplayr 765
        cmp     ax, API_PPPOE
766
        je      PPPoE_api
2614 hidnplayr 767
 
3185 hidnplayr 768
        cmp     ax, API_IPv6
769
        je      IPv6_api
770
 
2366 hidnplayr 771
        add     esp, 4                           ; if we reached here, no function was called, so we need to balance stack
1159 hidnplayr 772
 
773
  .doesnt_exist:
2366 hidnplayr 774
        mov     eax, -1
1159 hidnplayr 775
 
776
  .return:
2614 hidnplayr 777
        mov     [esp+28+4], eax                 ; return eax value to the program
2366 hidnplayr 778
        ret