FreeCalypso > hg > fc-magnetite
comparison src/g23m-fad/tcpip/tcpip_pei.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 | File: tcpip_pei.c | |
| 4 +------------------------------------------------------------------------------ | |
| 5 | Copyright 2002 Texas Instruments Berlin, AG | |
| 6 | All rights reserved. | |
| 7 | | |
| 8 | This file is confidential and a trade secret of Texas | |
| 9 | Instruments Berlin, AG | |
| 10 | The receipt of or possession of this file does not convey | |
| 11 | any rights to reproduce or disclose its contents or to | |
| 12 | manufacture, use, or sell anything it may describe, in | |
| 13 | whole, or in part, without the specific written consent of | |
| 14 | Texas Instruments Berlin, AG. | |
| 15 +----------------------------------------------------------------------------- | |
| 16 | Purpose : This module implements the PEI interface | |
| 17 | for the entity TCPIP. | |
| 18 +----------------------------------------------------------------------------- | |
| 19 */ | |
| 20 | |
| 21 #define TCPIP_PEI_C | |
| 22 | |
| 23 #define ENTITY_TCPIP | |
| 24 | |
| 25 /*==== INCLUDES =============================================================*/ | |
| 26 | |
| 27 #include "typedefs.h" /* to get Condat data types */ | |
| 28 #include "vsi.h" /* to get a lot of macros */ | |
| 29 #include "custom.h" | |
| 30 #include "gsm.h" /* to get a lot of macros */ | |
| 31 #include "prim.h" /* to get the definitions of used SAP and directions */ | |
| 32 #include "pei.h" /* to get PEI interface */ | |
| 33 #include "tools.h" /* to get common tools */ | |
| 34 #include "dti.h" /* For DTI library definitions. */ | |
| 35 #include "tcpip.h" /* to get the global entity definitions */ | |
| 36 #define RNET_CFG_REAL_TRANSPORT | |
| 37 #include "rnet_api.h" | |
| 38 #include "rnet_rt_env.h" | |
| 39 #include "rv_general.h" | |
| 40 #include "rnet_rt_i.h" | |
| 41 #include <ngip/if.h> | |
| 42 #include "string.h" | |
| 43 #include "stdio.h" | |
| 44 | |
| 45 T_RNET_DESC *desc; | |
| 46 | |
| 47 /*==== CONSTS ================================================================*/ | |
| 48 | |
| 49 #define TCPIP_STACK_SIZE 2048 | |
| 50 #define TCPIP_QUEUE_SIZE 15 | |
| 51 #define TCPIP_PRIORITY 80 | |
| 52 #define TCPIP_NUM_TIMER 1 | |
| 53 | |
| 54 #define PRIM_OFFSET_DTI2 0x50 /* We must subtract this from the DTI2 | |
| 55 * opcodes. No, I don't know why. And, to be | |
| 56 * honest, I do not really care. */ | |
| 57 | |
| 58 /*==== TYPES =================================================================*/ | |
| 59 | |
| 60 /*==== LOCALS ================================================================*/ | |
| 61 | |
| 62 static BOOL first_access = TRUE; | |
| 63 | |
| 64 static const T_FUNC tcpip_table[] = | |
| 65 { | |
| 66 MAK_FUNC_0(tcpip_initialize_req, TCPIP_INITIALIZE_REQ), | |
| 67 MAK_FUNC_0(tcpip_shutdown_req, TCPIP_SHUTDOWN_REQ), | |
| 68 MAK_FUNC_0(tcpip_ifconfig_req, TCPIP_IFCONFIG_REQ), | |
| 69 MAK_FUNC_0(tcpip_dti_req, TCPIP_DTI_REQ), | |
| 70 MAK_FUNC_0(tcpip_create_req, TCPIP_CREATE_REQ), | |
| 71 MAK_FUNC_0(tcpip_close_req, TCPIP_CLOSE_REQ), | |
| 72 MAK_FUNC_0(tcpip_bind_req, TCPIP_BIND_REQ), | |
| 73 MAK_FUNC_0(tcpip_listen_req, TCPIP_LISTEN_REQ), | |
| 74 MAK_FUNC_0(tcpip_connect_req, TCPIP_CONNECT_REQ), | |
| 75 MAK_FUNC_0(tcpip_data_req, TCPIP_DATA_REQ), | |
| 76 MAK_FUNC_0(tcpip_data_res, TCPIP_DATA_RES), | |
| 77 MAK_FUNC_0(tcpip_sockname_req, TCPIP_SOCKNAME_REQ), | |
| 78 MAK_FUNC_0(tcpip_peername_req, TCPIP_PEERNAME_REQ), | |
| 79 MAK_FUNC_0(tcpip_hostinfo_req, TCPIP_HOSTINFO_REQ), | |
| 80 MAK_FUNC_0(tcpip_mtu_size_req, TCPIP_MTU_SIZE_REQ), | |
| 81 MAK_FUNC_0(tcpip_internal_ind, TCPIP_INTERNAL_IND) | |
| 82 } ; | |
| 83 | |
| 84 static const T_FUNC dti_dl_table[] = | |
| 85 { | |
| 86 MAK_FUNC_0(tcpip_dti_connect_ind , DTI2_CONNECT_IND ), | |
| 87 MAK_FUNC_0(tcpip_dti_connect_cnf , DTI2_CONNECT_CNF ), | |
| 88 MAK_FUNC_0(tcpip_dti_disconnect_ind , DTI2_DISCONNECT_IND) , | |
| 89 MAK_FUNC_0(tcpip_dti_ready_ind , DTI2_READY_IND ), | |
| 90 MAK_FUNC_0(tcpip_dti_data_ind , DTI2_DATA_IND ) | |
| 91 #if defined (_SIMULATION_) | |
| 92 , | |
| 93 MAK_FUNC_S(tcpip_dti_data_test_ind , DTI2_DATA_TEST_IND ) | |
| 94 #endif | |
| 95 } ; | |
| 96 | |
| 97 | |
| 98 static const T_FUNC dti_ul_table[] = | |
| 99 { | |
| 100 MAK_FUNC_0(tcpip_dti_connect_req , DTI2_CONNECT_REQ ), | |
| 101 MAK_FUNC_0(tcpip_dti_connect_res , DTI2_CONNECT_RES ), | |
| 102 MAK_FUNC_0(tcpip_dti_disconnect_req, DTI2_DISCONNECT_REQ) , | |
| 103 MAK_FUNC_0(tcpip_dti_getdata_req , DTI2_GETDATA_REQ ), | |
| 104 MAK_FUNC_0(tcpip_dti_data_req , DTI2_DATA_REQ ) | |
| 105 | |
| 106 #if defined (_SIMULATION_) | |
| 107 , | |
| 108 MAK_FUNC_S(tcpip_dti_data_test_req , DTI2_DATA_TEST_REQ ) | |
| 109 #endif | |
| 110 } ; | |
| 111 | |
| 112 | |
| 113 /*==== PRIVATE FUNCTIONS ====================================================*/ | |
| 114 | |
| 115 /* | |
| 116 +------------------------------------------------------------------------------ | |
| 117 | Function : primitive_not_supported | |
| 118 +------------------------------------------------------------------------------ | |
| 119 | Description : This function handles unsupported primitives. | |
| 120 | | |
| 121 | Parameters : data - not used | |
| 122 | | |
| 123 | Return : void | |
| 124 +------------------------------------------------------------------------------ | |
| 125 */ | |
| 126 static void primitive_not_supported (void *data) | |
| 127 { | |
| 128 TRACE_FUNCTION ("primitive_not_supported"); | |
| 129 | |
| 130 PFREE (data); | |
| 131 } | |
| 132 | |
| 133 /* | |
| 134 +------------------------------------------------------------------------------ | |
| 135 | Function : pei_primitive | |
| 136 +------------------------------------------------------------------------------ | |
| 137 | Description : Process protocol specific primitive. | |
| 138 | | |
| 139 | Parameters : prim - pointer to the received primitive | |
| 140 | | |
| 141 | Return : PEI_OK - function succeeded | |
| 142 | PEI_ERROR - function failed | |
| 143 +-----------------------------------------------------------------------------*/ | |
| 144 static short pei_primitive (void * ptr) | |
| 145 { | |
| 146 T_PRIM *prim = (T_PRIM*)ptr; | |
| 147 | |
| 148 TRACE_FUNCTION ("pei_primitive"); | |
| 149 | |
| 150 if (prim NEQ NULL) | |
| 151 { | |
| 152 unsigned long opc = prim->custom.opc; | |
| 153 unsigned short n; | |
| 154 const T_FUNC *table; | |
| 155 | |
| 156 PTRACE_IN (opc); | |
| 157 | |
| 158 switch (SAP_NR(opc)) | |
| 159 { | |
| 160 case SAP_NR(TCPIP_UL): | |
| 161 table = tcpip_table; | |
| 162 n = TAB_SIZE (tcpip_table); | |
| 163 break; | |
| 164 case SAP_NR(DTI2_UL): /* defined in prim.h */ | |
| 165 table = dti_ul_table; | |
| 166 n = TAB_SIZE (dti_ul_table); | |
| 167 opc -= PRIM_OFFSET_DTI2 ; /* Don't ask. */ | |
| 168 break; | |
| 169 case SAP_NR(DTI2_DL): /* defined in prim.h */ | |
| 170 table = dti_dl_table; | |
| 171 n = TAB_SIZE (dti_dl_table); | |
| 172 opc -= PRIM_OFFSET_DTI2 ; /* Don't ask here either. */ | |
| 173 break; | |
| 174 default: | |
| 175 table = NULL; | |
| 176 n = 0; | |
| 177 break; | |
| 178 } | |
| 179 | |
| 180 if (table NEQ NULL) | |
| 181 { | |
| 182 if (PRIM_NR(opc) < n) | |
| 183 { | |
| 184 table += PRIM_NR(opc) ; | |
| 185 #ifdef PALLOC_TRANSITION | |
| 186 P_SDU(prim) = table->soff ? (T_sdu*) (((char*)&prim->data) + table->soff) : 0; | |
| 187 #ifndef NO_COPY_ROUTING | |
| 188 P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER); | |
| 189 #endif /* NO_COPY_ROUTING */ | |
| 190 #endif /* PALLOC_TRANSITION */ | |
| 191 JUMP (table->func) (P2D(prim)); | |
| 192 } | |
| 193 else | |
| 194 { | |
| 195 primitive_not_supported (P2D(prim)); | |
| 196 } | |
| 197 return PEI_OK; | |
| 198 } | |
| 199 | |
| 200 /* | |
| 201 * primitive is not a GSM primitive - forward it to the environment | |
| 202 */ | |
| 203 if (opc & SYS_MASK) | |
| 204 vsi_c_primitive (VSI_CALLER prim); | |
| 205 else | |
| 206 { | |
| 207 PFREE (P2D(prim)); | |
| 208 return PEI_ERROR; | |
| 209 } | |
| 210 } | |
| 211 return PEI_OK; | |
| 212 } | |
| 213 | |
| 214 /* | |
| 215 +------------------------------------------------------------------------------ | |
| 216 | Function : pei_init | |
| 217 +------------------------------------------------------------------------------ | |
| 218 | Description : Initialize Protocol Stack Entity | |
| 219 | | |
| 220 | Parameters : handle - task handle | |
| 221 | | |
| 222 | Return : PEI_OK - entity initialised | |
| 223 | PEI_ERROR - entity not (yet) initialised | |
| 224 +------------------------------------------------------------------------------ | |
| 225 */ | |
| 226 static short pei_init (T_HANDLE handle) | |
| 227 { | |
| 228 TRACE_FUNCTION ("pei_init"); | |
| 229 | |
| 230 /* Initialize entity handle */ | |
| 231 tcpip_handle = handle; | |
| 232 | |
| 233 /* | |
| 234 * Open communication channels | |
| 235 */ | |
| 236 if (hCommMMI < VSI_OK) | |
| 237 { | |
| 238 if ((hCommMMI = vsi_c_open (tcpip_handle, ACI_NAME)) < VSI_OK) | |
| 239 { | |
| 240 return PEI_ERROR; | |
| 241 } | |
| 242 } | |
| 243 | |
| 244 if (hCommTCPIP < VSI_OK) | |
| 245 { | |
| 246 if ((hCommTCPIP = vsi_c_open (tcpip_handle, TCPIP_NAME)) < VSI_OK) | |
| 247 { | |
| 248 return PEI_ERROR; | |
| 249 } | |
| 250 } | |
| 251 | |
| 252 /* | |
| 253 * Initialize global pointer tcpip_data. This is required to access all | |
| 254 * entity data. | |
| 255 */ | |
| 256 tcpip_data = &tcpip_data_base; | |
| 257 | |
| 258 tcpip_data->dti_handle = dti_init(TCPIP_MAX_DTI_LINKS, tcpip_handle, | |
| 259 DTI_DEFAULT_OPTIONS, tcpip_dti_callback) ; | |
| 260 return (PEI_OK); | |
| 261 } | |
| 262 | |
| 263 /* | |
| 264 +------------------------------------------------------------------------------ | |
| 265 | Function : pei_timeout | |
| 266 +------------------------------------------------------------------------------ | |
| 267 | Description : Process timeout. | |
| 268 | | |
| 269 | Parameters : index - timer index | |
| 270 | | |
| 271 | Return : PEI_OK - timeout processed | |
| 272 | PEI_ERROR - timeout not processed | |
| 273 +------------------------------------------------------------------------------ | |
| 274 */ | |
| 275 static short pei_timeout (unsigned short index) | |
| 276 { | |
| 277 /* TRACE_FUNCTION ("pei_timeout"); */ | |
| 278 | |
| 279 /* Process timeout */ | |
| 280 switch (index) | |
| 281 { | |
| 282 case RNET_RT_NGIP_TIMER: | |
| 283 /* Call of timeout routine */ | |
| 284 rnet_rt_handle_timer(NULL) ; | |
| 285 break; | |
| 286 default: | |
| 287 TRACE_ERROR("Unknown Timeout"); | |
| 288 return PEI_ERROR; | |
| 289 } | |
| 290 | |
| 291 return PEI_OK; | |
| 292 } | |
| 293 | |
| 294 | |
| 295 /* | |
| 296 +------------------------------------------------------------------------------ | |
| 297 | Function : pei_exit | |
| 298 +------------------------------------------------------------------------------ | |
| 299 | Description : Close Resources and terminate. | |
| 300 | | |
| 301 | Parameters : - | |
| 302 | | |
| 303 | Return : PEI_OK - exit sucessful | |
| 304 +------------------------------------------------------------------------------ | |
| 305 */ | |
| 306 static short pei_exit (void) | |
| 307 { | |
| 308 TRACE_FUNCTION ("pei_exit"); | |
| 309 | |
| 310 tcpip_do_shutdown() ; | |
| 311 if (tcpip_data->dti_handle NEQ NULL) | |
| 312 { | |
| 313 dti_deinit(tcpip_data->dti_handle) ; | |
| 314 tcpip_data->dti_handle = NULL ; | |
| 315 } | |
| 316 | |
| 317 /* Close communication channels */ | |
| 318 vsi_c_close (tcpip_handle,hCommMMI); | |
| 319 hCommMMI = VSI_ERROR; | |
| 320 vsi_c_close (tcpip_handle,hCommTCPIP); | |
| 321 hCommTCPIP = VSI_ERROR; | |
| 322 | |
| 323 | |
| 324 return PEI_OK; | |
| 325 } | |
| 326 | |
| 327 /* | |
| 328 +------------------------------------------------------------------------------ | |
| 329 | Function : pei_config | |
| 330 +------------------------------------------------------------------------------ | |
| 331 | Description : Dynamic Configuration. | |
| 332 | | |
| 333 | Parameters : in_string - configuration string | |
| 334 | | |
| 335 | Return : PEI_OK - sucessful | |
| 336 | PEI_ERROR - not successful | |
| 337 +------------------------------------------------------------------------------ | |
| 338 */ | |
| 339 | |
| 340 | |
| 341 static short pei_config (char *in_string) | |
| 342 { | |
| 343 TRACE_FUNCTION ("pei_config"); | |
| 344 TRACE_FUNCTION (in_string); | |
| 345 | |
| 346 if (!strcmp (in_string, "TCPIP_INITIALIZE_REQ") ) | |
| 347 { | |
| 348 tcpip_initialize_req(NULL) ; | |
| 349 } | |
| 350 else if (!strcmp (in_string, "TCPIP_SHUTDOWN_REQ") ) | |
| 351 { | |
| 352 tcpip_shutdown_req(NULL) ; | |
| 353 } | |
| 354 else if (!strcmp (in_string, "TCPIP_CREATE_REQ") ) | |
| 355 { | |
| 356 T_RV_RETURN_PATH return_path = { 0, 0 } ; | |
| 357 rnet_new(RNET_IPPROTO_TCP, &desc, return_path); | |
| 358 } | |
| 359 else if (!strcmp (in_string, "TCPIP_BIND_REQ") ) | |
| 360 { | |
| 361 rnet_bind(desc, RNET_IP_ADDR_ANY, 32000); | |
| 362 } | |
| 363 else if (!strcmp (in_string, "TCPIP_CONNECT_REQ") ) | |
| 364 { | |
| 365 rnet_connect(desc, RNET_IP_ADDR_ANY, 32000); | |
| 366 } | |
| 367 else if (!strcmp (in_string, "TCPIP_LISTEN_REQ") ) | |
| 368 { | |
| 369 rnet_listen(desc); | |
| 370 } | |
| 371 else if (!strcmp (in_string, "TCPIP_CLOSE_REQ") ) | |
| 372 { | |
| 373 rnet_close(desc); | |
| 374 } | |
| 375 else if (!strncmp(in_string, "dns ", 4)) | |
| 376 { | |
| 377 U8 *addrbyte ; | |
| 378 int o1, o2, o3, o4 ; | |
| 379 | |
| 380 if (sscanf(in_string + 4, "%d.%d.%d.%d", &o1, &o2, &o3, &o4) != 4) | |
| 381 { | |
| 382 TRACE_EVENT("cannot parse argument as an IP address") ; | |
| 383 return PEI_OK ; | |
| 384 } | |
| 385 addrbyte = (U8 *) &tcpip_data->config_dns_address ; | |
| 386 addrbyte[0] = (U8) o1 ; | |
| 387 addrbyte[1] = (U8) o2 ; | |
| 388 addrbyte[2] = (U8) o3 ; | |
| 389 addrbyte[3] = (U8) o4 ; | |
| 390 TRACE_EVENT("DNS address saved") ; | |
| 391 } | |
| 392 /* | |
| 393 * further dynamic configuration | |
| 394 */ | |
| 395 return PEI_OK; | |
| 396 } | |
| 397 | |
| 398 | |
| 399 /*==== PUBLIC FUNCTIONS =====================================================*/ | |
| 400 | |
| 401 /* | |
| 402 +------------------------------------------------------------------------------ | |
| 403 | Function : pei_create | |
| 404 +------------------------------------------------------------------------------ | |
| 405 | Description : Create the Protocol Stack Entity. | |
| 406 | | |
| 407 | Parameters : info - Pointer to the structure of entity parameters | |
| 408 | | |
| 409 | Return : PEI_OK - entity created successfully | |
| 410 | | |
| 411 +------------------------------------------------------------------------------ | |
| 412 */ | |
| 413 short tcpip_pei_create (T_PEI_INFO **info) | |
| 414 { | |
| 415 static T_PEI_INFO pei_info = | |
| 416 { | |
| 417 "TCP", /* name */ | |
| 418 { /* pei-table */ | |
| 419 pei_init, | |
| 420 pei_exit, | |
| 421 pei_primitive, | |
| 422 pei_timeout, | |
| 423 NULL, /* pei_signal */ | |
| 424 NULL, /* pei_run */ | |
| 425 pei_config, | |
| 426 NULL /* pei_monitor */ | |
| 427 }, | |
| 428 TCPIP_STACK_SIZE, /* stack size */ | |
| 429 TCPIP_QUEUE_SIZE, /* queue entries */ | |
| 430 TCPIP_PRIORITY, /* priority (1->low, 255->high) */ | |
| 431 TCPIP_NUM_TIMER, /* number of timers */ | |
| 432 COPY_BY_REF|PASSIVE_BODY /* flags: bit 0 active(0) body/passive(1) */ | |
| 433 }; /* bit 1 com by copy(0)/reference(1) */ | |
| 434 | |
| 435 TRACE_FUNCTION ("pei_create()"); | |
| 436 | |
| 437 /* Close Resources if open */ | |
| 438 if (first_access) { | |
| 439 first_access = FALSE; | |
| 440 } | |
| 441 else { | |
| 442 pei_exit (); | |
| 443 } | |
| 444 | |
| 445 /* Export startup configuration data */ | |
| 446 *info = &pei_info; | |
| 447 | |
| 448 return PEI_OK; | |
| 449 } | |
| 450 | |
| 451 /*==== END OF FILE ==========================================================*/ | |
| 452 |
