FreeCalypso > hg > fc-selenite
diff src/g23m-gprs/sndcp/sndcp_nup.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-gprs/sndcp/sndcp_nup.c Sun Jul 15 04:40:46 2018 +0000 @@ -0,0 +1,498 @@ +/* ++----------------------------------------------------------------------------- +| Project : GPRS (8441) +| Modul : sndcp_nup.c ++----------------------------------------------------------------------------- +| 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 is part of the entity SNDCP and implements all +| functions to handles the incoming primitives as described in +| the SDL-documentation (NU-statemachine) ++----------------------------------------------------------------------------- +*/ + +/*---- HISTORY --------------------------------------------------------------*/ + +#define ENTITY_SNDCP + +/*==== INCLUDES =============================================================*/ + +#include "typedefs.h" /* to get Condat data types */ +#include "vsi.h" /* to get a lot of macros */ +#include "macdef.h" +#include "gsm.h" /* to get a lot of macros */ +#include "prim.h" /* to get the definitions of used SAP and directions */ + +#include "dti.h" + +#include "sndcp.h" /* to get the global entity definitions */ +#include "sndcp_f.h" /* to get the functions to access the global arrays*/ + +#include "sndcp_nuf.h" /* to get functions from nu service */ +#include "sndcp_sus.h" /* to get internal signals to su signals */ +#include "sndcp_suas.h" /* to get internal signals to sua signals */ + + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + +/* ++------------------------------------------------------------------------------ +| Function : nu_connection_state ++------------------------------------------------------------------------------ +| Description : DTI connnection has been opened by calling sndcp_sig_callback +| with reason DTI_REASON_CONNECTION_OPENED. +| +| Parameters : UBYTE nsapi: the affected NSAPI +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void nu_connection_state (UBYTE nsapi, BOOL opened) +{ + TRACE_ISIG( "nu_connection_state" ); + + /* + * set service instance according to nsapi in primitive + */ + sndcp_data->nu = & sndcp_data->nu_base[nsapi]; + + switch( GET_STATE( NU ) ) + { + + case NU_UNACK_SU_RECEPTIVE : + case NU_UNACK_SU_NOT_RECEPTIVE: +#ifndef NCONFIG + case NU_SEND_UNACK_SU_RECEPTIVE: + case NU_SEND_UNACK_SU_NOT_RECEPTIVE: +#endif /* NCONFIG */ + if (!sndcp_data->nu->connection_is_opened + && + opened) { + sndcp_data->nu->connection_is_opened = TRUE; +#ifndef SNDCP_UPM_INCLUDED + if (sndcp_data->nu->sn_switch_cnf_expected) { + PALLOC (sn_switch_cnf, SN_SWITCH_CNF); + sn_switch_cnf->nsapi = nsapi; + sndcp_data->nu->sn_switch_cnf_expected = FALSE; + PSEND(hCommMMI, sn_switch_cnf); + } +#endif /*SNDCP_UPM_INCLUDED*/ +#ifdef SNDCP_UPM_INCLUDED + { + U32 linkid = 0; + PALLOC (sn_dti_cnf, SN_DTI_CNF); + sndcp_get_nsapi_linkid(nsapi, &linkid); + sn_dti_cnf->dti_linkid = linkid; + sndcp_data->nu->sn_dti_cnf_expected = FALSE; + sn_dti_cnf->dti_conn = NAS_CONNECT_DTI; + + PSEND(hCommMMI, sn_dti_cnf); + } +#endif + nu_unitready_ind_if_nec(nsapi); + + } else if (!opened) { + sndcp_data->nu->connection_is_opened = FALSE; + sndcp_data->nu->sn_unitready_ind_pending = FALSE; + sndcp_data->nu->sn_switch_cnf_expected = FALSE; + } + break; + case NU_ACK_SUA_RECEPTIVE: + case NU_ACK_SUA_NOT_RECEPTIVE: + case NU_SUS_SUA_RECEPTIVE: + case NU_SUS_SUA_NOT_RECEPTIVE: + case NU_REC_SUA_NOT_RECEPTIVE: +#ifndef NCONFIG + case NU_SEND_ACK_SUA_RECEPTIVE: + case NU_SEND_ACK_SUA_NOT_RECEPTIVE: + case NU_SEND_SUS_SUA_RECEPTIVE: + case NU_SEND_SUS_SUA_NOT_RECEPTIVE: + case NU_SEND_REC_SUA_NOT_RECEPTIVE: +#endif /* NCONFIG */ + if (!sndcp_data->nu->connection_is_opened + && + opened) { + sndcp_data->nu->connection_is_opened = TRUE; +#ifdef SNDCP_UPM_INCLUDED + { + U32 linkid = 0; + PALLOC (sn_dti_cnf, SN_DTI_CNF); + sndcp_get_nsapi_linkid(nsapi, &linkid); + sn_dti_cnf->dti_linkid = linkid; + sndcp_data->nu->sn_dti_cnf_expected = FALSE; + sn_dti_cnf->dti_conn = NAS_CONNECT_DTI; + + PSEND(hCommMMI, sn_dti_cnf); + } + +#else + if (sndcp_data->nu->sn_switch_cnf_expected) { + PALLOC (sn_switch_cnf, SN_SWITCH_CNF); + sn_switch_cnf->nsapi = nsapi; + sndcp_data->nu->sn_switch_cnf_expected = FALSE; + PSEND(hCommMMI, sn_switch_cnf); + } +#endif + nu_ready_ind_if_nec(nsapi); + } else if (!opened) { + sndcp_data->nu->connection_is_opened = FALSE; + sndcp_data->nu->sn_ready_ind_pending = FALSE; + sndcp_data->nu->sn_switch_cnf_expected = FALSE; + } + break; + default: + TRACE_ERROR( "Function nu_connection_state unexpected" ); + break; + } +} /* nu_connection_state() */ + +/* ++------------------------------------------------------------------------------ +| Function : nu_sn_data_req ++------------------------------------------------------------------------------ +| Description : Handles the primitive SN_DATA_REQ +| +| Parameters : *sn_data_req - Ptr to primitive payload +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void nu_sn_data_req ( T_SN_DATA_REQ *sn_data_req ) +{ + BOOL used = FALSE; + BOOL sack = FALSE; + UBYTE sapi = 0; + + TRACE_FUNCTION( "nu_sn_data_req" ); + + dti_stop(sndcp_data->hDTI, + 0, +#ifndef SNDCP_UPM_INCLUDED + SNDCP_INTERFACE_ACK, +#else + SNDCP_INTERFACE_UNACK, +#endif + sn_data_req->nsapi); + + /* + * set service instance according to nsapi in primitive + */ + sndcp_data->nu = & sndcp_data->nu_base[sn_data_req->nsapi]; + /* + * User has used up his ready_ind. + */ + sndcp_data->nu->sn_ready_ind_pending = FALSE; + /* + * If context is not active, discard primitive. + */ + sndcp_is_nsapi_used(sn_data_req->nsapi, &used); + if (!used && sn_data_req != NULL) { + MFREE_PRIM(sn_data_req); + sn_data_req = NULL; + return; + } + if (sn_data_req == NULL) { + /* + * Should not be possible. Only included to avoid NULL pointer use. + */ + return; + } + +#ifdef SNDCP_TRACE_IP_DATAGRAM + if(sndcp_data->trace_ip_header || sndcp_data->trace_ip_datagram){ + TRACE_EVENT("--------- Uplink IP datagram ---------"); +#ifdef _SNDCP_DTI_2_ + sndcp_trace_ip_datagram(& sn_data_req->desc_list2); +#else /*_SNDCP_DTI_2_*/ + sndcp_trace_ip_datagram(& sn_data_req->desc_list); +#endif /*_SNDCP_DTI_2_*/ + TRACE_EVENT("--------------------------------------"); + } else { +#ifdef _SNDCP_DTI_2_ + sndcp_default_ip_trace(& sn_data_req->desc_list2, SNDCP_UL_PACKET); +#else /*_SNDCP_DTI_2_*/ + sndcp_default_ip_trace& sn_data_req->desc_list, SNDCP_UL_PACKET); +#endif /*_SNDCP_DTI_2_*/ + } + if(sndcp_data->trace_ip_bin){ +#ifdef _SNDCP_DTI_2_ + sndcp_bin_trace_ip(& sn_data_req->desc_list2, SNDCP_UL_PACKET); +#else /*_SNDCP_DTI_2_*/ + sndcp_bin_trace_ip(& sn_data_req->desc_list, SNDCP_UL_PACKET); +#endif /*_SNDCP_DTI_2_*/ + } + +#else /* SNDCP_TRACE_IP_DATAGRAM */ + +#ifdef SNDCP_TRACE_BUFFER +#ifdef _SNDCP_DTI_2_ + TRACE_EVENT_P1("uplink at SN SAP: %d octets", + sn_data_req->desc_list2.list_len); + sndcp_trace_desc_list(& sn_data_req->desc_list2); +#else /*_SNDCP_DTI_2_*/ + TRACE_EVENT_P1("uplink at SN SAP: %d octets", + sn_data_req->desc_list.list_len); + sndcp_trace_desc_list(& sn_data_req->desc_list); +#endif /*_SNDCP_DTI_2_*/ +#endif /* SNDCP_TRACE_BUFFER */ +#endif /* SNDCP_TRACE_IP_DATAGRAM */ + + + switch( GET_STATE( NU ) ) + { + case NU_ACK_SUA_RECEPTIVE: + /* + * Buffer the given N-PDU + */ + nu_buffer_npdu(sndcp_data->nu->send_npdu_number_ack, sn_data_req); + /* + * It is not checked here if the nsapi is active anyway! + */ + sndcp_get_nsapi_sapi(sndcp_data->nu->nsapi, &sapi); + SET_STATE(NU, NU_ACK_SUA_NOT_RECEPTIVE); + sndcp_data->nu->send_npdu_number_ack = + (U8)((sndcp_data->nu->send_npdu_number_ack + 1) % MAX_NPDU_NUMBER_ACK); + sndcp_get_sapi_ack(sapi, &sack); + if(sack){ + sig_nu_sua_data_req(sn_data_req, + (U8)((sndcp_data->nu->send_npdu_number_ack - 1 + + MAX_NPDU_NUMBER_ACK)% MAX_NPDU_NUMBER_ACK), + sn_data_req->nsapi, + sapi); + } + + + break; + case NU_UNACK_SU_NOT_RECEPTIVE: + case NU_UNACK_SU_RECEPTIVE: + nu_unitready_ind_if_nec(sn_data_req->nsapi); +#ifdef _SNDCP_DTI_2_ + MFREE_PRIM(sn_data_req); +#else /*_SNDCP_DTI_2_*/ + PFREE_DESC(sn_data_req); +#endif /*_SNDCP_DTI_2_*/ + sn_data_req = NULL; + break; + case NU_REC_SUA_NOT_RECEPTIVE: + case NU_SUS_SUA_NOT_RECEPTIVE: + case NU_SUS_SUA_RECEPTIVE: + case NU_ACK_SUA_NOT_RECEPTIVE: + + nu_buffer_npdu(sndcp_data->nu->send_npdu_number_ack, + sn_data_req); + sndcp_data->nu->send_npdu_number_ack = + (U8)((sndcp_data->nu->send_npdu_number_ack + 1) % MAX_NPDU_NUMBER_ACK); + break; +#ifndef NCONFIG + case NU_SEND_UNACK_SU_RECEPTIVE: + case NU_SEND_UNACK_SU_NOT_RECEPTIVE: + case NU_SEND_ACK_SUA_RECEPTIVE: + case NU_SEND_ACK_SUA_NOT_RECEPTIVE: + case NU_SEND_SUS_SUA_RECEPTIVE: + case NU_SEND_SUS_SUA_NOT_RECEPTIVE: + case NU_SEND_REC_SUA_NOT_RECEPTIVE: +#ifndef SNDCP_UPM_INCLUDED + dti_start(sndcp_data->hDTI, 0, SNDCP_INTERFACE_ACK, sn_data_req->nsapi); +#ifdef _SNDCP_DTI_2_ + MFREE_PRIM(sn_data_req); +#else /*_SNDCP_DTI_2_*/ + PFREE_DESC(sn_data_req); +#endif /*_SNDCP_DTI_2_*/ +#else /*#ifndef SNDCP_UPM_INCLUDED*/ + dti_start(sndcp_data->hDTI, 0, SNDCP_INTERFACE_UNACK, sn_data_req->nsapi); + MFREE_PRIM(sn_data_req); +#endif /*#ifndef SNDCP_UPM_INCLUDED*/ + + sn_data_req = NULL; + break; +#endif + default: + TRACE_ERROR( "SN_DATA_REQ unexpected" ); +#ifdef _SNDCP_DTI_2_ + MFREE_PRIM(sn_data_req); +#else /*_SNDCP_DTI_2_*/ + PFREE_DESC(sn_data_req); +#endif /*_SNDCP_DTI_2_*/ + sn_data_req = NULL; + break; + } + +} /* nu_sn_data_req() */ + +/* ++------------------------------------------------------------------------------ +| Function : nu_sn_unitdata_req ++------------------------------------------------------------------------------ +| Description : Handles the primitive SN_UNITDATA_REQ +| +| Parameters : *sn_unitdata_req - Ptr to primitive payload +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void nu_sn_unitdata_req ( T_SN_UNITDATA_REQ *sn_unitdata_req ) +{ + UBYTE sapi = 0; + BOOL used = FALSE; + UBYTE nsapi = sn_unitdata_req->nsapi; + + +#ifdef FLOW_TRACE + sndcp_trace_flow_control(FLOW_TRACE_SNDCP, FLOW_TRACE_UP, FLOW_TRACE_TOP, FALSE); +#endif + + TRACE_FUNCTION( "nu_sn_unitdata_req" ); + + dti_stop(sndcp_data->hDTI, + 0, + SNDCP_INTERFACE_UNACK, + sn_unitdata_req->nsapi); + + /* + * set service instance according to nsapi in primitive + */ + sndcp_data->nu = & sndcp_data->nu_base[sn_unitdata_req->nsapi]; + /* + * User has used up his ready_ind. + */ + sndcp_data->nu->sn_unitready_ind_pending = FALSE; + /* + * If context is not active, discard primitive. + */ + sndcp_is_nsapi_used(sn_unitdata_req->nsapi, &used); + if (!used) { +#ifdef _SNDCP_DTI_2_ + MFREE_PRIM (sn_unitdata_req); +#else /*_SNDCP_DTI_2_*/ + PFREE_DESC (sn_unitdata_req); +#endif /*_SNDCP_DTI_2_*/ + sn_unitdata_req = NULL; + return; + } + +#ifdef SNDCP_TRACE_IP_DATAGRAM + if(sndcp_data->trace_ip_header || sndcp_data->trace_ip_datagram){ + TRACE_EVENT("--------- Uplink IP datagram ---------"); +#ifdef _SNDCP_DTI_2_ + sndcp_trace_ip_datagram(& sn_unitdata_req->desc_list2); +#else /*_SNDCP_DTI_2_*/ + sndcp_trace_ip_datagram(& sn_unitdata_req->desc_list); +#endif /*_SNDCP_DTI_2_*/ + TRACE_EVENT("--------------------------------------"); + } else { +#ifdef _SNDCP_DTI_2_ + sndcp_default_ip_trace(& sn_unitdata_req->desc_list2, SNDCP_UL_PACKET); +#else /*_SNDCP_DTI_2_*/ + sndcp_default_ip_trace(& sn_unitdata_req->desc_list, SNDCP_UL_PACKET); +#endif /*_SNDCP_DTI_2_*/ + } + if(sndcp_data->trace_ip_bin){ +#ifdef _SNDCP_DTI_2_ + sndcp_bin_trace_ip(& sn_unitdata_req->desc_list2, SNDCP_UL_PACKET); +#else /*_SNDCP_DTI_2_*/ + sndcp_bin_trace_ip(& sn_unitdata_req->desc_list, SNDCP_UL_PACKET); +#endif /*_SNDCP_DTI_2_*/ + } +#else /* SNDCP_TRACE_IP_DATAGRAM */ + +#ifdef SNDCP_TRACE_BUFFER +#ifdef _SNDCP_DTI_2_ + TRACE_EVENT_P1("uplink at SN SAP: %d octets", + sn_unitdata_req->desc_list2.list_len); + sndcp_trace_desc_list(& sn_unitdata_req->desc_list2); +#else /*_SNDCP_DTI_2_*/ + TRACE_EVENT_P1("uplink at SN SAP: %d octets", + sn_unitdata_req->desc_list.list_len); + sndcp_trace_desc_list(& sn_unitdata_req->desc_list); +#endif /*_SNDCP_DTI_2_*/ +#endif /* SNDCP_TRACE_BUFFER */ +#endif /* SNDCP_TRACE_IP_DATAGRAM */ + + switch( GET_STATE( NU ) ) + { + case NU_ACK_SUA_NOT_RECEPTIVE: + case NU_ACK_SUA_RECEPTIVE: + if (sn_unitdata_req != NULL) { +#ifdef _SNDCP_DTI_2_ + MFREE_PRIM (sn_unitdata_req); +#else /*_SNDCP_DTI_2_*/ + PFREE_DESC(sn_unitdata_req); +#endif /*_SNDCP_DTI_2_*/ + sn_unitdata_req = NULL; + } + nu_ready_ind_if_nec(nsapi); + break; + case NU_UNACK_SU_NOT_RECEPTIVE: + if (sn_unitdata_req != NULL) { +#ifdef _SNDCP_DTI_2_ + MFREE_PRIM (sn_unitdata_req); +#else /*_SNDCP_DTI_2_*/ + PFREE_DESC(sn_unitdata_req); +#endif /*_SNDCP_DTI_2_*/ + sn_unitdata_req = NULL; + } + break; + case NU_UNACK_SU_RECEPTIVE: + /* + * It is not checked here if the nsapi is active anyway! + */ + sndcp_get_nsapi_sapi(sndcp_data->nu->nsapi, &sapi); + SET_STATE(NU, NU_UNACK_SU_NOT_RECEPTIVE); + sndcp_data->nu->send_npdu_number_unack = + (sndcp_data->nu->send_npdu_number_unack + 1) % MAX_NPDU_NUMBER_UNACK; + sig_nu_su_unitdata_req(sn_unitdata_req, + (U16)((sndcp_data->nu->send_npdu_number_unack - 1 + + MAX_NPDU_NUMBER_UNACK) % MAX_NPDU_NUMBER_UNACK), + sndcp_data->nu->nsapi, + sapi); + + + break; +#ifndef NCONFIG + case NU_SEND_UNACK_SU_RECEPTIVE: + case NU_SEND_UNACK_SU_NOT_RECEPTIVE: + case NU_SEND_ACK_SUA_RECEPTIVE: + case NU_SEND_ACK_SUA_NOT_RECEPTIVE: + case NU_SEND_SUS_SUA_RECEPTIVE: + case NU_SEND_SUS_SUA_NOT_RECEPTIVE: + case NU_SEND_REC_SUA_NOT_RECEPTIVE: + dti_start(sndcp_data->hDTI, 0, SNDCP_INTERFACE_UNACK, sn_unitdata_req->nsapi); + if (sn_unitdata_req != NULL) { +#ifdef _SNDCP_DTI_2_ + MFREE_PRIM (sn_unitdata_req); +#else /*_SNDCP_DTI_2_*/ + PFREE_DESC(sn_unitdata_req); +#endif /*_SNDCP_DTI_2_*/ + sn_unitdata_req = NULL; + } + + break; +#endif + default: + TRACE_ERROR( "SN_UNITDATA_REQ unexpected" ); +#ifdef _SNDCP_DTI_2_ + MFREE_PRIM (sn_unitdata_req); +#else /*_SNDCP_DTI_2_*/ + PFREE_DESC(sn_unitdata_req); +#endif /*_SNDCP_DTI_2_*/ + + sn_unitdata_req = NULL; + break; + } + +} /* nu_sn_unitdata_req() */ + +