Subversion Repositories Kolibri OS

Rev

Rev 1536 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2010. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;  ETHERNET.INC                                                   ;;
  7. ;;                                                                 ;;
  8. ;;  Ethernet network layer 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: 1733 $
  18.  
  19. struct  ETH_FRAME
  20.         .DstMAC         dp  ?  ; destination MAC-address
  21.         .SrcMAC         dp  ?  ; source MAC-address
  22.         .Type           dw  ?  ; type of the upper-layer protocol
  23.         .Data:                 ; data (46-1500 bytes for a normal packet)
  24. ends
  25.  
  26. virtual at NET_DEVICE.end
  27.  
  28.         ETH_DEVICE:
  29.  
  30.         .set_mode       dd ?
  31.         .get_mode       dd ?
  32.  
  33.         .set_MAC        dd ?
  34.         .get_MAC        dd ?
  35.  
  36.         .mode           dd ?
  37.         .mac            dp ?
  38.  
  39. end virtual
  40.  
  41. align 4
  42. iglobal
  43.  
  44.         ETH_BROADCAST   dp  0xffffffffffff
  45. endg
  46.  
  47. align 4
  48. uglobal
  49.         ETH_RUNNING     dd  ?
  50. endg
  51.  
  52.  
  53. ;-----------------------------------------------------------------
  54. ;
  55. ; ETH_init
  56. ;
  57. ;  This function resets all ethernet variables
  58. ;
  59. ;-----------------------------------------------------------------
  60. macro   ETH_init {
  61.  
  62.         mov     [ETH_RUNNING], 0
  63.  
  64. }
  65.  
  66.  
  67. ;-----------------------------------------------------------------
  68. ;
  69. ; ETH_input
  70. ;
  71. ;  This function is called by ethernet drivers,
  72. ;  It pushes the received ethernet packets onto the eth_in_queue
  73. ;
  74. ;  IN:   [esp]  = Pointer to buffer
  75. ;       [esp+4] = size of buffer
  76. ;         ebx   = pointer to eth_device
  77. ;  OUT: /
  78. ;
  79. ;-----------------------------------------------------------------
  80. align 4
  81. ETH_input:
  82.         mov     eax, [esp]
  83.         mov     ecx, [esp+4]
  84.  
  85.         DEBUGF  1,"ETH_input - size: %u\n", ecx
  86.         cmp     ecx, 60    ; check packet length
  87.         jl      .dump
  88.         sub     ecx, ETH_FRAME.Data
  89.  
  90.         lea     edx, [eax + ETH_FRAME.Data]
  91.         mov     ax , [eax + ETH_FRAME.Type]
  92.  
  93.         cmp     ax, ETHER_IPv4
  94.         je      IPv4_input
  95.  
  96.         cmp     ax, ETHER_ARP
  97.         je      ARP_input
  98.  
  99. ;        cmp     ax, ETHER_PPP_DISCOVERY
  100. ;        je      PPPOE_discovery
  101.  
  102.         DEBUGF  2,"Unknown ethernet packet type %x\n", ax
  103.  
  104.   .dump:
  105.         DEBUGF  2,"ETH_input - dumping\n"
  106.         call    kernel_free
  107.         add     esp, 4
  108.         ret
  109.  
  110. ;-----------------------------------------------------------------
  111. ;
  112. ; ETH_output
  113. ;
  114. ; IN: eax = pointer to source mac
  115. ;     ebx = device ptr
  116. ;     ecx = packet size
  117. ;     edx = pointer to destination mac
  118. ;      di = protocol
  119. ;
  120. ; OUT: edi = 0 on error, pointer to buffer otherwise
  121. ;      eax = buffer start
  122. ;      ebx = to device structure
  123. ;      ecx = unchanged (packet size of embedded data)
  124. ;      edx = size of complete buffer
  125. ;
  126. ;-----------------------------------------------------------------
  127. align 4
  128. ETH_output:
  129.  
  130.         DEBUGF  1,"ETH_output: size=%u device:%x\n", ecx, ebx
  131.  
  132.         cmp     ecx, [ebx + NET_DEVICE.mtu]
  133.         jg      .exit
  134.  
  135.         push    ecx                     ; << 1
  136.         push    di eax edx              ; << 2
  137.         add     ecx, ETH_FRAME.Data
  138.  
  139.         push    ecx                     ; << 3
  140.  
  141.         push    ecx                     ; << 4
  142.         call    kernel_alloc            ; >> 4
  143.         test    eax, eax
  144.         jz      .out_of_ram
  145.         mov     edi, eax
  146.  
  147.         pop     ecx                     ; >> 3
  148.  
  149.         pop     esi                     ; >> 2
  150.         movsd
  151.         movsw
  152.         pop     esi                     ; >> 2
  153.         movsd
  154.         movsw
  155.         pop     ax                      ; >> 2
  156.         stosw
  157.  
  158.         lea     eax, [edi - ETH_FRAME.Data]  ; Set eax to buffer start
  159.         mov     edx, ecx                     ; Set edx to complete buffer size
  160.  
  161.         pop     ecx                     ; >> 1
  162.  
  163.         cmp     edx, 60-1               ; minimum ethernet packet size
  164.         jle     .adjust_size
  165.         DEBUGF  1,"ETH_output: done: %x total size: %u\n", eax, edx
  166.         ret
  167.  
  168.   .adjust_size:
  169.         mov     edx, 60
  170.         test    edx, edx        ; clear zero flag
  171.         ret
  172.  
  173.   .out_of_ram:
  174.         DEBUGF  2,"ETH_output: Out of ram space!!\n"
  175.         add     esp, 3*4+2+4
  176.         sub     edi, edi
  177.         ret
  178.  
  179.   .exit:
  180.         DEBUGF  2,"ETH_output: Packet too large!\n"
  181.         sub     edi, edi
  182. ;;;        dec     edi
  183.         ret
  184.  
  185.  
  186.  
  187. ;-----------------------------------------------------------------
  188. ;
  189. ; ETH_API
  190. ;
  191. ; This function is called by system function 75
  192. ;
  193. ; IN:  subfunction number in bl
  194. ;      device number in bh
  195. ;      ecx, edx, .. depends on subfunction
  196. ;
  197. ; OUT:
  198. ;
  199. ;-----------------------------------------------------------------
  200. align 4
  201. ETH_API:
  202.  
  203.         cmp     bh, MAX_NET_DEVICES
  204.         jg      .error
  205.         movzx   eax, bh
  206.         shl     eax, 2
  207.  
  208.         mov     eax, dword [NET_DRV_LIST + eax]
  209.         cmp     [eax + NET_DEVICE.type], NET_TYPE_ETH
  210.         jne     .error
  211.  
  212.         test    bl, bl
  213.         jz      .packets_tx     ; 0
  214.         dec     bl
  215.         jz      .packets_rx     ; 1
  216.         dec     bl
  217.         jz      .bytes_tx       ; 2
  218.         dec     bl
  219.         jz      .bytes_rx       ; 3
  220.         dec     bl
  221.         jz      .read_mac       ; 4
  222.         dec     bl
  223.         jz      .write_mac      ; 5
  224.  
  225.   .error:
  226.         DEBUGF  2,"Device is not ethernet type\n"
  227.         or      eax, -1
  228.         ret
  229.  
  230. .packets_tx:
  231.         mov     eax, dword [eax + NET_DEVICE.packets_tx]
  232.  
  233.         ret
  234.  
  235. .packets_rx:
  236.         mov     eax, dword [eax + NET_DEVICE.packets_rx]
  237.         ret
  238.  
  239. .bytes_tx:
  240.         mov     ebx, dword [eax + NET_DEVICE.bytes_tx + 4]
  241.         mov     eax, dword [eax + NET_DEVICE.bytes_tx]
  242.         mov     [esp+20+4], ebx                         ; TODO: fix this ugly code
  243.         ret
  244.  
  245. .bytes_rx:
  246.         mov     ebx, dword [eax + NET_DEVICE.bytes_rx + 4]
  247.         mov     eax, dword [eax + NET_DEVICE.bytes_rx]
  248.         mov     [esp+20+4], ebx                         ; TODO: fix this ugly code
  249.         ret
  250.  
  251.  
  252. .read_mac:
  253.         movzx   ebx, word [eax + ETH_DEVICE.mac]
  254.         mov     eax, dword [eax + ETH_DEVICE.mac + 2]
  255.         mov     [esp+20+4], ebx                         ; TODO: fix this ugly code
  256.         ret
  257.  
  258. .write_mac:
  259.         push    ecx
  260.         push    dx
  261.         call    [eax + ETH_DEVICE.set_MAC]
  262.         ret
  263.  
  264.