FreeCalypso > hg > fc-magnetite
comparison src/g23m-fad/ppp/ppp_papf.c @ 174:90eb61ecd093
src/g23m-fad: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 12 Oct 2016 05:40:46 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
173:bf64d785238a | 174:90eb61ecd093 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : | |
4 | Modul : | |
5 +----------------------------------------------------------------------------- | |
6 | Copyright 2002 Texas Instruments Berlin, AG | |
7 | All rights reserved. | |
8 | | |
9 | This file is confidential and a trade secret of Texas | |
10 | Instruments Berlin, AG | |
11 | The receipt of or possession of this file does not convey | |
12 | any rights to reproduce or disclose its contents or to | |
13 | manufacture, use, or sell anything it may describe, in | |
14 | whole, or in part, without the specific written consent of | |
15 | Texas Instruments Berlin, AG. | |
16 +----------------------------------------------------------------------------- | |
17 | Purpose : This modul is part of the entity PPP and implements all | |
18 | procedures and functions as described in the | |
19 | SDL-documentation (PAP-statemachine) | |
20 +----------------------------------------------------------------------------- | |
21 */ | |
22 | |
23 #ifndef PPP_PAPF_C | |
24 #define PPP_PAPF_C | |
25 #endif /* !PPP_PAPF_C */ | |
26 | |
27 #define ENTITY_PPP | |
28 | |
29 /*==== INCLUDES =============================================================*/ | |
30 | |
31 #include "typedefs.h" /* to get Condat data types */ | |
32 #include "vsi.h" /* to get a lot of macros */ | |
33 #include "macdef.h" /* to get a lot of macros */ | |
34 #include "custom.h" /* to get a lot of macros */ | |
35 #include "gsm.h" /* to get a lot of macros */ | |
36 #include "cnf_ppp.h" /* to get cnf-definitions */ | |
37 #include "mon_ppp.h" /* to get mon-definitions */ | |
38 #include "prim.h" /* to get the definitions of used SAP and directions */ | |
39 #include "dti.h" /* to get the DTILIB definitions */ | |
40 #include "ppp.h" /* to get the global entity definitions */ | |
41 | |
42 #include "ppp_arbf.h" /* to get function interface from arb */ | |
43 #include <string.h> /* to get memcpy */ | |
44 | |
45 /*==== CONST ================================================================*/ | |
46 | |
47 #define PAP_AUTH_ACK_LENGTH 5 | |
48 | |
49 /* | |
50 * the authentication request packet must be passable to the ISP in protocol | |
51 * configuration options (pco). The maximum length of pco is | |
52 * 251 octets (253 - 2 (identification overhead) = 251). There must also be | |
53 * space for other protocol packet, like LCP and IPCP. | |
54 * LCP needs | |
55 * 15 octets (3 (overhead pco) + 4 (overhead packet) + 4 (mru) + 4 | |
56 * (authentication protocol PAP) = 15) for server packet and | |
57 * 11 octets (3 (overhead pco) + 4 (overhead packet) + 4 (mru) = 11) for | |
58 * client packet. | |
59 * IPCP needs | |
60 * 31 octets (3 (overhead pco) + 4 (overhead packet) + 6 (IP address) + 6 | |
61 * (VJ header compression) + 6 (primary DNS) + 6 (secondary DNS) = 31) for | |
62 * client packet and | |
63 * 13 octets (3 (overhead pco) + 4 (overhead packet) + 6 | |
64 * (Gateway address) = 13) for gateway address packet. | |
65 * PAP needs | |
66 * 3 octets for pco overhead. | |
67 */ | |
68 #define PAP_AUTH_REQ_LENGTH_MAX (251 - 15 - 11 - 31 - 13 - 3) | |
69 | |
70 #define PAP_AUTH_NAK_TEXT "authentication packet to long" | |
71 #define PAP_AUTH_NAK_TEXT_LENGTH sizeof(PAP_AUTH_NAK_TEXT) | |
72 #define PAP_AUTH_NAK_LENGTH (5 + PAP_AUTH_NAK_TEXT_LENGTH) | |
73 | |
74 /*==== LOCAL VARS ===========================================================*/ | |
75 | |
76 /*==== PRIVATE FUNCTIONS ====================================================*/ | |
77 | |
78 /*==== PUBLIC FUNCTIONS =====================================================*/ | |
79 | |
80 | |
81 | |
82 /* | |
83 +------------------------------------------------------------------------------ | |
84 | Function : pap_init | |
85 +------------------------------------------------------------------------------ | |
86 | Description : The function pap_init() initializes Password Authentication | |
87 | Protocol | |
88 | | |
89 | Parameters : no parameters | |
90 | | |
91 +------------------------------------------------------------------------------ | |
92 */ | |
93 GLOBAL void pap_init () | |
94 { | |
95 TRACE_FUNCTION( "pap_init" ); | |
96 | |
97 /* | |
98 * initialize values | |
99 */ | |
100 ppp_data->pap.counter = 0; | |
101 ppp_data->pap.nari = 0; | |
102 ppp_data->pap.ar_packet = NULL; | |
103 | |
104 INIT_STATE( PPP_SERVICE_PAP , PAP_DOWN ); | |
105 } /* pap_init() */ | |
106 | |
107 | |
108 | |
109 /* | |
110 +------------------------------------------------------------------------------ | |
111 | Function : pap_fill_out_packet | |
112 +------------------------------------------------------------------------------ | |
113 | Description : The function pap_fill_out_packet() puts a PAP packet into | |
114 | the protocol configuration list | |
115 | | |
116 | Parameters : pco_buf - pco list buffer | |
117 | ptr_pos - position where to write the PAP packet, this value | |
118 | must get back to the calling funtion | |
119 | | |
120 +------------------------------------------------------------------------------ | |
121 */ | |
122 GLOBAL void pap_fill_out_packet (UBYTE pco_buf[], USHORT* ptr_pos) | |
123 { | |
124 USHORT pos; | |
125 | |
126 TRACE_FUNCTION( "pap_fill_out_packet" ); | |
127 | |
128 pos = *ptr_pos; | |
129 | |
130 /* | |
131 * copy stored authentication request packet | |
132 */ | |
133 /* | |
134 * Protocol ID | |
135 */ | |
136 pco_buf[pos] = PROTOCOL_PAP_MSB; | |
137 pos++; | |
138 pco_buf[pos] = PROTOCOL_PAP_LSB; | |
139 pos++; | |
140 /* | |
141 * Length of Protocol contents | |
142 */ | |
143 pco_buf[pos] = (UBYTE)ppp_data->pap.ar_packet->len; | |
144 pos++; | |
145 /* | |
146 * copy packet | |
147 */ | |
148 memcpy(&pco_buf[pos], | |
149 ppp_data->pap.ar_packet->buffer, | |
150 ppp_data->pap.ar_packet->len); | |
151 pos+= ppp_data->pap.ar_packet->len; | |
152 /* | |
153 * return new position | |
154 */ | |
155 *ptr_pos = pos; | |
156 } /* pap_fill_out_packet() */ | |
157 | |
158 | |
159 | |
160 /* | |
161 +------------------------------------------------------------------------------ | |
162 | Function : pap_get_sar | |
163 +------------------------------------------------------------------------------ | |
164 | Description : The function pap_get_sar() returns a PAP Authenticate Request | |
165 | packet. | |
166 | | |
167 | Parameters : ptr_packet - returns the Authenticate Request packet | |
168 | THE MEMORY FOR THE PACKET WILL BE ALLOCATED BY | |
169 | THIS FUNCTION | |
170 | | |
171 +------------------------------------------------------------------------------ | |
172 */ | |
173 GLOBAL void pap_get_sar (T_desc2** ptr_packet) | |
174 { | |
175 T_desc2* ret_desc; | |
176 USHORT len_pos; | |
177 USHORT pos; | |
178 UBYTE i; | |
179 | |
180 TRACE_FUNCTION( "pap_get_sar" ); | |
181 | |
182 /* | |
183 * Allocate the necessary size for the data descriptor. The size is | |
184 * calculated as follows: | |
185 * - take the size of a descriptor structure | |
186 * - subtract one because of the array buffer[1] to get the size of | |
187 * descriptor control information | |
188 * - add number of octets of descriptor data | |
189 */ | |
190 MALLOC (ret_desc, (USHORT)(sizeof(T_desc2) - 1 + | |
191 5 + /* | |
192 * 1 octet code field | |
193 * 1 octet identifier field | |
194 * 2 octets packet length field | |
195 * 1 octet peer id length field | |
196 */ | |
197 ppp_data->login.name_len + | |
198 1 + /* size of password length field */ | |
199 ppp_data->login.password_len)); | |
200 /* | |
201 * fill the packet | |
202 */ | |
203 ret_desc->next = (ULONG)NULL; | |
204 pos = 0; | |
205 /* | |
206 * Code field | |
207 */ | |
208 ret_desc->buffer[pos] = CODE_AUTH_REQ; | |
209 pos++; | |
210 /* | |
211 * Identifier field | |
212 */ | |
213 ret_desc->buffer[pos] = ppp_data->pap.nari;/*lint !e415 (Warning -- access of out-of-bounds pointer)*/ | |
214 pos++; | |
215 /* | |
216 * Length field (store the position) | |
217 */ | |
218 len_pos = pos; | |
219 pos++; | |
220 pos++; | |
221 /* | |
222 * authentication: peer-id and passwort | |
223 */ | |
224 ret_desc->buffer[pos] = ppp_data->login.name_len;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
225 pos++; | |
226 for (i = 0; i < ppp_data->login.name_len; i++) | |
227 { | |
228 ret_desc->buffer[pos] = ppp_data->login.name[i];/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ | |
229 pos++; | |
230 } | |
231 ret_desc->buffer[pos] = ppp_data->login.password_len;/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ | |
232 pos++; | |
233 for (i = 0; i < ppp_data->login.password_len; i++) | |
234 { | |
235 ret_desc->buffer[pos] = ppp_data->login.password[i];/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ | |
236 pos++; | |
237 } | |
238 /* | |
239 * insert packet length | |
240 */ | |
241 ret_desc->len = pos; | |
242 ret_desc->buffer[len_pos] = (UBYTE)(pos >> 8);/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ | |
243 len_pos++; | |
244 ret_desc->buffer[len_pos] = (UBYTE)(pos & 0x00ff);/*lint !e661 !e662 (Warning -- Possible access/creation of out-of-bounds pointer)*/ | |
245 | |
246 /* | |
247 * return the created packet | |
248 */ | |
249 *ptr_packet = ret_desc; | |
250 } /* pap_get_sar() */ | |
251 | |
252 | |
253 | |
254 /* | |
255 +------------------------------------------------------------------------------ | |
256 | Function : pap_get_saa | |
257 +------------------------------------------------------------------------------ | |
258 | Description : The function pap_get_saa() returns a PAP Authenticate Ack | |
259 | packet. | |
260 | | |
261 | Parameters : ptr_packet - returns the Authenticate Ack packet | |
262 | THE MEMORY FOR THE PACKET WILL BE ALLOCATED BY | |
263 | THIS FUNCTION | |
264 | | |
265 +------------------------------------------------------------------------------ | |
266 */ | |
267 GLOBAL void pap_get_saa (T_desc2** ptr_packet) | |
268 { | |
269 T_desc2* packet; | |
270 USHORT pos; | |
271 | |
272 TRACE_FUNCTION( "pap_get_saa" ); | |
273 | |
274 /* | |
275 * Allocate the necessary size for the data descriptor. The size is | |
276 * calculated as follows: | |
277 * - take the size of a descriptor structure | |
278 * - subtract one because of the array buffer[1] to get the size of | |
279 * descriptor control information | |
280 * - add number of octets of descriptor data | |
281 */ | |
282 MALLOC (packet, (USHORT)(sizeof(T_desc2) - 1 + PAP_AUTH_ACK_LENGTH)); | |
283 packet->len = PAP_AUTH_ACK_LENGTH; | |
284 packet->next = (ULONG)NULL; | |
285 pos = 0; | |
286 /* | |
287 * code field | |
288 */ | |
289 packet->buffer[pos] = CODE_AUTH_ACK; | |
290 pos++; | |
291 /* | |
292 * identifier field | |
293 */ | |
294 packet->buffer[pos] = ppp_data->pap.nari;/*lint !e415 (Warning -- access of out-of-bounds pointer)*/ | |
295 pos++; | |
296 /* | |
297 * length field | |
298 */ | |
299 packet->buffer[pos] = 0;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
300 pos++; | |
301 packet->buffer[pos] = PAP_AUTH_ACK_LENGTH;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
302 pos++; | |
303 /* | |
304 * set Msg-Length field | |
305 */ | |
306 packet->buffer[pos] = 0;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
307 /* | |
308 * return the created packet | |
309 */ | |
310 *ptr_packet = packet; | |
311 } /* pap_get_saa() */ | |
312 | |
313 | |
314 | |
315 /* | |
316 +------------------------------------------------------------------------------ | |
317 | Function : pap_rar | |
318 +------------------------------------------------------------------------------ | |
319 | Description : The function pap_rar() checks whether the given | |
320 | Authenticate Request packet is valid and if so it returns | |
321 | FORWARD_RARP and an Authentication Ack packet. | |
322 | | |
323 | Parameters : ptr_packet - Authenticate Request packet | |
324 | forward - returns result of analysis | |
325 | | |
326 +------------------------------------------------------------------------------ | |
327 */ | |
328 GLOBAL void pap_rar (T_desc2** ptr_packet, UBYTE* forward) | |
329 { | |
330 T_desc2* packet; | |
331 USHORT packet_len; | |
332 USHORT pos; | |
333 | |
334 TRACE_FUNCTION( "pap_rar" ); | |
335 | |
336 /* | |
337 * this packet can only reveiced in server mode | |
338 */ | |
339 if(ppp_data->mode NEQ PPP_SERVER) | |
340 { | |
341 *forward = FORWARD_DISCARD; | |
342 return; | |
343 } | |
344 /* | |
345 * check correct length | |
346 */ | |
347 packet = *ptr_packet; | |
348 packet_len = packet->buffer[2];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
349 packet_len = packet_len << 8; | |
350 packet_len+= packet->buffer[3];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
351 if((packet_len < 6) || (packet_len > packet->len)) | |
352 { | |
353 *forward = FORWARD_DISCARD; | |
354 return; | |
355 } | |
356 | |
357 /* | |
358 * check consistence of length of packet and length of log on information | |
359 */ | |
360 pos = 4; | |
361 pos+= packet->buffer[pos];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
362 pos++; | |
363 pos+= packet->buffer[pos]; | |
364 pos++; | |
365 if(pos > packet_len) | |
366 { | |
367 *forward = FORWARD_DISCARD; | |
368 return; | |
369 } | |
370 | |
371 /* | |
372 * store authentication packet | |
373 */ | |
374 if(packet_len > PAP_AUTH_REQ_LENGTH_MAX) | |
375 { | |
376 /* | |
377 * create Authentication Nak | |
378 */ | |
379 /* | |
380 * change code field | |
381 */ | |
382 packet->buffer[0] = CODE_AUTH_NAK; | |
383 /* | |
384 * change length field | |
385 */ | |
386 packet->buffer[2] = 0;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
387 packet->buffer[3] = PAP_AUTH_NAK_LENGTH;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
388 packet->len = PAP_AUTH_NAK_LENGTH; | |
389 /* | |
390 * set Msg-Length field | |
391 */ | |
392 packet->buffer[4] = PAP_AUTH_NAK_TEXT_LENGTH;/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
393 /* | |
394 * fill out Message | |
395 */ | |
396 memcpy(&packet->buffer[5], PAP_AUTH_NAK_TEXT, PAP_AUTH_NAK_TEXT_LENGTH);/*lint !e419 !e416 (Warning -- creation of out-of-bounds pointer, Apparent data overrun)*/ | |
397 /* | |
398 * set return values | |
399 */ | |
400 *forward = FORWARD_RARN; | |
401 *ptr_packet = packet; | |
402 return; | |
403 } | |
404 arb_discard_packet(ppp_data->pap.ar_packet); | |
405 ppp_data->pap.ar_packet = packet; | |
406 ppp_data->pap.nari = packet->buffer[1];/*lint !e415 (Warning -- access of out-of-bounds pointer)*/ | |
407 /* | |
408 * create Authenticate Ack packet and | |
409 * set return values | |
410 */ | |
411 pap_get_saa(ptr_packet); | |
412 *forward = FORWARD_RARP; | |
413 } /* pap_rar */ | |
414 | |
415 | |
416 | |
417 /* | |
418 +------------------------------------------------------------------------------ | |
419 | Function : pap_raa | |
420 +------------------------------------------------------------------------------ | |
421 | Description : The function pap_raa() checks whether the given | |
422 | Authenticate Ack packet is valid and if so it returns | |
423 | FORWARD_RAA. | |
424 | | |
425 | Parameters : packet - Authenticate Ack packet | |
426 | forward - returns result of analysis | |
427 | | |
428 +------------------------------------------------------------------------------ | |
429 */ | |
430 GLOBAL void pap_raa (T_desc2* packet, UBYTE* forward) | |
431 { | |
432 USHORT packet_len; | |
433 | |
434 TRACE_FUNCTION( "pap_raa" ); | |
435 | |
436 /* | |
437 * this packet can only reveiced in client mode | |
438 */ | |
439 if(ppp_data->mode NEQ PPP_CLIENT) | |
440 { | |
441 *forward = FORWARD_DISCARD; | |
442 return; | |
443 } | |
444 /* | |
445 * check correct length | |
446 */ | |
447 packet_len = packet->buffer[2];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
448 packet_len = packet_len << 8; | |
449 packet_len+= packet->buffer[3];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
450 if((packet_len < 5) || (packet_len > packet->len)) | |
451 { | |
452 *forward = FORWARD_DISCARD; | |
453 return; | |
454 } | |
455 | |
456 if(packet->buffer[1] NEQ ppp_data->pap.nari)/*lint !e415 (Warning -- access of out-of-bounds pointer)*/ | |
457 { | |
458 /* | |
459 * invalid packet | |
460 */ | |
461 *forward = FORWARD_DISCARD; | |
462 return; | |
463 } | |
464 /* | |
465 * acceptable packet | |
466 */ | |
467 arb_discard_packet(packet); | |
468 ppp_data->pap.nari++; | |
469 *forward = FORWARD_RAA; | |
470 } /* pap_raa */ | |
471 | |
472 | |
473 | |
474 /* | |
475 +------------------------------------------------------------------------------ | |
476 | Function : pap_ran | |
477 +------------------------------------------------------------------------------ | |
478 | Description : The function pap_ran() checks whether the given | |
479 | Authenticate Nak packet is valid and if so it returns | |
480 | FORWARD_RAN. | |
481 | | |
482 | Parameters : packet - Authenticate Nak packet | |
483 | forward - returns result of analysis | |
484 | | |
485 +------------------------------------------------------------------------------ | |
486 */ | |
487 GLOBAL void pap_ran (T_desc2* packet, UBYTE* forward) | |
488 { | |
489 USHORT packet_len; | |
490 | |
491 TRACE_FUNCTION( "pap_ran" ); | |
492 | |
493 /* | |
494 * this packet can only reveiced in client mode | |
495 */ | |
496 if(ppp_data->mode NEQ PPP_CLIENT) | |
497 { | |
498 *forward = FORWARD_DISCARD; | |
499 return; | |
500 } | |
501 /* | |
502 * check correct length | |
503 */ | |
504 packet_len = packet->buffer[2];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
505 packet_len = packet_len << 8; | |
506 packet_len+= packet->buffer[3];/*lint !e415 !e416 (Warning -- access/creation of out-of-bounds pointer)*/ | |
507 if((packet_len < 5) || (packet_len > packet->len)) | |
508 { | |
509 *forward = FORWARD_DISCARD; | |
510 return; | |
511 } | |
512 | |
513 if(packet->buffer[1] NEQ ppp_data->pap.nari)/*lint !e415 (Warning -- access of out-of-bounds pointer)*/ | |
514 { | |
515 /* | |
516 * invalid packet | |
517 */ | |
518 *forward = FORWARD_DISCARD; | |
519 return; | |
520 } | |
521 /* | |
522 * acceptable packet | |
523 */ | |
524 arb_discard_packet(packet); | |
525 *forward = FORWARD_RAN; | |
526 } /* pap_ran */ |