FreeCalypso > hg > fc-selenite
diff src/g23m-gprs/sndcp/sndcp_sds.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_sds.c Sun Jul 15 04:40:46 2018 +0000 @@ -0,0 +1,476 @@ +/* ++----------------------------------------------------------------------------- +| Project : GPRS (8441) +| Modul : sndcp_sds.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 process internal signals as +| described in the SDL-documentation (SD-statemachine) ++----------------------------------------------------------------------------- +*/ + + +#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_sdf.h" /* to get the internal functions of this service */ +#include "sndcp_nds.h" /* to get signals to nd service */ + + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_cia_sd_cia_decomp_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CIA_SD_CIA_DECOMP_CNF +| +| Parameters : cia_decomp_ind, p_id +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_cia_sd_cia_decomp_ind (T_CIA_DECOMP_IND* cia_decomp_ind, UBYTE p_id) +{ + UBYTE sapi_index = 0; + UBYTE sapi = 0; + UBYTE nsapi = cia_decomp_ind->pdu_ref.ref_nsapi; + BOOL rec = FALSE; + T_SN_UNITDATA_IND* sn_unitdata_ind = NULL; + + TRACE_ISIG( "sig_cia_sd_cia_decomp_ind" ); + + /* + * set service instance according to sapi in primitive + */ + sndcp_get_nsapi_sapi(cia_decomp_ind->pdu_ref.ref_nsapi, &sapi); + sndcp_get_sapi_index(sapi, &sapi_index); + sndcp_data->sd = & sndcp_data->sd_base[sapi_index]; + + switch( sndcp_get_nsapi_rec_state(nsapi) ) + { + case SD_UNACK_DISCARD: + case SD_UNACK_RECEIVE_FIRST_SEGMENT: + case SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT: + { + MALLOC(sn_unitdata_ind, sizeof(T_SN_UNITDATA_IND)); + +#ifdef _SNDCP_DTI_2_ + sn_unitdata_ind->desc_list2.first = cia_decomp_ind->desc_list2.first; + sn_unitdata_ind->desc_list2.list_len = + cia_decomp_ind->desc_list2.list_len; +#endif /*_SNDCP_DTI_2_*/ + +#ifdef SNDCP_TRACE_ALL + sndcp_data->cia.cia_decomp_ind_number[nsapi] --; + TRACE_EVENT_P1("number of cia_decomp_ind: % d", + sndcp_data->cia.cia_decomp_ind_number[nsapi]); +#endif /* SNDCP_TRACE_ALL */ + + + sn_unitdata_ind->nsapi = nsapi; + + sn_unitdata_ind->p_id = p_id; + sd_is_nsapi_rec(nsapi, &rec); + if (rec) { + sig_sd_nd_unitdata_ind(nsapi, sn_unitdata_ind); + sd_set_nsapi_rec(nsapi, FALSE); + sd_get_unitdata_if_nec(sapi); + } else { + if (sndcp_data->sd->cur_sn_unitdata_ind[nsapi] NEQ NULL) + { +#ifndef NTRACE +#ifdef SNDCP_TRACE_ALL + TRACE_EVENT_P1("Discard cur_sn.. in %s", sndcp_data->sd->state_name); +#endif /* SNDCP_TRACE_ALL */ +#endif /* NTRACE */ + sd_delete_cur_sn_unitdata_ind(nsapi); + } + sndcp_data->sd->cur_sn_unitdata_ind[nsapi] = sn_unitdata_ind; + sndcp_set_nsapi_rec_state(nsapi, SD_UNACK_WAIT_NSAPI); + } + } + MFREE(cia_decomp_ind); + break; + default: + TRACE_ERROR( "SIG_CIA_SD_CIA_DECOMP_IND unexpected" ); + MFREE_PRIM(cia_decomp_ind); + break; + } +} /* sig_cia_sd_cia_decomp_ind() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_mg_sd_delete_npdus ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_MG_SD_DELETE_NPDUS +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_mg_sd_delete_npdus (UBYTE nsapi, + UBYTE sapi) +{ + UBYTE sapi_index = 0; + + TRACE_ISIG( "sig_mg_sd_delete_npdus" ); + + /* + * set service instance according to sapi in primitive + */ + sndcp_get_sapi_index(sapi, &sapi_index); + sndcp_data->sd = & sndcp_data->sd_base[sapi_index]; + + switch( sndcp_get_nsapi_rec_state(nsapi) ) + { + case SD_UNACK_DISCARD: + break; + case SD_UNACK_RECEIVE_FIRST_SEGMENT: + case SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT: + if (sndcp_data->sd->cur_sn_unitdata_ind[nsapi] != NULL) { + sd_delete_cur_sn_unitdata_ind(nsapi); + sndcp_set_nsapi_rec_state(nsapi, SD_UNACK_RECEIVE_FIRST_SEGMENT); + } else { + sndcp_set_nsapi_rec_state(nsapi, SD_UNACK_RECEIVE_FIRST_SEGMENT); + } + break; + case SD_UNACK_WAIT_NSAPI: + if (sndcp_data->sd->cur_sn_unitdata_ind[nsapi] != NULL) { + sd_delete_cur_sn_unitdata_ind(nsapi); + sd_get_unitdata_if_nec(sapi); + sndcp_set_nsapi_rec_state(nsapi, SD_UNACK_RECEIVE_FIRST_SEGMENT); + } + break; + default: + TRACE_ERROR( "SIG_MG_SD_DELETE_NPDUS unexpected" ); + break; + } +} /* sig_mg_sd_delete_npdus() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_mg_sd_getunitdata ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_MG_SD_GETUNITDATA +| +| Parameters : sapi +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_mg_sd_getunitdata (UBYTE sapi, UBYTE nsapi) +{ + UBYTE sapi_index = 0; + + TRACE_ISIG( "sig_mg_sd_getunitdata" ); + + /* + * set service instance according to sapi in primitive + */ + sndcp_get_sapi_index(sapi, &sapi_index); + sndcp_data->sd = & sndcp_data->sd_base[sapi_index]; + + switch( GET_STATE(SD) ) + { + case SD_DEFAULT: + sd_get_unitdata_if_nec(sapi); + sndcp_set_nsapi_rec_state(nsapi, SD_UNACK_RECEIVE_FIRST_SEGMENT); + break; + default: + TRACE_ERROR( "SIG_MG_SD_GETUNITDATA unexpected" ); + break; + } +} /* sig_mg_sd_getunitdata() */ + + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_nd_sd_getunitdata_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ND_SD_GETUNITDATA_REQ +| +| Parameters : affected sapi, affected nsapi +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_nd_sd_getunitdata_req (UBYTE sapi, + UBYTE nsapi) +{ + UBYTE sapi_index = 0; + + TRACE_ISIG( "sig_nd_sd_getunitdata_req" ); + + /* + * set service instance according to sapi in primitive + */ + sndcp_get_sapi_index(sapi, &sapi_index); + sndcp_data->sd = & sndcp_data->sd_base[sapi_index]; + + switch( sndcp_get_nsapi_rec_state(nsapi) ) + { + case SD_UNACK_DISCARD: + case SD_UNACK_RECEIVE_FIRST_SEGMENT: + case SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT: + sd_set_nsapi_rec(nsapi, TRUE); + break; + case SD_UNACK_WAIT_NSAPI: + if (sndcp_data->sd->cur_sn_unitdata_ind[nsapi] NEQ NULL) { + /* + * Send the just reassembled N-PDU (must be present because of state!). + */ + sig_sd_nd_unitdata_ind(nsapi, sndcp_data->sd->cur_sn_unitdata_ind[nsapi]); + sndcp_data->sd->cur_sn_unitdata_ind[nsapi] = NULL; + sd_get_unitdata_if_nec(sapi); + sndcp_set_nsapi_rec_state(nsapi, SD_UNACK_RECEIVE_FIRST_SEGMENT); + } else { + /* + * Set the receptive for the given nsapi. + */ + sd_set_nsapi_rec(nsapi, TRUE); + } + break; + default: + TRACE_ERROR( "SIG_ND_SD_GETUNITDATA_REQ unexpected" ); + break; + } +} /* sig_nd_sd_getunitdata_req() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_mg_sd_reset_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_MG_SD_RESET_IND +| +| Parameters : affected nsapi +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_mg_sd_reset_ind (UBYTE nsapi) +{ + TRACE_ISIG( "sig_mg_sd_reset_ind" ); + + switch( sndcp_get_nsapi_rec_state(nsapi) ) + { + case SD_UNACK_DISCARD: + case SD_UNACK_RECEIVE_FIRST_SEGMENT: + case SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT: + case SD_UNACK_WAIT_NSAPI: + sndcp_data->cur_dcomp[nsapi] = 0; + sndcp_data->cur_pcomp[nsapi] = 0; + break; + default: + TRACE_ERROR( "SIG_MG_SD_RESET_IND unexpected" ); + break; + } +} /* sig_mg_sd_reset_ind() */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_pd_sd_unitdata_ind ++------------------------------------------------------------------------------ +| Description : Handles the signal PD_SD_UNITDATA_IND +| +| Parameters : *ll_unitdata_ind - Ptr to primitive payload +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_pd_sd_unitdata_ind ( T_LL_UNITDATA_IND *ll_unitdata_ind ) +{ + UBYTE sapi_index = 0; + BOOL valid = FALSE; + UBYTE nsapi = 0; + + TRACE_ISIG( "sig_pd_sd_unitdata_ind" ); + + /* + * set service instance according to sapi in primitive + */ + sndcp_get_sapi_index(ll_unitdata_ind->sapi, &sapi_index); + sndcp_data->sd = & sndcp_data->sd_base[sapi_index]; + + sd_get_nsapi(ll_unitdata_ind, &nsapi); + sndcp_data->big_head[nsapi] = FALSE; + + /* + * LLC has now "used up" it's pending LL_GETUNITDATA_REQ and will have + * to wait for the next one. + */ + sndcp_data->sd->llc_may_send = FALSE; + + switch( sndcp_get_nsapi_rec_state(nsapi) ) + { + case SD_UNACK_DISCARD: + /* + * Invalid segments are discarded without error notification + */ + sd_is_seg_valid(ll_unitdata_ind, &valid); + if (!valid) { + if (ll_unitdata_ind != NULL) { + UBYTE sapi = ll_unitdata_ind->sapi; + PFREE(ll_unitdata_ind); + sd_get_unitdata_if_nec(sapi); + } + return; + } + if (sd_f_bit(ll_unitdata_ind)) { + if (sd_m_bit(ll_unitdata_ind)) { + sd_un_d_f1_m1(ll_unitdata_ind); + } else { + sd_un_d_f1_m0(ll_unitdata_ind); + } + } else { + if (sd_m_bit(ll_unitdata_ind)) { + sd_un_d_f0_m1(ll_unitdata_ind); + } else { + sd_un_d_f0_m0(ll_unitdata_ind); + } + } + break; + case SD_UNACK_RECEIVE_FIRST_SEGMENT: + /* + * Invalid segments are discarded without error notification + */ + sd_is_seg_valid(ll_unitdata_ind, &valid); + if (!valid) { + if (ll_unitdata_ind != NULL) { + UBYTE sapi = ll_unitdata_ind->sapi; + PFREE (ll_unitdata_ind); + sd_get_unitdata_if_nec(sapi); + } + return; + } + if (sd_f_bit(ll_unitdata_ind)) { + if (sd_m_bit(ll_unitdata_ind)) { + sd_un_f_f1_m1(ll_unitdata_ind); + } else { + sd_un_f_f1_m0(ll_unitdata_ind); + } + } else { + if (sd_m_bit(ll_unitdata_ind)) { + sd_un_f_f0_m1(ll_unitdata_ind); + } else { + sd_un_f_f0_m0(ll_unitdata_ind); + } + } + + break; + case SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT: + /* + * Invalid segments are discarded without error notification + */ + sd_is_seg_valid(ll_unitdata_ind, &valid); + if (!valid) { + if (ll_unitdata_ind != NULL) { + UBYTE sapi = ll_unitdata_ind->sapi; + PFREE(ll_unitdata_ind); + sd_get_unitdata_if_nec(sapi); + } + return; + } + if (sd_f_bit(ll_unitdata_ind)) { + if (sd_m_bit(ll_unitdata_ind)) { + sd_un_s_f1_m1(ll_unitdata_ind); + } else { + sd_un_s_f1_m0(ll_unitdata_ind); + } + } else { + if (sd_m_bit(ll_unitdata_ind)) { + sd_un_s_f0_m1(ll_unitdata_ind); + } else { + sd_un_s_f0_m0(ll_unitdata_ind); + } + } + + break; + + case SD_UNACK_WAIT_NSAPI: + /* + * This NSAPI is waiting for the DL flow control prim + * from upper layer. The data for other NSAPI's could get passed, + * but since this packet is for the blocked NSAPI, the prim is discarded + * and next packet is not requested. + */ + if (ll_unitdata_ind != NULL) { + PFREE (ll_unitdata_ind); + } + break; + + default: + TRACE_ERROR( "SIG_PD_SD_UNITDATA_IND unexpected" ); + if (ll_unitdata_ind != NULL) { + UBYTE sapi = ll_unitdata_ind->sapi; + PFREE (ll_unitdata_ind); + sd_get_unitdata_if_nec(sapi); + } + break; + } + +} /* sig_pd_sd_unitdata_ind() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_cia_sd_getunitdata ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CIA_SD_GETUNITDATA +| +| Parameters : sapi +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_cia_sd_getunitdata (UBYTE sapi, UBYTE nsapi) +{ + UBYTE sapi_index = 0; + + TRACE_ISIG( "sig_cia_sd_getunitdata" ); + + /* + * set service instance according to sapi in primitive + */ + sndcp_get_sapi_index(sapi, &sapi_index); + sndcp_data->sd = & sndcp_data->sd_base[sapi_index]; + + switch( sndcp_get_nsapi_rec_state(nsapi) ) + { + case SD_UNACK_DISCARD: + case SD_UNACK_RECEIVE_FIRST_SEGMENT: + case SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT: + case SD_UNACK_WAIT_NSAPI: + sd_get_unitdata_if_nec(sapi); + break; + default: + TRACE_ERROR( "SIG_CIA_SD_GETUNITDATA unexpected" ); + break; + } +} /* sig_cia_sd_getunitdata() */ +