FreeCalypso > hg > fc-selenite
diff src/g23m-gprs/llc/llc_uirxs.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/llc/llc_uirxs.c Sun Jul 15 04:40:46 2018 +0000 @@ -0,0 +1,363 @@ +/* ++----------------------------------------------------------------------------- +| Project : +| Modul : ++----------------------------------------------------------------------------- +| 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 LLC and implements all +| functions to handles the incoming process internal signals as +| described in the SDL-documentation (UIRX-statemachine) ++----------------------------------------------------------------------------- +*/ + +#ifndef LLC_UIRXS_C +#define LLC_UIRXS_C +#endif + +#define ENTITY_LLC + +/*==== INCLUDES =============================================================*/ + +#include "typedefs.h" /* to get Condat data types */ +#include "vsi.h" /* to get a lot of macros */ +#include "macdef.h" +#include "gprs.h" +#include "gsm.h" /* to get a lot of macros */ +#include "cnf_llc.h" /* to get cnf-definitions */ +#include "mon_llc.h" /* to get mon-definitions */ +#include "prim.h" /* to get the definitions of used SAP and directions */ +#include "llc.h" /* to get the global entity definitions */ + +#include "llc_uirxf.h" /* to get local UIRX functions */ + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_llme_uirx_assign_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_LLME_UIRX_ASSIGN_REQ +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +#ifndef CF_FAST_EXEC + +GLOBAL void sig_llme_uirx_assign_req (void) +{ + TRACE_ISIG( "sig_llme_uirx_assign_req" ); + + switch (GET_STATE(UIRX)) + { + case UIRX_TLLI_UNASSIGNED_NOT_READY: + SET_STATE (UIRX, UIRX_ADM_NOT_READY); + /* + * Initialise current incarnation. + */ + uirx_init_sapi(); + break; + case UIRX_TLLI_UNASSIGNED_READY: + SET_STATE (UIRX, UIRX_ADM_READY); + /* + * Initialise current incarnation. + */ + uirx_init_sapi(); + break; + default: + TRACE_ERROR( "SIG_LLME_UIRX_ASSIGN_REQ unexpected" ); + break; + } +} /* sig_llme_uirx_assign_req() */ + +#endif /* CF_FAST_EXEC */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_llme_uirx_unassign_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_LLME_UIRX_UNASSIGN_REQ +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +#ifndef CF_FAST_EXEC + +GLOBAL void sig_llme_uirx_unassign_req (void) +{ + TRACE_ISIG( "sig_llme_uirx_unassign_req" ); + + switch (GET_STATE(UIRX)) + { + case UIRX_ADM_NOT_READY: + SET_STATE (UIRX, UIRX_TLLI_UNASSIGNED_NOT_READY); + break; + case UIRX_ADM_READY: + SET_STATE (UIRX, UIRX_TLLI_UNASSIGNED_READY); + break; + default: + TRACE_ERROR( "SIG_LLME_UIRX_UNASSIGN_REQ unexpected" ); + break; + } +} /* sig_llme_uirx_unassign_req() */ + +#endif /* CF_FAST_EXEC */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_llme_uirx_reset_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_LLME_UIRX_RESET_REQ +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +#ifndef CF_FAST_EXEC + +GLOBAL void sig_llme_uirx_reset_req (void) +{ + TRACE_ISIG( "sig_llme_uirx_reset_req" ); + + switch (GET_STATE(UIRX)) + { + case UIRX_TLLI_UNASSIGNED_NOT_READY: + /* + * No break! + */ + case UIRX_TLLI_UNASSIGNED_READY: + /* + * No break! + */ + case UIRX_ADM_NOT_READY: + /* + * No break! + */ + case UIRX_ADM_READY: + /* + * Only use this procedure as long as it initalises only the requested + * variables on reset (V(UR) as of V6.4.0). + */ + uirx_init_sapi(); + break; + default: + TRACE_ERROR( "SIG_LLME_UIRX_RESET_REQ unexpected" ); + break; + } +} /* sig_llme_uirx_reset_req() */ + +#endif /* CF_FAST_EXEC */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_rx_uirx_data_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_RX_UIRX_DATA_IND +| +| Parameters : ll_unitdata_ind - a valid pointer to an LL-UNITDATA-IND +| primitive +| nu - N(U) of the received UI frame +| ++------------------------------------------------------------------------------ +*/ +/*#if defined(CF_FAST_EXEC) || defined(_SIMULATION_) || \ + !defined(REL99) || defined(LL_2to1) */ + +GLOBAL void sig_rx_uirx_data_ind (T_LL_UNITDATA_IND *ll_unitdata_ind, + T_FRAME_NUM nu) +{ + USHORT diff; + + TRACE_ISIG( "sig_rx_uirx_data_ind" ); + + /* + * SAPI has already been checked by service RX. + */ + + switch (GET_STATE(UIRX)) + { + case UIRX_ADM_NOT_READY: + /* + * Calculate relative difference of V(UR) and N(U): add 512 to V(UR), + * subtract N(U), apply modulo 512 to get back into the valid range + */ + diff = (((llc_data->sapi->vur + + (MAX_SEQUENCE_NUMBER+1)) - nu) % (MAX_SEQUENCE_NUMBER+1)); + + /* + * Original formula: + * V(UR)-32 <= N(U) < V(UR) + * Translated: + * the relative difference must be maximally 32, and minimally 1 + */ + if ((diff > 0) AND (diff <= 32)) + { + /* + * We've got an retranmitted frame. Check if we got it already. + */ + if (uirx_check_nu (nu, llc_data->sapi->vur) == TRUE) + { + /* + * N(U) already received. Discard frame without any futher action. + */ + PFREE (ll_unitdata_ind); + TRACE_0_INFO("Duplicate frame number ignored"); + return; + } + } + else + { + /* + * We've got a new, not retransmitted, frame. Set V(UR) to the new value. + */ + uirx_set_new_vur ((T_FRAME_NUM)(nu + 1)); + } + + /* + * Store the N(U) of the frame to be already received. + */ + uirx_store_nu (nu, llc_data->sapi->vur); + + /* + * We are not ready to send data. Store frame in UIRX queue, + * if possible. + */ + uirx_queue_store (ll_unitdata_ind); + break; + + case UIRX_ADM_READY: + /* + * Calculate relative difference of V(UR) and N(U): add 512 to V(UR), + * subtract N(U), apply modulo 512 to get back into the valid range + */ + diff = (((llc_data->sapi->vur + + (MAX_SEQUENCE_NUMBER+1)) - nu) % (MAX_SEQUENCE_NUMBER+1)); + + /* + * Original formula: + * V(UR)-32 <= N(U) < V(UR) + * Translated: + * the relative difference must be maximally 32, and minimally 1 + */ + if ((diff > 0) AND (diff <= 32)) + { + /* + * We've got an retranmitted frame. Check if we got it already. + */ + if (uirx_check_nu (nu, llc_data->sapi->vur) == TRUE) + { + /* + * N(U) already received. Discard frame without any futher action. + */ + PFREE (ll_unitdata_ind); + TRACE_0_INFO("Duplicated frame number ignored"); + return; + } + } + else + { + /* + * We've got a new, not retransmitted, frame. Set V(UR) to the new value. + */ + uirx_set_new_vur ((T_FRAME_NUM)(nu + 1)); + } + + /* + * Store the N(U) of the frame to be already received. + */ + uirx_store_nu (nu, llc_data->sapi->vur); + + /* + * Label S_UNITDATA + */ + + /* + * No flow control for SAPI 1. + */ + if (llc_data->current_sapi != LL_SAPI_1) + { + /* + * Transit to state ADM_NOT_READY. + */ + SET_STATE (UIRX, UIRX_ADM_NOT_READY); + } + + /* + * Send primitive LL-UNITDATA-IND to either GMM, SNDCP, or GSMS, + * depending on the SAPI. + */ + switch (ll_unitdata_ind->sapi) + { + case LL_SAPI_1: + TRACE_PRIM_TO("GMM"); + TRACE_3_OUT_PARA("s:%d len:%d c:%d", ll_unitdata_ind->sapi, + BYTELEN(ll_unitdata_ind->sdu.l_buf), + ll_unitdata_ind->cipher); + PSEND (hCommGMM, ll_unitdata_ind); + break; + + case LL_SAPI_3: + case LL_SAPI_5: + case LL_SAPI_9: + case LL_SAPI_11: + TRACE_3_OUT_PARA("s:%d len:%d c:%d", ll_unitdata_ind->sapi, + BYTELEN(ll_unitdata_ind->sdu.l_buf), + ll_unitdata_ind->cipher); + PSEND (hCommSNDCP, ll_unitdata_ind); + break; + + case LL_SAPI_7: +#ifdef LL_2to1 + TRACE_PRIM_TO("MM"); + TRACE_3_OUT_PARA("s:%d len:%d c:%d", ll_unitdata_ind->sapi, + BYTELEN(ll_unitdata_ind->sdu.l_buf), + ll_unitdata_ind->cipher); + PSEND (hCommMM, ll_unitdata_ind); +#else + TRACE_PRIM_TO("GSMS"); + TRACE_3_OUT_PARA("s:%d len:%d c:%d", ll_unitdata_ind->sapi, + BYTELEN(ll_unitdata_ind->sdu.l_buf), + ll_unitdata_ind->cipher); + PSEND (hCommGSMS, ll_unitdata_ind); +#endif + break; + + default: + PFREE (ll_unitdata_ind); + TRACE_ERROR ("invalid global SAPI value"); + break; + } + break; + + default: + PFREE (ll_unitdata_ind); + TRACE_ERROR( "SIG_RX_UIRX_DATA_IND unexpected" ); + break; + } +} /* sig_rx_uirx_data_ind() */ + +/*#endif */ /* CF_FAST_EXEC || _SIMULATION_ */ + +