Rev 3562 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3545 | hidnplayr | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
3618 | hidnplayr | 3 | ;; Copyright (C) KolibriOS team 2010-2013. All rights reserved. ;; |
3545 | hidnplayr | 4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
||
3618 | hidnplayr | 6 | ;; pppoe.asm - PPPoe dialer for KolibriOS ;; |
3545 | hidnplayr | 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 | |||
3618 | hidnplayr | 28 | include '../../macros.inc' |
3545 | hidnplayr | 29 | purge mov,add,sub |
3618 | hidnplayr | 30 | include '../../proc32.inc' |
31 | include '../../dll.inc' |
||
32 | include '../../network.inc' |
||
33 | include '../../struct.inc' |
||
3545 | hidnplayr | 34 | |
35 | ; Ethernet protocol numbers |
||
36 | ETHER_PPP_DISCOVERY = 0x6388 |
||
37 | ETHER_PPP_SESSION = 0x6488 |
||
38 | |||
39 | ; PPP protocol numbers |
||
40 | PPP_LCP = 0x21c0 ; Link Configure Protocol |
||
41 | PPP_CBCP = 0x29c0 ; CallBack Control Protocol |
||
42 | PPP_PAP = 0x23c0 ; Password Authenication Protocol packet |
||
43 | PPP_CHAP = 0x23c2 ; Challenge Handshake Authentication Protocol |
||
44 | PPP_IPCP = 0x2180 ; Internet Protocol Configure Protocol (maybe this should be in kernel?) |
||
45 | PPP_CCP = 0xfd80 ; Compression Configure Protocol |
||
46 | |||
47 | ; PPP Active Discovery... |
||
48 | PPPoE_PADI = 0x09 ; .. Initiation |
||
49 | PPPoE_PADO = 0x07 ; .. Offer |
||
50 | PPPoE_PADR = 0x19 ; .. Request |
||
51 | PPPoE_PADS = 0x65 ; .. Session-confirmation |
||
52 | PPPoE_PADT = 0xa7 ; .. Terminate |
||
53 | |||
54 | TAG_EOL = 0x0000 |
||
55 | TAG_SERVICE_NAME= 0x0101 |
||
56 | TAG_AC_NAME = 0x0201 |
||
57 | TAG_HOST_UNIQ = 0x0301 |
||
58 | TAG_AC_COOKIE = 0x0401 |
||
59 | |||
60 | LCP_config_request = 1 |
||
61 | LCP_config_ack = 2 |
||
62 | LCP_config_nak = 3 |
||
63 | LCP_config_reject = 4 |
||
64 | LCP_terminate_request = 5 |
||
65 | LCP_terminate_ack = 6 |
||
66 | LCP_code_reject = 7 |
||
67 | LCP_protocol_reject = 8 |
||
68 | LCP_echo_request = 9 |
||
69 | LCP_echo_reply = 10 |
||
70 | LCP_discard_request = 11 |
||
71 | |||
72 | struct ETH_frame |
||
73 | DestMac dp ? |
||
74 | SrcMac dp ? |
||
75 | Type dw ? |
||
76 | ends |
||
77 | |||
78 | struct PPPoE_frame ETH_frame |
||
79 | VersionAndType db ? |
||
80 | Code db ? |
||
81 | SessionID dw ? |
||
82 | Length dw ? ; Length of payload, does NOT include the length PPPoE header. |
||
83 | Payload rb 0 |
||
84 | ends |
||
85 | |||
86 | struct PPP_frame PPPoE_frame |
||
87 | Protocol dw ? |
||
88 | ends |
||
89 | |||
90 | struct LCP_frame PPP_frame |
||
91 | LCP_Code db ? |
||
92 | LCP_Identifier db ? |
||
93 | LCP_Length dw ? |
||
94 | LCP_Data rb 0 |
||
95 | ends |
||
96 | |||
97 | ; entry point |
||
98 | start: |
||
99 | ; load libraries |
||
100 | stdcall dll.Load, @IMPORT |
||
101 | test eax, eax |
||
102 | jnz exit |
||
103 | ; initialize console |
||
104 | push 1 |
||
105 | call [con_start] |
||
106 | push title |
||
107 | push 25 |
||
108 | push 80 |
||
109 | push 25 |
||
110 | push 80 |
||
111 | call [con_init] |
||
112 | |||
113 | main: |
||
114 | mcall 40, 1 shl 7 |
||
115 | |||
116 | call [con_cls] |
||
117 | ; Welcome user |
||
118 | push str1 |
||
119 | call [con_write_asciiz] |
||
120 | |||
121 | mcall socket, 777, 3, 666 |
||
122 | mov [socketnum], eax |
||
123 | mcall send, [socketnum], PADI, PADI.length, 0 |
||
124 | |||
125 | mainloop: |
||
126 | mcall 10 |
||
127 | |||
128 | call [con_get_flags] |
||
129 | test eax, 0x200 ; con window closed? |
||
130 | jnz close_conn |
||
131 | |||
3562 | hidnplayr | 132 | mcall recv, [socketnum], buffer, 4096, 0 |
3545 | hidnplayr | 133 | cmp eax, sizeof.PPPoE_frame |
134 | jb mainloop |
||
135 | |||
136 | cmp word [buffer + ETH_frame.Type], ETHER_PPP_SESSION |
||
137 | je SESSION_input |
||
138 | |||
139 | cmp word [buffer + ETH_frame.Type], ETHER_PPP_DISCOVERY |
||
140 | jne mainloop |
||
141 | |||
142 | cmp [buffer + PPPoE_frame.Code], PPPoE_PADO |
||
143 | je pado |
||
144 | |||
145 | cmp [buffer + PPPoE_frame.Code], PPPoE_PADS |
||
146 | je pads |
||
147 | |||
148 | cmp [buffer + PPPoE_frame.Code], PPPoE_PADT |
||
149 | je padt |
||
150 | |||
151 | jmp mainloop |
||
152 | |||
153 | pado: |
||
154 | |||
155 | push str2 |
||
156 | call [con_write_asciiz] |
||
157 | |||
158 | lea esi, [buffer + ETH_frame.SrcMac] ; source mac -> dest mac |
||
159 | lea edi, [buffer + ETH_frame.DestMac] |
||
160 | movsw |
||
161 | movsd |
||
162 | |||
163 | mov byte [buffer + PPPoE_frame.Code], PPPoE_PADR ; change packet type to PADR |
||
164 | |||
165 | mov al, byte [buffer + PPPoE_frame.Length + 1] ; get packet size |
||
166 | mov ah, byte [buffer + PPPoE_frame.Length + 0] |
||
167 | movzx esi, ax |
||
168 | add esi, sizeof.PPPoE_frame |
||
169 | mcall send, [socketnum], buffer, , 0 ; now send it! |
||
170 | |||
171 | jmp mainloop |
||
172 | |||
173 | |||
174 | pads: |
||
175 | |||
176 | push str3 |
||
177 | call [con_write_asciiz] |
||
178 | |||
179 | mov edx, dword [buffer + ETH_frame.SrcMac] ; source mac -> dest mac |
||
180 | mov si, word [buffer + ETH_frame.SrcMac + 4] |
||
181 | mov dword [PADT.mac], edx |
||
182 | mov word [PADT.mac + 4], si |
||
183 | |||
184 | mov cx, word [buffer + PPPoE_frame.SessionID] ; and Session ID |
||
185 | mov [PADT.sid], cx |
||
186 | |||
187 | mcall 76, API_PPPOE + 0 ; Start PPPoE session |
||
188 | |||
189 | jmp mainloop |
||
190 | |||
191 | padt: |
||
192 | |||
193 | push str4 |
||
194 | call [con_write_asciiz] |
||
195 | |||
196 | mcall 76, API_PPPOE + 1 ; Stop PPPoE session |
||
197 | |||
198 | exit: |
||
199 | mcall close, [socketnum] |
||
200 | mcall -1 |
||
201 | |||
202 | |||
203 | close_conn: |
||
204 | |||
205 | mcall send, [socketnum], PADT, PADT.length, 0 |
||
206 | jmp exit |
||
207 | |||
208 | |||
209 | SESSION_input: |
||
210 | |||
211 | mov ax, word[buffer + PPP_frame.Protocol] |
||
212 | |||
213 | cmp ax, PPP_LCP |
||
214 | je LCP_input |
||
215 | |||
216 | cmp ax, PPP_CBCP |
||
217 | je CBCP_input |
||
218 | |||
219 | cmp ax, PPP_PAP |
||
220 | je PAP_input |
||
221 | |||
222 | cmp ax, PPP_CHAP |
||
223 | je CHAP_input |
||
224 | |||
225 | cmp ax, PPP_IPCP |
||
226 | je IPCP_input |
||
227 | |||
228 | cmp ax, PPP_CCP |
||
229 | je CCP_input |
||
230 | |||
231 | jmp mainloop |
||
232 | |||
233 | |||
234 | |||
235 | LCP_input: |
||
236 | |||
237 | stdcall con_write_asciiz, str_lcp |
||
238 | |||
239 | cmp [buffer + LCP_frame.LCP_Code], LCP_echo_request |
||
240 | je .echo |
||
241 | |||
242 | .dump: |
||
243 | jmp mainloop |
||
244 | |||
245 | .echo: |
||
246 | mov [buffer + LCP_frame.LCP_Code], LCP_echo_reply |
||
247 | |||
248 | lea esi, [buffer + ETH_frame.SrcMac] ; source mac -> dest mac |
||
249 | lea edi, [buffer + ETH_frame.DestMac] |
||
250 | movsw |
||
251 | movsd |
||
252 | |||
253 | mov esi, eax |
||
254 | mcall send, [socketnum], buffer, , 0 ; now send it back! |
||
255 | |||
256 | jmp mainloop |
||
257 | |||
258 | CBCP_input: |
||
259 | |||
260 | stdcall con_write_asciiz, str_cbcp |
||
261 | |||
262 | jmp mainloop |
||
263 | |||
264 | PAP_input: |
||
265 | |||
266 | stdcall con_write_asciiz, str_pap |
||
267 | |||
268 | jmp mainloop |
||
269 | |||
270 | CHAP_input: |
||
271 | |||
272 | stdcall con_write_asciiz, str_chap |
||
273 | |||
274 | jmp mainloop |
||
275 | |||
276 | IPCP_input: |
||
277 | |||
278 | stdcall con_write_asciiz, str_ipcp |
||
279 | |||
280 | jmp mainloop |
||
281 | |||
282 | CCP_input: |
||
283 | |||
284 | stdcall con_write_asciiz, str_ccp |
||
285 | |||
286 | jmp mainloop |
||
287 | |||
288 | ; data |
||
289 | title db 'PPPoE',0 |
||
290 | str1 db 'Sending PADI',13,10,0 |
||
291 | str2 db 'Got PADO',13,10,'Sending PADR',13,10,0 |
||
292 | str3 db 'Got PADS',13,10,'starting PPPoE session',13,10,0 |
||
293 | str4 db 'Got PADT - connection terminated by Access Concentrator',13,10,0 |
||
294 | str_lcp db 'Got LCP packet',13,10,0 |
||
295 | str_cbcp db 'got CBCP packet',13,10,0 |
||
296 | str_pap db 'got PAP packet',13,10,0 |
||
297 | str_chap db 'got CHAP packet',13,10,0 |
||
298 | str_ipcp db 'got IPCP packet',13,10,0 |
||
299 | str_ccp db 'got CCP packet',13,10,0 |
||
300 | |||
301 | |||
302 | PADI: |
||
303 | dp 0xffffffffffff ; dest mac: broadcast |
||
304 | dp 0 ; source mac (overwritten by kernel) |
||
305 | dw ETHER_PPP_DISCOVERY ; type |
||
306 | |||
307 | db 0x11 ; Version and Type |
||
308 | db PPPoE_PADI ; Code |
||
309 | dw 0 ; session ID |
||
310 | dw 20 shl 8 ; Payload Length |
||
311 | |||
312 | dw TAG_SERVICE_NAME ; tag |
||
313 | dw 0x0000 ; length |
||
314 | |||
315 | dw TAG_HOST_UNIQ ; tag |
||
316 | dw 0x0c00 ; length = 12 bytes |
||
317 | |||
318 | dd 0xdead ; some random id |
||
319 | dd 0xbeef |
||
320 | dd 0x1337 |
||
321 | |||
322 | .length = $ - PADI |
||
323 | |||
324 | PADT: |
||
325 | |||
326 | .mac dp 0 ; Dest mac, to be filled in |
||
327 | dp 0 ; source mac (overwritten by kernel) |
||
328 | dw ETHER_PPP_DISCOVERY ; Type |
||
329 | |||
330 | db 0x11 ; Version and Type |
||
331 | db PPPoE_PADT ; Code: terminate connection |
||
332 | .sid dw 0 ; session id, to be filled in |
||
333 | dw 0 ; PAyload length = 0 |
||
334 | |||
335 | .length = $ - PADT |
||
336 | |||
337 | |||
338 | ; import |
||
339 | align 4 |
||
340 | @IMPORT: |
||
341 | |||
342 | library console, 'console.obj' |
||
343 | import console, \ |
||
344 | con_start, 'START', \ |
||
345 | con_init, 'con_init', \ |
||
346 | con_write_asciiz, 'con_write_asciiz', \ |
||
347 | con_exit, 'con_exit', \ |
||
348 | con_gets, 'con_gets',\ |
||
349 | con_cls, 'con_cls',\ |
||
350 | con_getch2, 'con_getch2',\ |
||
351 | con_set_cursor_pos, 'con_set_cursor_pos',\ |
||
352 | con_write_string, 'con_write_string',\ |
||
353 | con_get_flags, 'con_get_flags' |
||
354 | |||
355 | |||
356 | i_end: |
||
357 | |||
358 | socketnum dd ? |
||
359 | |||
360 | buffer rb 4096 |
||
361 | rb 4096 ; stack |
||
362 | mem: |