diff --git a/kernel/branches/net/applications/pppoe/pppoe.asm b/kernel/branches/net/applications/pppoe/pppoe.asm new file mode 100644 index 0000000000..f059c0434d --- /dev/null +++ b/kernel/branches/net/applications/pppoe/pppoe.asm @@ -0,0 +1,212 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2012. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; pppoe.asm - PPPoE dialer for KolibriOS ;; +;; ;; +;; Written by hidnplayr@kolibrios.org ;; +;; ;; +;; GNU GENERAL PUBLIC LICENSE ;; +;; Version 2, June 1991 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +format binary as "" + +use32 + + db 'MENUET01' ; signature + dd 1 ; header version + dd start ; entry point + dd i_end ; initialized size + dd mem ; required memory + dd mem ; stack pointer + dd 0 ; parameters + dd 0 ; path + +include '../macros.inc' +purge mov,add,sub +include '../proc32.inc' +include '../dll.inc' +include '../network.inc' +include '../struct.inc' + +; PPP Active Discovery... +PPPoE_PADI = 0x09 ; .. Initiation +PPPoE_PADO = 0x07 ; .. Offer +PPPoE_PADR = 0x19 ; .. Request +PPPoE_PADS = 0x65 ; .. Session-confirmation +PPPoE_PADT = 0xa7 ; .. Terminate + +struct PPPoE_frame + VersionAndType db ? + Code db ? + SessionID dw ? + Length dw ? ; Length of payload, does NOT include the length PPPoE header. + Payload rb 0 +ends + +; entry point +start: +; load libraries + stdcall dll.Load, @IMPORT + test eax, eax + jnz exit +; initialize console + push 1 + call [con_start] + push title + push 25 + push 80 + push 25 + push 80 + call [con_init] + +main: + mcall 40, 1 shl 7 + + call [con_cls] +; Welcome user + push str1 + call [con_write_asciiz] + + mcall socket, 777, 3, 666 + mov [socketnum], eax + mcall send, [socketnum], PADI, 14 + 6 + 4, 0 + + .recv: + mcall 10 + + call [con_get_flags] + test eax, 0x200 ; con window closed? + jnz close_conn + + mcall recv, [socketnum], buffer, 4096 + cmp eax, 20 + jb .recv + + cmp [buffer + 14 + PPPoE_frame.Code], PPPoE_PADO + je .pado + + cmp [buffer + 14 + PPPoE_frame.Code], PPPoE_PADS + je .pads + + cmp [buffer + 14 + PPPoE_frame.Code], PPPoE_PADT + je .padt + + jmp .recv + + .pado: + + push str2 + call [con_write_asciiz] + + lea esi, [buffer + 6] ; source mac -> dest mac + lea edi, [buffer] + movsb + movsd + + mov byte [buffer + 15], PPPoE_PADR ; change packet type to PADR + + mov al, byte [buffer + 19] ; get packet size + mov ah, byte [buffer + 18] + movzx esi, ax + add esi, 20 + + mcall send, [socketnum], buffer, , 0 ; now send it! + + jmp .recv + + + .pads: + + push str3 + call [con_write_asciiz] + + mov edx, dword [buffer + 6] ; copy the MAC address + mov si, word [buffer + 6 +4] + mov dword [PADT.mac], edx + mov word [PADT.mac + 4], si + + mov cx, word [buffer + 6 + 2] ; and Session ID + mov [PADT.sid], cx + + mcall 75, API_PPPOE + 0 ; Start PPPoE session + + jmp .recv + + .padt: + + push str4 + call [con_write_asciiz] + + mcall 75, API_PPPOE + 1 + +exit: + mcall close, [socketnum] + mcall -1 + + +close_conn: + + mcall send, [socketnum], PADT, 14 + 6, 0 + jmp exit + +; data +title db 'PPPoE',0 +str1 db 'Sending PADI',13,10,0 +str2 db 'Got PADO',13,10,'Sending PADR',13,10,0 +str3 db 'Got PADS',13,10,'starting PPPoE session',13,10,0 +str4 db 'Got PADT - connection terminated by Access Concentrator',13,10,0 + + +PADI: + dp -1 ; dest mac + dp 0 ; source mac (overwritten by kernel) + dw 0 ; type (overwritten by kernel) + + db 0x11 + db PPPoE_PADI + dw 0 ; session ID + dw 4 shl 8 + + dw 0x0101 ; service name tag with zero length + dw 0x0000 + +PADT: + + .mac dp 0 + dp 0 + dw 0 + + db 0x11 + db PPPoE_PADT + .sid dw 0 + dw 0 + + +; import +align 4 +@IMPORT: + +library console, 'console.obj' +import console, \ + con_start, 'START', \ + con_init, 'con_init', \ + con_write_asciiz, 'con_write_asciiz', \ + con_exit, 'con_exit', \ + con_gets, 'con_gets',\ + con_cls, 'con_cls',\ + con_getch2, 'con_getch2',\ + con_set_cursor_pos, 'con_set_cursor_pos',\ + con_write_string, 'con_write_string',\ + con_get_flags, 'con_get_flags' + + +i_end: + +socketnum dd ? +buffer rb 4096 + rb 4096 ; stack +mem: