FreeCalypso > hg > fc-selenite
diff src/g23m-fad/udp/udp_pei.c @ 1:d393cd9bb723
src/g23m-*: initial import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 15 Jul 2018 04:40:46 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-fad/udp/udp_pei.c Sun Jul 15 04:40:46 2018 +0000 @@ -0,0 +1,761 @@ +/* ++---------------------------------------------------------------------------- +| Project : GSM-FaD (8411) +| Modul : UDP_PEI ++---------------------------------------------------------------------------- +| Copyright 2002 Texas Instruments Berlin, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| The receipt of or possession of this file does not convey +| any rights to reproduce or disclose its contents or to +| manufacture, use, or sell anything it may describe, in +| whole, or in part, without the specific written consent of +| Texas Instruments Berlin, AG. ++---------------------------------------------------------------------------- +| Purpose : This Modul defines the process body interface +| for the component Internet Protocol of the mobile station ++---------------------------------------------------------------------------- +*/ + +#define ENTITY_UDP + +/*==== INCLUDES ===================================================*/ + +#include <string.h> +#include <stdlib.h> +#include <stddef.h> +#include "typedefs.h" +#include "pcm.h" +#include "vsi.h" +#include "macdef.h" /* to get PFREE_DESC2 */ +#include "custom.h" +#include "gsm.h" +#include "message.h" +#include "ccdapi.h" +#include "prim.h" +#include "cus_udp.h" +#include "cnf_udp.h" +#include "mon_udp.h" +#include "pei.h" +#include "tok.h" +#include "dti.h" /* to get dti lib */ +#include "udp.h" + +/*==== CONST ======================================================*/ + +/*==== VAR EXPORT =================================================*/ + +DTI_HANDLE udp_hDTI; +/* The DTI data base is being allocated in function dti_init(). */ + +T_HANDLE hCommACI = VSI_ERROR; /* ACI Communication */ +T_HANDLE hCommLL = VSI_ERROR; /* LL Communication */ +T_HANDLE hCommHL = VSI_ERROR; /* HL Communication */ +T_HANDLE udp_handle; + +T_UDP_DATA udp_data_base [UDP_INSTANCES], * udp_data; + +/*==== VAR LOCAL ==================================================*/ + +static BOOL first_access = TRUE; +static T_MONITOR udp_mon; + +/*==== FUNCTIONS ==================================================*/ + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-FaD (8411) MODULE : UDP_PEI | +| STATE : code ROUTINE : pei_not_supported | ++--------------------------------------------------------------------+ + + PURPOSE : An unsupported primitive is received. +*/ + +static void pei_not_supported (void * data) +{ + TRACE_FUNCTION ("pei_not_supported()"); + PFREE (data); +} + +/* Use MAK_FUNC_0 for primitives which contains no SDU. + * Use MAK_FUNC_S for primitives which contains a SDU. */ + +/* Jumptable for the UDPA service access point. + * Contains the processing-function addresses and + * opcodes of request and response primitives. */ + +static const T_FUNC udpa_table[] = +{ + MAK_FUNC_0 (ker_udpa_dti_req, UDPA_DTI_REQ), + MAK_FUNC_0 (ker_udpa_config_req, UDPA_CONFIG_REQ) +}; + +/* Jumptable for the UDP service access point. + * Contains the processing-function addresses and + * opcodes of request and response primitives. */ + +static const T_FUNC udp_table[] = +{ + MAK_FUNC_0 (ker_udp_bind_req, UDP_BIND_REQ), + MAK_FUNC_0 (ker_udp_closeport_req, UDP_CLOSEPORT_REQ), + MAK_FUNC_0 (ker_udp_error_res, UDP_ERROR_RES), + MAK_FUNC_0 (ker_udp_shutdown_res, UDP_SHUTDOWN_RES), +}; + +/* Jumptable for the IP service access point. + * Contains the processing-function addresses and + * opcodes of indication and confirm primitives. */ + +static const T_FUNC ip_table[] = +{ + MAK_FUNC_0 (ker_ip_addr_cnf, IP_ADDR_CNF), +}; + +/* Jumptable for the DTI service access point of the higher layer. + * Contains the processing-function addresses and + * opcodes of request and response primitives. */ + +static const T_FUNC dti_hl_table[] = +{ + MAK_FUNC_0 (pei_dti_dti_connect_req, DTI2_CONNECT_REQ), + MAK_FUNC_0 (pei_dti_dti_connect_res, DTI2_CONNECT_RES), + MAK_FUNC_0 (pei_dti_dti_disconnect_req, DTI2_DISCONNECT_REQ), + MAK_FUNC_0 (pei_dti_dti_getdata_req, DTI2_GETDATA_REQ), + MAK_FUNC_0 (pei_dti_dti_data_req, DTI2_DATA_REQ), +#ifdef _SIMULATION_ + MAK_FUNC_S (pei_dti_dti_data_test_req, DTI2_DATA_TEST_REQ) +#endif +}; + +/* Jumptable for the DTI service access point of the lower layer. + * Contains the processing-function addresses and + * opcodes of indication and confirm primitives. */ + +static const T_FUNC dti_ll_table[] = +{ + MAK_FUNC_0 (pei_dti_dti_connect_ind, DTI2_CONNECT_IND), + MAK_FUNC_0 (pei_dti_dti_connect_cnf, DTI2_CONNECT_CNF), + MAK_FUNC_0 (pei_dti_dti_disconnect_ind, DTI2_DISCONNECT_IND), + MAK_FUNC_0 (pei_dti_dti_ready_ind, DTI2_READY_IND), + MAK_FUNC_0 (pei_dti_dti_data_ind, DTI2_DATA_IND), +#ifdef _SIMULATION_ + MAK_FUNC_S (pei_dti_dti_data_test_ind, DTI2_DATA_TEST_IND) +#endif +}; + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-FaD (8411) MODULE : UDP_PEI | +| STATE : code ROUTINE : pei_primitive | ++--------------------------------------------------------------------+ + + PURPOSE : Process protocol specific primitive. +*/ + +static SHORT pei_primitive (void * ptr) +{ + /* + * @ADAPT@ + * | + * UL HIGHER LAYER + * | + * v + * +-----------(udp)----------+ + * | | + * | UDP | + * | | + * +-------------^------------+ + * | + * DL LOWER LAYER + * | + */ + + /* Please note that the words "Downlink" and "Uplink" + * should not be used here, because their meaning + * is directly opposite to what is being meant here. + * So let us correct the creator's mistake by + * pronouncing "DL" as "Downlayer" and + * "UL" as "Uplayer" and all should fit well + * -- as long as you can remember this ... */ + + TRACE_FUNCTION ("pei_primitive()"); + + if (ptr != NULL) + { + T_PRIM * prim = ptr; + ULONG opc = prim->custom.opc; + USHORT n; + const T_FUNC * table; + + VSI_PPM_REC (& prim->custom, __FILE__, __LINE__); + + PTRACE_IN (opc); + + udp_data = GET_INSTANCE (prim); + + switch (SAP_NR (opc)) + { + case SAP_NR (UDP_UL): + table = udp_table; + n = TAB_SIZE (udp_table); + break; + case SAP_NR (UDPA_UL): + table = udpa_table; + n = TAB_SIZE (udpa_table); + break; + case IP_DL: + table = ip_table; + n = TAB_SIZE (ip_table); + break; + case DTI2_UL: + table = dti_hl_table; + n = TAB_SIZE (dti_hl_table); + /* + * to be able to distinguish DTI1/DTI2 opcodes, + * the ones for DTI2 start at 0x50 + */ + opc -= 0x50; + break; + case DTI2_DL: + table = dti_ll_table; + n = TAB_SIZE (dti_ll_table); + /* + * to be able to distinguish DTI1/DTI2 opcodes, + * the ones for DTI2 start at 0x50 + */ + opc -= 0x50; + break; + default: + table = NULL; + n = 0; + break; + } + + if (table NEQ NULL) + { + if (PRIM_NR (opc) < n) + { + table += PRIM_NR (opc); +#ifdef PALLOC_TRANSITION + P_SDU(prim) = table->soff ? + (T_sdu *) ((char *) & prim->data + table->soff) : + 0; + #ifndef NO_COPY_ROUTING + P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER); + #endif +#endif + JUMP (table->func) (P2D (prim)); + } + else + { + pei_not_supported (P2D (prim)); + } + return PEI_OK; + } + + /* Primitive is no GSM primitive + * then forward to the environment */ + +#ifdef GSM_ONLY + PFREE (P2D (prim)); + return PEI_ERROR; +#else + if (opc & SYS_MASK) + vsi_c_primitive (VSI_CALLER prim); + else + { + PFREE (P2D (prim)); + return PEI_ERROR; + } +#endif + } + return PEI_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : IP_PEI | +| STATE : code ROUTINE : pei_init | ++--------------------------------------------------------------------+ + + PURPOSE : Initialize Protocol Stack Entity +*/ + +static SHORT pei_init (T_HANDLE handle) +{ + udp_handle = handle; + + TRACE_FUNCTION ("pei_init()"); + + udp_data = udp_data_base + UDP_SINGLE_LAYER; + + INIT_STATE (KER, DEACTIVATED); + INIT_STATE (HILA, DOWN); + INIT_STATE (LOLA, DOWN); + + if ((udp_hDTI = dti_init ( + 2 * UDP_INSTANCES, + udp_handle, + DTI_DEFAULT_OPTIONS, + pei_sig_callback + )) EQ D_NO_DATA_BASE) + return PEI_ERROR; + + /* + if (hCommHL < VSI_OK) + if ((hCommHL = vsi_c_open (VSI_CALLER WAP_NAME)) < VSI_OK) + return PEI_ERROR; + */ + if (hCommLL < VSI_OK) + if ((hCommLL = vsi_c_open (VSI_CALLER IP_NAME)) < VSI_OK) + return PEI_ERROR; + + if (hCommACI < VSI_OK) + if ((hCommACI = vsi_c_open (VSI_CALLER ACI_NAME)) < VSI_OK) + return PEI_ERROR; + + /* Init global parameters */ + init_udp (); + + return PEI_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-FaD (8411) MODULE : UDP_PEI | +| STATE : code ROUTINE : pei_exit | ++--------------------------------------------------------------------+ + + PURPOSE : Close Resources and terminate +*/ + +static SHORT pei_exit (void) +{ + TRACE_FUNCTION ("pei_exit()"); + + /* Clean up communication */ + + vsi_c_close (VSI_CALLER hCommHL); + hCommHL = VSI_ERROR; + + vsi_c_close (VSI_CALLER hCommLL); + hCommLL = VSI_ERROR; + + vsi_c_close (VSI_CALLER hCommACI); + hCommACI = VSI_ERROR; + + if (udp_hDTI NEQ D_NO_DATA_BASE) + dti_deinit (udp_hDTI); + + return PEI_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-FaD (8411) MODULE : UDP_PEI | +| STATE : code ROUTINE : pei_config | ++--------------------------------------------------------------------+ + + PURPOSE : Dynamic Configuration +*/ + +#ifndef NCONFIG +static KW_DATA kwtab[] = { + {"", 0} +}; +KW_DATA partab[] = { + {"", 0} +}; +#endif + +static SHORT pei_config (T_PEI_CONFIG inString) +{ +#ifndef NCONFIG + char * s = inString; + char * keyw; + char * val[10]; + TRACE_FUNCTION ("pei_config()"); + TRACE_EVENT (s); + + tok_init (s); + + /* Parse next keyword and number of variables */ + while ((tok_next(&keyw,val)) NEQ TOK_EOCS) + { + switch ((tok_key ((KW_DATA *) kwtab, keyw))) + { + case TOK_NOT_FOUND: + TRACE_ERROR ("[PEI_CONFIG]: Illegal Keyword"); + break; + + default: + break; + } + } +#endif + return PEI_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-FaD (8411) MODULE : UDP_PEI | +| STATE : code ROUTINE : pei_monitor | ++--------------------------------------------------------------------+ + + PURPOSE : Monitoring of physical Parameters +*/ + +static SHORT pei_monitor (void ** monitor) +{ + TRACE_FUNCTION ("pei_monitor()"); + + udp_mon.version = VERSION_UDP; + *monitor = & udp_mon; + return PEI_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-FaD (8411) MODULE : UDP_PEI | +| STATE : code ROUTINE : pei_create | ++--------------------------------------------------------------------+ + + PURPOSE : Create the Protocol Stack Entity +*/ + +SHORT udp_pei_create (const T_PEI_INFO ** info) +{ + static const T_PEI_INFO pei_info = + { + "UDP", + { + pei_init, + pei_exit, + pei_primitive, + NULL, /* no timeout function */ + NULL, /* no signal function */ + NULL, /* no run function */ + pei_config, + pei_monitor + }, + 1024, /* stack size */ + 10, /* queue entries */ + 170, /* priority */ + 0, /* number of timers */ + 0x03|PRIM_NO_SUSPEND/* flags */ + }; + + TRACE_FUNCTION ("pei_create()"); + + /* Close resources if open */ + if (first_access) + first_access = FALSE; + else + pei_exit (); + + /* Export startup configuration data */ + *info = & pei_info; + + return PEI_OK; +} + +/* ++---------------------------------------------------------------------------- +| Function: pei_sig_callback ++---------------------------------------------------------------------------- +| PURPOSE : Callback function for DTILIB ++---------------------------------------------------------------------------- +*/ + +void pei_sig_callback ( + U8 instance, + U8 interfac, + U8 channel, + U8 reason, + T_DTI2_DATA_IND * dti_data_ind +) { + TRACE_FUNCTION ("pei_sig_callback()"); + +#ifdef _SIMULATION_ + if (instance NEQ UDP_DTI_DEF_INSTANCE || channel NEQ UDP_DTI_DEF_CHANNEL) + { + TRACE_ERROR ("[PEI_SIG_CALLBACK] channel or instance not valid!"); + return; /* error, not found */ + } +#endif + + /* udp_data = udp_data_base + instance; */ + + if (udp_hDTI NEQ D_NO_DATA_BASE) + { + switch (reason) + { + case DTI_REASON_CONNECTION_OPENED: + switch (interfac) + { + case UDP_DTI_HL_INTERFACE: + sig_dti_ker_connection_opened_hl_ind (); + break; + case UDP_DTI_LL_INTERFACE: + sig_dti_ker_connection_opened_ll_ind (); + break; + default: + TRACE_ERROR ("unknown DTILIB interface parameter"); + break; + } + break; + + case DTI_REASON_CONNECTION_CLOSED: + switch (interfac) + { + case UDP_DTI_HL_INTERFACE: + sig_dti_ker_connection_closed_hl_ind (); + break; + case UDP_DTI_LL_INTERFACE: + sig_dti_ker_connection_closed_ll_ind (); + break; + default: + TRACE_ERROR ("unknown DTILIB interface parameter"); + break; + } + break; + + case DTI_REASON_DATA_RECEIVED: + switch (interfac) + { + case UDP_DTI_HL_INTERFACE: + /* + * DTI2_DATA_IND is interpreted as DTI2_DATA_REQ + */ + PACCESS (dti_data_ind); + { + PPASS (dti_data_ind, dti_data_req, DTI2_DATA_REQ); + sig_dti_ker_data_received_hl_ind (dti_data_req); + } + break; + case UDP_DTI_LL_INTERFACE: + sig_dti_ker_data_received_ll_ind (dti_data_ind); + break; + default: + TRACE_ERROR ("unknown DTILIB interface parameter"); + break; + } + break; + + case DTI_REASON_TX_BUFFER_READY: + switch (interfac) + { + case UDP_DTI_HL_INTERFACE: + sig_dti_ker_tx_buffer_ready_hl_ind (); + break; + case UDP_DTI_LL_INTERFACE: + sig_dti_ker_tx_buffer_ready_ll_ind (); + break; + default: + TRACE_ERROR ("unknown DTILIB interface parameter"); + break; + } + break; + + case DTI_REASON_TX_BUFFER_FULL: + switch (interfac) + { + case UDP_DTI_HL_INTERFACE: + sig_dti_ker_tx_buffer_full_hl_ind (); /* DUMMY function */ + break; + case UDP_DTI_LL_INTERFACE: + sig_dti_ker_tx_buffer_full_ll_ind (); /* DUMMY function */ + break; + default: + TRACE_ERROR ("unknown DTILIB interface parameter"); + break; + } + break; + + default: + TRACE_ERROR ("unknown DTILIB reason parameter"); + break; + } + } + else + { + TRACE_ERROR ("Pointer to DTILIB database not existing"); + } +} + +/* ++---------------------------------------------------------------------------+ +| PROJECT: UDP MODULE: udp_pei.c | +| STATE: code ROUTINE: pei_dti_dti_connect_req | ++---------------------------------------------------------------------------+ + + PURPOSE: pei_dti_dti_connect_req wraps dti_dti_connect_req +*/ + +void pei_dti_dti_connect_req (T_DTI2_CONNECT_REQ * dti_connect_req) +{ + dti_dti_connect_req (udp_hDTI, dti_connect_req); +} + +/* ++---------------------------------------------------------------------------+ +| PROJECT: UDP MODULE: udp_pei.c | +| STATE: code ROUTINE: pei_dti_dti_disconnect_ind | ++---------------------------------------------------------------------------+ + + PURPOSE: pei_dti_dti_disconnect_ind wraps dti_dti_disconnect_ind +*/ + +void pei_dti_dti_disconnect_ind (T_DTI2_DISCONNECT_IND * dti_disconnect_ind) +{ + dti_dti_disconnect_ind (udp_hDTI, dti_disconnect_ind); +} + +/* ++---------------------------------------------------------------------------+ +| PROJECT: UDP MODULE: udp_pei.c | +| STATE: code ROUTINE: pei_dti_dti_connect_cnf | ++---------------------------------------------------------------------------+ + + PURPOSE: pei_dti_dti_connect_cnf wraps dti_dti_connect_cnf +*/ + +void pei_dti_dti_connect_cnf (T_DTI2_CONNECT_CNF * dti_connect_cnf) +{ + dti_dti_connect_cnf (udp_hDTI, dti_connect_cnf); +} + +/* ++---------------------------------------------------------------------------+ +| PROJECT: UDP MODULE: udp_pei.c | +| STATE: code ROUTINE: pei_dti_dti_connect_ind | ++---------------------------------------------------------------------------+ + + PURPOSE: pei_dti_dti_connect_ind wraps dti_dti_connect_ind +*/ + +void pei_dti_dti_connect_ind (T_DTI2_CONNECT_IND * dti_connect_ind) +{ + dti_dti_connect_ind (udp_hDTI, dti_connect_ind); +} + +/* ++---------------------------------------------------------------------------+ +| PROJECT: UDP MODULE: udp_pei.c | +| STATE: code ROUTINE: pei_dti_dti_connect_res | ++---------------------------------------------------------------------------+ + + PURPOSE: pei_dti_dti_connect_res wraps dti_dti_connect_res +*/ + +void pei_dti_dti_connect_res (T_DTI2_CONNECT_RES * dti_connect_res) +{ + dti_dti_connect_res (udp_hDTI, dti_connect_res); +} + +/* ++---------------------------------------------------------------------------+ +| PROJECT: UDP MODULE: udp_pei.c | +| STATE: code ROUTINE: pei_dti_dti_disconnect_req | ++---------------------------------------------------------------------------+ + + PURPOSE: pei_dti_dti_disconnect_req wraps dti_dti_disconnect_req +*/ + +void pei_dti_dti_disconnect_req (T_DTI2_DISCONNECT_REQ * dti_disconnect_req) +{ + dti_dti_disconnect_req (udp_hDTI, dti_disconnect_req); +} + +/* ++---------------------------------------------------------------------------+ +| PROJECT: UDP MODULE: udp_pei.c | +| STATE: code ROUTINE: pei_dti_dti_data_req | ++---------------------------------------------------------------------------+ + + PURPOSE: pei_dti_dti_data_req wraps dti_dti_data_req +*/ + +void pei_dti_dti_data_req (T_DTI2_DATA_REQ * dti_data_req) +{ + dti_dti_data_req (udp_hDTI, dti_data_req); +} + +/* ++---------------------------------------------------------------------------+ +| PROJECT: UDP MODULE: udp_pei.c | +| STATE: code ROUTINE: pei_dti_dti_getdata_req | ++---------------------------------------------------------------------------+ + + PURPOSE: pei_dti_dti_getdata_req wraps dti_dti_getdata_req +*/ + +void pei_dti_dti_getdata_req (T_DTI2_GETDATA_REQ * dti_getdata_req) +{ + dti_dti_getdata_req (udp_hDTI, dti_getdata_req); +} + +/* ++---------------------------------------------------------------------------+ +| PROJECT: UDP MODULE: udp_pei.c | +| STATE: code ROUTINE: pei_dti_dti_data_ind | ++---------------------------------------------------------------------------+ + + PURPOSE: pei_dti_dti_data_ind wraps dti_dti_data_ind +*/ + +void pei_dti_dti_data_ind (T_DTI2_DATA_IND * dti_data_ind) +{ + dti_dti_data_ind (udp_hDTI, dti_data_ind); +} + +/* ++---------------------------------------------------------------------------+ +| PROJECT: UDP MODULE: udp_pei.c | +| STATE: code ROUTINE: pei_dti_dti_ready_ind | ++---------------------------------------------------------------------------+ + + PURPOSE: pei_dti_dti_ready_ind wraps dti_dti_ready_ind +*/ + +void pei_dti_dti_ready_ind (T_DTI2_READY_IND * dti_ready_ind) +{ + dti_dti_ready_ind (udp_hDTI, dti_ready_ind); +} + +#ifdef _SIMULATION_ + +/* ++---------------------------------------------------------------------------+ +| PROJECT: UDP MODULE: udp_pei.c | +| STATE: code ROUTINE: pei_dti_dti_data_test_req | ++---------------------------------------------------------------------------+ + + PURPOSE: pei_dti_dti_data_test_req wraps dti_dti_data_test_req +*/ + +void pei_dti_dti_data_test_req (T_DTI2_DATA_TEST_REQ * dti_data_test_req) +{ + dti_dti_data_test_req (udp_hDTI, dti_data_test_req); +} + +/* ++---------------------------------------------------------------------------+ +| PROJECT: UDP MODULE: udp_pei.c | +| STATE: code ROUTINE: pei_dti_dti_data_test_ind | ++---------------------------------------------------------------------------+ + + PURPOSE: pei_dti_dti_data_test_ind wraps dti_dti_data_test_ind +*/ + +void pei_dti_dti_data_test_ind (T_DTI2_DATA_TEST_IND * dti_data_test_ind) +{ + dti_dti_data_test_ind (udp_hDTI, dti_data_test_ind); +} + +#endif /* _SIMULATION_ */ + +/*-------------------------------------------------------------------------*/ +