FreeCalypso > hg > freecalypso-sw
diff gsm-fw/g23m-aci/aci/psa_tcpipf.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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/g23m-aci/aci/psa_tcpipf.c Sun Oct 12 01:45:14 2014 +0000 @@ -0,0 +1,597 @@ +/* ++----------------------------------------------------------------------------- +| Project : WAPoverGPRS +| Modul : PSA_TCPIPF ++----------------------------------------------------------------------------- +| 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 : Functions for interfacing to TCP/IP-related entities. At +| the moment, these are IP(v4) and UDP. In the future, TCP and IPv6 +| and perhaps others will follow, so we try to be as general as +| possible. +| +| Main exports: +| psaTCPIP_Activate() +| psaTCPIP_Configure() +| psaTCPIP_Deactivate() +| +| Declarations and definitions are in psa_tcpip.h. ++----------------------------------------------------------------------------- +*/ +#if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP) + +#ifndef PSA_TCPIPF_C +#define PSA_TCPIPF_C +#endif /* !PSA_TCPIPF_C */ + +#include "aci_all.h" +/*==== INCLUDES ===================================================*/ +#include "dti.h" /* functionality of the dti library */ +#include "dti_conn_mng.h" +#include "aci_cmh.h" +#include "ati_cmd.h" +#include "aci_cmd.h" +#include "aci_fd.h" +#include "psa.h" +#include "psa_tcpip.h" +#include "psa_cc.h" +#include "cmh.h" +#include "psa_ra.h" +#include "cmh_ra.h" +#include "cmh_l2r.h" + +#include "ksd_utl.h" + +#if defined (FF_SAT_E) +#include "cmh_cc.h" +#include "psa_sat.h" +#endif /* SAT E */ + +#ifdef FF_GPF_TCPIP +#include "dcm_utils.h" +#include "dcm_state.h" +#include "dcm_env.h" +#endif +#include "dcm_f.h" + + + +/*==== CONSTANTS ==================================================*/ + +/*==== TYPES ======================================================*/ + + +/*==== EXPORT =====================================================*/ +GLOBAL void psaTCPIP_Initialize_Req(void); +GLOBAL void psaTCPIP_Shutdown_Req(void); +GLOBAL void psaTCPIP_Config (ULONG ipaddr, ULONG dns1, ULONG dns2, UBYTE dirc); +GLOBAL ULONG bytes2ipv4addr(UBYTE *host); + +/*==== VARIABLES ==================================================*/ + +/*==== FUNCTIONS ==================================================*/ + +/* Convert an IP address in an array of 4 bytes (network order + * assumed) into an unsigned long value representing the same IP + * address, also in network order. This is purely a matter of + * alignment, so a simple copy will do. + */ +ULONG psaTCPIP_bytes2ipv4addr(UBYTE *ip_address) +{ + ULONG result; + UBYTE i; + BYTE buf[4]; + + for (i=0; i<4; i++) + { + utl_string2Byte ((CHAR*)(ip_address+(i*4)), 3, &buf[3-i]); + } + memcpy(&result, buf, 4); + return result; +} + +GLOBAL char* wap_state_to_string(T_ACI_WAP_STATES wap_state) +{ + switch(wap_state) + { + case Wap_Not_Init: return "wap-not_init"; +#ifdef FF_GPF_TCPIP + case TCPIP_Initialization: return "TCPIP_Initialization"; + case TCPIP_Initialized: return "TCPIP_Initialized"; + case TCPIP_Activation: return "TCPIP_Activation"; + case TCPIP_Activated: return "TCPIP_Activated"; +#endif /*FF_GPF_TCPIP*/ + case UDPA_Activation: return "UDPA_Activation"; + case UDPA_Activated: return "UDPA_Activated"; + case IPA_Activation: return "IPA_Activation"; + case IPA_Activated: return "IPA_Activated"; + case IPA_Configuration: return "IPA_Configuration"; + case IPA_Configurated: return "IPA_Configurated"; + case UDPA_Configuration: return "UDPA_Configuration"; + case UDPA_Configurated: return "UDPA_Configurated"; +#ifdef FF_GPF_TCPIP + case TCPIP_Configuration: return "TCPIP_Configuration"; + case TCPIP_Configurated: return "TCPIP_Configurated"; +#endif /*FF_GPF_TCPIP*/ + case IPA_Deconfiguration: return "IPA_Deconfiguration"; + case IPA_Deconfigurated: return "IPA_Deconfigurated"; + case UDPA_Deconfiguration: return "UDPA_Deconfiguration"; + case UPDA_Deconfigurated: return "UPDA_Deconfigurated"; +#ifdef FF_GPF_TCPIP + case TCPIP_Deconfiguration: return "TCPIP_Deconfiguration"; + case TCPIP_Deconfigurated: return "TCPIP_Deconfigurated"; + case TCPIP_Deactivation: return "TCPIP_Deactivation"; + case TCPIP_Deactivated: return "TCPIP_Deactivated"; +#endif /*FF_GPF_TCPIP*/ + case UDPA_Deactivation: return "UDPA_Deactivation"; + case UDPA_Deactivated: return "UDPA_Deactivated"; + case IPA_Deactivation: return "IPA_Deactivation"; + case IPA_Deactivated: return "IPA_Deactivated"; + default: return "<Unknown wap_state>"; + } +} + + +/* ++-------------------------------------------------------------------+ +| PROJECT : WAPoverGPRS MODULE : PSA_TCPIP | +| ROUTINE : psaTCPIP_Init | ++-------------------------------------------------------------------+ + + PURPOSE : Initialize the protocol stack adapter for TCP/IP. + +*/ +GLOBAL void psaTCPIP_Init(void) +{ + memset (&tcpipShrdPrm, 0, sizeof (T_TCPIP_SHRD_PRM)); + wap_state = Wap_Not_Init ; /* This is redundant at the moment, + * but will be set only here + * eventually. */ + tcpipShrdPrm.connection_type = TCPIP_CONNECTION_TYPE_UNKNOWN; + tcpipShrdPrm.connection_buildup = TCPIP_CONNECTION_BUILDUP_UNKNOWN; +} + + +/* Activate TCP/IP-related entities. See psa_tcpip.h for a detailed + * description. + */ +void psaTCPIP_Activate(UBYTE src_id, + UBYTE dti_id, + SHORT wap_call_id, + UBYTE options, + UBYTE connection_type, + void (*callback_function)(T_ACI_RETURN result)) +{ + /* The `options' parameter is not yet used, since we have only UDP + * and IPv4. This will change in the future, including related + * changes to other parts of the ACI. (At the moment the completion + * of UDP activation calls IP activation directly, but this will + * have to be torn apart. [ni 2001-10-02] + */ + + TRACE_FUNCTION ("psaTCPIP_Activate()") ; + + tcpipShrdPrm.src_id = src_id ; + tcpipShrdPrm.connection_type = connection_type; + tcpipShrdPrm.connection_buildup = TCPIP_CONNECTION_BUILDUP_UP; + tcpipShrdPrm.wap_call_id = wap_call_id ; + tcpipShrdPrm.options = options ; + tcpipShrdPrm.callback_function = callback_function ; + + if(is_gpf_tcpip_call()) { + GPF_TCPIP_STATEMENT(wap_state = TCPIP_Initialization); + psaTCPIP_config_dispatch(); + } + else { + wap_state = Wap_Not_Init ; + psaUDPIP_config_dispatch(); + } +} + + +/* Configure TCP/IP-related entities. + */ +void psaTCPIP_Configure(UBYTE *ip_address, + void *pdp_addrp, + UBYTE *peer_address, + UBYTE *dns1, + UBYTE *dns2, + short mtu, + void (*callback_function)(T_ACI_RETURN result)) +{ + TRACE_FUNCTION("psaTCPIP_Configure()") ; + + if (ip_address AND pdp_addrp) { + TRACE_ERROR("psaTCPIP_Configure(): both ip_address and pdp_addrp non-null!") ; + return ; + } + + if (!ip_address AND !pdp_addrp) { + TRACE_ERROR("psaTCPIP_Configure(): both ip_address and pdp_addrp null!") ; + return ; + } + + if (ip_address) /* From PPP, IP over CSD. */ + { + memcpy(tcpipShrdPrm.ipaddr, ip_address, 16) ; + } +#ifdef GPRS + else if (pdp_addrp) /* From SNDCP, IP over GPRS. */ + { + memcpy(tcpipShrdPrm.ipaddr, pdp_addrp, 16/*sizeof(tcpipShrdPrm.ipaddr)*/); + } +#endif + + if (peer_address) { + memcpy(tcpipShrdPrm.peer_addr, peer_address, 16) ; + } + if(dns1) { + memcpy(tcpipShrdPrm.dns1,dns1,16); + } + + if(dns2) { + memcpy(tcpipShrdPrm.dns2,dns2,16); + } + tcpipShrdPrm.mtu = mtu ; + tcpipShrdPrm.callback_function = callback_function ; + + if(is_gpf_tcpip_call()) { + GPF_TCPIP_STATEMENT(wap_state = TCPIP_Configuration); + psaTCPIP_config_dispatch(); + } + else { + wap_state = IPA_Configuration ; + psaUDPIP_config_dispatch(); + } +} + + +/* Deactivate TCP/IP-related entities. + */ +void psaTCPIP_Deactivate(void (*callback_function)(T_ACI_RETURN result)) +{ + TRACE_FUNCTION("psaTCPIP_Deactivate()") ; + TRACE_EVENT_P1("wap_state: %d", wap_state) ; + + tcpipShrdPrm.connection_buildup = TCPIP_CONNECTION_BUILDUP_DOWN; + tcpipShrdPrm.callback_function = callback_function ; + + if(is_gpf_tcpip_call()) { + #ifdef FF_GPF_TCPIP + if ( wap_state EQ TCPIP_Configurated ) { + wap_state = TCPIP_Deconfiguration ; + } + #endif + psaTCPIP_config_dispatch() ; + } + else { + if ( wap_state EQ UDPA_Configurated ) { + wap_state = IPA_Deconfiguration ; + } + psaUDPIP_config_dispatch(); + } +} + + +/********************** Dispatcher functions **********************/ + +/* State machine for UDP/TCP/IP activation, configuration, and + * deactivation. At the moment some of this is still handled elsewhere + * in the ACI (see comments to psaTCPIP_Configure() and + * psaTCPIP_Activate() above), but I plan to tear this apart and keep + * all control over these activities in this place, including status + * checks and transitions. [ni 2001-10-02] + */ + +void psaUDPIP_config_dispatch(void) +{ +#ifdef CO_UDP_IP // to avoid linker errors in simulation + + TRACE_FUNCTION("psaUDPIP_config_dispatch()") ; + TRACE_EVENT_P1("wap_state: %s", wap_state_to_string(wap_state)) ; + switch (wap_state) + { + /* Entry point for activation. */ + case Wap_Not_Init: + cmhUDPA_Activate((T_ACI_CMD_SRC)tcpipShrdPrm.src_id, tcpipShrdPrm.wap_call_id) ; + break ; + case UDPA_Activation: /* Unused at the moment; handled elsewhere. */ + break ; + case UDPA_Activated: /* Unused at the moment; handled elsewhere. */ + break ; + case IPA_Activation: /* Unused at the moment; handled elsewhere. */ + break ; + case IPA_Activated: + switch (tcpipShrdPrm.connection_buildup) + { + case TCPIP_CONNECTION_BUILDUP_UP: + if (tcpipShrdPrm.callback_function) + { + tcpipShrdPrm.callback_function(AT_CMPL) ; + } + break ; + case TCPIP_CONNECTION_BUILDUP_DOWN: + cmhUDPA_Deactivate(tcpipShrdPrm.src_id); + break; + default: + TRACE_ERROR("Unknown build up state in psaTCPIP_config_dispatch()"); + return; + } + break; + /* Entry point for configuration. */ + case IPA_Configuration: + switch (tcpipShrdPrm.connection_buildup) + { + case TCPIP_CONNECTION_BUILDUP_UP: + psaIPA_Config(psaTCPIP_bytes2ipv4addr(tcpipShrdPrm.ipaddr), + tcpipShrdPrm.mtu, IPA_CONN) ; + break; + case TCPIP_CONNECTION_BUILDUP_DOWN: + psaIPA_Config(psaTCPIP_bytes2ipv4addr(tcpipShrdPrm.ipaddr), + tcpipShrdPrm.mtu, IPA_DSC) ; + break; + default: + TRACE_ERROR("Unknown build up state in psaTCPIP_config_dispatch()"); + return; + } + break; + case IPA_Configurated: /* Unused at the moment; handled elsewhere. */ + break ; + case UDPA_Configuration: /* Unused at the moment; handled elsewhere. */ + break ; + case UDPA_Configurated: + if (tcpipShrdPrm.callback_function) + { + tcpipShrdPrm.callback_function(AT_CMPL) ; + } + break ; + + /* Entry point for deactivation. */ + case IPA_Deconfiguration: + psaIPA_Config(0, 0, IPA_DSC) ; + break ; + case IPA_Deconfigurated: /* Unused at the moment; handled elsewhere. */ + break ; + case UDPA_Deactivation: /* Unused at the moment; handled elsewhere. */ +#if defined (FF_SAT_E) + /* If transport layer is UDP, reset wap_call flag + UDP is not busy anymore */ + if( satShrdPrm.chnTb.chnTPL EQ UDP ) + { + sAT_PercentWAP ( CMD_SRC_NONE, 0 ); + } +#endif /* SAT E */ + break ; + case UDPA_Deactivated: /* Unused at the moment; handled elsewhere. */ + break ; + case IPA_Deactivation: + wap_state = IPA_Deactivated ; + tcpipShrdPrm.connection_type = TCPIP_CONNECTION_TYPE_UNKNOWN; + + if (tcpipShrdPrm.callback_function) + { + tcpipShrdPrm.callback_function(AT_CMPL) ; + } + /*lint -fallthrough*/ + case IPA_Deactivated: + wap_state = Wap_Not_Init ; + + if(ccShrdPrm.wapStat EQ CC_WAP_STACK_DOWN) + { + /* WAP-dedicated variables shall be reinitialized */ + wapId = NO_ENTRY; + Wap_Call = FALSE; + + TRACE_EVENT ("WAP parameter reseted"); + } + break ; + + default: + TRACE_ERROR("Unknown wap state in psaTCPIP_config_dispatch()") ; + } +#else + ACI_ASSERT(FALSE); +#endif +} + + +/******************************************************************************/ +void psaTCPIP_config_dispatch(void) +{ +#ifdef FF_GPF_TCPIP // to avoid linker errors in simulation + + TRACE_FUNCTION("psaTCPIP_config_dispatch()") ; + TRACE_EVENT_P1("wap_state: %s", wap_state_to_string(wap_state)) ; + switch (wap_state) + { + case TCPIP_Initialization : + switch(tcpipShrdPrm.connection_buildup) + { + case TCPIP_CONNECTION_BUILDUP_UP: + psaTCPIP_Initialize_Req(); + break; + + case TCPIP_CONNECTION_BUILDUP_DOWN: + psaTCPIP_Shutdown_Req(); + break; + + default: + TRACE_ERROR("Error: Unknown build_up state in psaTCPIP_config_dispatch()"); + return; + } + + case TCPIP_Initialized : + break; + + case TCPIP_Activation : + switch(tcpipShrdPrm.connection_buildup) + { + case TCPIP_CONNECTION_BUILDUP_UP: + if(tcpipShrdPrm.callback_function) + { + tcpipShrdPrm.callback_function(AT_CMPL); + } + break ; + + case TCPIP_CONNECTION_BUILDUP_DOWN: + wap_state = TCPIP_Deactivation; + psaTCPIP_Shutdown_Req(); + break; + + default: + TRACE_ERROR("Error: Unknown build up state in psaTCPIP_config_dispatch()"); + return; + } + break; + + case TCPIP_Configuration: + switch(tcpipShrdPrm.connection_buildup) + { + case TCPIP_CONNECTION_BUILDUP_UP: + psaTCPIP_Config(bytes2ipv4addr(tcpipShrdPrm.ipaddr), + bytes2ipv4addr(tcpipShrdPrm.dns1), + bytes2ipv4addr(tcpipShrdPrm.dns2), + TCPIP_IFCONFIG_UP); + break; + case TCPIP_CONNECTION_BUILDUP_DOWN: + psaTCPIP_Config(0,0,0,TCPIP_IFCONFIG_DOWN); + break; + + default: + TRACE_ERROR("Error: Unknown build up state in psaTCPIP_config_dispatch()"); + return; + } + break; + + case TCPIP_Configurated: + if(tcpipShrdPrm.callback_function) + { + tcpipShrdPrm.callback_function(AT_CMPL) ; + } + break; + + case TCPIP_Deconfiguration : + psaTCPIP_Config(0,0,0,TCPIP_IFCONFIG_DOWN); + break; + + case TCPIP_Deconfigurated : + break; + + case TCPIP_Deactivation : + psaTCPIP_Shutdown_Req(); + break; + + case TCPIP_Deactivated: + tcpipShrdPrm.connection_type = TCPIP_CONNECTION_TYPE_UNKNOWN; + if(tcpipShrdPrm.callback_function) + { + tcpipShrdPrm.callback_function(AT_CMPL) ; + } + wap_state = Wap_Not_Init ; + break ; + + default: + TRACE_ERROR("Error: Unknown wap_state in psaTCPIP_config_dispatch()") ; + } +#else + ACI_ASSERT(FALSE); +#endif +} + + +/********************** Callbacks, several ***********************/ + +/* TCP/IP activation callback for circuit-switched data, to be called + * when activation is completed. + */ +void psaTCPIP_act_csd_callback(T_ACI_RETURN result) +{ + TRACE_FUNCTION("psaTCPIP_act_csd_callback()"); + + if (!psaCC_ctbIsValid (tcpipShrdPrm.wap_call_id)) + { + /* Avoid to dereference NULL */ + TRACE_ERROR ("Call table entry disappeared"); + return; + } + + /* + * activate RA connection: in case of failure clear call ! + */ + ccShrdPrm.datStat = DS_ACT_REQ; + + if(cmhRA_Activate((T_ACI_CMD_SRC)psaCC_ctb(tcpipShrdPrm.wap_call_id)->curSrc, + (T_ACI_AT_CMD)psaCC_ctb(tcpipShrdPrm.wap_call_id)->curCmd, + tcpipShrdPrm.wap_call_id) + NEQ AT_EXCT) + { + TRACE_EVENT("RA ACTIVATION FAILURE -> DISC CALL"); + ccShrdPrm.datStat = DS_IDL ; + psaCC_ctb(tcpipShrdPrm.wap_call_id)->nrmCs = MNCC_CAUSE_CALL_CLEAR ; + psaCC_ClearCall (tcpipShrdPrm.wap_call_id); + } +} + + +/* TCP/IP configuration callback for circuit-switched data, to be called + * when configuration is completed. + */ +void psaTCPIP_conf_csd_callback(T_ACI_RETURN result) +{ + TRACE_FUNCTION("psaTCPIP_conf_csd_callback()") ; + + R_AT ( RAT_CONNECT, (T_ACI_CMD_SRC)tcpipShrdPrm.src_id ) + ( AT_CMD_NONE, -1, tcpipShrdPrm.wap_call_id, FALSE ); + if(is_gpf_tcpip_call()) { + #ifdef FF_GPF_TCPIP + T_DCM_STATUS_IND_MSG msg; + msg.hdr.msg_id = DCM_NEXT_CMD_READY_MSG; + dcm_send_message(msg, DCM_SUB_WAIT_SATDN_CNF); + #endif // #ifdef FF_GPF_TCPIP + } +} + + +/* TCP/IP deactivation callback for circuit-switched data, to be called + * when deactivation is completed. + */ +void psaTCPIP_deact_csd_callback(T_ACI_RETURN result) +{ + TRACE_FUNCTION("psaTCPIP_deact_csd_callback()") ; + + /* + * deactivate L2R connection: + */ + if (cmhL2R_Deactivate() NEQ AT_EXCT) + { + TRACE_EVENT("L2R DEACTIVATION FAILURE "); + if (psaCC_ctbIsValid (tcpipShrdPrm.wap_call_id)) /* To be sure */ + psaCC_ctb(tcpipShrdPrm.wap_call_id)->nrmCs = MNCC_CAUSE_CALL_CLEAR; + psaCC_ClearCall (tcpipShrdPrm.wap_call_id); /* Changed in OMAPS00049111 */ + } + + if(is_gpf_tcpip_call()) + { +#ifdef FF_GPF_TCPIP + { + T_DCM_STATUS_IND_MSG msg; + msg.hdr.msg_id = DCM_NEXT_CMD_READY_MSG; + dcm_send_message(msg, DCM_SUB_WAIT_SATH_CNF); + } +#endif /* #ifdef FF_GPF_TCPIP */ + } +} + +#endif /*defined(FF_WAP) OR defined(FF_GPF_TCPIP) */ + +/* EOF */ +