Subversion Repositories Kolibri OS

Rev

Rev 302 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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