Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2012-2015. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;  PPPoE.INC                                                   ;;
  7. ;;                                                              ;;
  8. ;;  Part of the tcp/ip network stack 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: 5522 $
  18.  
  19.  
  20. struct  PPPoE_frame
  21.         VersionAndType  db ?
  22.         Code            db ?
  23.         SessionID       dw ?
  24.         Length          dw ?            ; Length of payload, does NOT include the length PPPoE header.
  25.         Payload         rb 0
  26. ends
  27.  
  28. uglobal
  29. align 4
  30.  
  31.         PPPoE_SID       dw ?
  32.         PPPoE_MAC       dp ?
  33.  
  34. endg
  35.  
  36. ;-----------------------------------------------------------------
  37. ;
  38. ; PPPoE_init
  39. ;
  40. ;  This function resets all IP variables
  41. ;
  42. ;-----------------------------------------------------------------
  43. macro   PPPoE_init {
  44.  
  45.         call    PPPoE_stop_connection
  46.  
  47. }
  48.  
  49.  
  50. ;-----------------------------------------------------------------
  51. ;
  52. ; PPPoE discovery input
  53. ;
  54. ; Handler of received Ethernet packet with type = Discovery
  55. ;
  56. ;
  57. ;  IN:  Pointer to buffer in [esp]
  58. ;       size of buffer in [esp+4]
  59. ;       pointer to device struct in ebx
  60. ;       pointer to PPP header in edx
  61. ;       size of PPP packet in ecx
  62. ;  OUT: /
  63. ;
  64. ;-----------------------------------------------------------------
  65. align 4
  66. PPPoE_discovery_input:
  67.  
  68.         DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_discovery_input\n"
  69.  
  70. ; First, find open PPPoE socket
  71.  
  72.         pusha
  73.         mov     ecx, socket_mutex
  74.         call    mutex_lock
  75.         popa
  76.  
  77.         mov     eax, net_sockets
  78.  
  79.   .next_socket:
  80.         mov     eax, [eax + SOCKET.NextPtr]
  81.         or      eax, eax
  82.         jz      .dump
  83.  
  84.         cmp     [eax + SOCKET.Domain], AF_PPP
  85.         jne     .next_socket
  86.  
  87.         cmp     [eax + SOCKET.Protocol], PPP_PROTO_ETHERNET
  88.         jne     .next_socket
  89.  
  90.         pusha
  91.         mov     ecx, socket_mutex
  92.         call    mutex_unlock
  93.         popa
  94.  
  95. ; Now, send it to the this socket
  96.  
  97.         mov     ecx, [esp + 4]
  98.         mov     esi, [esp]
  99.  
  100.         jmp     SOCKET_input
  101.  
  102.   .dump:
  103.         pusha
  104.         mov     ecx, socket_mutex
  105.         call    mutex_unlock
  106.         popa
  107.  
  108.         DEBUGF  DEBUG_NETWORK_VERBOSE, 'PPPoE_discovery_input: dumping\n'
  109.         call    NET_BUFF_free
  110.         ret
  111.  
  112.  
  113. ;--------------------------------------
  114. ;
  115. ; Send discovery packet
  116. ;
  117. ; IN: eax = socket pointer
  118. ;     ecx = number of bytes to send
  119. ;     esi = pointer to data
  120. ;
  121. ;--------------------------------------
  122.  
  123. align 4
  124. PPPoE_discovery_output:
  125.  
  126.         DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_discovery_output: socket=%x buffer=%x size=%d\n", eax, esi, ecx
  127.  
  128. ; RFC2516: An entire PADI packet (including the PPPoE header) MUST NOT
  129. ; exceed 1484 octets.
  130.         cmp     ecx, 1484 + 14
  131.         ja      .bad
  132.  
  133. ; Check that device exists and is ethernet device
  134.         mov     ebx, [eax + SOCKET.device]
  135.  
  136.         cmp     ebx, NET_DEVICES_MAX
  137.         ja      .bad
  138.  
  139.         mov     ebx, [NET_DRV_LIST + 4*ebx]
  140.         test    ebx, ebx
  141.         jz      .bad
  142.  
  143.         cmp     [ebx + NET_DEVICE.device_type], NET_DEVICE_ETH
  144.         jne     .bad
  145.  
  146.         DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_discovery_output: device=%x\n", ebx
  147.  
  148. ; Create packet.
  149.         push    ecx esi
  150.         stdcall kernel_alloc, 1500
  151.         pop     esi ecx
  152.         test    eax, eax
  153.         jz      .bad
  154.  
  155.         mov     edx, ecx
  156.         mov     edi, eax
  157.         rep movsb
  158.  
  159.         cmp     edx, 60         ; Min ETH size
  160.         ja      @f
  161.         mov     edx, 60
  162.        @@:
  163.  
  164.         push    edx eax         ; size and packet ptr for driver send proc
  165.  
  166. ; Overwrite source MAC and protocol type
  167.         lea     edi, [eax + ETH_header.SrcMAC]
  168.         lea     esi, [ebx + ETH_DEVICE.mac]
  169.         movsd
  170.         movsw
  171.         cmp     word[edi], ETHER_PROTO_PPP_SESSION      ; Allow only PPP_discovery, or LCP
  172.         je      @f
  173.         mov     ax, ETHER_PROTO_PPP_DISCOVERY
  174.         stosw
  175.        @@:
  176.  
  177. ; And send the packet
  178.         call    [ebx + NET_DEVICE.transmit]
  179.  
  180.         xor     eax, eax
  181.         ret
  182.  
  183.   .bad:
  184.         or      eax, -1
  185.         ret
  186.  
  187.  
  188. ;-----------------------------------------------------------------
  189. ;
  190. ; PPPoE session input
  191. ;
  192. ; Handler of received Ethernet packet with type = Session
  193. ;
  194. ;
  195. ;  IN:  Pointer to buffer in [esp]
  196. ;       size of buffer in [esp+4]
  197. ;       pointer to device struct in ebx
  198. ;       pointer to PPP header in edx
  199. ;       size of PPP packet in ecx
  200. ;  OUT: /
  201. ;
  202. ;-----------------------------------------------------------------
  203. align 4
  204. PPPoE_session_input:
  205.  
  206.         cmp     [edx + PPPoE_frame.VersionAndType], 0x11
  207.         jne     .dump
  208.  
  209.         cmp     [edx + PPPoE_frame.Code], 0x00
  210.         jne     .dump
  211.  
  212.         movzx   ecx, [edx + PPPoE_frame.Length]
  213.         xchg    cl, ch
  214.  
  215.         mov     ax, [edx + PPPoE_frame.SessionID]
  216.         DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_input: session ID=%x, length=%u\n", ax, cx
  217.         cmp     ax, [PPPoE_SID]
  218.         jne     .dump
  219.  
  220.         mov     ax, word [edx + PPPoE_frame.Payload]
  221.         add     edx, PPPoE_frame.Payload + 2
  222.  
  223.         cmp     ax, PPP_PROTO_IPv4
  224.         je      IPv4_input
  225.  
  226. ;        cmp     ax, PPP_PROTO_IPv6
  227. ;        je      IPv6_input
  228.  
  229.         jmp     PPPoE_discovery_input   ; Send LCP,CHAP,CBCP,... packets to the PPP dialer
  230.         DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_input: Unknown protocol=%x\n", ax
  231.  
  232.   .dump:
  233.         DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_input: dumping\n"
  234.         call    NET_BUFF_free
  235.         ret
  236.  
  237.  
  238.  
  239. ;-----------------------------------------------------------------
  240. ;
  241. ; PPPoE_output
  242. ;
  243. ; IN:  ax = protocol
  244. ;     ebx = device ptr
  245. ;     ecx = packet size
  246. ;
  247. ; OUT: eax = buffer start / 0 on error
  248. ;      ebx = device ptr
  249. ;      ecx = packet size
  250. ;      edx = size of complete buffer
  251. ;      edi = start of PPP payload
  252. ;
  253. ;-----------------------------------------------------------------
  254. align 4
  255. PPPoE_output:
  256.  
  257.         DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_output: size=%u device=%x\n", ecx, ebx
  258.  
  259.         pushw   ax
  260.         pushw   [PPPoE_SID]
  261.  
  262.         mov     ax, ETHER_PROTO_PPP_SESSION
  263.         add     ecx, PPPoE_frame.Payload + 2
  264.         lea     edx, [PPPoE_MAC]
  265.         call    ETH_output
  266.         jz      .eth_error
  267.  
  268.         sub     ecx, PPPoE_frame.Payload
  269.         mov     [edi + PPPoE_frame.VersionAndType], 0x11
  270.         mov     [edi + PPPoE_frame.Code], 0
  271.         popw    [edi + PPPoE_frame.SessionID]
  272.         xchg    cl, ch
  273.         mov     [edi + PPPoE_frame.Length], cx
  274.         xchg    cl, ch
  275.  
  276.         pop     word [edi + PPPoE_frame.Payload]
  277.  
  278.         sub     ecx, 2
  279.         add     edi, PPPoE_frame.Payload + 2
  280.  
  281.         DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_output: success!\n"
  282.         ret
  283.  
  284.  
  285.   .eth_error:
  286.         add     esp, 4
  287.         xor     eax, eax
  288.         ret
  289.  
  290.  
  291. PPPoE_start_connection:
  292.  
  293.         DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_start_connection: %x\n", cx
  294.  
  295.         cmp     [PPPoE_SID], 0
  296.         jne     .fail
  297.  
  298.         mov     [PPPoE_SID], cx
  299.         mov     dword [PPPoE_MAC], edx
  300.         mov     word [PPPoE_MAC + 4], si
  301.  
  302.         xor     eax, eax
  303.         ret
  304.  
  305.   .fail:
  306.         or      eax, -1
  307.         ret
  308.  
  309.  
  310. align 4
  311. PPPoE_stop_connection:
  312.  
  313.         DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_stop_connection\n"
  314.  
  315.         xor     eax, eax
  316.         mov     [PPPoE_SID], ax
  317.         mov     dword [PPPoE_MAC], eax
  318.         mov     word [PPPoE_MAC + 4], ax
  319.  
  320.         ret
  321.  
  322.  
  323. ;---------------------------------------------------------------------------
  324. ;
  325. ; PPPoE API
  326. ;
  327. ; This function is called by system function 75
  328. ;
  329. ; IN:  subfunction number in bl
  330. ;      device number in bh
  331. ;      ecx, edx, .. depends on subfunction
  332. ;
  333. ; OUT:
  334. ;
  335. ;---------------------------------------------------------------------------
  336. align 4
  337. PPPoE_api:
  338.  
  339.         movzx   eax, bh
  340.         shl     eax, 2
  341.  
  342.         and     ebx, 0xff
  343.         cmp     ebx, .number
  344.         ja      .error
  345.         jmp     dword [.table + 4*ebx]
  346.  
  347.   .table:
  348.         dd      PPPoE_start_connection  ; 0
  349.         dd      PPPoE_stop_connection   ; 1
  350.   .number = ($ - .table) / 4 - 1
  351.  
  352.   .error:
  353.         mov     eax, -1
  354.         ret
  355.