Subversion Repositories Kolibri OS

Rev

Rev 6011 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2019. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;  loopback.inc                                                   ;;
  7. ;;                                                                 ;;
  8. ;;  LoopBack device for KolibriOS                                  ;;
  9. ;;                                                                 ;;
  10. ;;    Written by hidnplayr@kolibrios.org                           ;;
  11. ;;                                                                 ;;
  12. ;;          GNU GENERAL PUBLIC LICENSE                             ;;
  13. ;;             Version 2, June 1991                                ;;
  14. ;;                                                                 ;;
  15. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  16.  
  17. $Revision: 7678 $
  18.  
  19. iglobal
  20. align 4
  21.  
  22. LOOPBACK_DEVICE:
  23.  
  24.         .device_type    dd NET_DEVICE_LOOPBACK
  25.         .mtu            dd 4096
  26.         .name           dd .namestr
  27.  
  28.         .unload         dd .dummy_fn
  29.         .reset          dd .dummy_fn
  30.         .transmit       dd loop_input
  31.  
  32.         .bytes_tx       dq 0
  33.         .bytes_rx       dq 0
  34.         .packets_tx     dd 0
  35.         .packets_rx     dd 0
  36.  
  37.         .link_state     dd -1
  38.         .hwacc          dd NET_HWACC_TCP_IPv4_IN + NET_HWACC_TCP_IPv4_OUT
  39.  
  40.         .namestr        db 'loopback', 0
  41.  
  42.         .dummy_fn:
  43.         ret
  44.  
  45. endg
  46.  
  47.  
  48. macro   loop_init {
  49. local   .fail
  50.  
  51.         mov     ebx, LOOPBACK_DEVICE
  52.         call    net_add_device
  53.  
  54.         cmp     eax, -1
  55.         je      .fail
  56.  
  57.         mov     [IPv4_address], 127 + 1 shl 24
  58.         mov     [IPv4_subnet], 255
  59.         mov     [IPv4_broadcast], 0xffffff00 + 127
  60.  
  61.   .fail:
  62. }
  63.  
  64. ;-----------------------------------------------------------------;
  65. ;                                                                 ;
  66. ; loop_input                                                      ;
  67. ;                                                                 ;
  68. ;   IN: [esp+4] = Pointer to buffer                               ;
  69. ;                                                                 ;
  70. ;  OUT: eax = 0 on success, errorcode otherwise                   ;
  71. ;                                                                 ;
  72. ;-----------------------------------------------------------------;
  73. align 4
  74. loop_input:
  75.  
  76.         mov     eax, [esp+4]
  77.  
  78. ; Update stats
  79.         inc     [LOOPBACK_DEVICE.packets_tx]
  80.         inc     [LOOPBACK_DEVICE.packets_rx]
  81.  
  82.         mov     ecx, [eax + NET_BUFF.length]
  83.         add     dword[LOOPBACK_DEVICE.bytes_rx], ecx
  84.         adc     dword[LOOPBACK_DEVICE.bytes_rx + 4], 0
  85.         add     dword[LOOPBACK_DEVICE.bytes_tx], ecx
  86.         adc     dword[LOOPBACK_DEVICE.bytes_tx + 4], 0
  87.  
  88.         DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_input: ptr=%x size=%u\n", eax, ecx
  89.  
  90. ; Reverse buffptr and returnaddr on stack
  91.         pop     edx edi
  92.         push    edx .done edi
  93.  
  94. ; Set registers for protocol handlers
  95.         lea     edx, [eax + NET_BUFF.data]
  96.         mov     ebx, [eax + NET_BUFF.device]
  97.         mov     eax, [eax + NET_BUFF.type]
  98.  
  99. ; Place protocol handlers here
  100.         cmp     eax, AF_INET4
  101.         je      ipv4_input
  102.  
  103.         DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_input: Unknown packet type=%x\n", eax
  104.  
  105.   .dump:
  106.         DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_input: dumping\n"
  107.         call    net_buff_free
  108.  
  109.         or      eax, -1
  110.         ret
  111.  
  112.   .done:
  113.         xor     eax, eax
  114.         ret
  115.  
  116.  
  117. ;-----------------------------------------------------------------;
  118. ;                                                                 ;
  119. ; loop_output                                                     ;
  120. ;                                                                 ;
  121. ;  IN:  ecx = packet size                                         ;
  122. ;       edi = address family                                      ;
  123. ;                                                                 ;
  124. ; OUT:  eax = start of net frame / 0 on error                     ;
  125. ;       ebx = to device structure                                 ;
  126. ;       ecx = unchanged (packet size of embedded data)            ;
  127. ;       edi = start of payload                                    ;
  128. ;                                                                 ;
  129. ;-----------------------------------------------------------------;
  130. align 4
  131. loop_output:
  132.  
  133.         DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_output\n"
  134.  
  135.         cmp     ecx, [LOOPBACK_DEVICE.mtu]
  136.         ja      .too_large
  137.  
  138.         push    ecx edi
  139.         add     ecx, NET_BUFF.data
  140.         stdcall net_buff_alloc, ecx
  141.         test    eax, eax
  142.         jz      .out_of_ram
  143.  
  144.         pop     edi
  145.         mov     [eax + NET_BUFF.type], edi
  146.         mov     ebx, LOOPBACK_DEVICE
  147.         mov     [eax + NET_BUFF.device], ebx
  148.         pop     ecx
  149.         mov     [eax + NET_BUFF.length], ecx
  150.         lea     edi, [eax + NET_BUFF.data]
  151.  
  152.         DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_output: ptr=%x size=%u\n", eax, ecx
  153.         ret
  154.  
  155.   .too_large:
  156.         DEBUGF  DEBUG_NETWORK_ERROR, "LOOP_output: packet is too large\n"
  157.         xor     eax, eax
  158.         ret
  159.  
  160.   .out_of_ram:
  161.         DEBUGF  DEBUG_NETWORK_ERROR, "LOOP_output: out of memory\n"
  162.         add     esp, 4+4
  163.         xor     eax, eax
  164.         ret
  165.  
  166.  
  167.