FreeCalypso > hg > fc-magnetite
diff src/g23m-gprs/llc/llc_irxs.c @ 183:219afcfc6250
src/g23m-gprs: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Oct 2016 04:24:13 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/llc/llc_irxs.c Thu Oct 13 04:24:13 2016 +0000 @@ -0,0 +1,440 @@ +/* ++----------------------------------------------------------------------------- +| 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 (IRX-statemachine) ++----------------------------------------------------------------------------- +*/ + +#ifndef LLC_IRXS_C +#define LLC_IRXS_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_irxf.h" /* to get IRX helper functions */ +#include "llc_irxl.h" /* to get IRX label functions */ +#include "llc_itxs.h" /* to get IRX/ITX signals */ +#include "llc_us.h" /* to get U signals */ + + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_llme_irx_assign_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_LLME_IRX_ASSIGN_REQ +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_llme_irx_assign_req (void) +{ + TRACE_ISIG( "sig_llme_irx_assign_req" ); + + switch (GET_STATE(IRX)) + { + case IRX_TLLI_UNASSIGNED: + /* + * Initialise current incarnation. + */ + irx_init_sapi(); + SET_STATE (IRX, IRX_TLLI_ASSIGNED); + break; + + default: + TRACE_ERROR( "SIG_LLME_IRX_ASSIGN_REQ unexpected" ); + break; + } +} /* sig_llme_irx_assign_req() */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_llme_irx_unassign_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_LLME_IRX_UNASSIGN_REQ +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_llme_irx_unassign_req (void) +{ + TRACE_ISIG( "sig_llme_irx_unassign_req" ); + + switch (GET_STATE(IRX)) + { + case IRX_TLLI_UNASSIGNED: + /* + * Ignore unexpected signal + */ + break; + + default: + /* + * Delete stored I frames and change to state TLLI_UNASSIGNED + */ + irx_queue_clean(); + irx_init_sapi(); + SET_STATE (IRX, IRX_TLLI_UNASSIGNED); + break; + } +} /* sig_llme_irx_unassign_req() */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_llme_irx_reset_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_LLME_IRX_RESET_REQ +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_llme_irx_reset_req (void) +{ + TRACE_ISIG( "sig_llme_irx_reset_req" ); + + + switch (GET_STATE(IRX)) + { + case IRX_TLLI_UNASSIGNED: + case IRX_TLLI_ASSIGNED: + /* + * Ignore signal. + */ + break; + + case IRX_ABM: + case IRX_ABM_BUSY: + /* + * Delete stored I frames and change to state TLLI_UNASSIGNED + */ + irx_queue_clean(); + irx_init_sapi(); + SET_STATE (IRX, IRX_TLLI_ASSIGNED); + break; + + default: + TRACE_ERROR( "SIG_LLME_IRX_RESET_REQ unexpected" ); + break; + } +} /* sig_llme_irx_reset_req() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_llme_irx_abmest_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_LLME_IRX_ABMEST_REQ +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_llme_irx_abmest_req (void) +{ + TRACE_ISIG( "sig_llme_irx_abmest_req" ); + + switch (GET_STATE(IRX)) + { + case IRX_TLLI_ASSIGNED: + /* + * Initialize ABM operation + */ + irx_init_abm(); + SET_STATE (IRX, IRX_ABM); + break; + + case IRX_ABM: + case IRX_ABM_BUSY: + /* + * Delete stored I frames and re-initialize ABM operation + */ + irx_queue_clean(); + irx_init_abm(); + SET_STATE (IRX, IRX_ABM); + break; + + default: + TRACE_ERROR( "SIG_LLME_IRX_ABMEST_REQ unexpected" ); + break; + } +} /* sig_llme_irx_abmest_req() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_llme_irx_abmrel_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_LLME_IRX_ABMREL_REQ +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_llme_irx_abmrel_req (void) +{ + TRACE_ISIG( "sig_llme_irx_abmrel_req" ); + + switch (GET_STATE(IRX)) + { + case IRX_ABM: + case IRX_ABM_BUSY: + /* + * Delete stored I frames and end ABM operation + */ + irx_queue_clean(); + irx_init_sapi(); + SET_STATE (IRX, IRX_TLLI_ASSIGNED); + break; + + default: + /* TRACE_ERROR( "SIG_LLME_IRX_ABMREL_REQ unexpected" ); but ok */ + break; + } +} /* sig_llme_irx_abmrel_req() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_rx_irx_data_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_RX_IRX_DATA_IND +| +| Parameters : ll_unitdata_ind - a valid pointer to an LL-UNITDATA-IND +| primitive +| command - contains the command within the primitive +| frame_type - type of PDU (I or S frame) +| cr_bit - setting of the CR bit +| a_bit - setting of the A bit +| ns - send sequence number of the frame +| nr - receive sequence number of the frame +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_rx_irx_data_ind (T_LL_UNITDATA_IND *ll_unitdata_ind, + T_COMMAND command, + T_PDU_TYPE frame_type, + T_BIT cr_bit, + T_BIT a_bit, + T_FRAME_NUM ns, + T_FRAME_NUM nr) +{ + UBYTE state; + + TRACE_ISIG( "sig_rx_irx_data_ind" ); + +#ifdef TRACE_EVE + { + static char* sf[] = { "RR", "ACK", "RNR", "SACK" }; + + if(command <= 3) + { + if(frame_type == I_FRAME) + { + TRACE_4_INFO("got %s I-Frame NS:%d NR:%d A:%d", sf[command], ns, nr, a_bit); + } + else + { + TRACE_3_INFO("got %s S-Frame NR:%d A:%d", sf[command], nr, a_bit); + } + } + } +#endif + + llc_data->u->current_tlli = ll_unitdata_ind->tlli; + + switch ( (state = GET_STATE(IRX)) ) + { + case IRX_TLLI_ASSIGNED: + /* + * Send a DM response to any valid command received, that + * cannot be handeled (GSM 4.64 Release 6.7.0 Chapter 6.4.1.4) + */ + TRACE_0_INFO("S- or I/S-Frame received in unexpected state"); + + PFREE (ll_unitdata_ind); + + sig_irx_u_no_frame_expected_ind(); + break; + + case IRX_ABM: + case IRX_ABM_BUSY: + /* + * va <= nr <= vs + */ + if ( FRAME_NUM_VALID (llc_data->sapi->va, nr, llc_data->sapi->vs) ) + { + /* + * frame valid + */ + irx_ack_all_to ((T_FRAME_NUM)(nr - 1)); + + switch (command) + { + case I_RR: + /* + * Label IRX_RR + */ + sig_irx_itx_peer_ready_ind(); + break; + + case I_ACK: + /* + * Label IRX_ACK + */ + sig_irx_itx_ack_ind (FALSE, nr ); + sig_irx_itx_ack_ind (TRUE, (T_FRAME_NUM)(nr + 1)); + sig_irx_itx_cnf_l3data_req (); + sig_irx_itx_peer_ready_ind (); + break; + + case I_SACK: + /* + * Label IRX_SACK + */ + sig_irx_itx_ack_ind (FALSE, nr); + irx_handle_sack (nr, ll_unitdata_ind, frame_type); + sig_irx_itx_peer_ready_ind(); + break; + + case I_RNR: + /* + * Label IRX_RNR + */ + sig_irx_itx_peer_busy_ind(); + break; + + default: + TRACE_ERROR( "Unexpected command received" ); + break; + } + } + + if (frame_type == I_FRAME) + { + irx_label_if (ll_unitdata_ind, ns, a_bit, state); + } + else /* S_FRAME */ + { + if (state == IRX_ABM) + { + irx_send_ack (a_bit); + PFREE (ll_unitdata_ind); + } + else + { + irx_send_rnr (); + PFREE (ll_unitdata_ind); + } + } + break; + + default: + /* + * Free unexpected data + */ + PFREE (ll_unitdata_ind); + TRACE_ERROR( "SIG_RX_IRX_DATA_IND unexpected" ); + break; + } +} /* sig_rx_irx_data_ind() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_itx_irx_s_frame_req ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_ITX_IRX_S_FRAME_REQ +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_itx_irx_s_frame_req (T_ABIT_REQ_TYPE req) +{ + TRACE_ISIG( "sig_itx_irx_s_frame_req" ); + + switch (GET_STATE(IRX)) + { + case IRX_ABM: + /* + * Send an S frame appropriate for the current state + */ + if ( llc_data->irx->last_ns == NS_EQUAL_VR ) + { + sig_irx_itx_send_rr_req (req); + } + else if ( llc_data->irx->last_ns == NS_EQUAL_VR_PLUS_1 ) + { + sig_irx_itx_send_ack_req (req); + } + else + { + T_SACK_BITMAP bitmap; + + irx_build_sack_bitmap( &bitmap ); + sig_irx_itx_send_sack_req (req, &bitmap); + } + /* SET_STATE (IRX, SAME_STATE); */ + break; + + + case IRX_ABM_BUSY: + /* + * The appropriate S frame in state busy anytime is an RNR + */ + sig_irx_itx_send_rnr_req (req); + /* SET_STATE (IRX, SAME_STATE); */ + break; + + default: + TRACE_ERROR( "SIG_ITX_IRX_S_FRAME_REQ unexpected" ); + break; + } +} /* sig_itx_irx_s_frame_req() */ + +