Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2015. 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: 6011 $
  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     [IP_LIST], 127 + 1 shl 24
  58.         mov     [SUBNET_LIST], 255
  59.         mov     [BROADCAST_LIST], 0xffffff00 + 127
  60.  
  61.   .fail:
  62. }
  63.  
  64. ;-----------------------------------------------------------------;
  65. ;                                                                 ;
  66. ; loop_input                                                      ;
  67. ;                                                                 ;
  68. ;   IN: [esp+4] = Pointer to buffer                               ;
  69. ;                                                                 ;
  70. ;  OUT: /                                                         ;
  71. ;                                                                 ;
  72. ;-----------------------------------------------------------------;
  73. align 4
  74. loop_input:
  75.  
  76.         mov     eax, [esp+4]
  77.  
  78. ; Update stats
  79.         inc     [LOOPBACK_DEVICE.packets_rx]
  80.  
  81.         mov     ecx, [eax + NET_BUFF.length]
  82.         add     dword[LOOPBACK_DEVICE.bytes_rx], ecx
  83.         adc     dword[LOOPBACK_DEVICE.bytes_rx + 4], 0
  84.  
  85.         DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_input: ptr=%x size=%u\n", eax, ecx
  86.  
  87. ; Reverse buffptr and returnaddr on stack
  88.         pop     edx edi
  89.         push    edx edi
  90.  
  91. ; Set registers for protocol handlers
  92.         lea     edx, [eax + NET_BUFF.data]
  93.         mov     ebx, [eax + NET_BUFF.device]
  94.         mov     eax, [eax + NET_BUFF.type]
  95.  
  96. ; Place protocol handlers here
  97.         cmp     eax, AF_INET4
  98.         je      ipv4_input
  99.  
  100.         DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_input: Unknown packet type=%x\n", eax
  101.  
  102.   .dump:
  103.         DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_input: dumping\n"
  104.         call    net_buff_free
  105.         ret
  106.  
  107.  
  108. ;-----------------------------------------------------------------;
  109. ;                                                                 ;
  110. ; loop_output                                                     ;
  111. ;                                                                 ;
  112. ;  IN:  ecx = packet size                                         ;
  113. ;       edi = address family                                      ;
  114. ;                                                                 ;
  115. ; OUT:  eax = start of net frame / 0 on error                     ;
  116. ;       ebx = to device structure                                 ;
  117. ;       ecx = unchanged (packet size of embedded data)            ;
  118. ;       edi = start of payload                                    ;
  119. ;                                                                 ;
  120. ;-----------------------------------------------------------------;
  121. align 4
  122. loop_output:
  123.  
  124.         DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_output\n"
  125.  
  126.         cmp     ecx, [LOOPBACK_DEVICE.mtu]
  127.         ja      .too_large
  128.  
  129.         push    ecx edi
  130.         add     ecx, NET_BUFF.data
  131.         stdcall net_buff_alloc, ecx
  132.         test    eax, eax
  133.         jz      .out_of_ram
  134.  
  135.         pop     edi
  136.         mov     [eax + NET_BUFF.type], edi
  137.         mov     ebx, LOOPBACK_DEVICE
  138.         mov     [eax + NET_BUFF.device], ebx
  139.         pop     ecx
  140.         mov     [eax + NET_BUFF.length], ecx
  141.         lea     edi, [eax + NET_BUFF.data]
  142.  
  143.         inc     [LOOPBACK_DEVICE.packets_tx]
  144.         add     dword[LOOPBACK_DEVICE.bytes_tx], ecx
  145.         adc     dword[LOOPBACK_DEVICE.bytes_tx + 4], 0
  146.  
  147.         DEBUGF  DEBUG_NETWORK_VERBOSE, "LOOP_output: ptr=%x size=%u\n", eax, ecx
  148.         ret
  149.  
  150.   .too_large:
  151.         DEBUGF  DEBUG_NETWORK_ERROR, "LOOP_output: packet is too large\n"
  152.         xor     eax, eax
  153.         ret
  154.  
  155.   .out_of_ram:
  156.         DEBUGF  DEBUG_NETWORK_ERROR, "LOOP_output: out of memory\n"
  157.         add     esp, 4+4
  158.         xor     eax, eax
  159.         ret
  160.  
  161.  
  162.