FreeCalypso > hg > fc-tourmaline
diff src/g23m-gprs/sndcp/sndcp_sup.c @ 1:fa8dc04885d8
src/g23m-*: import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:25:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/sndcp/sndcp_sup.c Fri Oct 16 06:25:50 2020 +0000 @@ -0,0 +1,290 @@ +/* ++----------------------------------------------------------------------------- +| Project : GPRS (8441) +| Modul : sndcp_sup.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 (SU-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 "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_suf.h" /* to get internal functions of service su */ +#include "sndcp_nus.h" /* to get signal functions to service nu */ + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + + + +#ifdef _SNDCP_DTI_2_ +/* ++------------------------------------------------------------------------------ +| Function : su_ll_unitready_ind ++------------------------------------------------------------------------------ +| Description : Handles the primitive LL_UNITREADY_IND +| +| Parameters : *ll_unitready_ind - Ptr to primitive payload +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void su_ll_unitready_ind ( T_LL_UNITREADY_IND *ll_unitready_ind ) +{ + U8 sapi_index = 0; + + + TRACE_FUNCTION( "su_ll_unitready_ind" ); +#ifdef FLOW_TRACE + sndcp_trace_flow_control(FLOW_TRACE_SNDCP, + FLOW_TRACE_UP, + FLOW_TRACE_BOTTOM, + TRUE); +#endif + /* + * set service instance according to sapi in primitive + */ + sndcp_get_sapi_index(ll_unitready_ind->sapi, &sapi_index); + sndcp_data->su = & sndcp_data->su_base[sapi_index]; + + switch( GET_STATE( SU ) ) + { + case SU_LLC_NOT_RECEPTIVE_SUSPEND: + /* + * Is queue with outgoing LL_UNITDESC_REQs empty? + */ + if (sndcp_data->su->ll_unitdesc_q_read == + sndcp_data->su->ll_unitdesc_q_write) { + if (sndcp_data->su->cia_state == CIA_IDLE) { + su_next_sn_unitdata_req(ll_unitready_ind->sapi); + } + } + SET_STATE(SU, SU_LLC_RECEPTIVE_SUSPEND); + break; + case SU_LLC_RECEPTIVE_SUSPEND: + break; + case SU_LLC_NOT_RECEPTIVE: + /* + * Is queue with outgoing LL_UNITDESC_REQs empty? + */ + if (sndcp_data->su->ll_unitdesc_q_read == + sndcp_data->su->ll_unitdesc_q_write) { + + SET_STATE(SU, SU_LLC_RECEPTIVE); + if (sndcp_data->su->cia_state == CIA_IDLE) { + su_next_sn_unitdata_req(ll_unitready_ind->sapi); + } + + } else { /* sndcp_data->su.ll_unitdesc_q is not empty */ + /* + * Send next ll_unitdesc_req from queue. + */ + U8 ll_unitdesc_seg_pos; + U8 ll_unitdesc_nsapi; + U8 ll_unitdesc_sapi; + + T_LL_UNITDESC_REQ* ll_unitdesc_req = + sndcp_data->su->ll_unitdesc_q[sndcp_data->su->ll_unitdesc_q_read]; + + sndcp_data->su->ll_unitdesc_q[sndcp_data->su->ll_unitdesc_q_read] = + NULL; + + sndcp_data->su->ll_unitdesc_q_read = + (sndcp_data->su->ll_unitdesc_q_read + 1) % + SNDCP_SEGMENT_NUMBERS_UNACK; + +#ifdef SNDCP_TRACE_ALL + TRACE_EVENT("uplink with sn header at LL SAP: "); + TRACE_EVENT_P1("%d octets", + ll_unitdesc_req->desc_list3.list_len); + + sndcp_trace_desc_list3_content(ll_unitdesc_req->desc_list3); + +#endif +#ifdef FLOW_TRACE + sndcp_trace_flow_control(FLOW_TRACE_SNDCP, + FLOW_TRACE_UP, + FLOW_TRACE_BOTTOM, + FALSE); +#endif + ll_unitdesc_seg_pos = ll_unitdesc_req->seg_pos; + ll_unitdesc_nsapi = su_get_nsapi(ll_unitdesc_req); + ll_unitdesc_sapi = ll_unitdesc_req->sapi; + + +#ifdef _SIMULATION_ + su_send_ll_unitdata_req_test(ll_unitdesc_req); +#else /* _SIMULATION_ */ + PSEND(hCommLLC, ll_unitdesc_req); +#endif /* _SIMULATION_ */ + + if ((ll_unitdesc_seg_pos & SEG_POS_LAST) > 0) { + sig_su_nu_ready_ind( ll_unitdesc_nsapi ); + su_next_sn_unitdata_req( ll_unitdesc_sapi ); + sndcp_data->su->cia_state = CIA_IDLE; + } + + } /* sndcp_data->su.ll_unitdesc_q is not empty */ + break; + case SU_LLC_RECEPTIVE: + break; + default: + TRACE_ERROR( "LL_UNITREADY_IND unexpected" ); + break; + } + if (ll_unitready_ind != NULL) { + PFREE(ll_unitready_ind); + } + +} /* su_ll_unitready_ind() */ +#else /* _SNDCP_DTI_2_ */ +/* ++------------------------------------------------------------------------------ +| Function : su_ll_unitready_ind ++------------------------------------------------------------------------------ +| Description : Handles the primitive LL_UNITREADY_IND +| +| Parameters : *ll_unitready_ind - Ptr to primitive payload +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void su_ll_unitready_ind ( T_LL_UNITREADY_IND *ll_unitready_ind ) +{ + UBYTE sapi_index = 0; + + + TRACE_FUNCTION( "su_ll_unitready_ind" ); +#ifdef FLOW_TRACE + sndcp_trace_flow_control(FLOW_TRACE_SNDCP, + FLOW_TRACE_UP, + FLOW_TRACE_BOTTOM, + TRUE); +#endif + /* + * set service instance according to sapi in primitive + */ + sndcp_get_sapi_index(ll_unitready_ind->sapi, &sapi_index); + sndcp_data->su = & sndcp_data->su_base[sapi_index]; + + switch( GET_STATE( SU ) ) + { + case SU_LLC_NOT_RECEPTIVE_SUSPEND: + /* + * Is queue with outgoing LL_UNITDATA_REQs empty? + */ + if (sndcp_data->su->ll_unitdata_q_read == + sndcp_data->su->ll_unitdata_q_write) { + if (sndcp_data->su->cia_state == CIA_IDLE) { + su_next_sn_unitdata_req(ll_unitready_ind->sapi); + } + } + SET_STATE(SU, SU_LLC_RECEPTIVE_SUSPEND); + break; + case SU_LLC_RECEPTIVE_SUSPEND: + break; + case SU_LLC_NOT_RECEPTIVE: + /* + * Is queue with outgoing LL_UNITDATA_REQs empty? + */ + if (sndcp_data->su->ll_unitdata_q_read == + sndcp_data->su->ll_unitdata_q_write) { + + SET_STATE(SU, SU_LLC_RECEPTIVE); + if (sndcp_data->su->cia_state == CIA_IDLE) { + su_next_sn_unitdata_req(ll_unitready_ind->sapi); + } + + } else { /* sndcp_data->su.ll_unitdata_q is not empty */ + /* + * Send next ll_unitdata_req from queue. + */ + UBYTE ll_unitdata_seg_pos; + UBYTE ll_unitdata_nsapi; + UBYTE ll_unitdata_sapi; + + T_LL_UNITDATA_REQ* ll_unitdata_req = + sndcp_data->su->ll_unitdata_q[sndcp_data->su->ll_unitdata_q_read]; + + sndcp_data->su->ll_unitdata_q[sndcp_data->su->ll_unitdata_q_read] = + NULL; + + sndcp_data->su->ll_unitdata_q_read = + (sndcp_data->su->ll_unitdata_q_read + 1) % + SNDCP_SEGMENT_NUMBERS_UNACK; + +#ifdef SNDCP_TRACE_ALL + TRACE_EVENT("uplink with sn header at LL SAP: "); + TRACE_EVENT_P1("%d octets", + (ll_unitdata_req->sdu.l_buf + 7) / 8); + + + sndcp_trace_sdu(& ll_unitdata_req->sdu); +#endif +#ifdef FLOW_TRACE + sndcp_trace_flow_control(FLOW_TRACE_SNDCP, + FLOW_TRACE_UP, + FLOW_TRACE_BOTTOM, + FALSE); +#endif + ll_unitdata_seg_pos = ll_unitdata_req->seg_pos; + ll_unitdata_nsapi = su_get_nsapi(ll_unitdata_req); + ll_unitdata_sapi = ll_unitdata_req->sapi; + + PSEND (hCommLLC, ll_unitdata_req); + + if ((ll_unitdata_seg_pos & SEG_POS_LAST) > 0) { + sig_su_nu_ready_ind( ll_unitdata_nsapi ); + su_next_sn_unitdata_req( ll_unitdata_sapi ); + sndcp_data->su->cia_state = CIA_IDLE; + } + + } /* sndcp_data->su.ll_unitdata_q is not empty */ + break; + case SU_LLC_RECEPTIVE: + break; + default: + TRACE_ERROR( "LL_UNITREADY_IND unexpected" ); + break; + } + if (ll_unitready_ind != NULL) { + PFREE(ll_unitready_ind); + } + +} /* su_ll_unitready_ind() */ +#endif /* _SNDCP_DTI_2_ */ + + +