Subversion Repositories Kolibri OS

Rev

Rev 1529 | Go to most recent revision | Blame | 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: 1536 $
  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.         cmp     bl, 7
  209.         jz      .out_queue
  210.         cmp     bl, 6
  211.         jz      .in_queue
  212.  
  213.         mov     eax, dword [NET_DRV_LIST + eax]
  214.         cmp     [eax + NET_DEVICE.type], NET_TYPE_ETH
  215.         jne     .error
  216.  
  217.         test    bl, bl
  218.         jz      .packets_tx     ; 0
  219.         dec     bl
  220.         jz      .packets_rx     ; 1
  221.         dec     bl
  222.         jz      .bytes_tx       ; 2
  223.         dec     bl
  224.         jz      .bytes_rx       ; 3
  225.         dec     bl
  226.         jz      .read_mac       ; 4
  227.         dec     bl
  228.         jz      .write_mac      ; 5
  229.  
  230.   .error:
  231.         DEBUGF  2,"Device is not ethernet type\n"
  232.         or      eax, -1
  233.         ret
  234.  
  235. .packets_tx:
  236.         mov     eax, dword [eax + NET_DEVICE.packets_tx]
  237.  
  238.         ret
  239.  
  240. .packets_rx:
  241.         mov     eax, dword [eax + NET_DEVICE.packets_rx]
  242.         ret
  243.  
  244. .bytes_tx:
  245.         mov     ebx, dword [eax + NET_DEVICE.bytes_tx + 4]
  246.         mov     eax, dword [eax + NET_DEVICE.bytes_tx]
  247.         mov     [esp+20+4], ebx                         ; TODO: fix this ugly code
  248.         ret
  249.  
  250. .bytes_rx:
  251.         mov     ebx, dword [eax + NET_DEVICE.bytes_rx + 4]
  252.         mov     eax, dword [eax + NET_DEVICE.bytes_rx]
  253.         mov     [esp+20+4], ebx                         ; TODO: fix this ugly code
  254.         ret
  255.  
  256.  
  257. .read_mac:
  258.         movzx   ebx, word [eax + ETH_DEVICE.mac]
  259.         mov     eax, dword [eax + ETH_DEVICE.mac + 2]
  260.         mov     [esp+20+4], ebx                         ; TODO: fix this ugly code
  261.         ret
  262.  
  263. .write_mac:
  264.         push    ecx
  265.         push    dx
  266.         call    [eax + ETH_DEVICE.set_MAC]
  267.         ret
  268.  
  269. .in_queue:
  270.    if ETH_QUEUE
  271.         add     eax, ETH_IN_QUEUE
  272.         mov     eax, [eax + queue.size]
  273.    else
  274.         or      eax, -1
  275.    end if
  276.         ret
  277.  
  278. .out_queue:
  279.    if ETH_QUEUE
  280.         add     eax, ETH_OUT_QUEUE
  281.         mov     eax, [eax + queue.size]
  282.    else
  283.         or      eax, -1
  284.    end if
  285.         ret