FreeCalypso > hg > fc-magnetite
comparison src/g23m-fad/ppp/ppp_arbp.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 | functions to handles the incoming primitives as described in | |
19 | the SDL-documentation (ARB-statemachine) | |
20 +----------------------------------------------------------------------------- | |
21 */ | |
22 | |
23 #ifndef PPP_ARBP_C | |
24 #define PPP_ARBP_C | |
25 #endif /* !PPP_ARBP_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_rts.h" /* to get signal interface from rt */ | |
43 #include "ppp_ptxs.h" /* to get signal interface from ptx */ | |
44 #include "ppp_ftxs.h" /* to get signal interface from ftx */ | |
45 #include "ppp_arbf.h" /* to get function interface from arb */ | |
46 #include "ppp_lcps.h" /* to get signal interface from lcp */ | |
47 #include "ppp_ncps.h" /* to get signal interface from ncp */ | |
48 #include "ppp_paps.h" /* to get signal interface from pap */ | |
49 #include "ppp_caps.h" /* to get signal interface from chap */ | |
50 | |
51 #include <string.h> /* to get strcmp */ | |
52 #include <stdio.h> /* to get sprintf */ | |
53 | |
54 /*==== CONST ================================================================*/ | |
55 | |
56 /*==== LOCAL VARS ===========================================================*/ | |
57 | |
58 /*==== PRIVATE FUNCTIONS ====================================================*/ | |
59 | |
60 /*==== PUBLIC FUNCTIONS =====================================================*/ | |
61 | |
62 /* | |
63 +------------------------------------------------------------------------------ | |
64 | Function : arb_ppp_establish_req | |
65 +------------------------------------------------------------------------------ | |
66 | Description : Handles the primitive PPP_ESTABLISH_REQ | |
67 | | |
68 | Parameters : *ppp_establish_req - Ptr to primitive payload | |
69 | | |
70 +------------------------------------------------------------------------------ | |
71 */ | |
72 GLOBAL void arb_ppp_establish_req ( T_PPP_ESTABLISH_REQ *ppp_establish_req ) | |
73 { | |
74 UBYTE open_channel=0; | |
75 TRACE_FUNCTION( "arb_ppp_establish_req" ); | |
76 | |
77 /* | |
78 * Open the DTI channels. Poll - because the VSI channel | |
79 * may not be ready at once. | |
80 */ | |
81 switch( GET_STATE( PPP_SERVICE_ARB ) ) | |
82 { | |
83 case ARB_DEAD: | |
84 ppp_data->ppp_cause = 0; | |
85 ppp_data->mode = ppp_establish_req->mode; | |
86 ppp_data->mru = ppp_establish_req->mru; | |
87 | |
88 switch(ppp_data->mode) | |
89 { | |
90 case PPP_TRANSPARENT: | |
91 break; | |
92 | |
93 case PPP_SERVER: | |
94 ppp_data->mc=ppp_establish_req->mc; | |
95 ppp_data->mt=ppp_establish_req->mt; | |
96 ppp_data->mf=ppp_establish_req->mf; | |
97 sig_arb_rt_parameters_req(ppp_establish_req->rt); | |
98 sig_arb_lcp_parameters_req(ppp_establish_req->mru, | |
99 ppp_establish_req->ap, | |
100 ppp_establish_req->accm); | |
101 sig_arb_ftx_blocked_mode_req(); | |
102 sig_arb_ptx_blocked_mode_req(); | |
103 break; | |
104 | |
105 case PPP_CLIENT: | |
106 ppp_data->mc=ppp_establish_req->mc; | |
107 ppp_data->mt=ppp_establish_req->mt; | |
108 ppp_data->mf=ppp_establish_req->mf; | |
109 sig_arb_rt_parameters_req(ppp_establish_req->rt); | |
110 sig_arb_lcp_parameters_req(ppp_establish_req->mru, | |
111 ppp_establish_req->ap, | |
112 ppp_establish_req->accm); | |
113 /* login information for authentication for PAP or CHAP */ | |
114 ppp_data->login = ppp_establish_req->login; | |
115 sig_arb_ncp_parameters_req(ppp_establish_req->ppp_hc, | |
116 PPP_MSID_DEFAULT, | |
117 ppp_establish_req->ip, | |
118 ppp_establish_req->dns1, | |
119 ppp_establish_req->dns2, | |
120 PPP_GATEWAY_DEFAULT); | |
121 sig_arb_ftx_blocked_mode_req(); | |
122 sig_arb_ptx_blocked_mode_req(); | |
123 break; | |
124 | |
125 default: | |
126 TRACE_ERROR( "PPP_ESTABLISH_REQ with invalid parameter: mode" ); | |
127 break; | |
128 } | |
129 break; | |
130 default: | |
131 TRACE_ERROR( "PPP_ESTABLISH_REQ unexpected" ); | |
132 break; | |
133 } /* switch */ | |
134 | |
135 while ((dti_open( | |
136 ppp_data->ppphDTI, | |
137 PPP_INSTANCE, | |
138 PROT_LAYER, | |
139 PROT_CHANNEL, | |
140 PTX_QUEUE_SIZE, | |
141 ppp_establish_req->prot_direction, | |
142 DTI_QUEUE_WATERMARK, | |
143 DTI_VERSION_10, | |
144 ppp_establish_req->protocol_channel.protocol_entity, | |
145 ppp_establish_req->prot_link_id | |
146 ) EQ FALSE) && (open_channel < MAX_TRIES_OPEN_VSI_CHAN)) | |
147 { | |
148 TRACE_EVENT("Problem to connect VSI channel to prot layer"); | |
149 open_channel++; | |
150 } | |
151 | |
152 if(open_channel < MAX_TRIES_OPEN_VSI_CHAN) | |
153 { | |
154 open_channel=0; | |
155 | |
156 while ((dti_open( | |
157 ppp_data->ppphDTI, | |
158 PPP_INSTANCE, | |
159 PEER_LAYER, | |
160 PEER_CHANNEL, | |
161 FTX_QUEUE_SIZE, | |
162 ppp_establish_req->peer_direction, | |
163 DTI_QUEUE_WATERMARK, | |
164 DTI_VERSION_10, | |
165 ppp_establish_req->peer_channel.peer_entity, | |
166 ppp_establish_req->peer_link_id | |
167 ) EQ FALSE) && (open_channel < MAX_TRIES_OPEN_VSI_CHAN)) | |
168 { | |
169 TRACE_EVENT("Problem to connect VSI channel to peer layer"); | |
170 open_channel++; | |
171 } | |
172 } | |
173 | |
174 /* | |
175 * Do nothing if VSI communication channels not opened | |
176 */ | |
177 | |
178 if(open_channel >= MAX_TRIES_OPEN_VSI_CHAN) | |
179 { | |
180 PALLOC (ppp_terminate_ind, PPP_TERMINATE_IND); | |
181 SET_STATE( PPP_SERVICE_ARB, ARB_DEAD ); | |
182 sig_arb_ncp_down_req(); | |
183 sig_arb_pap_down_req(); | |
184 sig_arb_chap_down_req(); | |
185 sig_arb_lcp_down_req(); | |
186 sig_arb_ptx_dead_mode_req(); | |
187 sig_arb_ftx_dead_mode_req(); | |
188 arb_dti_close_prot_ind(); | |
189 arb_dti_close_peer_ind(); | |
190 | |
191 /* | |
192 * set error code | |
193 */ | |
194 ppp_data->ppp_cause = PPP_TERM_NO_CHANNEL; | |
195 ppp_terminate_ind->ppp_cause = ppp_data->ppp_cause; | |
196 PSEND (hCommMMI, ppp_terminate_ind); | |
197 } | |
198 PFREE(ppp_establish_req); | |
199 } /* arb_ppp_establish_req() */ | |
200 | |
201 /* | |
202 +------------------------------------------------------------------------------ | |
203 | Function : arb_ppp_terminate_req | |
204 +------------------------------------------------------------------------------ | |
205 | Description : Handles the primitive PPP_TERMINATE_REQ | |
206 | | |
207 | Parameters : *ppp_terminate_req - Ptr to primitive payload | |
208 | | |
209 +------------------------------------------------------------------------------ | |
210 */ | |
211 GLOBAL void arb_ppp_terminate_req ( T_PPP_TERMINATE_REQ *ppp_terminate_req ) | |
212 { | |
213 TRACE_FUNCTION( "arb_ppp_terminate_req" ); | |
214 | |
215 TRACE_EVENT( "ACI requested Termination" ); | |
216 | |
217 switch( GET_STATE( PPP_SERVICE_ARB ) ) | |
218 { | |
219 case ARB_PAP_ESTABLISH: | |
220 case ARB_PAP_RECONF: | |
221 SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); | |
222 sig_arb_pap_down_req(); | |
223 break; | |
224 case ARB_CHAP_ESTABLISH: | |
225 case ARB_CHAP_RECONF: | |
226 SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); | |
227 sig_arb_chap_down_req(); | |
228 break; | |
229 case ARB_PDP_WAIT: | |
230 SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); | |
231 sig_any_rt_srt_req(); | |
232 break; | |
233 } | |
234 | |
235 switch( GET_STATE( PPP_SERVICE_ARB ) ) | |
236 { | |
237 case ARB_IP: | |
238 sig_arb_ftx_blocked_mode_req(); | |
239 sig_arb_ptx_blocked_mode_req(); | |
240 case ARB_NCP_ESTABLISH: | |
241 case ARB_NCP_RECONF: | |
242 case ARB_NCP_MOD: | |
243 sig_arb_ncp_down_req(); | |
244 case ARB_PDP_SENT: | |
245 case ARB_DEAD: | |
246 case ARB_LCP_ESTABLISH: | |
247 case ARB_LCP_PDP: | |
248 case ARB_LCP_NCP: | |
249 case ARB_LCP_RECONF: | |
250 case ARB_LCP_MOD: | |
251 if(ppp_data->arb.last_ipcp) | |
252 { | |
253 MFREE_DESC2(ppp_data->arb.last_ipcp); | |
254 ppp_data->arb.last_ipcp = NULL; | |
255 } | |
256 if(ppp_terminate_req->lower_layer EQ PPP_LOWER_LAYER_UP) | |
257 { | |
258 /* | |
259 * inform PPP-peer about termination | |
260 */ | |
261 SET_STATE( PPP_SERVICE_ARB, ARB_LCP_RECONF ); | |
262 /* | |
263 * set error code | |
264 */ | |
265 if(ppp_data->ppp_cause EQ 0) | |
266 ppp_data->ppp_cause = PPP_TERM_OK_MMI; | |
267 sig_arb_lcp_close_req(); | |
268 /* xxxxx close dti?! */ | |
269 } | |
270 else | |
271 { | |
272 /* | |
273 * free all PPP resources and finish | |
274 */ | |
275 PALLOC (ppp_terminate_ind, PPP_TERMINATE_IND); | |
276 SET_STATE( PPP_SERVICE_ARB, ARB_DEAD ); | |
277 sig_arb_ncp_down_req(); | |
278 sig_arb_pap_down_req(); | |
279 sig_arb_chap_down_req(); | |
280 sig_arb_lcp_down_req(); | |
281 sig_arb_ptx_dead_mode_req(); | |
282 sig_arb_ftx_dead_mode_req(); | |
283 arb_dti_close_prot_ind(); | |
284 arb_dti_close_peer_ind(); | |
285 | |
286 /* | |
287 * set error code | |
288 */ | |
289 if(ppp_data->ppp_cause EQ 0) | |
290 ppp_data->ppp_cause = PPP_TERM_OK_MMI; | |
291 ppp_terminate_ind->ppp_cause = ppp_data->ppp_cause; | |
292 PSEND (hCommMMI, ppp_terminate_ind); | |
293 } /* end else */ | |
294 break; | |
295 case ARB_TRANSPARENT: | |
296 { | |
297 PALLOC (ppp_terminate_ind, PPP_TERMINATE_IND); | |
298 SET_STATE( PPP_SERVICE_ARB, ARB_DEAD ); | |
299 sig_arb_ncp_down_req(); | |
300 sig_arb_pap_down_req(); | |
301 sig_arb_chap_down_req(); | |
302 sig_arb_lcp_down_req(); | |
303 sig_arb_ptx_dead_mode_req(); | |
304 sig_arb_ftx_dead_mode_req(); | |
305 | |
306 arb_dti_close_prot_ind(); | |
307 arb_dti_close_peer_ind(); | |
308 | |
309 /* | |
310 * set error code | |
311 */ | |
312 if(ppp_data->ppp_cause EQ 0) | |
313 ppp_data->ppp_cause = PPP_TERM_OK_MMI; | |
314 ppp_terminate_ind->ppp_cause = ppp_data->ppp_cause; | |
315 PSEND (hCommMMI, ppp_terminate_ind); | |
316 } | |
317 break; | |
318 default: | |
319 TRACE_ERROR( "PPP_TERMINATE_REQ unexpected" ); | |
320 break; | |
321 } | |
322 PFREE(ppp_terminate_req); | |
323 | |
324 } /* arb_ppp_terminate_req() */ | |
325 | |
326 | |
327 | |
328 /* | |
329 +------------------------------------------------------------------------------ | |
330 | Function : arb_ppp_pdp_activate_res | |
331 +------------------------------------------------------------------------------ | |
332 | Description : Handles the primitive PPP_PDP_ACTIVATE_RES | |
333 | | |
334 | Parameters : *ppp_pdp_activate_res - Ptr to primitive payload | |
335 | | |
336 +------------------------------------------------------------------------------ | |
337 */ | |
338 GLOBAL void arb_ppp_pdp_activate_res ( T_PPP_PDP_ACTIVATE_RES *ppp_pdp_activate_res ) | |
339 { | |
340 ULONG dns1, dns2, gateway; | |
341 T_desc2* temp_desc; | |
342 | |
343 TRACE_FUNCTION( "arb_ppp_pdp_activate_res" ); | |
344 /* | |
345 * extract DNS addresses | |
346 */ | |
347 arb_analyze_pco_list(&ppp_pdp_activate_res->sdu, &dns1, &dns2, &gateway); | |
348 | |
349 TRACE_EVENT("PDP context activated"); | |
350 TRACE_EVENT_P5("IP: %d.%d.%d.%d (%08x)", | |
351 ((ppp_pdp_activate_res->ip >> 24) & 0x000000ff), | |
352 ((ppp_pdp_activate_res->ip >> 16) & 0x000000ff), | |
353 ((ppp_pdp_activate_res->ip >> 8) & 0x000000ff), | |
354 ( ppp_pdp_activate_res->ip & 0x000000ff), | |
355 ppp_pdp_activate_res->ip); | |
356 if(dns1 NEQ 0) | |
357 { | |
358 TRACE_EVENT_P5("primary DNS: %d.%d.%d.%d (%08x)", | |
359 ((dns1 >> 24) & 0x000000ff), | |
360 ((dns1 >> 16) & 0x000000ff), | |
361 ((dns1 >> 8) & 0x000000ff), | |
362 ( dns1 & 0x000000ff), | |
363 dns1); | |
364 } | |
365 else | |
366 { | |
367 TRACE_EVENT("no primary DNS"); | |
368 } | |
369 if(dns2 NEQ 0) | |
370 { | |
371 TRACE_EVENT_P5("secondary DNS: %d.%d.%d.%d (%08x)", | |
372 ((dns2 >> 24) & 0x000000ff), | |
373 ((dns2 >> 16) & 0x000000ff), | |
374 ((dns2 >> 8) & 0x000000ff), | |
375 ( dns2 & 0x000000ff), | |
376 dns2); | |
377 } | |
378 else | |
379 { | |
380 TRACE_EVENT("no secondary DNS"); | |
381 } | |
382 if(gateway NEQ 0) | |
383 { | |
384 TRACE_EVENT_P5("Gateway: %d.%d.%d.%d (%08x)", | |
385 ((gateway >> 24) & 0x000000ff), | |
386 ((gateway >> 16) & 0x000000ff), | |
387 ((gateway >> 8) & 0x000000ff), | |
388 ( gateway & 0x000000ff), | |
389 gateway); | |
390 } | |
391 else | |
392 { | |
393 TRACE_EVENT("no Gateway"); | |
394 } | |
395 if(ppp_pdp_activate_res->ppp_hc EQ PPP_HC_OFF) | |
396 { | |
397 TRACE_EVENT("do not use header compression"); | |
398 } | |
399 else if(ppp_pdp_activate_res->ppp_hc EQ PPP_HC_VJ) | |
400 { | |
401 TRACE_EVENT("using VJ header compression"); | |
402 } | |
403 /* | |
404 * set ncp parameters | |
405 */ | |
406 sig_arb_ncp_parameters_req(ppp_pdp_activate_res->ppp_hc, | |
407 ppp_pdp_activate_res->msid, | |
408 ppp_pdp_activate_res->ip, | |
409 dns1, | |
410 dns2, | |
411 gateway); | |
412 | |
413 switch( GET_STATE( PPP_SERVICE_ARB ) ) | |
414 { | |
415 case ARB_LCP_PDP: | |
416 SET_STATE( PPP_SERVICE_ARB, ARB_LCP_NCP ); | |
417 break; | |
418 case ARB_PDP_SENT: | |
419 SET_STATE( PPP_SERVICE_ARB, ARB_NCP_ESTABLISH ); | |
420 sig_arb_ncp_open_req(); | |
421 if(ppp_data->arb.last_ipcp) | |
422 { | |
423 temp_desc = ppp_data->arb.last_ipcp; | |
424 ppp_data->arb.last_ipcp = NULL; | |
425 sig_arb_ncp_packet_req(temp_desc); | |
426 } | |
427 break; | |
428 default: | |
429 TRACE_ERROR( "PPP_PDP_ACTIVATE_RES unexpected" ); | |
430 break; | |
431 } | |
432 PFREE(ppp_pdp_activate_res); | |
433 | |
434 } /* arb_ppp_pdp_activate_res() */ | |
435 | |
436 | |
437 | |
438 /* | |
439 +------------------------------------------------------------------------------ | |
440 | Function : arb_ppp_pdp_activate_rej | |
441 +------------------------------------------------------------------------------ | |
442 | Description : Handles the primitive PPP_PDP_ACTIVATE_REJ | |
443 | | |
444 | Parameters : *ppp_pdp_activate_rej - Ptr to primitive payload | |
445 | | |
446 +------------------------------------------------------------------------------ | |
447 */ | |
448 GLOBAL void arb_ppp_pdp_activate_rej ( T_PPP_PDP_ACTIVATE_REJ *ppp_pdp_activate_rej ) | |
449 { | |
450 TRACE_FUNCTION( "arb_ppp_pdp_activate_rej" ); | |
451 | |
452 TRACE_EVENT_P1("PDP context activation rejected by the network (cause=%x)", | |
453 ppp_pdp_activate_rej->ppp_cause); | |
454 /* | |
455 * set error code | |
456 */ | |
457 if(ppp_data->ppp_cause EQ 0) | |
458 ppp_data->ppp_cause = ppp_pdp_activate_rej->ppp_cause; | |
459 | |
460 switch( GET_STATE( PPP_SERVICE_ARB ) ) | |
461 { | |
462 case ARB_PDP_SENT: | |
463 case ARB_LCP_PDP: | |
464 SET_STATE( PPP_SERVICE_ARB, ARB_LCP_ESTABLISH ); | |
465 if(ppp_data->arb.last_ipcp) | |
466 { | |
467 MFREE_DESC2(ppp_data->arb.last_ipcp); | |
468 ppp_data->arb.last_ipcp = NULL; | |
469 } | |
470 sig_arb_lcp_close_req(); | |
471 break; | |
472 default: | |
473 TRACE_ERROR( "PPP_PDP_ACTIVATE_REJ unexpected" ); | |
474 break; | |
475 } | |
476 PFREE(ppp_pdp_activate_rej); | |
477 | |
478 } /* arb_ppp_pdp_activate_rej() */ | |
479 | |
480 | |
481 | |
482 /* | |
483 +------------------------------------------------------------------------------ | |
484 | Function : arb_ppp_modification_req | |
485 +------------------------------------------------------------------------------ | |
486 | Description : Handles the primitive PPP_MODIFICATION_REQ | |
487 | | |
488 | Parameters : *ppp_modification_req - Ptr to primitive payload | |
489 | | |
490 +------------------------------------------------------------------------------ | |
491 */ | |
492 GLOBAL void arb_ppp_modification_req ( T_PPP_MODIFICATION_REQ *ppp_modification_req ) | |
493 { | |
494 TRACE_FUNCTION( "arb_ppp_modification_req" ); | |
495 | |
496 sig_arb_ncp_modify_hc_req(ppp_modification_req->ppp_hc, | |
497 ppp_modification_req->msid); | |
498 | |
499 switch( GET_STATE( PPP_SERVICE_ARB ) ) | |
500 { | |
501 case ARB_LCP_RECONF: | |
502 SET_STATE( PPP_SERVICE_ARB, ARB_LCP_MOD ); | |
503 case ARB_LCP_MOD: | |
504 break; | |
505 case ARB_IP: | |
506 sig_arb_ftx_blocked_mode_req(); | |
507 sig_arb_ptx_blocked_mode_req(); | |
508 case ARB_NCP_RECONF: | |
509 SET_STATE( PPP_SERVICE_ARB, ARB_NCP_MOD ); | |
510 case ARB_NCP_MOD: | |
511 sig_arb_ncp_open_req(); | |
512 break; | |
513 default: | |
514 TRACE_ERROR( "PPP_MODIFICATION_REQ unexpected" ); | |
515 break; | |
516 } | |
517 PFREE(ppp_modification_req); | |
518 | |
519 } /* arb_ppp_modification_req() */ |