Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2971 Serge 3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
431 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;  STACK.INC                                                   ;;
7
;;                                                              ;;
8
;;  TCP/IP stack for Menuet OS                                  ;;
9
;;                                                              ;;
10
;;  Copyright 2002 Mike Hibbett, mikeh@oceanfree.net            ;;
11
;;                                                              ;;
12
;;  See file COPYING for details                                ;;
13
;;                                                              ;;
14
;; Version 0.7                                                  ;;
15
;;      Added a timer per socket to allow delays when rx window ;;
16
;;      gets below 1KB                                          ;;
17
;;                                                              ;;
18
;;10.01.2007 Bugfix for checksum function from Paolo Franchetti ;;
19
;;                                                              ;;
20
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 ha 21
 
593 mikedld 22
$Revision: 2971 $
1 ha 23
 
261 hidnplayr 24
 
1 ha 25
;*******************************************************************
26
;   Interface
27
;      The interfaces defined in ETHERNET.INC plus:
28
;      stack_init
29
;      stack_handler
30
;      app_stack_handler
31
;      app_socket_handler
32
;      checksum
33
;
34
;*******************************************************************
35
 
261 hidnplayr 36
uglobal
37
StackCounters:
914 serge 38
  dumped_rx_count     dd  0
261 hidnplayr 39
  arp_tx_count:       dd  0
40
  arp_rx_count:       dd  0
302 hidnplayr 41
  ip_rx_count:	      dd  0
42
  ip_tx_count:	      dd  0
261 hidnplayr 43
endg
1 ha 44
 
261 hidnplayr 45
; socket buffers
302 hidnplayr 46
SOCKETBUFFSIZE	   equ	      4096  ; state + config + buffer.
2971 Serge 47
SOCKETHEADERSIZE   equ	      SOCKET.rxData ; thus 4096 - SOCKETHEADERSIZE bytes data
1 ha 48
 
914 serge 49
;NUM_SOCKETS        equ        16    ; Number of open sockets supported. Was 20
1 ha 50
 
261 hidnplayr 51
; IPBUFF status values
302 hidnplayr 52
BUFF_EMPTY	   equ	   0
53
BUFF_RX_FULL	   equ	   1
54
BUFF_ALLOCATED	   equ	   2
55
BUFF_TX_FULL	   equ	   3
1 ha 56
 
302 hidnplayr 57
NUM_IPBUFFERS	   equ	   20	 ; buffers allocated for TX/RX
1 ha 58
 
302 hidnplayr 59
NUMQUEUES	   equ	      4
60
EMPTY_QUEUE	   equ	      0
61
IPIN_QUEUE	   equ	      1
62
IPOUT_QUEUE	   equ	      2
63
NET1OUT_QUEUE	   equ	      3
1 ha 64
 
302 hidnplayr 65
NO_BUFFER	   equ	      0xFFFF
66
IPBUFFSIZE	   equ	      1500		  ; MTU of an ethernet packet
67
NUMQUEUEENTRIES    equ	      NUM_IPBUFFERS
68
NUMRESENDENTRIES    equ 	18		; Buffers for TCP resend packets
1 ha 69
 
70
; These are the 0x40 function codes for application access to the stack
71
STACK_DRIVER_STATUS  equ   52
72
SOCKET_INTERFACE     equ   53
73
 
74
 
75
; 128KB allocated for the stack and network driver buffers and other
76
; data requirements
412 serge 77
;stack_data_start     equ   0x700000
78
;eth_data_start       equ   0x700000
79
;stack_data           equ   0x704000
80
;stack_data_end       equ   0x71ffff
1 ha 81
 
82
; 32 bit word
302 hidnplayr 83
stack_config	     equ   stack_data
261 hidnplayr 84
 
1 ha 85
; 32 bit word - IP Address in network format
302 hidnplayr 86
stack_ip	     equ   stack_data + 4
261 hidnplayr 87
 
1 ha 88
; 1 byte. 0 == inactive, 1 = active
89
ethernet_active      equ   stack_data + 9
261 hidnplayr 90
 
91
 
92
; TODO :: empty memory area
93
 
1 ha 94
; Address of selected socket
914 serge 95
;sktAddr              equ   stack_data + 32
1 ha 96
; Parameter to checksum routine - data ptr
302 hidnplayr 97
checkAdd1	     equ   stack_data + 36
1 ha 98
; Parameter to checksum routine - 2nd data ptr
302 hidnplayr 99
checkAdd2	     equ   stack_data + 40
1 ha 100
; Parameter to checksum routine - data size
302 hidnplayr 101
checkSize1	     equ   stack_data + 44
1 ha 102
; Parameter to checksum routine - 2nd data size
302 hidnplayr 103
checkSize2	     equ   stack_data + 46
1 ha 104
; result of checksum routine
302 hidnplayr 105
checkResult	     equ   stack_data + 48
1 ha 106
 
107
; holds the TCP/UDP pseudo header. SA|DA|0|prot|UDP len|
302 hidnplayr 108
pseudoHeader	     equ   stack_data + 50
1 ha 109
 
110
; receive and transmit IP buffer allocation
914 serge 111
;sockets              equ   stack_data + 62
112
Next_free2 equ stack_data + 62;Next_free2           equ   sockets + (SOCKETBUFFSIZE * NUM_SOCKETS)
1 ha 113
; 1560 byte buffer for rx / tx ethernet packets
302 hidnplayr 114
Ether_buffer	     equ   Next_free2
115
Next_free3	     equ   Ether_buffer + 1518
261 hidnplayr 116
last_1sTick	     equ   Next_free3
302 hidnplayr 117
IPbuffs 	     equ   Next_free3 + 1
118
queues		     equ   IPbuffs + ( NUM_IPBUFFERS * IPBUFFSIZE )
119
queueList	     equ   queues + (2 * NUMQUEUES)
120
last_1hsTick	     equ   queueList + ( 2 * NUMQUEUEENTRIES )
1 ha 121
 
122
;resendQ              equ   queueList + ( 2 * NUMQUEUEENTRIES )
123
;resendBuffer         equ    resendQ + ( 4 * NUMRESENDENTRIES ) ; for TCP
124
;                    equ    resendBuffer + ( IPBUFFSIZE * NUMRESENDENTRIES )
125
 
126
 
127
 
412 serge 128
;resendQ             equ     0x770000
914 serge 129
;resendBuffer        equ     resendQ + ( 4 * NUMRESENDENTRIES ) ; for TCP        ; XTODO: validate size
130
resendBuffer	    equ     resendQ + ( 8 * NUMRESENDENTRIES ) ; for TCP
1 ha 131
 
132
 
914 serge 133
uglobal
134
net_sockets rd 2
135
endg
136
 
261 hidnplayr 137
; simple macro for memory set operation
138
macro _memset_dw adr,value,amount
139
{
302 hidnplayr 140
	mov	edi, adr
141
	mov	ecx, amount
261 hidnplayr 142
	if value = 0
143
		xor	eax, eax
144
	else
145
		mov	eax, value
146
	end if
147
	cld
302 hidnplayr 148
	rep	stosd
261 hidnplayr 149
}
150
 
151
 
152
; Below, the main network layer source code is included
153
;
154
include "queue.inc"
155
include "eth_drv/ethernet.inc"
156
include "ip.inc"
157
include "socket.inc"
158
 
1 ha 159
;***************************************************************************
160
;   Function
161
;      stack_init
162
;
163
;   Description
164
;      Clear all allocated memory to zero. This ensures that
165
;       on startup, the stack is inactive, and consumes no resources
166
;       This is a kernel function, called prior to the OS main loop
167
;       in set_variables
168
;
169
;***************************************************************************
261 hidnplayr 170
 
1 ha 171
stack_init:
261 hidnplayr 172
	; Init two address spaces with default values
173
	_memset_dw	stack_data_start, 0, 0x20000/4
914 serge 174
	_memset_dw	resendQ, 0, NUMRESENDENTRIES * 2
1 ha 175
 
914 serge 176
	mov	[net_sockets], 0
177
	mov	[net_sockets + 4], 0
178
 
261 hidnplayr 179
	; Queries initialization
180
	call	queueInit
1 ha 181
 
261 hidnplayr 182
	; The following block sets up the 1s timer
183
	mov	al, 0x0
184
	out	0x70, al
185
	in	al, 0x71
186
	mov	[last_1sTick], al
187
ret
1 ha 188
 
189
 
190
 
191
;***************************************************************************
192
;   Function
193
;      stack_handler
194
;
195
;   Description
196
;       The kernel loop routine for the stack
197
;       This is a kernel function, called in the main loop
198
;
199
;***************************************************************************
200
stack_handler:
201
 
202
    call    ethernet_driver
203
    call    ip_rx
204
 
205
 
206
    ; Test for 10ms tick, call tcp timer
207
    mov     eax, [timer_ticks] ;[0xfdf0]
208
    cmp     eax, [last_1hsTick]
302 hidnplayr 209
    je	    sh_001
1 ha 210
 
211
    mov     [last_1hsTick], eax
212
    call    tcp_tx_handler
213
 
214
sh_001:
215
 
216
    ; Test for 1 second event, call 1s timer functions
261 hidnplayr 217
    mov     al, 0x0   ;second
218
    out     0x70, al
302 hidnplayr 219
    in	    al, 0x71
1 ha 220
    cmp     al, [last_1sTick]
302 hidnplayr 221
    je	    sh_exit
1 ha 222
 
223
    mov     [last_1sTick], al
224
 
379 serge 225
    stdcall arp_table_manager, ARP_TABLE_TIMER, 0, 0
1 ha 226
    call    tcp_tcb_handler
227
 
228
sh_exit:
229
    ret
230
 
261 hidnplayr 231
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
232
;; Checksum [by Johnny_B]
233
;;  IN:
234
;;    buf_ptr=POINTER to buffer
235
;;    buf_size=SIZE of buffer
236
;;  OUT:
237
;;    AX=16-bit checksum
238
;;              Saves all used registers
239
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
240
proc checksum_jb stdcall uses ebx esi ecx,\
241
     buf_ptr:DWORD, buf_size:DWORD
1 ha 242
 
261 hidnplayr 243
    xor     eax, eax
244
    xor     ebx, ebx  ;accumulator
245
    mov     esi, dword[buf_ptr]
246
    mov     ecx, dword[buf_size]
247
    shr     ecx, 1  ; ecx=ecx/2
302 hidnplayr 248
    jnc     @f	    ; if CF==0 then size is even number
261 hidnplayr 249
    mov     bh, byte[esi + ecx*2]
250
  @@:
251
    cld
1 ha 252
 
261 hidnplayr 253
  .loop:
254
    lodsw   ;eax=word[esi],esi=esi+2
255
    xchg    ah,al    ;cause must be a net byte-order
256
    add     ebx, eax
257
    loop    .loop
1 ha 258
 
261 hidnplayr 259
    mov     eax, ebx
260
    shr     eax, 16
261
    add     ax, bx
262
    not     ax
1 ha 263
 
264
    ret
261 hidnplayr 265
endp
1 ha 266
 
267
;***************************************************************************
268
;   Function
269
;      checksum
270
;
271
;   Description
272
;       checkAdd1,checkAdd2, checkSize1, checkSize2, checkResult
273
;       Dont break anything; Most registers are used by the caller
274
;       This code is derived from the 'C' source, cksum.c, in the book
275
;       Internetworking with TCP/IP Volume II by D.E. Comer
276
;
277
;***************************************************************************
261 hidnplayr 278
 
279
 
1 ha 280
checksum:
281
    pusha
323 hidnplayr 282
    mov     eax, [checkAdd1]
302 hidnplayr 283
    xor     edx, edx		      ; edx is the accumulative checksum
1 ha 284
    xor     ebx, ebx
285
    mov     cx, [checkSize1]
286
    shr     cx, 1
302 hidnplayr 287
    jz	    cs1_1
1 ha 288
 
289
cs1:
290
    mov     bh, [eax]
291
    mov     bl, [eax + 1]
292
 
293
    add     eax, 2
294
    add     edx, ebx
295
 
296
    loopw   cs1
297
 
298
cs1_1:
299
    and     word [checkSize1], 0x01
302 hidnplayr 300
    jz	    cs_test2
1 ha 301
 
302
    mov     bh, [eax]
303
    xor     bl, bl
304
 
305
    add     edx, ebx
306
 
307
cs_test2:
308
    mov     cx, [checkSize2]
309
    cmp     cx, 0
302 hidnplayr 310
    jz	    cs_exit			; Finished if no 2nd buffer
1 ha 311
 
323 hidnplayr 312
    mov     eax, [checkAdd2]
313
 
1 ha 314
    shr     cx, 1
302 hidnplayr 315
    jz	    cs2_1
1 ha 316
 
317
cs2:
318
    mov     bh, [eax]
319
    mov     bl, [eax + 1]
320
 
321
    add     eax, 2
322
    add     edx, ebx
323
 
324
    loopw   cs2
325
 
326
cs2_1:
327
    and     word [checkSize2], 0x01
302 hidnplayr 328
    jz	    cs_exit
1 ha 329
 
330
    mov     bh, [eax]
331
    xor     bl, bl
332
 
333
    add     edx, ebx
334
 
335
cs_exit:
336
    mov     ebx, edx
337
 
338
    shr     ebx, 16
339
    and     edx, 0xffff
340
    add     edx, ebx
341
    mov     eax, edx
342
    shr     eax, 16
343
    add     edx, eax
344
    not     dx
345
 
346
    mov     [checkResult], dx
347
    popa
348
    ret
349
 
350
 
351
 
352
 
353
;***************************************************************************
354
;   Function
355
;      app_stack_handler
356
;
357
;   Description
261 hidnplayr 358
;       This is an application service, called by int 0x40, function 52
1 ha 359
;       It provides application access to the network interface layer
360
;
361
;***************************************************************************
362
app_stack_handler:
363
    cmp     eax, 0
364
    jnz     not0
261 hidnplayr 365
    ; Read the configuration word
1 ha 366
    mov     eax, [stack_config]
367
    ret
368
 
369
not0:
370
    cmp     eax, 1
371
    jnz     not1
372
    ; read the IP address
373
 
374
    mov     eax, [stack_ip]
375
    ret
376
 
377
not1:
378
    cmp     eax, 2
379
    jnz     not2
380
 
381
    ; write the configuration word
382
    mov     [stack_config], ebx
383
 
384
    ; 
385
    ; If ethernet now enabled, probe for the card, reset it and empty
386
    ; the packet buffer
387
    ; If all successfull, enable the card.
388
    ; If ethernet now disabled, set it as disabled. Should really
389
    ; empty the tcpip data area too.
390
 
391
    ; ethernet interface is '3' in ls 7 bits
392
    and     bl, 0x7f
393
    cmp     bl, 3
394
 
302 hidnplayr 395
    je	     ash_eth_enable
1 ha 396
    ; Ethernet isn't enabled, so make sure that the card is disabled
397
    mov     [ethernet_active], byte 0
398
 
399
    ret
400
 
401
ash_eth_enable:
402
    ; Probe for the card. This will reset it and enable the interface
403
    ; if found
404
    call    eth_probe
405
    cmp     eax, 0
302 hidnplayr 406
    je	    ash_eth_done	    ; Abort if no hardware found
1 ha 407
 
408
    mov     [ethernet_active], byte 1
409
 
410
ash_eth_done:
411
    ret
412
 
413
not2:
414
    cmp     eax, 3
415
    jnz     not3
416
    ; write the IP Address
417
    mov     [stack_ip], ebx
418
    ret
419
 
261 hidnplayr 420
;old functions was deleted
421
 
1 ha 422
not3:
423
    cmp     eax, 6
424
    jnz     not6
425
 
426
    ; Insert an IP packet into the stacks received packet queue
427
    call    stack_insert_packet
428
    ret
429
 
430
not6:
431
    cmp     eax, 7
432
    jnz     not7
433
 
434
    ; Test for any packets queued for transmission over the network
435
 
436
not7:
437
    cmp     eax, 8
438
    jnz     not8
439
 
440
    call    stack_get_packet
441
    ; Extract a packet queued for transmission by the network
442
    ret
443
 
444
not8:
445
    cmp     eax, 9
446
    jnz     not9
447
 
448
    ; read the gateway IP address
449
 
450
    mov     eax, [gateway_ip]
451
    ret
452
 
453
not9:
454
    cmp     eax, 10
455
    jnz     not10
456
 
457
    ; read the subnet mask
458
 
459
    mov     eax, [subnet_mask]
460
    ret
461
 
462
not10:
463
    cmp     eax, 11
464
    jnz     not11
465
 
466
    ; write the gateway IP Address
467
    mov     [gateway_ip], ebx
468
 
469
    ret
470
 
471
not11:
472
    cmp     eax, 12
473
    jnz     not12
474
 
475
    ; write the subnet mask
476
    mov     [subnet_mask], ebx
477
 
478
 
479
not12:
480
    cmp     eax, 13
481
    jnz     not13
482
 
483
    ; read the dns
484
 
485
    mov     eax, [dns_ip]
486
    ret
487
 
488
not13:
489
    cmp     eax, 14
261 hidnplayr 490
    jnz     not14
1 ha 491
 
492
    ; write the dns IP Address
493
    mov     [dns_ip], ebx
494
 
379 serge 495
    ret
496
 
261 hidnplayr 497
;
498
not14:
499
	cmp	eax, 15
500
	jnz	not15
501
 
502
    ; in ebx we need 4 to read the last 2 bytes
503
	cmp	ebx, dword 4
504
	je	read
379 serge 505
 
261 hidnplayr 506
    ; or we need 0 to read the first 4 bytes
507
	cmp	ebx, dword 0
508
	jnz	param_error
509
 
510
    ; read MAC, returned (in mirrored byte order) in eax
511
read:
512
	mov	eax, [node_addr + ebx]
513
	jmp	@f
379 serge 514
 
515
param_error:
261 hidnplayr 516
	mov	eax, -1     ; params not accepted
517
@@:
518
	ret
519
 
379 serge 520
 
261 hidnplayr 521
; 0 -> arp_probe
522
; 1 -> arp_announce
523
; 2 -> arp_responce (not supported yet)
524
 
525
not15:					; ARP stuff
526
	cmp	eax, 16
527
	jnz	not16
379 serge 528
 
261 hidnplayr 529
	cmp	ebx, 0
530
	je	a_probe
379 serge 531
 
261 hidnplayr 532
	cmp	ebx, 1
533
	je	a_ann			; arp announce
379 serge 534
 
302 hidnplayr 535
;       cmp     ebx,2
536
;       jne     a_resp                  ; arp response
261 hidnplayr 537
 
538
	jmp	param15_error
379 serge 539
 
540
 
261 hidnplayr 541
; arp probe, sender IP must be set to 0.0.0.0, target IP is set to address being probed
542
; ecx: pointer to target MAC, MAC should set to 0 by application
543
; edx: target IP
544
a_probe:
545
	push	dword [stack_ip]
379 serge 546
 
261 hidnplayr 547
	mov	edx, [stack_ip]
548
	mov	[stack_ip], dword 0
379 serge 549
	mov	esi, ecx		; pointer to target MAC address
261 hidnplayr 550
	call	arp_request
379 serge 551
 
552
	pop	dword [stack_ip]
302 hidnplayr 553
	jmp	@f
379 serge 554
 
261 hidnplayr 555
; arp announce, sender IP must be set to target IP
556
; ecx: pointer to target MAC
557
a_ann:
558
	mov	edx, [stack_ip]
559
	mov	esi, ecx		; pointer to target MAC address
560
	call	arp_request
561
	jmp	@f
379 serge 562
 
261 hidnplayr 563
param15_error:
564
	mov	eax, -1
379 serge 565
 
261 hidnplayr 566
@@:
567
	ret
568
;
569
; modified by [smb]
570
 
571
;
572
; ARPTable manager interface
573
not16:
574
    cmp     eax, 17
575
    jnz     stack_driver_end
576
 
577
    ;see "proc arp_table_manager" for more details
578
    stdcall arp_table_manager,ebx,ecx,edx  ;Opcode,Index,Extra
579
 
1 ha 580
    ret
261 hidnplayr 581
;
1 ha 582
 
583
stack_driver_end:
261 hidnplayr 584
	ret
1 ha 585
 
586
 
587
 
588
;***************************************************************************
589
;   Function
590
;      app_socket_handler
591
;
592
;   Description
261 hidnplayr 593
;       This is an application service, called by int 0x40, function 53
1 ha 594
;       It provides application access to stack socket services
595
;       such as opening sockets
596
;
597
;***************************************************************************
598
app_socket_handler:
599
    cmp     eax, 0
600
    jnz     nots0
601
 
602
    call    socket_open
603
    ret
604
 
605
nots0:
606
    cmp     eax, 1
607
    jnz     nots1
608
 
609
    call    socket_close
610
    ret
611
 
612
nots1:
613
    cmp     eax, 2
614
    jnz     nots2
615
 
616
    call    socket_poll
617
    ret
618
 
619
nots2:
620
    cmp     eax, 3
621
    jnz     nots3
622
 
623
    call    socket_read
624
    ret
625
 
626
nots3:
627
    cmp     eax, 4
628
    jnz     nots4
629
 
630
    call    socket_write
631
    ret
632
 
633
nots4:
634
    cmp     eax, 5
635
    jnz     nots5
636
 
637
    call    socket_open_tcp
638
    ret
639
 
640
nots5:
641
    cmp     eax, 6
642
    jnz     nots6
643
 
644
    call    socket_status
645
    ret
646
 
647
nots6:
648
    cmp     eax, 7
649
    jnz     nots7
650
 
651
    call    socket_write_tcp
652
    ret
653
 
654
nots7:
655
    cmp     eax, 8
656
    jnz     nots8
657
 
658
    call    socket_close_tcp
659
    ret
660
 
661
nots8:
662
    cmp     eax, 9
663
    jnz     nots9
664
 
665
    call    is_localport_unused
666
    ret
667
 
668
nots9:
302 hidnplayr 669
    cmp     eax, 10
670
    jnz     nots10
671
 
672
    mov     eax,dword[drvr_cable]
673
    test    eax,eax
674
    jnz     @f		      ; if function is not implented, return -1
675
    mov     al,-1
676
    ret
677
 
678
   @@:
679
    call    dword[drvr_cable]
680
    ret
681
 
682
 
683
nots10:
323 hidnplayr 684
    cmp     eax, 11
685
    jnz     nots11
686
 
687
    call    socket_read_packet
688
    ret
689
 
690
nots11:
1 ha 691
    cmp     eax, 254
692
    jnz     notdump
693
 
694
    ret
695
 
696
notdump:
697
    cmp     eax, 255
698
    jnz     notsdebug
699
 
700
    ; This sub function allows access to debugging information on the stack
701
    ; ebx holds the request:
702
    ;  100 : return length of empty queue
703
    ;  101 : return length of IPOUT QUEUE
704
    ;  102 : return length of IPIN QUEUE
705
    ;  103 : return length of NET1OUT QUEUE
706
    ; 200 : return # of ARP entries
707
    ; 201 : return size of ARP table ( max # entries )
708
    ; 202 : select ARP table entry #
709
    ; 203 : return IP of selected table entry
710
    ; 204 : return High 4 bytes of MAC address of selected table entry
711
    ; 205 : return low  2 bytes of MAC address of selected table entry
712
    ; 206 : return status word of selected table entry
713
    ; 207 : return Time to live of selected table entry
714
 
715
 
716
    ;  2 : return number of IP packets received
717
    ;  3 : return number of packets transmitted
718
    ;  4 : return number of received packets dumped
719
    ;  5 : return number of arp packets received
720
    ;  6 : return status of packet driver
721
    ;      ( 0 == not active, FFFFFFFF = successful )
722
 
723
    call    stack_internal_status
724
    ret
725
 
726
notsdebug:
727
    ; Invalid Option
728
    ret
729
 
730
 
731
uglobal
732
  ARPTmp:
733
  times 14 db 0
734
endg
735
 
736
;***************************************************************************
737
;   Function
738
;      stack_internal_status
739
;
740
;   Description
741
;       Returns information about the internal status of the stack
742
;       This is only useful for debugging
743
;       It works with the ethernet driver
744
;       sub function in ebx
745
;       return requested data in eax
746
;
747
;***************************************************************************
748
stack_internal_status:
749
    cmp     ebx, 100
750
    jnz     notsis100
751
 
752
    ;  100 : return length of EMPTY QUEUE
753
    mov     ebx, EMPTY_QUEUE
754
    call    queueSize
755
    ret
756
 
757
notsis100:
758
    cmp     ebx, 101
759
    jnz     notsis101
760
 
761
    ;  101 : return length of IPOUT QUEUE
762
    mov     ebx, IPOUT_QUEUE
763
    call    queueSize
764
    ret
765
 
766
notsis101:
767
    cmp     ebx, 102
768
    jnz     notsis102
769
 
770
    ;  102 : return length of IPIN QUEUE
771
    mov     ebx, IPIN_QUEUE
772
    call    queueSize
773
    ret
774
 
775
notsis102:
776
    cmp     ebx, 103
777
    jnz     notsis103
778
 
779
    ;  103 : return length of NET1OUT QUEUE
780
    mov     ebx, NET1OUT_QUEUE
781
    call    queueSize
782
    ret
783
 
784
notsis103:
785
    cmp     ebx, 200
786
    jnz     notsis200
787
 
788
    ; 200 : return num entries in arp table
789
    movzx   eax, byte [NumARP]
790
    ret
791
 
792
notsis200:
793
    cmp     ebx, 201
794
    jnz     notsis201
795
 
796
    ; 201 : return arp table size
797
    mov     eax, 20 ; ARP_TABLE_SIZE
798
    ret
799
 
800
notsis201:
801
    cmp     ebx, 202
802
    jnz     notsis202
803
 
804
    ; 202 - read the requested table entry
805
    ; into a temporary buffer
806
    ; ecx holds the entry number
807
 
808
    mov     eax, ecx
809
    mov     ecx, 14 ; ARP_ENTRY_SIZE
810
    mul     ecx
811
 
812
    mov     ecx, [eax + ARPTable]
813
    mov     [ARPTmp], ecx
814
    mov     ecx, [eax + ARPTable+4]
815
    mov     [ARPTmp+4], ecx
816
    mov     ecx, [eax + ARPTable+8]
817
    mov     [ARPTmp+8], ecx
818
    mov     cx, [eax + ARPTable+12]
819
    mov     [ARPTmp+12], cx
820
    ret
821
 
822
notsis202:
823
    cmp     ebx, 203
824
    jnz     notsis203
825
 
826
    ; 203 - return IP address
827
    mov     eax, [ARPTmp]
828
    ret
829
 
830
notsis203:
831
    cmp     ebx, 204
832
    jnz     notsis204
833
 
834
    ; 204 - return MAC high dword
835
    mov     eax, [ARPTmp+4]
836
    ret
837
 
838
notsis204:
839
    cmp     ebx, 205
840
    jnz     notsis205
841
 
842
    ; 205 - return MAC ls word
843
    movzx   eax, word [ARPTmp+8]
844
    ret
845
 
846
notsis205:
847
    cmp     ebx, 206
848
    jnz     notsis206
849
 
850
    ; 206 - return status word
851
    movzx   eax, word [ARPTmp+10]
852
    ret
853
 
854
notsis206:
855
    cmp     ebx, 207
856
    jnz     notsis207
857
 
858
    ; 207 - return ttl word
859
    movzx   eax, word [ARPTmp+12]
860
    ret
861
 
862
notsis207:
863
    cmp     ebx, 2
864
    jnz     notsis2
865
 
866
    ;  2 : return number of IP packets received
867
    mov     eax, [ip_rx_count]
868
    ret
869
 
870
notsis2:
871
    cmp     ebx, 3
872
    jnz     notsis3
873
 
874
    ;  3 : return number of packets transmitted
875
    mov     eax, [ip_tx_count]
876
    ret
877
 
878
notsis3:
879
    cmp     ebx, 4
880
    jnz     notsis4
881
 
882
    ;  4 : return number of received packets dumped
883
    mov     eax, [dumped_rx_count]
884
    ret
885
 
886
notsis4:
887
    cmp     ebx, 5
888
    jnz     notsis5
889
 
890
    ;  5 : return number of arp packets received
891
    mov     eax, [arp_rx_count]
892
    ret
893
 
894
notsis5:
895
    cmp     ebx, 6
896
    jnz     notsis6
897
 
898
    ;  6 : return status of packet driver
899
    ;  ( 0 == not active, FFFFFFFF = successful )
900
    mov     eax, [eth_status]
901
    ret
902
 
903
notsis6:
904
    xor     eax, eax
905
    ret
906
 
907
 
908
 
909
;***************************************************************************
910
;   Function
911
;      stack_get_packet
912
;
913
;   Description
914
;       extracts an IP packet from the NET1 output queue
915
;       and sends the data to the calling process
916
;       pointer to data in edx
917
;       returns number of bytes read in eax
918
;
919
;***************************************************************************
920
stack_get_packet:
921
    ; Look for a buffer to tx
922
    mov     eax, NET1OUT_QUEUE
923
    call    dequeue
924
    cmp     ax, NO_BUFFER
302 hidnplayr 925
    je	    sgp_non_exit	    ; Exit if no buffer available
1 ha 926
 
302 hidnplayr 927
    push    eax 		    ; Save buffer number for freeing at end
1 ha 928
 
929
    push    edx
930
    ; convert buffer pointer eax to the absolute address
931
    mov     ecx, IPBUFFSIZE
932
    mul     ecx
933
    add     eax, IPbuffs
934
    pop     edx
935
 
302 hidnplayr 936
    push    eax 		    ; save address of IP data
1 ha 937
 
938
    ; Get the address of the callers data
379 serge 939
    mov     edi,[TASK_BASE]
115 poddubny 940
    add     edi,TASKDATA.mem_start
1 ha 941
    add     edx,[edi]
942
    mov     edi, edx
943
 
944
    pop     eax
945
 
302 hidnplayr 946
    mov     ecx, 1500		; should get the actual number of bytes to write
1 ha 947
    mov     esi, eax
948
    cld
302 hidnplayr 949
    rep     movsb		; copy the data across
1 ha 950
 
951
    ; And finally, return the buffer to the free queue
952
    pop     eax
953
    call    freeBuff
954
 
955
    mov     eax, 1500
956
    ret
957
 
958
sgp_non_exit:
959
    xor     eax, eax
960
    ret
961
 
962
 
963
 
964
;***************************************************************************
965
;   Function
966
;      stack_insert_packet
967
;
968
;   Description
969
;       writes an IP packet into the stacks receive queue
970
;       # of bytes to write in ecx
971
;       pointer to data in edx
972
;       returns 0 in eax ok, -1 == failed
973
;
974
;***************************************************************************
975
stack_insert_packet:
976
 
977
    mov     eax, EMPTY_QUEUE
978
    call    dequeue
979
    cmp     ax, NO_BUFFER
302 hidnplayr 980
    je	    sip_err_exit
1 ha 981
 
982
    push    eax
983
 
984
    ; save the pointers to the data buffer & size
985
    push    edx
986
    push    ecx
987
 
988
    ; convert buffer pointer eax to the absolute address
989
    mov     ecx, IPBUFFSIZE
990
    mul     ecx
991
    add     eax, IPbuffs
992
 
993
    mov     edx, eax
994
 
995
    ; So, edx holds the IPbuffer ptr
996
 
302 hidnplayr 997
    pop     ecx 		    ; count of bytes to send
998
    mov     ebx, ecx		    ; need the length later
999
    pop     eax 		    ; get callers ptr to data to send
1 ha 1000
 
1001
    ; Get the address of the callers data
379 serge 1002
    mov     edi,[TASK_BASE]
115 poddubny 1003
    add     edi,TASKDATA.mem_start
1 ha 1004
    add     eax,[edi]
1005
    mov     esi, eax
1006
 
1007
    mov     edi, edx
1008
    cld
302 hidnplayr 1009
    rep     movsb		; copy the data across
1 ha 1010
 
1011
    pop     ebx
1012
 
1013
    mov     eax, IPIN_QUEUE
1014
    call    queue
1015
 
1016
    inc     dword [ip_rx_count]
1017
 
1018
    mov     eax, 0
1019
    ret
1020
 
1021
sip_err_exit:
1022
    mov     eax, 0xFFFFFFFF
1023
    ret
1024