Subversion Repositories Kolibri OS

Rev

Rev 3908 | Rev 5565 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3555 Serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
5201 serge 3
;; Copyright (C) KolibriOS team 2012-2014. All rights reserved. ;;
3555 Serge 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
 
5201 serge 17
$Revision: 5015 $
18
 
19
 
3555 Serge 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
3725 Serge 29
align 4
30
 
3555 Serge 31
        PPPoE_SID       dw ?
32
        PPPoE_MAC       dp ?
3725 Serge 33
 
3555 Serge 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
 
3589 Serge 68
        DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_discovery_input\n"
3555 Serge 69
 
70
; First, find open PPPoE socket
71
 
3725 Serge 72
        pusha
73
        mov     ecx, socket_mutex
74
        call    mutex_lock
75
        popa
76
 
3555 Serge 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
 
3725 Serge 90
        pusha
91
        mov     ecx, socket_mutex
92
        call    mutex_unlock
93
        popa
94
 
3555 Serge 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:
3725 Serge 103
        pusha
104
        mov     ecx, socket_mutex
105
        call    mutex_unlock
106
        popa
107
 
3589 Serge 108
        DEBUGF  DEBUG_NETWORK_VERBOSE, 'PPPoE_discovery_input: dumping\n'
3908 Serge 109
        call    NET_packet_free
3555 Serge 110
        add     esp, 4
111
        ret
112
 
113
 
114
;--------------------------------------
115
;
116
; Send discovery packet
117
;
118
; IN: eax = socket pointer
119
;     ecx = number of bytes to send
120
;     esi = pointer to data
121
;
122
;--------------------------------------
123
 
124
align 4
125
PPPoE_discovery_output:
126
 
3589 Serge 127
        DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_discovery_output: socket=%x buffer=%x size=%d\n", eax, esi, ecx
3555 Serge 128
 
129
; RFC2516: An entire PADI packet (including the PPPoE header) MUST NOT
130
; exceed 1484 octets.
131
        cmp     ecx, 1484 + 14
132
        ja      .bad
133
 
134
; Check that device exists and is ethernet device
135
        mov     ebx, [eax + SOCKET.device]
136
 
3626 Serge 137
        cmp     ebx, NET_DEVICES_MAX
3555 Serge 138
        ja      .bad
139
 
140
        mov     ebx, [NET_DRV_LIST + 4*ebx]
141
        test    ebx, ebx
142
        jz      .bad
143
 
3626 Serge 144
        cmp     [ebx + NET_DEVICE.device_type], NET_DEVICE_ETH
3555 Serge 145
        jne     .bad
146
 
3589 Serge 147
        DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_discovery_output: device=%x\n", ebx
3555 Serge 148
 
149
; Create packet.
150
        push    ecx esi
151
        stdcall kernel_alloc, 1500
152
        pop     esi ecx
153
        test    eax, eax
154
        jz      .bad
155
 
156
        mov     edx, ecx
157
        mov     edi, eax
3725 Serge 158
        rep movsb
3555 Serge 159
 
160
        cmp     edx, 60         ; Min ETH size
161
        ja      @f
162
        mov     edx, 60
163
       @@:
164
 
165
        push    edx eax         ; size and packet ptr for driver send proc
166
 
167
; Overwrite source MAC and protocol type
168
        lea     edi, [eax + ETH_header.SrcMAC]
169
        lea     esi, [ebx + ETH_DEVICE.mac]
170
        movsd
171
        movsw
3626 Serge 172
        cmp     word[edi], ETHER_PROTO_PPP_SESSION      ; Allow only PPP_discovery, or LCP
3555 Serge 173
        je      @f
3626 Serge 174
        mov     ax, ETHER_PROTO_PPP_DISCOVERY
3555 Serge 175
        stosw
176
       @@:
177
 
178
; And send the packet
179
        call    [ebx + NET_DEVICE.transmit]
180
 
181
        xor     eax, eax
182
        ret
183
 
184
  .bad:
185
        or      eax, -1
186
        ret
187
 
188
 
189
;-----------------------------------------------------------------
190
;
191
; PPPoE session input
192
;
193
; Handler of received Ethernet packet with type = Session
194
;
195
;
196
;  IN:  Pointer to buffer in [esp]
197
;       size of buffer in [esp+4]
198
;       pointer to device struct in ebx
199
;       pointer to PPP header in edx
200
;       size of PPP packet in ecx
201
;  OUT: /
202
;
203
;-----------------------------------------------------------------
204
align 4
205
PPPoE_session_input:
206
 
207
        cmp     [edx + PPPoE_frame.VersionAndType], 0x11
208
        jne     .dump
209
 
210
        cmp     [edx + PPPoE_frame.Code], 0x00
211
        jne     .dump
212
 
213
        movzx   ecx, [edx + PPPoE_frame.Length]
214
        xchg    cl, ch
215
 
216
        mov     ax, [edx + PPPoE_frame.SessionID]
3589 Serge 217
        DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_input: session ID=%x, length=%u\n", ax, cx
3555 Serge 218
        cmp     ax, [PPPoE_SID]
219
        jne     .dump
220
 
221
        mov     ax, word [edx + PPPoE_frame.Payload]
222
        add     edx, PPPoE_frame.Payload + 2
223
 
3626 Serge 224
        cmp     ax, PPP_PROTO_IPv4
3555 Serge 225
        je      IPv4_input
226
 
3626 Serge 227
;        cmp     ax, PPP_PROTO_IPv6
3555 Serge 228
;        je      IPv6_input
229
 
230
        jmp     PPPoE_discovery_input   ; Send LCP,CHAP,CBCP,... packets to the PPP dialer
3589 Serge 231
        DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_input: Unknown protocol=%x\n", ax
3555 Serge 232
 
233
  .dump:
3589 Serge 234
        DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_input: dumping\n"
3908 Serge 235
        call    NET_packet_free
3555 Serge 236
        add     esp, 4
237
        ret
238
 
239
 
240
 
241
 
242
;-----------------------------------------------------------------
243
;
244
; PPPoE_output
245
;
5201 serge 246
; IN:  ax = protocol
3555 Serge 247
;     ebx = device ptr
248
;     ecx = packet size
249
;
5201 serge 250
; OUT: eax = buffer start / 0 on error
251
;      ebx = device ptr
252
;      ecx = packet size
3555 Serge 253
;      edx = size of complete buffer
5201 serge 254
;      edi = start of PPP payload
3555 Serge 255
;
256
;-----------------------------------------------------------------
257
align 4
258
PPPoE_output:
259
 
3589 Serge 260
        DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_output: size=%u device=%x\n", ecx, ebx
3555 Serge 261
 
5201 serge 262
        pushw   ax
3555 Serge 263
        pushw   [PPPoE_SID]
264
 
5201 serge 265
        mov     ax, ETHER_PROTO_PPP_SESSION
266
        add     ecx, PPPoE_frame.Payload + 2
3555 Serge 267
        lea     edx, [PPPoE_MAC]
268
        call    ETH_output
269
        jz      .eth_error
270
 
271
        sub     ecx, PPPoE_frame.Payload
272
        mov     [edi + PPPoE_frame.VersionAndType], 0x11
273
        mov     [edi + PPPoE_frame.Code], 0
274
        popw    [edi + PPPoE_frame.SessionID]
275
        xchg    cl, ch
276
        mov     [edi + PPPoE_frame.Length], cx
277
        xchg    cl, ch
278
 
279
        pop     word [edi + PPPoE_frame.Payload]
280
 
281
        sub     ecx, 2
282
        add     edi, PPPoE_frame.Payload + 2
283
 
3589 Serge 284
        DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_output: success!\n"
3555 Serge 285
        ret
286
 
287
 
288
  .eth_error:
289
        add     esp, 4
5201 serge 290
        xor     eax, eax
3555 Serge 291
        ret
292
 
293
 
294
PPPoE_start_connection:
295
 
3589 Serge 296
        DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_start_connection: %x\n", cx
3555 Serge 297
 
298
        cmp     [PPPoE_SID], 0
299
        jne     .fail
300
 
301
        mov     [PPPoE_SID], cx
302
        mov     dword [PPPoE_MAC], edx
303
        mov     word [PPPoE_MAC + 4], si
304
 
305
        xor     eax, eax
306
        ret
307
 
308
  .fail:
309
        or      eax, -1
310
        ret
311
 
312
 
313
align 4
314
PPPoE_stop_connection:
315
 
3589 Serge 316
        DEBUGF  DEBUG_NETWORK_VERBOSE, "PPPoE_stop_connection\n"
3555 Serge 317
 
318
        xor     eax, eax
319
        mov     [PPPoE_SID], ax
320
        mov     dword [PPPoE_MAC], eax
321
        mov     word [PPPoE_MAC + 4], ax
322
 
323
        ret
324
 
325
 
326
;---------------------------------------------------------------------------
327
;
328
; PPPoE API
329
;
330
; This function is called by system function 75
331
;
332
; IN:  subfunction number in bl
333
;      device number in bh
334
;      ecx, edx, .. depends on subfunction
335
;
336
; OUT:
337
;
338
;---------------------------------------------------------------------------
339
align 4
340
PPPoE_api:
341
 
342
        movzx   eax, bh
343
        shl     eax, 2
344
 
345
        and     ebx, 0xff
346
        cmp     ebx, .number
347
        ja      .error
348
        jmp     dword [.table + 4*ebx]
349
 
350
  .table:
351
        dd      PPPoE_start_connection  ; 0
352
        dd      PPPoE_stop_connection   ; 1
353
  .number = ($ - .table) / 4 - 1
354
 
355
  .error:
356
        mov     eax, -1
357
        ret