Rev 2960 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2959 | hidnplayr | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
3 | ;; Copyright (C) KolibriOS team 2012. All rights reserved. ;; |
||
4 | ;; Distributed under terms of the GNU General Public License ;; |
||
5 | ;; ;; |
||
6 | ;; pppoe.asm - PPPoE dialer for KolibriOS ;; |
||
7 | ;; ;; |
||
8 | ;; Written by hidnplayr@kolibrios.org ;; |
||
9 | ;; ;; |
||
10 | ;; GNU GENERAL PUBLIC LICENSE ;; |
||
11 | ;; Version 2, June 1991 ;; |
||
12 | ;; ;; |
||
13 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
14 | |||
15 | format binary as "" |
||
16 | |||
17 | use32 |
||
18 | |||
19 | db 'MENUET01' ; signature |
||
20 | dd 1 ; header version |
||
21 | dd start ; entry point |
||
22 | dd i_end ; initialized size |
||
23 | dd mem ; required memory |
||
24 | dd mem ; stack pointer |
||
25 | dd 0 ; parameters |
||
26 | dd 0 ; path |
||
27 | |||
28 | include '../macros.inc' |
||
29 | purge mov,add,sub |
||
30 | include '../proc32.inc' |
||
31 | include '../dll.inc' |
||
32 | include '../network.inc' |
||
33 | include '../struct.inc' |
||
34 | |||
2962 | hidnplayr | 35 | ; Ethernet protocol numbers |
36 | ETHER_PPP_DISCOVERY = 0x6388 |
||
37 | ETHER_PPP_SESSION = 0x6488 |
||
38 | |||
39 | ; PPP protocol numbers |
||
40 | PPP_IPv4 = 0x2100 |
||
41 | PPP_LCP = 0x21c0 |
||
42 | |||
2959 | hidnplayr | 43 | ; PPP Active Discovery... |
44 | PPPoE_PADI = 0x09 ; .. Initiation |
||
45 | PPPoE_PADO = 0x07 ; .. Offer |
||
46 | PPPoE_PADR = 0x19 ; .. Request |
||
47 | PPPoE_PADS = 0x65 ; .. Session-confirmation |
||
48 | PPPoE_PADT = 0xa7 ; .. Terminate |
||
49 | |||
2960 | hidnplayr | 50 | TAG_EOL = 0x0000 |
51 | TAG_SERVICE_NAME= 0x0101 |
||
52 | TAG_AC_NAME = 0x0201 |
||
53 | TAG_HOST_UNIQ = 0x0301 |
||
54 | TAG_AC_COOKIE = 0x0401 |
||
55 | |||
2962 | hidnplayr | 56 | LCP_config_request = 1 |
57 | LCP_config_ack = 2 |
||
58 | LCP_config_nak = 3 |
||
59 | LCP_config_reject = 4 |
||
60 | LCP_terminate_request = 5 |
||
61 | LCP_terminate_ack = 6 |
||
62 | LCP_code_reject = 7 |
||
63 | LCP_protocol_reject = 8 |
||
64 | LCP_echo_request = 9 |
||
65 | LCP_echo_reply = 10 |
||
66 | LCP_discard_request = 11 |
||
67 | |||
2960 | hidnplayr | 68 | struct ETH_frame |
69 | DestMac dp ? |
||
70 | SrcMac dp ? |
||
71 | Type dw ? |
||
72 | ends |
||
73 | |||
74 | struct PPPoE_frame ETH_frame |
||
2959 | hidnplayr | 75 | VersionAndType db ? |
76 | Code db ? |
||
77 | SessionID dw ? |
||
78 | Length dw ? ; Length of payload, does NOT include the length PPPoE header. |
||
79 | Payload rb 0 |
||
80 | ends |
||
81 | |||
2962 | hidnplayr | 82 | struct PPP_frame PPPoE_frame |
83 | Protocol dw ? |
||
84 | ends |
||
85 | |||
86 | struct LCP_frame PPP_frame |
||
87 | LCP_Code db ? |
||
88 | LCP_Identifier db ? |
||
89 | LCP_Length dw ? |
||
90 | LCP_Data rb 0 |
||
91 | ends |
||
92 | |||
2959 | hidnplayr | 93 | ; entry point |
94 | start: |
||
95 | ; load libraries |
||
96 | stdcall dll.Load, @IMPORT |
||
97 | test eax, eax |
||
98 | jnz exit |
||
99 | ; initialize console |
||
100 | push 1 |
||
101 | call [con_start] |
||
102 | push title |
||
103 | push 25 |
||
104 | push 80 |
||
105 | push 25 |
||
106 | push 80 |
||
107 | call [con_init] |
||
108 | |||
109 | main: |
||
110 | mcall 40, 1 shl 7 |
||
111 | |||
112 | call [con_cls] |
||
113 | ; Welcome user |
||
114 | push str1 |
||
115 | call [con_write_asciiz] |
||
116 | |||
117 | mcall socket, 777, 3, 666 |
||
118 | mov [socketnum], eax |
||
2960 | hidnplayr | 119 | mcall send, [socketnum], PADI, PADI.length, 0 |
2959 | hidnplayr | 120 | |
2960 | hidnplayr | 121 | mainloop: |
2959 | hidnplayr | 122 | mcall 10 |
123 | |||
124 | call [con_get_flags] |
||
125 | test eax, 0x200 ; con window closed? |
||
126 | jnz close_conn |
||
127 | |||
128 | mcall recv, [socketnum], buffer, 4096 |
||
2960 | hidnplayr | 129 | cmp eax, sizeof.PPPoE_frame |
130 | jb mainloop |
||
2959 | hidnplayr | 131 | |
2962 | hidnplayr | 132 | cmp word [buffer + ETH_frame.Type], ETHER_PPP_SESSION |
133 | je LCP_input |
||
134 | |||
135 | cmp word [buffer + ETH_frame.Type], ETHER_PPP_DISCOVERY |
||
136 | jne mainloop |
||
137 | |||
2960 | hidnplayr | 138 | cmp [buffer + PPPoE_frame.Code], PPPoE_PADO |
139 | je pado |
||
2959 | hidnplayr | 140 | |
2960 | hidnplayr | 141 | cmp [buffer + PPPoE_frame.Code], PPPoE_PADS |
142 | je pads |
||
2959 | hidnplayr | 143 | |
2960 | hidnplayr | 144 | cmp [buffer + PPPoE_frame.Code], PPPoE_PADT |
145 | je padt |
||
2959 | hidnplayr | 146 | |
2960 | hidnplayr | 147 | jmp mainloop |
2959 | hidnplayr | 148 | |
2960 | hidnplayr | 149 | pado: |
2959 | hidnplayr | 150 | |
151 | push str2 |
||
152 | call [con_write_asciiz] |
||
153 | |||
2960 | hidnplayr | 154 | lea esi, [buffer + ETH_frame.SrcMac] ; source mac -> dest mac |
155 | lea edi, [buffer + ETH_frame.DestMac] |
||
156 | movsw |
||
2959 | hidnplayr | 157 | movsd |
158 | |||
2960 | hidnplayr | 159 | mov byte [buffer + PPPoE_frame.Code], PPPoE_PADR ; change packet type to PADR |
2959 | hidnplayr | 160 | |
2960 | hidnplayr | 161 | mov al, byte [buffer + PPPoE_frame.Length + 1] ; get packet size |
162 | mov ah, byte [buffer + PPPoE_frame.Length + 0] |
||
2959 | hidnplayr | 163 | movzx esi, ax |
2960 | hidnplayr | 164 | add esi, sizeof.PPPoE_frame |
2959 | hidnplayr | 165 | |
166 | mcall send, [socketnum], buffer, , 0 ; now send it! |
||
167 | |||
2960 | hidnplayr | 168 | jmp mainloop |
2959 | hidnplayr | 169 | |
170 | |||
2960 | hidnplayr | 171 | pads: |
2959 | hidnplayr | 172 | |
173 | push str3 |
||
174 | call [con_write_asciiz] |
||
175 | |||
2960 | hidnplayr | 176 | mov edx, dword [buffer + ETH_frame.SrcMac] ; source mac -> dest mac |
177 | mov si, word [buffer + ETH_frame.SrcMac + 4] |
||
2959 | hidnplayr | 178 | mov dword [PADT.mac], edx |
179 | mov word [PADT.mac + 4], si |
||
180 | |||
2960 | hidnplayr | 181 | mov cx, word [buffer + PPPoE_frame.SessionID] ; and Session ID |
2959 | hidnplayr | 182 | mov [PADT.sid], cx |
183 | |||
2960 | hidnplayr | 184 | mcall 76, API_PPPOE + 0 ; Start PPPoE session |
2959 | hidnplayr | 185 | |
2960 | hidnplayr | 186 | jmp mainloop |
2959 | hidnplayr | 187 | |
2960 | hidnplayr | 188 | padt: |
2959 | hidnplayr | 189 | |
190 | push str4 |
||
191 | call [con_write_asciiz] |
||
192 | |||
2960 | hidnplayr | 193 | mcall 76, API_PPPOE + 1 |
2959 | hidnplayr | 194 | |
195 | exit: |
||
196 | mcall close, [socketnum] |
||
197 | mcall -1 |
||
198 | |||
199 | |||
200 | close_conn: |
||
201 | |||
202 | mcall send, [socketnum], PADT, 14 + 6, 0 |
||
203 | jmp exit |
||
204 | |||
2962 | hidnplayr | 205 | |
206 | LCP_input: |
||
207 | |||
208 | cmp word [buffer + PPP_frame.Protocol], PPP_LCP |
||
209 | jne mainloop |
||
210 | |||
211 | cmp [buffer + LCP_frame.LCP_Code], LCP_echo_request |
||
212 | je .echo |
||
213 | |||
214 | .dump: |
||
215 | jmp mainloop |
||
216 | |||
217 | .echo: |
||
218 | mov [buffer + LCP_frame.LCP_Code], LCP_echo_reply |
||
219 | |||
220 | push dword [buffer + ETH_frame.DestMac] |
||
221 | push dword [buffer + ETH_frame.SrcMac] |
||
222 | pop dword [buffer + ETH_frame.DestMac] |
||
223 | pop dword [buffer + ETH_frame.SrcMac] |
||
224 | push word [buffer + ETH_frame.DestMac + 4] |
||
225 | push word [buffer + ETH_frame.SrcMac + 4] |
||
226 | pop word [buffer + ETH_frame.DestMac + 4] |
||
227 | pop word [buffer + ETH_frame.SrcMac + 4] |
||
228 | |||
229 | mov esi, eax |
||
230 | mcall send, [socketnum], buffer, , 0 ; now send it! |
||
231 | |||
232 | jmp mainloop |
||
233 | |||
2959 | hidnplayr | 234 | ; data |
235 | title db 'PPPoE',0 |
||
236 | str1 db 'Sending PADI',13,10,0 |
||
237 | str2 db 'Got PADO',13,10,'Sending PADR',13,10,0 |
||
238 | str3 db 'Got PADS',13,10,'starting PPPoE session',13,10,0 |
||
239 | str4 db 'Got PADT - connection terminated by Access Concentrator',13,10,0 |
||
240 | |||
241 | |||
242 | PADI: |
||
243 | dp -1 ; dest mac |
||
244 | dp 0 ; source mac (overwritten by kernel) |
||
245 | dw 0 ; type (overwritten by kernel) |
||
246 | |||
247 | db 0x11 |
||
248 | db PPPoE_PADI |
||
249 | dw 0 ; session ID |
||
2960 | hidnplayr | 250 | dw 20 shl 8 |
2959 | hidnplayr | 251 | |
2960 | hidnplayr | 252 | dw TAG_SERVICE_NAME |
2959 | hidnplayr | 253 | dw 0x0000 |
254 | |||
2960 | hidnplayr | 255 | dw TAG_HOST_UNIQ |
256 | dw 0x0c00 ; 12 bytes long |
||
257 | dd 0xdead ; some random id |
||
258 | dd 0xbeef |
||
259 | dd 0x1337 |
||
260 | |||
261 | .length = $ - PADI |
||
262 | |||
2959 | hidnplayr | 263 | PADT: |
264 | |||
265 | .mac dp 0 |
||
266 | dp 0 |
||
267 | dw 0 |
||
268 | |||
269 | db 0x11 |
||
270 | db PPPoE_PADT |
||
271 | .sid dw 0 |
||
272 | dw 0 |
||
273 | |||
274 | |||
275 | ; import |
||
276 | align 4 |
||
277 | @IMPORT: |
||
278 | |||
279 | library console, 'console.obj' |
||
280 | import console, \ |
||
281 | con_start, 'START', \ |
||
282 | con_init, 'con_init', \ |
||
283 | con_write_asciiz, 'con_write_asciiz', \ |
||
284 | con_exit, 'con_exit', \ |
||
285 | con_gets, 'con_gets',\ |
||
286 | con_cls, 'con_cls',\ |
||
287 | con_getch2, 'con_getch2',\ |
||
288 | con_set_cursor_pos, 'con_set_cursor_pos',\ |
||
289 | con_write_string, 'con_write_string',\ |
||
290 | con_get_flags, 'con_get_flags' |
||
291 | |||
292 | |||
293 | i_end: |
||
294 | |||
295 | socketnum dd ? |
||
2962 | hidnplayr | 296 | sid dw ? |
2959 | hidnplayr | 297 | buffer rb 4096 |
298 | rb 4096 ; stack |
||
299 | mem: |