Subversion Repositories Kolibri OS

Rev

Rev 2614 | 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: 2629 $
1159 hidnplayr 20
 
2614 hidnplayr 21
ARP_NO_ENTRY            = 0
22
ARP_VALID_MAPPING       = 1
23
ARP_AWAITING_RESPONSE   = 2
24
ARP_RESPONSE_TIMEOUT    = 3
1159 hidnplayr 25
 
2614 hidnplayr 26
ARP_REQUEST_TTL         = 31          ; 20 s
27
ARP_ENTRY_TTL           = 937         ; 600 s
28
ARP_STATIC_ENTRY        = -1
1159 hidnplayr 29
 
2614 hidnplayr 30
ARP_REQ_OPCODE          = 0x0100      ; request
31
ARP_REP_OPCODE          = 0x0200      ; reply
1196 hidnplayr 32
 
2614 hidnplayr 33
ARP_TABLE_SIZE          = 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
2629 hidnplayr 159
;       packet ptr in edx
1529 hidnplayr 160
;  OUT: /
161
;
162
;-----------------------------------------------------------------
163
align 4
164
ARP_input:
1258 hidnplayr 165
 
2555 hidnplayr 166
        DEBUGF  1,"ARP_input - start\n"
2311 hidnplayr 167
        cmp     ecx, sizeof.ARP_header
168
        jb      .exit
1258 hidnplayr 169
 
1529 hidnplayr 170
;---------------------
171
; Handle Reply packets
1258 hidnplayr 172
 
2311 hidnplayr 173
        cmp     [edx + ARP_header.Opcode], ARP_REP_OPCODE
174
        jne     .maybe_request
1159 hidnplayr 175
 
2555 hidnplayr 176
        DEBUGF  1,"ARP_input - it's a reply packet from %u.%u.%u.%u\n",\
2629 hidnplayr 177
        [edx + ARP_header.SenderIP]:1, [edx + ARP_header.SenderIP+1]:1,\
178
        [edx + ARP_header.SenderIP+2]:1, [edx + ARP_header.SenderIP+3]:1
1159 hidnplayr 179
 
2311 hidnplayr 180
        mov     ecx, [NumARP]
181
        test    ecx, ecx
182
        jz      .exit
1159 hidnplayr 183
 
2311 hidnplayr 184
        mov     eax, [edx + ARP_header.SenderIP]
185
        mov     esi, ARP_table
1196 hidnplayr 186
 
1529 hidnplayr 187
  .loop:
2311 hidnplayr 188
        cmp     [esi + ARP_entry.IP], eax
189
        je      .gotit
190
        add     esi, sizeof.ARP_entry
191
        dec     ecx
192
        jnz     .loop
1258 hidnplayr 193
 
2311 hidnplayr 194
        jmp     .exit
1159 hidnplayr 195
 
1529 hidnplayr 196
  .gotit:
2555 hidnplayr 197
        DEBUGF  1,"ARP_input - found matching entry\n"
1159 hidnplayr 198
 
2311 hidnplayr 199
        cmp     [esi + ARP_entry.TTL], ARP_STATIC_ENTRY         ; if it is a static entry, dont touch it
200
        je      .exit
1159 hidnplayr 201
 
2555 hidnplayr 202
        DEBUGF  1,"ARP_input - updating entry\n"
1159 hidnplayr 203
 
2311 hidnplayr 204
        mov     [esi + ARP_entry.Status], ARP_VALID_MAPPING
205
        mov     [esi + ARP_entry.TTL], ARP_ENTRY_TTL
1529 hidnplayr 206
 
2311 hidnplayr 207
        mov     eax, dword [edx + ARP_header.SenderMAC]
208
        mov     dword [esi+ARP_entry.MAC], eax
2629 hidnplayr 209
        mov     cx, word [edx + ARP_header.SenderMAC + 4]
210
        mov     word [esi+ARP_entry.MAC+4], cx
1529 hidnplayr 211
 
2311 hidnplayr 212
        jmp     .exit
1529 hidnplayr 213
 
214
 
215
;-----------------------
216
; Handle Request packets
217
 
218
  .maybe_request:
2311 hidnplayr 219
        cmp     [edx + ARP_header.Opcode], ARP_REQ_OPCODE
220
        jne     .exit
1529 hidnplayr 221
 
2311 hidnplayr 222
        call    NET_ptr_to_num
223
        cmp     edi, -1
224
        jz      .exit
225
        DEBUGF  1,"ARP Request packet through device: %u\n", edi
226
        inc     [ARP_PACKETS_RX+4*edi]
1159 hidnplayr 227
 
2311 hidnplayr 228
        mov     eax, [IP_LIST+4*edi]
229
        cmp     eax, [edx + ARP_header.TargetIP]                ; Is it looking for my IP address?
2629 hidnplayr 230
        jne     .exit
1159 hidnplayr 231
 
2311 hidnplayr 232
        push    eax
233
        push    edi
1206 hidnplayr 234
 
1529 hidnplayr 235
; OK, it is a request for one of our MAC addresses.
236
; Build the frame and send it. We can reuse the buffer.  (faster then using ARP_create_packet)
237
 
2311 hidnplayr 238
        lea     esi, [edx + ARP_header.SenderMAC]
239
        lea     edi, [edx + ARP_header.TargetMAC]
240
        movsd                                                   ; Move Sender Mac to Dest MAC
241
        movsw                                                   ;
242
        movsd                                                   ; Move sender IP to Dest IP
1529 hidnplayr 243
 
2311 hidnplayr 244
        pop     esi
245
        mov     esi, [NET_DRV_LIST + 4*esi]
246
        lea     esi, [esi + ETH_DEVICE.mac]
247
        lea     edi, [edx + ARP_header.SenderMAC]
248
        movsd                                                   ; Copy MAC address from in MAC_LIST
249
        movsw                                                   ;
250
        pop     eax
251
        stosd                                                   ; Write our IP
1159 hidnplayr 252
 
2311 hidnplayr 253
        mov     [edx + ARP_header.Opcode], ARP_REP_OPCODE
1159 hidnplayr 254
 
1529 hidnplayr 255
; Now, Fill in ETHERNET header
256
 
2311 hidnplayr 257
        mov     edi, [esp]
258
        lea     esi, [edx + ARP_header.TargetMAC]
259
        movsd
260
        movsw
261
        lea     esi, [edx + ARP_header.SenderMAC]
262
        movsd
263
        movsw
2629 hidnplayr 264
;        mov     ax , ETHER_ARP                                 ; It's already there, I'm sure of it!
1529 hidnplayr 265
;        stosw
266
 
2555 hidnplayr 267
        DEBUGF  1,"ARP_input - Sending reply \n"
1529 hidnplayr 268
 
2311 hidnplayr 269
        call    [ebx + NET_DEVICE.transmit]
270
        ret
1159 hidnplayr 271
 
2629 hidnplayr 272
  .exit:
2311 hidnplayr 273
        call    kernel_free
274
        add     esp, 4                                          ; pop (balance stack)
1529 hidnplayr 275
 
2555 hidnplayr 276
        DEBUGF  1,"ARP_input - exiting\n"
2311 hidnplayr 277
        ret
1159 hidnplayr 278
 
279
 
1185 hidnplayr 280
;---------------------------------------------------------------------------
281
;
1529 hidnplayr 282
; ARP_output_request
1185 hidnplayr 283
;
1529 hidnplayr 284
; IN:  ip in eax
1185 hidnplayr 285
; OUT: /
286
;
287
;---------------------------------------------------------------------------
288
align 4
1529 hidnplayr 289
ARP_output_request:
1185 hidnplayr 290
 
2311 hidnplayr 291
        DEBUGF 1,"Create ARP Packet\n"
1185 hidnplayr 292
 
2311 hidnplayr 293
        call    IPv4_dest_to_dev
294
        push    eax                             ; DestIP
295
        pushd   [IP_LIST+edi]                   ; SenderIP
1185 hidnplayr 296
 
2311 hidnplayr 297
        mov     ebx, [NET_DRV_LIST+edi]         ; device ptr
1185 hidnplayr 298
 
2311 hidnplayr 299
        lea     eax, [ebx + ETH_DEVICE.mac]     ; local device mac
300
        mov     edx, ETH_BROADCAST              ; broadcast mac
301
        mov     ecx, sizeof.ARP_header
302
        mov     di, ETHER_ARP
303
        call    ETH_output
304
        jz      .exit
1185 hidnplayr 305
 
2311 hidnplayr 306
        mov     ecx, eax
1185 hidnplayr 307
 
2311 hidnplayr 308
        mov     [edi + ARP_header.HardwareType], 0x0100         ; Ethernet
309
        mov     [edi + ARP_header.ProtocolType], 0x0008         ; IP
310
        mov     [edi + ARP_header.HardwareSize], 6              ; MAC-addr length
311
        mov     [edi + ARP_header.ProtocolSize], 4              ; IP-addr length
312
        mov     [edi + ARP_header.Opcode], ARP_REQ_OPCODE       ; Request
1185 hidnplayr 313
 
2311 hidnplayr 314
        add     edi, ARP_header.SenderMAC
1185 hidnplayr 315
 
2311 hidnplayr 316
        lea     esi, [ebx + ETH_DEVICE.mac]     ; SenderMac
317
        movsw                                   ;
318
        movsd                                   ;
319
        pop     eax                             ; SenderIP
320
        stosd                                   ;
1185 hidnplayr 321
 
2311 hidnplayr 322
        mov     eax, -1                         ; DestMac
323
        stosd                                   ;
324
        stosw                                   ;
325
        pop     eax                             ; DestIP
326
        stosd                                   ;
1185 hidnplayr 327
 
2311 hidnplayr 328
        DEBUGF 1,"ARP Packet for device %x created successfully\n", ebx
1185 hidnplayr 329
 
2311 hidnplayr 330
        push    edx ecx
331
        call    [ebx + NET_DEVICE.transmit]
332
        ret
1185 hidnplayr 333
 
1529 hidnplayr 334
  .exit:
2311 hidnplayr 335
        add     esp, 4+4
336
        DEBUGF  1,"Create ARP Packet - failed\n"
337
        sub     eax, eax
338
        ret
1185 hidnplayr 339
 
340
 
1257 hidnplayr 341
;-----------------------------------------------------------------
1196 hidnplayr 342
;
343
; ARP_add_entry (or update)
344
;
1529 hidnplayr 345
; IN:  esi = ptr to entry (can easily be made on the stack)
1196 hidnplayr 346
; OUT: eax = entry #, -1 on error
347
;
1257 hidnplayr 348
;-----------------------------------------------------------------   ; TODO: use a mutex
1196 hidnplayr 349
align 4
350
ARP_add_entry:
351
 
2311 hidnplayr 352
        DEBUGF 1,"ARP add entry: "
1206 hidnplayr 353
 
2311 hidnplayr 354
        mov     ecx, [NumARP]
355
        test    ecx, ecx                ; first entry?
356
        jz      .add
357
        cmp     ecx, ARP_TABLE_SIZE     ; list full ?
358
        jae     .error
1196 hidnplayr 359
 
2311 hidnplayr 360
        mov     eax, dword [esi + ARP_entry.MAC]
361
        mov     bx , word [esi + ARP_entry.MAC + 4]
362
        mov     edi, ARP_table
1196 hidnplayr 363
 
1529 hidnplayr 364
  .loop:
2311 hidnplayr 365
        cmp     dword [edi + ARP_entry.MAC], eax        ; Check for duplicate MAC's
366
        jne     .maybe_next                             ;
367
        cmp     word [edi + ARP_entry.MAC + 4], bx      ;
368
        jne     .maybe_next                             ;
1196 hidnplayr 369
 
2311 hidnplayr 370
        cmp     [edi + ARP_entry.TTL], ARP_STATIC_ENTRY
371
        jne     .notstatic
372
        cmp     [esi + ARP_entry.TTL], ARP_STATIC_ENTRY
373
        jne     .error
1529 hidnplayr 374
  .notstatic:
1196 hidnplayr 375
 
2311 hidnplayr 376
        neg     ecx
377
        add     ecx, [NumARP]
378
        jmp     .add
1196 hidnplayr 379
 
1529 hidnplayr 380
  .maybe_next:
2311 hidnplayr 381
        add     esi, sizeof.ARP_entry
382
        loop    .loop
1196 hidnplayr 383
 
2311 hidnplayr 384
        mov     ecx, [NumARP]
1529 hidnplayr 385
  .add:
2311 hidnplayr 386
        push    ecx
387
        imul    ecx, sizeof.ARP_entry
388
        lea     edi, [ecx + ARP_table]
389
        mov     ecx, sizeof.ARP_entry/2
390
        rep     movsw
1196 hidnplayr 391
 
2311 hidnplayr 392
        lea     esi, [edi - sizeof.ARP_entry]
393
        inc     [NumARP]
394
        pop     eax
395
        DEBUGF 1,"New entry created: %u\n", eax
1529 hidnplayr 396
 
397
  .exit:
2311 hidnplayr 398
        DEBUGF 1,"Exiting\n"
399
        ret
1196 hidnplayr 400
 
1529 hidnplayr 401
  .error:
2311 hidnplayr 402
        DEBUGF 1,"error! \n"
403
        mov     eax, -1
404
        ret
1196 hidnplayr 405
 
406
 
1257 hidnplayr 407
;-----------------------------------------------------------------
1185 hidnplayr 408
;
409
; ARP_del_entry
410
;
1529 hidnplayr 411
; IN:  esi = ptr to arp entry
1185 hidnplayr 412
; OUT: /
413
;
1257 hidnplayr 414
;-----------------------------------------------------------------
1185 hidnplayr 415
align 4
416
ARP_del_entry:
417
 
2311 hidnplayr 418
        DEBUGF 1,"ARP del entry %x, total entrys: %u\n", esi, [NumARP]
1206 hidnplayr 419
 
2311 hidnplayr 420
        mov     ecx, ARP_table + (ARP_TABLE_SIZE - 1) * sizeof.ARP_entry
421
        sub     ecx, esi
422
        shr     ecx, 1
1185 hidnplayr 423
 
2311 hidnplayr 424
        mov     edi, esi
425
        lea     esi, [edi + sizeof.ARP_entry]
426
        rep     movsw
1185 hidnplayr 427
 
2311 hidnplayr 428
        dec     [NumARP]
429
        DEBUGF 1,"ARP entry deleted\n"
1529 hidnplayr 430
 
2311 hidnplayr 431
        ret
1185 hidnplayr 432
 
433
 
434
 
435
 
1529 hidnplayr 436
 
1257 hidnplayr 437
;-----------------------------------------------------------------
1159 hidnplayr 438
;
1529 hidnplayr 439
; ARP_IP_to_MAC
1159 hidnplayr 440
;
1529 hidnplayr 441
;  This function translates an IP address to a MAC address
1159 hidnplayr 442
;
1529 hidnplayr 443
;  IN:  eax = IPv4 address
444
;  OUT: eax = -1 on error, -2 means request send
445
;      else, ax = first two bytes of mac (high 16 bits of eax will be 0)
446
;       ebx = last four bytes of mac
1159 hidnplayr 447
;
1257 hidnplayr 448
;-----------------------------------------------------------------
1159 hidnplayr 449
align 4
1529 hidnplayr 450
ARP_IP_to_MAC:
1159 hidnplayr 451
 
2555 hidnplayr 452
        DEBUGF 1,"ARP_IP_to_MAC: %u.%u", al, ah
453
        rol     eax, 16
454
        DEBUGF 1,".%u.%u\n", al, ah
455
        rol     eax, 16
1159 hidnplayr 456
 
2311 hidnplayr 457
        cmp     eax, 0xffffffff
458
        je      .broadcast
1159 hidnplayr 459
 
1529 hidnplayr 460
; if ((Remote IP & subnet_mask) == (local IP & subnet_mask ))
461
; destination is on same subnet
462
; else, destination is remote and must use a gateway
1206 hidnplayr 463
 
2311 hidnplayr 464
        call    IPv4_dest_to_dev
465
        mov     ebx, [IP_LIST + edi]
466
        and     ebx, [SUBNET_LIST + edi]
1159 hidnplayr 467
 
2311 hidnplayr 468
        mov     ecx, eax
469
        and     ecx, [SUBNET_LIST + edi]
1196 hidnplayr 470
 
2311 hidnplayr 471
        cmp     ecx, ebx
472
        je      .local
1196 hidnplayr 473
 
2311 hidnplayr 474
        mov     eax, [GATEWAY_LIST + edi]
475
        DEBUGF  1,"requested IP is not on subnet, using default gateway\n"
1196 hidnplayr 476
 
1529 hidnplayr 477
;--------------------------------
478
; Try to find the IP in ARP_table
1206 hidnplayr 479
 
1529 hidnplayr 480
  .local:
2311 hidnplayr 481
        mov     ecx, [NumARP]
482
        test    ecx, ecx
483
        jz      .not_in_list
484
        mov     esi, ARP_table + ARP_entry.IP
1529 hidnplayr 485
  .scan_loop:
2311 hidnplayr 486
        cmp     [esi], eax
487
        je      .found_it
488
        add     esi, sizeof.ARP_entry
489
        loop    .scan_loop
1206 hidnplayr 490
 
1529 hidnplayr 491
  .not_in_list:
2311 hidnplayr 492
        DEBUGF 1,"IP not found on list, preparing for ARP request\n"
1196 hidnplayr 493
 
1529 hidnplayr 494
;--------------------
495
; Send an ARP request
1196 hidnplayr 496
 
2629 hidnplayr 497
        push    eax                     ; save IP for ARP_output_request
1159 hidnplayr 498
 
2629 hidnplayr 499
; Now create the ARP entry
500
        pushw   ARP_REQUEST_TTL         ; TTL
501
        pushw   ARP_AWAITING_RESPONSE   ; status
502
        pushd   0                       ; mac
2311 hidnplayr 503
        pushw   0
2629 hidnplayr 504
        pushd   eax                     ; ip
2311 hidnplayr 505
        mov     esi, esp
506
        call    ARP_add_entry
507
        add     esp, sizeof.ARP_entry
1159 hidnplayr 508
 
2311 hidnplayr 509
        cmp     eax, -1
510
        je      .full
1159 hidnplayr 511
 
2629 hidnplayr 512
; And send a request
2311 hidnplayr 513
        pop     eax
2629 hidnplayr 514
        call    ARP_output_request      ; IP in eax
1530 hidnplayr 515
;; TODO: check if driver could transmit packet
516
 
2629 hidnplayr 517
        mov     eax, -2                 ; request send
2311 hidnplayr 518
        ret
1159 hidnplayr 519
 
1529 hidnplayr 520
  .found_it:
2311 hidnplayr 521
        DEBUGF  1,"found IP in ARPTable\n"
2629 hidnplayr 522
        cmp     [esi + ARP_entry.Status], ARP_VALID_MAPPING
2311 hidnplayr 523
        jne     .invalid
1159 hidnplayr 524
 
2311 hidnplayr 525
        movzx   eax, word [esi + ARP_entry.MAC]
526
        mov     ebx, dword[esi + ARP_entry.MAC+2]
527
        ret
1206 hidnplayr 528
 
1529 hidnplayr 529
  .invalid:
2311 hidnplayr 530
        mov     eax, -1
531
        ret
1159 hidnplayr 532
 
1529 hidnplayr 533
  .full:
2311 hidnplayr 534
        DEBUGF  1,"ARP table is full!\n"
535
        pop     eax
536
        mov     eax, -1
537
        ret
1159 hidnplayr 538
 
1529 hidnplayr 539
  .broadcast:
2311 hidnplayr 540
        mov     eax, 0x0000ffff
541
        mov     ebx, 0xffffffff
542
        ret
1159 hidnplayr 543
 
544
 
1257 hidnplayr 545
;-----------------------------------------------------------------
1159 hidnplayr 546
;
547
; ARP_API
548
;
549
; This function is called by system function 75
550
;
551
; IN:  subfunction number in bl
552
;      device number in bh
553
;      ecx, edx, .. depends on subfunction
554
;
1257 hidnplayr 555
; OUT:  ?
1159 hidnplayr 556
;
1257 hidnplayr 557
;-----------------------------------------------------------------
1159 hidnplayr 558
align 4
2614 hidnplayr 559
ARP_api:
1159 hidnplayr 560
 
2311 hidnplayr 561
        movzx   eax, bh
562
        shl     eax, 2
1159 hidnplayr 563
 
2614 hidnplayr 564
        and     ebx, 0xff
565
        cmp     ebx, .number
566
        ja      .error
567
        jmp     dword [.table + 4*ebx]
1159 hidnplayr 568
 
2614 hidnplayr 569
  .table:
570
        dd      .packets_tx     ; 0
571
        dd      .packets_rx     ; 1
572
        dd      .entries        ; 2
573
        dd      .read           ; 3
574
        dd      .write          ; 4
575
        dd      .remove         ; 5
576
  .number = ($ - .table) / 4 - 1
577
 
578
  .error:
2311 hidnplayr 579
        mov     eax, -1
580
        ret
1159 hidnplayr 581
 
2614 hidnplayr 582
  .packets_tx:
583
        mov     eax, [ARP_PACKETS_TX + eax]
2311 hidnplayr 584
        ret
1159 hidnplayr 585
 
2614 hidnplayr 586
  .packets_rx:
587
        mov     eax, [ARP_PACKETS_RX + eax]
2311 hidnplayr 588
        ret
1159 hidnplayr 589
 
2614 hidnplayr 590
  .entries:
2311 hidnplayr 591
        mov     eax, [NumARP]
592
        ret
1159 hidnplayr 593
 
2614 hidnplayr 594
  .read:
2311 hidnplayr 595
        cmp     ecx, [NumARP]
596
        jae     .error
597
        ; edi = pointer to buffer
598
        ; ecx = # entry
599
        imul    ecx, sizeof.ARP_entry
600
        add     ecx, ARP_table
601
        mov     esi, ecx
602
        mov     ecx, sizeof.ARP_entry/2
603
        rep     movsw
1200 hidnplayr 604
 
2311 hidnplayr 605
        xor     eax, eax
606
        ret
1159 hidnplayr 607
 
2614 hidnplayr 608
  .write:
2311 hidnplayr 609
        ; esi = pointer to buffer
610
        call    ARP_add_entry        ;out: eax = entry number, -1 on error
611
        ret
1159 hidnplayr 612
 
2614 hidnplayr 613
  .remove:
2311 hidnplayr 614
        ; ecx = # entry
615
        cmp     ecx, [NumARP]
616
        jae     .error
617
        imul    ecx, sizeof.ARP_entry
618
        lea     esi, [ARP_table + ecx]
619
        call    ARP_del_entry
620
        ret
1159 hidnplayr 621