FreeCalypso > hg > freecalypso-sw
comparison gsm-fw/g23m-aci/aci/cmh_gpppr.c @ 775:eedbf248bac0
gsm-fw/g23m-aci subtree: initial import from LoCosto source
| author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
|---|---|
| date | Sun, 12 Oct 2014 01:45:14 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 774:40a721fd9854 | 775:eedbf248bac0 |
|---|---|
| 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 module defines the functions which are responsible | |
| 18 | for the responses of the protocol stack adapter for | |
| 19 | GPRS Point-to-Point Protocol ( PPP ). | |
| 20 +----------------------------------------------------------------------------- | |
| 21 */ | |
| 22 | |
| 23 #if defined (GPRS) && defined (DTI) | |
| 24 | |
| 25 #ifndef CMH_GPPPR_C | |
| 26 #define CMH_GPPPR_C | |
| 27 #endif | |
| 28 | |
| 29 #include "aci_all.h" | |
| 30 /*==== INCLUDES ===================================================*/ | |
| 31 | |
| 32 #include "dti.h" /* functionality of the dti library */ | |
| 33 #include "aci_cmh.h" | |
| 34 #include "ati_cmd.h" | |
| 35 #include "aci_cmd.h" | |
| 36 | |
| 37 #include "dti_conn_mng.h" | |
| 38 #include "dti_cntrl_mng.h" | |
| 39 | |
| 40 #include "aci.h" | |
| 41 #include "gaci.h" | |
| 42 #include "gaci_cmh.h" | |
| 43 #include "psa.h" | |
| 44 #include "psa_gppp.h" | |
| 45 #include "psa_sm.h" | |
| 46 #include "psa_uart.h" | |
| 47 | |
| 48 #include "psa_aaa.h" | |
| 49 | |
| 50 #include "cmh.h" | |
| 51 #include "cmh_gppp.h" | |
| 52 #include "cmh_sm.h" | |
| 53 | |
| 54 #include "sap_dti.h" | |
| 55 | |
| 56 /*==== CONSTANTS ==================================================*/ | |
| 57 | |
| 58 | |
| 59 /*==== TYPES ======================================================*/ | |
| 60 | |
| 61 | |
| 62 /*==== EXPORT =====================================================*/ | |
| 63 | |
| 64 | |
| 65 /*==== VARIABLES ==================================================*/ | |
| 66 | |
| 67 /*==== FUNCTIONS ==================================================*/ | |
| 68 | |
| 69 /* | |
| 70 +-------------------------------------------------------------------+ | |
| 71 | PROJECT : GPRS (8441) MODULE : CMH_PPPR | | |
| 72 | STATE : finnished ROUTINE : cmhGPPP_Established | | |
| 73 +-------------------------------------------------------------------+ | |
| 74 | |
| 75 PURPOSE : establish a PPP link was successful | |
| 76 | |
| 77 */ | |
| 78 GLOBAL SHORT cmhGPPP_Established ( void ) | |
| 79 { | |
| 80 | |
| 81 T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; | |
| 82 | |
| 83 TRACE_FUNCTION ("cmhGPPP_Established()"); | |
| 84 | |
| 85 p_pdp_context_node = pdp_context_find_node_from_cid( work_cids[cid_pointer] ); | |
| 86 | |
| 87 if( p_pdp_context_node ) | |
| 88 { | |
| 89 switch( gpppEntStat.curCmd ) | |
| 90 { | |
| 91 case( AT_CMD_CGDATA ): | |
| 92 /* no action, because the PDP context will be terminated */ | |
| 93 if( get_state_working_cid() NEQ PDP_CONTEXT_STATE_ESTABLISH_3 ) | |
| 94 { | |
| 95 return 0; | |
| 96 } | |
| 97 else | |
| 98 { | |
| 99 set_state_working_cid( PDP_CONTEXT_STATE_DATA_LINK ); | |
| 100 /* | |
| 101 * do we need one more context activation | |
| 102 */ | |
| 103 if( cmhSM_next_work_cid( AT_CMD_CGDATA ) EQ FALSE ) | |
| 104 { | |
| 105 /* todo for new DTI interface - SMNEW done 06032001... */ | |
| 106 R_AT( RAT_CGDATA, gpppEntStat.entOwn )( p_pdp_context_node->internal_data.link_id ); /* UACI */ | |
| 107 /* PHE 201201 gpppEntStat.curCmd = AT_CMD_NONE; */ | |
| 108 } | |
| 109 } | |
| 110 | |
| 111 cmhSM_next_call_table_entry(); | |
| 112 break; | |
| 113 } | |
| 114 } | |
| 115 else | |
| 116 { | |
| 117 TRACE_ERROR( "ERROR: PDP context not found, in function cmhGPPP_Established" ); | |
| 118 } | |
| 119 return 0; | |
| 120 } | |
| 121 | |
| 122 | |
| 123 /* | |
| 124 +-------------------------------------------------------------------+ | |
| 125 | PROJECT : GPRS (8441) MODULE : CMH_PPPR | | |
| 126 | STATE : code ROUTINE : cmhGPPP_Terminated | | |
| 127 +-------------------------------------------------------------------+ | |
| 128 | |
| 129 PURPOSE : PPP connection is closed | |
| 130 | |
| 131 */ | |
| 132 GLOBAL SHORT cmhGPPP_Terminated ( void ) | |
| 133 { | |
| 134 T_ACI_CMD_SRC rat_owner; | |
| 135 UBYTE cmdBuf = gpppEntStat.curCmd, /* buffers current command */ | |
| 136 cme_err = CME_ERR_Unknown; /* error number */ | |
| 137 U8 cid = PDP_CONTEXT_CID_INVALID; | |
| 138 SHORT reactivation = 0, | |
| 139 rat_id = RAT_MAX; | |
| 140 USHORT nsapi_set = 0; | |
| 141 T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; | |
| 142 #ifdef FF_TCP_IP | |
| 143 T_DTI_ENTITY_ID peer; | |
| 144 #endif | |
| 145 UBYTE srcId = srcId_cb; | |
| 146 | |
| 147 TRACE_FUNCTION ("cmhGPPP_Terminated()"); | |
| 148 | |
| 149 cid = gaci_get_cid_over_link_id(gaci_get_link_id_over_peer(DTI_ENTITY_PPPS)); | |
| 150 | |
| 151 p_pdp_context_node = pdp_context_find_node_from_cid( cid ); | |
| 152 | |
| 153 #ifdef FF_TCP_IP | |
| 154 peer = dti_cntrl_get_peer(DTI_ENTITY_PPPS, 0, 0); | |
| 155 if ( peer EQ DTI_ENTITY_AAA ) | |
| 156 { | |
| 157 psaAAA_disconnect_ind (p_pdp_context_node->internal_data.link_id_uart); | |
| 158 } | |
| 159 #endif | |
| 160 | |
| 161 if( p_pdp_context_node ) | |
| 162 { | |
| 163 cid = p_pdp_context_node->cid; | |
| 164 | |
| 165 /* | |
| 166 *------------------------------------------------------------------- | |
| 167 * Inform the DTI Manager about the link termination. | |
| 168 *------------------------------------------------------------------- | |
| 169 */ | |
| 170 dti_cntrl_entity_disconnected( p_pdp_context_node->internal_data.link_id , DTI_ENTITY_PPPS ); | |
| 171 dti_cntrl_entity_disconnected( p_pdp_context_node->internal_data.link_id_uart, DTI_ENTITY_PPPS ); | |
| 172 | |
| 173 switch ( get_state_over_cid( cid ) ) | |
| 174 { | |
| 175 case PDP_CONTEXT_STATE_INVALID: | |
| 176 case PDP_CONTEXT_STATE_DEFINED: | |
| 177 case PDP_CONTEXT_STATE_ATTACHING: | |
| 178 case PDP_CONTEXT_STATE_ACTIVATING: | |
| 179 case PDP_CONTEXT_STATE_ACTIVATED: | |
| 180 case PDP_CONTEXT_STATE_DEACTIVATE_NORMAL: | |
| 181 TRACE_ERROR( "cmhGPPP_Terminated(): State/Event error!!!" ); | |
| 182 break; | |
| 183 | |
| 184 case PDP_CONTEXT_STATE_ESTABLISH_2: | |
| 185 case PDP_CONTEXT_STATE_ESTABLISH_3: | |
| 186 case PDP_CONTEXT_STATE_ACTIVATED_ESTABLISH_1: | |
| 187 set_state_over_cid( cid, PDP_CONTEXT_STATE_ABORT_ESTABLISH ); | |
| 188 nsapi_set = cmhSM_Give_nsapi_set( cid ); | |
| 189 dti_cntrl_set_dti_id_to_reconnect(EXTRACT_DTI_ID(p_pdp_context_node->internal_data.link_id)); | |
| 190 break; | |
| 191 | |
| 192 case PDP_CONTEXT_STATE_ESTABLISH_1: | |
| 193 cmhSM_contextDeactivated(); | |
| 194 | |
| 195 /*lint -fallthrough*/ | |
| 196 case PDP_CONTEXT_STATE_ABORT_ESTABLISH: | |
| 197 set_state_over_cid( cid, PDP_CONTEXT_STATE_DEFINED ); | |
| 198 /* Close the data path since this can not be done from CMH_SM (no activating/activated context) */ | |
| 199 dti_cntrl_close_dpath_from_dti_id( EXTRACT_DTI_ID(p_pdp_context_node->internal_data.link_id) ); | |
| 200 | |
| 201 dti_cntrl_set_dti_id_to_reconnect(EXTRACT_DTI_ID(p_pdp_context_node->internal_data.link_id)); | |
| 202 if(ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Disable OR isContextDeactivationRequestedByCGACT(cid)) | |
| 203 rat_id = RAT_NO_CARRIER; | |
| 204 else | |
| 205 rat_id = RAT_CME; | |
| 206 break; | |
| 207 | |
| 208 case PDP_CONTEXT_STATE_BREAKDOWN_LINK_NORMAL: | |
| 209 set_state_over_cid( cid, PDP_CONTEXT_STATE_DEFINED ); | |
| 210 dti_cntrl_set_dti_id_to_reconnect(EXTRACT_DTI_ID(p_pdp_context_node->internal_data.link_id)); | |
| 211 rat_id = RAT_NO_CARRIER; | |
| 212 break; | |
| 213 | |
| 214 case PDP_CONTEXT_STATE_DATA_LINK: | |
| 215 set_state_over_cid( cid, PDP_CONTEXT_STATE_BREAKDOWN_LINK_NORMAL ); | |
| 216 nsapi_set = cmhSM_Give_nsapi_set( cid ); | |
| 217 dti_cntrl_set_dti_id_to_reconnect(EXTRACT_DTI_ID(p_pdp_context_node->internal_data.link_id)); | |
| 218 break; | |
| 219 | |
| 220 case PDP_CONTEXT_STATE_REACTIVATION_1: | |
| 221 set_state_over_cid( cid, PDP_CONTEXT_STATE_REACTIVATION_2 ); | |
| 222 dti_cntrl_set_dti_id_to_reconnect(EXTRACT_DTI_ID(p_pdp_context_node->internal_data.link_id)); | |
| 223 gpppEntStat.curCmd = AT_CMD_NONE; | |
| 224 /* 28592 cmhSM_connection_down(EXTRACT_DTI_ID(p_pdp_context_node->internal_data.link_id)); */ | |
| 225 return 0; | |
| 226 | |
| 227 case PDP_CONTEXT_STATE_REACTIVATION_2: | |
| 228 set_state_over_cid( cid, PDP_CONTEXT_STATE_DEFINED ); | |
| 229 dti_cntrl_set_dti_id_to_reconnect(EXTRACT_DTI_ID(p_pdp_context_node->internal_data.link_id)); | |
| 230 gpppEntStat.curCmd = AT_CMD_NONE; | |
| 231 rat_id = RAT_NO_CARRIER; | |
| 232 reactivation = 1; | |
| 233 cmhSM_connection_down(EXTRACT_DTI_ID(p_pdp_context_node->internal_data.link_id)); /* 28592 */ | |
| 234 break; | |
| 235 | |
| 236 } /* end switch */ | |
| 237 | |
| 238 } | |
| 239 else | |
| 240 { | |
| 241 TRACE_ERROR( "ERROR: PDP context not found, in function cmhGPPP_Terminated" ); | |
| 242 return 0; | |
| 243 } | |
| 244 | |
| 245 rat_owner = (T_ACI_CMD_SRC)get_owner_over_cid( cid ); | |
| 246 | |
| 247 if ( reactivation EQ 0 ) | |
| 248 { | |
| 249 /* Do we need a SMREG_PDP_DEACTIVATE_REQ? */ | |
| 250 if ( nsapi_set ) | |
| 251 { | |
| 252 psaSM_PDP_Deactivate ( nsapi_set, PS_REL_IND_NO ); | |
| 253 } | |
| 254 /* | |
| 255 *------------------------------------------------------------------- | |
| 256 * check for command context | |
| 257 *------------------------------------------------------------------- | |
| 258 */ | |
| 259 switch( gpppEntStat.curCmd ) | |
| 260 { | |
| 261 case( AT_CMD_CGDATA ): | |
| 262 if ( rat_owner EQ gpppEntStat.entOwn ) | |
| 263 { | |
| 264 gpppEntStat.curCmd = AT_CMD_NONE; | |
| 265 } | |
| 266 /* brz: to check */ | |
| 267 switch(gpppShrdPrm.ppp_cause) | |
| 268 { | |
| 269 case PPP_TERM_OK_PEER: | |
| 270 case PPP_TERM_NO_RESPONSE: | |
| 271 case PPP_TERM_LOOP_BACK: | |
| 272 case PPP_TERM_LCP_NOT_CONVERGE: | |
| 273 case PPP_TERM_IPCP_NOT_CONVERGE: | |
| 274 case PPP_TERM_IPCP_NOT_STARTED: | |
| 275 cme_err = CME_ERR_GPRSBadModClass; | |
| 276 break; | |
| 277 /* The below cause values is commented as it is not defined in the | |
| 278 * Alborg SAP Document, and because of this it is giving compilation | |
| 279 * ERROR | |
| 280 */ | |
| 281 /*case SMREG_RC_USE_AUTHED_FAILED:*/ | |
| 282 case PPP_TERM_USE_AUTHED_FAILED: | |
| 283 cme_err = CME_ERR_GPRSPdpAuth; | |
| 284 break; | |
| 285 default: | |
| 286 cme_err = CME_ERR_Unknown; | |
| 287 } | |
| 288 break; | |
| 289 #if 0 | |
| 290 /* | |
| 291 * These cases do never happen! | |
| 292 */ | |
| 293 case( AT_CMD_CGACT ): | |
| 294 case( AT_CMD_CGANS ): | |
| 295 case( AT_CMD_A ): | |
| 296 case( AT_CMD_H ): | |
| 297 break; | |
| 298 #endif | |
| 299 default: | |
| 300 switch(gpppShrdPrm.ppp_cause) | |
| 301 { | |
| 302 case CAUSE_NWSM_SERVICE_NOT_SUPPORTED: | |
| 303 cme_err = CME_ERR_GPRSSerOptNsup; | |
| 304 break; | |
| 305 case CAUSE_NWSM_SERVICE_NOT_SUBSCRIBED: | |
| 306 cme_err = CME_ERR_GPRSSerOptNsub; | |
| 307 break; | |
| 308 case CAUSE_NWSM_SERVICE_TEMP_OUT_OF_ORDER: | |
| 309 cme_err = CME_ERR_GPRSSerOptOOO; | |
| 310 break; | |
| 311 case PPP_TERM_USE_AUTHED_FAILED: | |
| 312 cme_err = CME_ERR_GPRSPdpAuth; | |
| 313 break; | |
| 314 default: | |
| 315 cme_err = CME_ERR_Unknown; | |
| 316 } | |
| 317 } | |
| 318 if ( smEntStat.entOwn EQ rat_owner ) | |
| 319 { | |
| 320 switch( smEntStat.curCmd ) | |
| 321 { | |
| 322 case( AT_CMD_CGDATA ): | |
| 323 case( AT_CMD_CGACT ): | |
| 324 smEntStat.curCmd = AT_CMD_NONE; | |
| 325 break; | |
| 326 } | |
| 327 } | |
| 328 } | |
| 329 | |
| 330 cmhSM_connection_down(EXTRACT_DTI_ID(p_pdp_context_node->internal_data.link_id)); | |
| 331 | |
| 332 if( rat_id NEQ RAT_MAX ) | |
| 333 { | |
| 334 gaci_RAT_caller( rat_id, cid, cmdBuf, cme_err ); | |
| 335 | |
| 336 if( reactivation EQ 0 ) | |
| 337 { | |
| 338 work_cids[0] = PDP_CONTEXT_CID_INVALID; | |
| 339 } | |
| 340 | |
| 341 cmhSM_context_reactivation(); | |
| 342 cmhSM_disconnect_cid(cid, GC_TYPE_DATA_LINK); | |
| 343 } | |
| 344 | |
| 345 work_cids[0] = PDP_CONTEXT_CID_INVALID; | |
| 346 cid_pointer = 0; | |
| 347 if ( smEntStat.curCmd EQ AT_CMD_CGACT ) | |
| 348 { | |
| 349 smEntStat.curCmd = AT_CMD_NONE; | |
| 350 } | |
| 351 return 0; | |
| 352 } | |
| 353 | |
| 354 /* | |
| 355 +-------------------------------------------------------------------+ | |
| 356 | PROJECT : GPRS (8441) MODULE : CMH_PPPR | | |
| 357 | STATE : finished ROUTINE : cmhGPPP_Activated | | |
| 358 +-------------------------------------------------------------------+ | |
| 359 | |
| 360 PURPOSE : activate the PDP context (only in server or transparent | |
| 361 mode) and if the context is already activated then answer PPP. | |
| 362 (PPP_ACTIVATE_IND is received). | |
| 363 | |
| 364 | |
| 365 */ | |
| 366 GLOBAL SHORT cmhGPPP_Activated ( void ) | |
| 367 { | |
| 368 U8 cid = work_cids[cid_pointer]; | |
| 369 T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; | |
| 370 | |
| 371 TRACE_FUNCTION ("cmhGPPP_Activated()"); | |
| 372 | |
| 373 p_pdp_context_node = pdp_context_find_node_from_cid( cid ); | |
| 374 if( !p_pdp_context_node ) | |
| 375 { | |
| 376 TRACE_ERROR("ERROR: PDP context not found, in function cmhGPPP_Activated"); | |
| 377 return -1; | |
| 378 } | |
| 379 | |
| 380 /* | |
| 381 *------------------------------------------------------------------- | |
| 382 * check for command context | |
| 383 *------------------------------------------------------------------- | |
| 384 */ | |
| 385 switch( gpppEntStat.curCmd ) | |
| 386 { | |
| 387 case( AT_CMD_CGANS ): | |
| 388 case( AT_CMD_CGDATA ): | |
| 389 /* | |
| 390 *--------------------------------------------------------------- | |
| 391 * check entity context state | |
| 392 *--------------------------------------------------------------- | |
| 393 */ | |
| 394 switch ( get_state_working_cid() ) | |
| 395 { | |
| 396 case PDP_CONTEXT_STATE_ESTABLISH_1: | |
| 397 { | |
| 398 | |
| 399 /* | |
| 400 *--------------------------------------------------------------- | |
| 401 * save parameter | |
| 402 *--------------------------------------------------------------- | |
| 403 */ | |
| 404 | |
| 405 /* Issue OMAPS00047332 : SNDCP, SM and UPM are not supporting ppp_hc and msid anymore */ | |
| 406 | |
| 407 smEntStat.curCmd = gpppEntStat.curCmd; | |
| 408 smShrdPrm.owner = gpppShrdPrm.owner; | |
| 409 smEntStat.entOwn = (T_ACI_CMD_SRC)smShrdPrm.owner; | |
| 410 | |
| 411 /* | |
| 412 *--------------------------------------------------------------- | |
| 413 * store PCO information if it's provided PPP | |
| 414 *--------------------------------------------------------------- | |
| 415 */ | |
| 416 | |
| 417 if( (gpppShrdPrm.pdp->sdu.l_buf >> 3) > 0 ) | |
| 418 { | |
| 419 cmhSM_set_PCO( cid, PCO_USER, | |
| 420 &gpppShrdPrm.pdp->sdu.buf[gpppShrdPrm.pdp->sdu.o_buf >> 3], | |
| 421 (UBYTE) (gpppShrdPrm.pdp->sdu.l_buf >> 3)); | |
| 422 } | |
| 423 | |
| 424 /* | |
| 425 *--------------------------------------------------------------- | |
| 426 * PPP has requested context activation: Activate the context. | |
| 427 *--------------------------------------------------------------- | |
| 428 */ | |
| 429 cmhSM_connect_context( cid, DTI_ENTITY_PPPS ); | |
| 430 | |
| 431 set_state_working_cid( PDP_CONTEXT_STATE_ESTABLISH_2 ); | |
| 432 } | |
| 433 break; | |
| 434 | |
| 435 case PDP_CONTEXT_STATE_ACTIVATED_ESTABLISH_1: | |
| 436 { | |
| 437 /* | |
| 438 *--------------------------------------------------------------- | |
| 439 * save parameter | |
| 440 *--------------------------------------------------------------- | |
| 441 */ | |
| 442 | |
| 443 /* Issue OMAPS00047332 : SNDCP, SM and UPM are not supporting ppp_hc and msid anymore | |
| 444 So do not send ppp_hc and msid params to ppp | |
| 445 */ | |
| 446 smEntStat.curCmd = gpppEntStat.curCmd; | |
| 447 smShrdPrm.owner = gpppShrdPrm.owner; | |
| 448 smEntStat.entOwn = (T_ACI_CMD_SRC)smShrdPrm.owner; | |
| 449 | |
| 450 /* | |
| 451 *--------------------------------------------------------------- | |
| 452 * PPP has requested context activation, but the context is | |
| 453 * already activated: Answer PPP. | |
| 454 *--------------------------------------------------------------- | |
| 455 */ | |
| 456 psaGPPP_PDP_Activate( &p_pdp_context_node->internal_data.pdp_address_allocated, | |
| 457 p_pdp_context_node->internal_data.network_pco.pco, | |
| 458 (UBYTE) (p_pdp_context_node->internal_data.network_pco.len), | |
| 459 (UBYTE) CID_TO_NSAPI(cid)); | |
| 460 | |
| 461 set_state_working_cid( PDP_CONTEXT_STATE_ESTABLISH_3 ); | |
| 462 } | |
| 463 break; | |
| 464 default: | |
| 465 /* The PPP_PDP_ACTIVATE_IND might have crossed with a PPP_TERMINATE_REQ. | |
| 466 Ignore the event by returning */ | |
| 467 return 0; | |
| 468 } | |
| 469 | |
| 470 } | |
| 471 | |
| 472 return 0; | |
| 473 } | |
| 474 | |
| 475 /* | |
| 476 +-------------------------------------------------------------------+ | |
| 477 | PROJECT : GPRS (8441) MODULE : CMH_PPPR | | |
| 478 | STATE : finished ROUTINE : cmhGPPP_Modified | | |
| 479 +-------------------------------------------------------------------+ | |
| 480 | |
| 481 PURPOSE : new negotiate header compression confirmed (only in server mode) | |
| 482 | |
| 483 */ | |
| 484 GLOBAL SHORT cmhGPPP_Modified ( void ) | |
| 485 { | |
| 486 TRACE_FUNCTION ("cmhGPPP_Modified()"); | |
| 487 | |
| 488 /* | |
| 489 *--------------------------------------------------------------- | |
| 490 * nothing to do | |
| 491 *--------------------------------------------------------------- | |
| 492 */ | |
| 493 | |
| 494 return 0; | |
| 495 } | |
| 496 | |
| 497 #endif /* GPRS */ | |
| 498 /*==== EOF ========================================================*/ | |
| 499 |
