Subversion Repositories Kolibri OS

Rev

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

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