Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1196 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
1514 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved.    ;;
1196 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
6
;;  ARP.INC                                                        ;;
7
;;                                                                 ;;
8
;;  Part of the tcp/ip network stack for KolibriOS                 ;;
9
;;                                                                 ;;
10
;;  Based on the work of [Johnny_B] and [smb]                      ;;
11
;;                                                                 ;;
12
;;    Written by hidnplayr@kolibrios.org                           ;;
13
;;                                                                 ;;
14
;;          GNU GENERAL PUBLIC LICENSE                             ;;
1529 hidnplayr 15
;;             Version 2, June- 1991                               ;;
1196 hidnplayr 16
;;                                                                 ;;
17
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1159 hidnplayr 18
 
1206 hidnplayr 19
$Revision: 2555 $
1159 hidnplayr 20
 
2311 hidnplayr 21
ARP_NO_ENTRY            equ 0
22
ARP_VALID_MAPPING       equ 1
23
ARP_AWAITING_RESPONSE   equ 2
24
ARP_RESPONSE_TIMEOUT    equ 3
1159 hidnplayr 25
 
2311 hidnplayr 26
ARP_REQUEST_TTL         equ 31          ; 20 s
27
ARP_ENTRY_TTL           equ 937         ; 600 s
28
ARP_STATIC_ENTRY        equ -1
1159 hidnplayr 29
 
2311 hidnplayr 30
ARP_REQ_OPCODE          equ 0x0100      ; request
31
ARP_REP_OPCODE          equ 0x0200      ; reply
1196 hidnplayr 32
 
2311 hidnplayr 33
ARP_TABLE_SIZE          equ 20          ; Size of table
1159 hidnplayr 34
 
2305 hidnplayr 35
struct ARP_entry
36
 
2311 hidnplayr 37
       IP               dd ?
38
       MAC              dp ?
39
       Status           dw ?
40
       TTL              dw ?
2305 hidnplayr 41
 
1159 hidnplayr 42
ends
43
 
2305 hidnplayr 44
struct ARP_header
45
 
2311 hidnplayr 46
       HardwareType     dw ?
47
       ProtocolType     dw ?
48
       HardwareSize     db ?
49
       ProtocolSize     db ?
50
       Opcode           dw ?
51
       SenderMAC        dp ?
52
       SenderIP         dd ?
53
       TargetMAC        dp ?
54
       TargetIP         dd ?
2305 hidnplayr 55
 
1159 hidnplayr 56
ends
57
 
58
align 4
59
uglobal
60
 
2311 hidnplayr 61
        NumARP          dd ?
1258 hidnplayr 62
 
2311 hidnplayr 63
        ARP_table       rb ARP_TABLE_SIZE * sizeof.ARP_entry
1159 hidnplayr 64
 
2311 hidnplayr 65
        ARP_PACKETS_TX  rd MAX_NET_DEVICES
66
        ARP_PACKETS_RX  rd MAX_NET_DEVICES
1159 hidnplayr 67
 
68
 
69
endg
70
 
71
 
72
 
1196 hidnplayr 73
;-----------------------------------------------------------------
74
;
75
; ARP_init
76
;
77
;  This function resets all ARP variables
78
;
79
;-----------------------------------------------------------------
1529 hidnplayr 80
macro ARP_init {
1159 hidnplayr 81
 
2311 hidnplayr 82
        xor     eax, eax
83
        mov     [NumARP], eax
1159 hidnplayr 84
 
2311 hidnplayr 85
        mov     edi, ARP_PACKETS_TX
86
        mov     ecx, 2*MAX_NET_DEVICES
87
        rep     stosd
1159 hidnplayr 88
 
1529 hidnplayr 89
}
1159 hidnplayr 90
 
1529 hidnplayr 91
;---------------------------------------------------------------------------
1159 hidnplayr 92
;
1529 hidnplayr 93
; ARP_decrease_entry_ttls
1159 hidnplayr 94
;
1529 hidnplayr 95
;---------------------------------------------------------------------------
1159 hidnplayr 96
 
1529 hidnplayr 97
macro ARP_decrease_entry_ttls {
1159 hidnplayr 98
 
2311 hidnplayr 99
local   .loop
100
local   .exit
1159 hidnplayr 101
 
1529 hidnplayr 102
; The TTL field is decremented every second, and is deleted when it reaches 0.
103
; It is refreshed every time a packet is received.
104
; If the TTL field is 0xFFFF it is a static entry and is never deleted.
105
; The status field can be the following values:
106
; 0x0000  entry not used
107
; 0x0001  entry holds a valid mapping
108
; 0x0002  entry contains an IP address, awaiting ARP response
109
; 0x0003  No response received to ARP request.
110
; The last status value is provided to allow the network layer to delete
111
; a packet that is queued awaiting an ARP response
1159 hidnplayr 112
 
2311 hidnplayr 113
        mov     ecx, [NumARP]
114
        test    ecx, ecx
115
        jz      .exit
1206 hidnplayr 116
 
2311 hidnplayr 117
        mov     esi, ARP_table
1529 hidnplayr 118
  .loop:
2311 hidnplayr 119
        cmp     [esi + ARP_entry.TTL], ARP_STATIC_ENTRY
120
        je      .next
1206 hidnplayr 121
 
2311 hidnplayr 122
        dec     [esi + ARP_entry.TTL]
123
        jz      .time_out
1159 hidnplayr 124
 
1529 hidnplayr 125
  .next:
2311 hidnplayr 126
        add     esi, sizeof.ARP_entry
127
        dec     ecx
128
        jnz     .loop
129
        jmp     .exit
1159 hidnplayr 130
 
1529 hidnplayr 131
  .time_out:
2311 hidnplayr 132
        cmp     [esi + ARP_entry.Status], ARP_AWAITING_RESPONSE
133
        je      .response_timeout
1159 hidnplayr 134
 
2311 hidnplayr 135
        push    esi ecx
136
        call    ARP_del_entry
137
        pop     ecx esi
1159 hidnplayr 138
 
2311 hidnplayr 139
        jmp     .next
1159 hidnplayr 140
 
1529 hidnplayr 141
  .response_timeout:
2311 hidnplayr 142
        mov     [esi + ARP_entry.Status], ARP_RESPONSE_TIMEOUT
143
        mov     [esi + ARP_entry.TTL], 10
1159 hidnplayr 144
 
2311 hidnplayr 145
        jmp     .next
1258 hidnplayr 146
 
1529 hidnplayr 147
  .exit:
1258 hidnplayr 148
 
1529 hidnplayr 149
}
1159 hidnplayr 150
 
1258 hidnplayr 151
 
1529 hidnplayr 152
;-----------------------------------------------------------------
153
;
154
; ARP_input
155
;
156
;  IN:  Pointer to buffer in [esp]
157
;       size of buffer in [esp+4]
158
;       packet size (without ethernet header) in ecx
159
;  OUT: /
160
;
161
;-----------------------------------------------------------------
162
align 4
163
ARP_input:
1258 hidnplayr 164
 
2555 hidnplayr 165
        DEBUGF  1,"ARP_input - start\n"
2311 hidnplayr 166
        cmp     ecx, sizeof.ARP_header
167
        jb      .exit
1258 hidnplayr 168
 
1529 hidnplayr 169
;---------------------
170
; Handle Reply packets
1258 hidnplayr 171
 
2311 hidnplayr 172
        cmp     [edx + ARP_header.Opcode], ARP_REP_OPCODE
173
        jne     .maybe_request
1159 hidnplayr 174
 
2555 hidnplayr 175
        DEBUGF  1,"ARP_input - it's a reply packet from %u.%u.%u.%u\n",\
2311 hidnplayr 176
        [edx + ARP_header.SenderIP]:1, [edx + ARP_header.SenderIP+1]:1, [edx + ARP_header.SenderIP+2]:1, [edx + ARP_header.SenderIP+3]:1
1159 hidnplayr 177
 
2311 hidnplayr 178
        mov     ecx, [NumARP]
179
        test    ecx, ecx
180
        jz      .exit
1159 hidnplayr 181
 
2311 hidnplayr 182
        mov     eax, [edx + ARP_header.SenderIP]
183
        mov     esi, ARP_table
1196 hidnplayr 184
 
1529 hidnplayr 185
  .loop:
2311 hidnplayr 186
        cmp     [esi + ARP_entry.IP], eax
187
        je      .gotit
188
        add     esi, sizeof.ARP_entry
189
        dec     ecx
190
        jnz     .loop
1258 hidnplayr 191
 
2311 hidnplayr 192
        jmp     .exit
1159 hidnplayr 193
 
1529 hidnplayr 194
  .gotit:
2555 hidnplayr 195
        DEBUGF  1,"ARP_input - found matching entry\n"
1159 hidnplayr 196
 
2311 hidnplayr 197
        cmp     [esi + ARP_entry.TTL], ARP_STATIC_ENTRY         ; if it is a static entry, dont touch it
198
        je      .exit
1159 hidnplayr 199
 
2555 hidnplayr 200
        DEBUGF  1,"ARP_input - updating entry\n"
1159 hidnplayr 201
 
2311 hidnplayr 202
        mov     [esi + ARP_entry.Status], ARP_VALID_MAPPING
203
        mov     [esi + ARP_entry.TTL], ARP_ENTRY_TTL
1529 hidnplayr 204
 
2311 hidnplayr 205
        mov     eax, dword [edx + ARP_header.SenderMAC]
206
        mov     dword [esi+ARP_entry.MAC], eax
207
        mov     ax , word [edx + ARP_header.SenderMAC + 4]
208
        mov     word [esi+ARP_entry.MAC+4], ax
1529 hidnplayr 209
 
2311 hidnplayr 210
        jmp     .exit
1529 hidnplayr 211
 
212
 
213
;-----------------------
214
; Handle Request packets
215
 
216
  .maybe_request:
2311 hidnplayr 217
        cmp     [edx + ARP_header.Opcode], ARP_REQ_OPCODE
218
        jne     .exit
1529 hidnplayr 219
 
2311 hidnplayr 220
        call    NET_ptr_to_num
221
        cmp     edi, -1
222
        jz      .exit
223
        DEBUGF  1,"ARP Request packet through device: %u\n", edi
224
        inc     [ARP_PACKETS_RX+4*edi]
1159 hidnplayr 225
 
2311 hidnplayr 226
        mov     eax, [IP_LIST+4*edi]
227
        cmp     eax, [edx + ARP_header.TargetIP]                ; Is it looking for my IP address?
228
        jne     .exit                                           ; TODO: instead of quitting, update local entrys with matching IP's ?
1159 hidnplayr 229
 
2311 hidnplayr 230
        push    eax
231
        push    edi
1206 hidnplayr 232
 
1529 hidnplayr 233
; OK, it is a request for one of our MAC addresses.
234
; Build the frame and send it. We can reuse the buffer.  (faster then using ARP_create_packet)
235
 
2311 hidnplayr 236
        lea     esi, [edx + ARP_header.SenderMAC]
237
        lea     edi, [edx + ARP_header.TargetMAC]
238
        movsd                                                   ; Move Sender Mac to Dest MAC
239
        movsw                                                   ;
240
        movsd                                                   ; Move sender IP to Dest IP
1529 hidnplayr 241
 
2311 hidnplayr 242
        pop     esi
243
        mov     esi, [NET_DRV_LIST + 4*esi]
244
        lea     esi, [esi + ETH_DEVICE.mac]
245
        lea     edi, [edx + ARP_header.SenderMAC]
246
        movsd                                                   ; Copy MAC address from in MAC_LIST
247
        movsw                                                   ;
248
        pop     eax
249
        stosd                                                   ; Write our IP
1159 hidnplayr 250
 
2311 hidnplayr 251
        mov     [edx + ARP_header.Opcode], ARP_REP_OPCODE
1159 hidnplayr 252
 
1529 hidnplayr 253
; Now, Fill in ETHERNET header
254
 
2311 hidnplayr 255
        mov     edi, [esp]
256
        lea     esi, [edx + ARP_header.TargetMAC]
257
        movsd
258
        movsw
259
        lea     esi, [edx + ARP_header.SenderMAC]
260
        movsd
261
        movsw
1529 hidnplayr 262
;        mov     ax , ETHER_ARP
263
;        stosw
264
 
2555 hidnplayr 265
        DEBUGF  1,"ARP_input - Sending reply \n"
1529 hidnplayr 266
 
2311 hidnplayr 267
        call    [ebx + NET_DEVICE.transmit]
268
        ret
1159 hidnplayr 269
 
1529 hidnplayr 270
     .exit:
2311 hidnplayr 271
        call    kernel_free
272
        add     esp, 4                                          ; pop (balance stack)
1529 hidnplayr 273
 
2555 hidnplayr 274
        DEBUGF  1,"ARP_input - exiting\n"
2311 hidnplayr 275
        ret
1159 hidnplayr 276
 
277
 
1185 hidnplayr 278
;---------------------------------------------------------------------------
279
;
1529 hidnplayr 280
; ARP_output_request
1185 hidnplayr 281
;
1529 hidnplayr 282
; IN:  ip in eax
1185 hidnplayr 283
; OUT: /
284
;
285
;---------------------------------------------------------------------------
286
align 4
1529 hidnplayr 287
ARP_output_request:
1185 hidnplayr 288
 
2311 hidnplayr 289
        DEBUGF 1,"Create ARP Packet\n"
1185 hidnplayr 290
 
2311 hidnplayr 291
        call    IPv4_dest_to_dev
292
        push    eax                             ; DestIP
293
        pushd   [IP_LIST+edi]                   ; SenderIP
1185 hidnplayr 294
 
2311 hidnplayr 295
        mov     ebx, [NET_DRV_LIST+edi]         ; device ptr
1185 hidnplayr 296
 
2311 hidnplayr 297
        lea     eax, [ebx + ETH_DEVICE.mac]     ; local device mac
298
        mov     edx, ETH_BROADCAST              ; broadcast mac
299
        mov     ecx, sizeof.ARP_header
300
        mov     di, ETHER_ARP
301
        call    ETH_output
302
        jz      .exit
1185 hidnplayr 303
 
2311 hidnplayr 304
        mov     ecx, eax
1185 hidnplayr 305
 
2311 hidnplayr 306
        mov     [edi + ARP_header.HardwareType], 0x0100         ; Ethernet
307
        mov     [edi + ARP_header.ProtocolType], 0x0008         ; IP
308
        mov     [edi + ARP_header.HardwareSize], 6              ; MAC-addr length
309
        mov     [edi + ARP_header.ProtocolSize], 4              ; IP-addr length
310
        mov     [edi + ARP_header.Opcode], ARP_REQ_OPCODE       ; Request
1185 hidnplayr 311
 
2311 hidnplayr 312
        add     edi, ARP_header.SenderMAC
1185 hidnplayr 313
 
2311 hidnplayr 314
        lea     esi, [ebx + ETH_DEVICE.mac]     ; SenderMac
315
        movsw                                   ;
316
        movsd                                   ;
317
        pop     eax                             ; SenderIP
318
        stosd                                   ;
1185 hidnplayr 319
 
2311 hidnplayr 320
        mov     eax, -1                         ; DestMac
321
        stosd                                   ;
322
        stosw                                   ;
323
        pop     eax                             ; DestIP
324
        stosd                                   ;
1185 hidnplayr 325
 
2311 hidnplayr 326
        DEBUGF 1,"ARP Packet for device %x created successfully\n", ebx
1185 hidnplayr 327
 
2311 hidnplayr 328
        push    edx ecx
329
        call    [ebx + NET_DEVICE.transmit]
330
        ret
1185 hidnplayr 331
 
1529 hidnplayr 332
  .exit:
2311 hidnplayr 333
        add     esp, 4+4
334
        DEBUGF  1,"Create ARP Packet - failed\n"
335
        sub     eax, eax
336
        ret
1185 hidnplayr 337
 
338
 
1257 hidnplayr 339
;-----------------------------------------------------------------
1196 hidnplayr 340
;
341
; ARP_add_entry (or update)
342
;
1529 hidnplayr 343
; IN:  esi = ptr to entry (can easily be made on the stack)
1196 hidnplayr 344
; OUT: eax = entry #, -1 on error
345
;
1257 hidnplayr 346
;-----------------------------------------------------------------   ; TODO: use a mutex
1196 hidnplayr 347
align 4
348
ARP_add_entry:
349
 
2311 hidnplayr 350
        DEBUGF 1,"ARP add entry: "
1206 hidnplayr 351
 
2311 hidnplayr 352
        mov     ecx, [NumARP]
353
        test    ecx, ecx                ; first entry?
354
        jz      .add
355
        cmp     ecx, ARP_TABLE_SIZE     ; list full ?
356
        jae     .error
1196 hidnplayr 357
 
2311 hidnplayr 358
        mov     eax, dword [esi + ARP_entry.MAC]
359
        mov     bx , word [esi + ARP_entry.MAC + 4]
360
        mov     edi, ARP_table
1196 hidnplayr 361
 
1529 hidnplayr 362
  .loop:
2311 hidnplayr 363
        cmp     dword [edi + ARP_entry.MAC], eax        ; Check for duplicate MAC's
364
        jne     .maybe_next                             ;
365
        cmp     word [edi + ARP_entry.MAC + 4], bx      ;
366
        jne     .maybe_next                             ;
1196 hidnplayr 367
 
2311 hidnplayr 368
        cmp     [edi + ARP_entry.TTL], ARP_STATIC_ENTRY
369
        jne     .notstatic
370
        cmp     [esi + ARP_entry.TTL], ARP_STATIC_ENTRY
371
        jne     .error
1529 hidnplayr 372
  .notstatic:
1196 hidnplayr 373
 
2311 hidnplayr 374
        neg     ecx
375
        add     ecx, [NumARP]
376
        jmp     .add
1196 hidnplayr 377
 
1529 hidnplayr 378
  .maybe_next:
2311 hidnplayr 379
        add     esi, sizeof.ARP_entry
380
        loop    .loop
1196 hidnplayr 381
 
2311 hidnplayr 382
        mov     ecx, [NumARP]
1529 hidnplayr 383
  .add:
2311 hidnplayr 384
        push    ecx
385
        imul    ecx, sizeof.ARP_entry
386
        lea     edi, [ecx + ARP_table]
387
        mov     ecx, sizeof.ARP_entry/2
388
        rep     movsw
1196 hidnplayr 389
 
2311 hidnplayr 390
        lea     esi, [edi - sizeof.ARP_entry]
391
        inc     [NumARP]
392
        pop     eax
393
        DEBUGF 1,"New entry created: %u\n", eax
1529 hidnplayr 394
 
395
  .exit:
2311 hidnplayr 396
        DEBUGF 1,"Exiting\n"
397
        ret
1196 hidnplayr 398
 
1529 hidnplayr 399
  .error:
2311 hidnplayr 400
        DEBUGF 1,"error! \n"
401
        mov     eax, -1
402
        ret
1196 hidnplayr 403
 
404
 
1257 hidnplayr 405
;-----------------------------------------------------------------
1185 hidnplayr 406
;
407
; ARP_del_entry
408
;
1529 hidnplayr 409
; IN:  esi = ptr to arp entry
1185 hidnplayr 410
; OUT: /
411
;
1257 hidnplayr 412
;-----------------------------------------------------------------
1185 hidnplayr 413
align 4
414
ARP_del_entry:
415
 
2311 hidnplayr 416
        DEBUGF 1,"ARP del entry %x, total entrys: %u\n", esi, [NumARP]
1206 hidnplayr 417
 
2311 hidnplayr 418
        mov     ecx, ARP_table + (ARP_TABLE_SIZE - 1) * sizeof.ARP_entry
419
        sub     ecx, esi
420
        shr     ecx, 1
1185 hidnplayr 421
 
2311 hidnplayr 422
        mov     edi, esi
423
        lea     esi, [edi + sizeof.ARP_entry]
424
        rep     movsw
1185 hidnplayr 425
 
2311 hidnplayr 426
        dec     [NumARP]
427
        DEBUGF 1,"ARP entry deleted\n"
1529 hidnplayr 428
 
2311 hidnplayr 429
        ret
1185 hidnplayr 430
 
431
 
432
 
433
 
1529 hidnplayr 434
 
1257 hidnplayr 435
;-----------------------------------------------------------------
1159 hidnplayr 436
;
1529 hidnplayr 437
; ARP_IP_to_MAC
1159 hidnplayr 438
;
1529 hidnplayr 439
;  This function translates an IP address to a MAC address
1159 hidnplayr 440
;
1529 hidnplayr 441
;  IN:  eax = IPv4 address
442
;  OUT: eax = -1 on error, -2 means request send
443
;      else, ax = first two bytes of mac (high 16 bits of eax will be 0)
444
;       ebx = last four bytes of mac
1159 hidnplayr 445
;
1257 hidnplayr 446
;-----------------------------------------------------------------
1159 hidnplayr 447
align 4
1529 hidnplayr 448
ARP_IP_to_MAC:
1159 hidnplayr 449
 
2555 hidnplayr 450
        DEBUGF 1,"ARP_IP_to_MAC: %u.%u", al, ah
451
        rol     eax, 16
452
        DEBUGF 1,".%u.%u\n", al, ah
453
        rol     eax, 16
1159 hidnplayr 454
 
2311 hidnplayr 455
        cmp     eax, 0xffffffff
456
        je      .broadcast
1159 hidnplayr 457
 
1529 hidnplayr 458
; if ((Remote IP & subnet_mask) == (local IP & subnet_mask ))
459
; destination is on same subnet
460
; else, destination is remote and must use a gateway
1206 hidnplayr 461
 
2311 hidnplayr 462
        call    IPv4_dest_to_dev
463
        mov     ebx, [IP_LIST + edi]
464
        and     ebx, [SUBNET_LIST + edi]
1159 hidnplayr 465
 
2311 hidnplayr 466
        mov     ecx, eax
467
        and     ecx, [SUBNET_LIST + edi]
1196 hidnplayr 468
 
2311 hidnplayr 469
        cmp     ecx, ebx
470
        je      .local
1196 hidnplayr 471
 
2311 hidnplayr 472
        mov     eax, [GATEWAY_LIST + edi]
473
        DEBUGF  1,"requested IP is not on subnet, using default gateway\n"
1196 hidnplayr 474
 
1529 hidnplayr 475
;--------------------------------
476
; Try to find the IP in ARP_table
1206 hidnplayr 477
 
1529 hidnplayr 478
  .local:
2311 hidnplayr 479
        mov     ecx, [NumARP]
480
        test    ecx, ecx
481
        jz      .not_in_list
482
        mov     esi, ARP_table + ARP_entry.IP
1529 hidnplayr 483
  .scan_loop:
2311 hidnplayr 484
        cmp     [esi], eax
485
        je      .found_it
486
        add     esi, sizeof.ARP_entry
487
        loop    .scan_loop
1206 hidnplayr 488
 
1529 hidnplayr 489
  .not_in_list:
2311 hidnplayr 490
        DEBUGF 1,"IP not found on list, preparing for ARP request\n"
1196 hidnplayr 491
 
1529 hidnplayr 492
;--------------------
493
; Send an ARP request
1196 hidnplayr 494
 
2311 hidnplayr 495
        push    eax
1159 hidnplayr 496
 
2311 hidnplayr 497
        pushw   ARP_REQUEST_TTL
498
        pushw   ARP_AWAITING_RESPONSE
499
        pushd   0
500
        pushw   0
501
        pushd   eax
502
        mov     esi, esp
503
        call    ARP_add_entry
504
        add     esp, sizeof.ARP_entry
1159 hidnplayr 505
 
2311 hidnplayr 506
        cmp     eax, -1
507
        je      .full
1159 hidnplayr 508
 
2311 hidnplayr 509
        mov     ecx, eax
510
        pop     eax
511
        push    ecx
512
        call    ARP_output_request
1159 hidnplayr 513
 
1530 hidnplayr 514
;; TODO: check if driver could transmit packet
515
 
2311 hidnplayr 516
        pop     esi
517
        imul    esi, sizeof.ARP_entry
518
        add     esi, ARP_table
1530 hidnplayr 519
 
2311 hidnplayr 520
        mov     ecx, 25
1530 hidnplayr 521
  .wait_loop:
2311 hidnplayr 522
        cmp     [esi + ARP_entry.Status], 1
523
        je      .got_it
524
        push    esi
525
        mov     esi, 10
526
        call    delay_ms
527
        pop     esi
528
        loop    .wait_loop
1530 hidnplayr 529
 
2311 hidnplayr 530
        mov     eax, -2         ; request send
531
        ret
1159 hidnplayr 532
 
1529 hidnplayr 533
  .found_it:
2311 hidnplayr 534
        DEBUGF  1,"found IP in ARPTable\n"
535
        cmp     [esi + ARP_entry.Status], 1
536
        jne     .invalid
1159 hidnplayr 537
 
1530 hidnplayr 538
  .got_it:
2311 hidnplayr 539
        movzx   eax, word [esi + ARP_entry.MAC]
540
        mov     ebx, dword[esi + ARP_entry.MAC+2]
541
        ret
1206 hidnplayr 542
 
1529 hidnplayr 543
  .invalid:
2311 hidnplayr 544
        mov     eax, -1
545
        ret
1159 hidnplayr 546
 
1529 hidnplayr 547
  .full:
2311 hidnplayr 548
        DEBUGF  1,"ARP table is full!\n"
549
        pop     eax
550
        mov     eax, -1
551
        ret
1159 hidnplayr 552
 
1529 hidnplayr 553
  .broadcast:
2311 hidnplayr 554
        mov     eax, 0x0000ffff
555
        mov     ebx, 0xffffffff
556
        ret
1159 hidnplayr 557
 
558
 
1257 hidnplayr 559
;-----------------------------------------------------------------
1159 hidnplayr 560
;
561
; ARP_API
562
;
563
; This function is called by system function 75
564
;
565
; IN:  subfunction number in bl
566
;      device number in bh
567
;      ecx, edx, .. depends on subfunction
568
;
1257 hidnplayr 569
; OUT:  ?
1159 hidnplayr 570
;
1257 hidnplayr 571
;-----------------------------------------------------------------
1159 hidnplayr 572
align 4
573
ARP_API:
574
 
2311 hidnplayr 575
        movzx   eax, bh
576
        shl     eax, 2
1159 hidnplayr 577
 
2311 hidnplayr 578
        test    bl, bl
579
        jz      .packets_tx     ; 0
580
        dec     bl
581
        jz      .packets_rx     ; 1
582
        dec     bl
583
        jz      .entries        ; 2
584
        dec     bl
585
        jz      .read           ; 3
586
        dec     bl
587
        jz      .write          ; 4
588
        dec     bl
589
        jz      .remove         ; 5
590
        dec     bl
1159 hidnplayr 591
 
592
.error:
2311 hidnplayr 593
        mov     eax, -1
594
        ret
1159 hidnplayr 595
 
596
.packets_tx:
2311 hidnplayr 597
        add     eax, ARP_PACKETS_TX
598
        mov     eax, [eax]
599
        ret
1159 hidnplayr 600
 
601
.packets_rx:
2311 hidnplayr 602
        add     eax, ARP_PACKETS_RX
603
        mov     eax, [eax]
604
        ret
1159 hidnplayr 605
 
606
.entries:
2311 hidnplayr 607
        mov     eax, [NumARP]
608
        ret
1159 hidnplayr 609
 
610
.read:
2311 hidnplayr 611
        cmp     ecx, [NumARP]
612
        jae     .error
613
        ; edi = pointer to buffer
614
        ; ecx = # entry
615
        imul    ecx, sizeof.ARP_entry
616
        add     ecx, ARP_table
617
        mov     esi, ecx
618
        mov     ecx, sizeof.ARP_entry/2
619
        rep     movsw
1200 hidnplayr 620
 
2311 hidnplayr 621
        xor     eax, eax
622
        ret
1159 hidnplayr 623
 
624
.write:
2311 hidnplayr 625
        ; esi = pointer to buffer
626
        call    ARP_add_entry        ;out: eax = entry number, -1 on error
627
        ret
1159 hidnplayr 628
 
629
.remove:
2311 hidnplayr 630
        ; ecx = # entry
631
        cmp     ecx, [NumARP]
632
        jae     .error
633
        imul    ecx, sizeof.ARP_entry
634
        lea     esi, [ARP_table + ecx]
635
        call    ARP_del_entry
636
        ret
1159 hidnplayr 637