FreeCalypso > hg > fc-selenite
diff src/g23m-fad/rlp/rlp_kers.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-fad/rlp/rlp_kers.c Sun Jul 15 04:40:46 2018 +0000 @@ -0,0 +1,1733 @@ +/* ++----------------------------------------------------------------------------- +| Project : CSD (8411) +| Modul : Rlp_kers.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 defines the functions for processing +| of incomming signals for the component +| Radio Link Protocol of the base station ++----------------------------------------------------------------------------- +*/ + +#ifndef RLP_KERS_C +#define RLP_KERS_C +#endif + +#define ENTITY_RLP + +/*==== INCLUDES ===================================================*/ + +#include <string.h> +#include "typedefs.h" +#include "vsi.h" +#include "macdef.h" +#include "custom.h" +#include "gsm.h" +#include "cus_rlp.h" +#include "prim.h" +#include "tok.h" +#include "rlp.h" + +/*==== CONST =======================================================*/ + +/*==== TYPES =======================================================*/ + +/*==== VAR EXPORT ==================================================*/ + +/*==== VAR LOCAL ===================================================*/ + +/*==== FUNCTIONS ===================================================*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_sabm_ind ++------------------------------------------------------------------------------ +| Description :Process signal SIG_SABM_IND received from process rcv. +| +| Parameters : - +| +| +| Return : - ++------------------------------------------------------------------------------ +*/ + +GLOBAL void sig_rcv_ker_sabm_ind(void) +{ + TRACE_FUNCTION ("sig_rcv_ker_sabm_ind()"); + + TRACE_EVENT ("SABM rcvd"); + + switch (GET_STATE (KER)) + { + case RLP_ADM_AND_DETACHED: + rlp_data->ker.DM_State = IS_SEND; + rlp_data->ker.DM_FBit = 1; + break; + + case RLP_ADM_AND_ATTACHED: + { + PALLOC (rlp_connect_ind, RLP_CONNECT_IND); + PSENDX (L2R, rlp_connect_ind); + rlp_data->ker.DM_State = IS_IDLE; + SET_STATE (KER, RLP_PENDING_CONNECT_IND); + break; + } + + case RLP_PENDING_CONNECT_REQ: + { + PALLOC (rlp_connect_cnf, RLP_CONNECT_CNF); + + TIMERSTOP (TT_HANDLE); + + rlp_connect_cnf->ack_flg = RLP_ACK; + + PSENDX (L2R, rlp_connect_cnf); + + rlp_data->ker.UA_State = IS_SEND; + rlp_data->ker.UA_FBit = 1; + ker_init_link_vars (); + SET_STATE (KER, RLP_CONNECTION_ESTABLISHED); + break; + } + + case RLP_CONNECTION_ESTABLISHED: + case RLP_PENDING_REMAP_REQ: + case RLP_REMAP_DATA: + { + PALLOC (rlp_reset_ind, RLP_RESET_IND); + + TIMERSTOP (TT_HANDLE); + TIMERSTOP (TRCVR_HANDLE); + ker_reset_all_t_rcvs (); + + PSENDX (L2R, rlp_reset_ind); + + ker_deinit_link_vars (); + SET_STATE (KER, RLP_PENDING_RESET_IND); + break; + } + + case RLP_PENDING_RESET_REQ: + { + PALLOC (rlp_reset_cnf, RLP_RESET_CNF); + + TIMERSTOP (TT_HANDLE); + PSENDX (L2R, rlp_reset_cnf); + + rlp_data->ker.UA_State = IS_SEND; + rlp_data->ker.UA_FBit = 1; + + ker_init_link_vars (); + SET_STATE (KER, RLP_CONNECTION_ESTABLISHED); + break; + } + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_disc_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_DISC_IND received from process rcv. +| +| Parameters : pFBit - +| +| +| Return : - ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_disc_ind(T_BIT pFBit) +{ + TRACE_FUNCTION ("sig_rcv_ker_disc_ind()"); + + TRACE_EVENT ("DISC rcvd"); + + switch (GET_STATE (KER)) + { + case RLP_ADM_AND_DETACHED: + rlp_data->ker.DM_State = IS_SEND; + rlp_data->ker.DM_FBit = pFBit; + break; + + case RLP_ADM_AND_ATTACHED: + rlp_data->ker.UA_State = IS_SEND; + rlp_data->ker.UA_FBit = pFBit; + rlp_data->ker.DM_State = IS_IDLE; + break; + + case RLP_PENDING_CONNECT_REQ: + case RLP_PENDING_CONNECT_IND: + { + PALLOC (rlp_disc_ind, RLP_DISC_IND); + + TIMERSTOP (TT_HANDLE); + PSENDX (L2R, rlp_disc_ind); + + rlp_data->ker.UA_State = IS_SEND; + rlp_data->ker.UA_FBit = pFBit; + SET_STATE (KER, RLP_ADM_AND_ATTACHED); + break; + } + + case RLP_CONNECTION_ESTABLISHED: + case RLP_PENDING_REMAP_REQ: + case RLP_REMAP_DATA: + { + PALLOC (rlp_disc_ind, RLP_DISC_IND); + + TIMERSTOP (TT_HANDLE); + TIMERSTOP (TRCVR_HANDLE); + ker_reset_all_t_rcvs (); + + PSENDX (L2R, rlp_disc_ind); + + rlp_data->ker.UA_State = IS_SEND; + rlp_data->ker.UA_FBit = pFBit; + ker_deinit_link_vars (); + SET_STATE (KER, RLP_ADM_AND_ATTACHED); + break; + } + + case RLP_DISCONNECT_INITIATED: + { + rlp_data->ker.UA_State = IS_SEND; + rlp_data->ker.UA_FBit = pFBit; + + TIMERSTOP (TT_HANDLE); + + if (rlp_data->ker.DISC_Ind) + { + PALLOC (rlp_disc_ind, RLP_DISC_IND); + PSENDX (L2R, rlp_disc_ind); + SET_STATE (KER, RLP_ADM_AND_ATTACHED); + } + else + { + PALLOC (rlp_disc_cnf, RLP_DISC_CNF); + PSENDX (L2R, rlp_disc_cnf); + SET_STATE (KER, RLP_ADM_AND_ATTACHED); + } + + break; + } + + case RLP_PENDING_RESET_REQ: + { + PALLOC (rlp_disc_ind, RLP_DISC_IND); + + TIMERSTOP (TT_HANDLE); + PSENDX (L2R, rlp_disc_ind); + + rlp_data->ker.UA_State = IS_SEND; + rlp_data->ker.UA_FBit = pFBit; + + SET_STATE (KER, RLP_ADM_AND_ATTACHED); + break; + } + + case RLP_PENDING_RESET_IND: + { + PALLOC (rlp_disc_ind, RLP_DISC_IND); + + PSENDX (L2R, rlp_disc_ind); + + rlp_data->ker.UA_State = IS_SEND; + rlp_data->ker.UA_FBit = pFBit; + + SET_STATE (KER, RLP_ADM_AND_ATTACHED); + break; + } + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_ua_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_UA_IND received from process rcv. +| +| Parameters : pFBit - +| +| +| Return : - ++------------------------------------------------------------------------------ +*/ + +GLOBAL void sig_rcv_ker_ua_ind(T_BIT pFBit) +{ + TRACE_FUNCTION ("sig_rcv_ker_ua_ind()"); + + TRACE_EVENT ("UA rcvd"); + + switch (GET_STATE (KER)) + { + case RLP_PENDING_CONNECT_REQ: + switch (rlp_data->ker.SABM_State) + { + case ISW_WAIT: + if (pFBit EQ 1) + { + PALLOC (rlp_connect_cnf, RLP_CONNECT_CNF); + TIMERSTOP (TT_HANDLE); + + rlp_connect_cnf->ack_flg = RLP_ACK; + + PSENDX (L2R, rlp_connect_cnf); + ker_init_link_vars (); + SET_STATE (KER, RLP_CONNECTION_ESTABLISHED); + } + break; + + default: + break; + } + break; + + case RLP_DISCONNECT_INITIATED: + switch (rlp_data->ker.DISC_State) + { + case ISW_WAIT: + if (pFBit EQ rlp_data->ker.DISC_PBit) + { + if (rlp_data->ker.DISC_PBit EQ 1) + rlp_data->ker.Poll_xchg = IW_IDLE; + + TIMERSTOP (TT_HANDLE); + if (rlp_data->ker.DISC_Ind) + { + PALLOC (rlp_disc_ind, RLP_DISC_IND); + PSENDX (L2R, rlp_disc_ind); + SET_STATE (KER, RLP_ADM_AND_ATTACHED); + } + else + { + PALLOC (rlp_disc_cnf, RLP_DISC_CNF); + PSENDX (L2R, rlp_disc_cnf); + SET_STATE (KER, RLP_ADM_AND_ATTACHED); + } + + } + break; + } + break; + + case RLP_PENDING_RESET_REQ: + switch (rlp_data->ker.SABM_State) + { + case ISW_WAIT: + if (pFBit EQ 1) + { + PALLOC (rlp_reset_cnf, RLP_RESET_CNF); + + TIMERSTOP (TT_HANDLE); + PSENDX (L2R, rlp_reset_cnf); + + ker_init_link_vars (); + SET_STATE (KER, RLP_CONNECTION_ESTABLISHED); + } + break; + } + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_dm_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_DM_IND received from process rcv. +| +| Parameters : pFBit - +| +| +| Return : - ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_dm_ind(T_BIT pFBit) +{ + TRACE_FUNCTION ("sig_rcv_ker_dm_ind()"); + + TRACE_EVENT ("DM rcvd"); + + switch (GET_STATE (KER)) + { + case RLP_PENDING_CONNECT_REQ: + switch (rlp_data->ker.SABM_State) + { + case ISW_WAIT: + if (pFBit EQ 1) + { + PALLOC (rlp_connect_cnf, RLP_CONNECT_CNF); + TIMERSTOP (TT_HANDLE); + rlp_data->ker.Poll_xchg = IW_IDLE; + + rlp_connect_cnf->ack_flg = RLP_NAK; + + PSENDX (L2R, rlp_connect_cnf); + SET_STATE (KER, RLP_ADM_AND_ATTACHED); + } + break; + } + break; + + case RLP_DISCONNECT_INITIATED: + switch (rlp_data->ker.DISC_State) + { + case ISW_WAIT: + if (pFBit EQ rlp_data->ker.DISC_PBit) + { + if (rlp_data->ker.DISC_PBit EQ 1) + rlp_data->ker.Poll_xchg = IW_IDLE; + + TIMERSTOP (TT_HANDLE); + + if (rlp_data->ker.DISC_Ind) + { + PALLOC (rlp_disc_ind, RLP_DISC_IND); + PSENDX (L2R, rlp_disc_ind); + SET_STATE (KER, RLP_ADM_AND_ATTACHED); + } + else + { + PALLOC (rlp_disc_cnf, RLP_DISC_CNF); + PSENDX (L2R, rlp_disc_cnf); + SET_STATE (KER, RLP_ADM_AND_ATTACHED); + } + } + break; + } + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_rr_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_RR_IND received from process rcv. +| +| Parameters : cBit +| pFBit +| nr +| +| Return : - ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_rr_ind + ( + T_BIT cBit, + T_BIT pFBit, + T_FRAME_NUM nr + ) +{ + + BOOL retransError; + + TRACE_FUNCTION ("sig_rcv_ker_rr_ind()"); + + switch (GET_STATE (KER)) + { + case RLP_CONNECTION_ESTABLISHED: + rlp_data->ker.SF = SF_RR; + + /* + * unsolicited F_Bit ? + */ + if (!(pFBit EQ 1 AND cBit EQ 0 AND rlp_data->ker.Poll_State NEQ ISW_WAIT)) + { + /* + * NR within range of send frames pending for acknowledgement ? + */ + if (sbm_frame_in_range (nr)) + { + ker_s_handler (cBit, pFBit, rlp_data->ker.SF, nr, &retransError); + if (retransError) + { + SET_STATE(KER, RLP_DISCONNECT_INITIATED); + TRACE_EVENT("#2"); + } + } + } + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_rnr_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_RNR_IND received from process rcv. +| +| Parameters : cBit +| pFBit +| nr +| +| Return : - ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_rnr_ind + ( + T_BIT cBit, + T_BIT pFBit, + T_FRAME_NUM nr + ) +{ + BOOL retransError; + + TRACE_FUNCTION ("sig_rcv_ker_rnr_ind()"); + + switch (GET_STATE (KER)) + { + case RLP_CONNECTION_ESTABLISHED: + rlp_data->ker.SF = SF_RNR; + + /* + * unsolicited F_Bit ? + */ + if (!(pFBit EQ 1 AND cBit EQ 0 AND rlp_data->ker.Poll_State NEQ ISW_WAIT)) + { + /* + * NR within range of send frames pending + * for acknowledgement ?? + */ + if (sbm_frame_in_range (nr)) + { + ker_s_handler (cBit, pFBit, rlp_data->ker.SF, nr, &retransError); + if (retransError) + { + SET_STATE(KER, RLP_DISCONNECT_INITIATED); + TRACE_EVENT("#3"); + } + } + } + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_rej_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_REJ_IND received from process rcv. +| +| Parameters : cBit +| pFBit +| nr +| +| Return : - ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_rej_ind + ( + T_BIT cBit, + T_BIT pFBit, + T_FRAME_NUM nr + ) +{ + + BOOL retransError; + + TRACE_FUNCTION ("sig_rcv_ker_rej_ind()"); + + switch (GET_STATE (KER)) + { + case RLP_CONNECTION_ESTABLISHED: + rlp_data->ker.SF = SF_REJ; + + /* + * unsolicited F_Bit ? + */ + if (!(pFBit EQ 1 AND cBit EQ 0 AND rlp_data->ker.Poll_State NEQ ISW_WAIT)) + { + /* + * NR within range of send frames pending for acknowledgement ? + */ + if (sbm_frame_in_range (nr)) + { + ker_s_handler (cBit, pFBit, rlp_data->ker.SF, nr, &retransError); + if (retransError) + { + SET_STATE(KER, RLP_DISCONNECT_INITIATED); + TRACE_EVENT("#4"); + } + } + } + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_srej_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_SREJ_IND received from process rcv. +| +| Parameters :cBit - +| pFBit - +| nr - +| +| Return : - ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_srej_ind + ( + T_BIT cBit, + T_BIT pFBit, + T_FRAME_NUM nr + ) +{ + + BOOL retransError; + + TRACE_FUNCTION ("sig_rcv_ker_srej_ind()"); + + switch (GET_STATE (KER)) + { + case RLP_CONNECTION_ESTABLISHED: + rlp_data->ker.SF = SF_SREJ; + + /* + * unsolicited F_Bit ? + */ + if (!(pFBit EQ 1 AND cBit EQ 0 AND rlp_data->ker.Poll_State NEQ ISW_WAIT)) + { + /* + * NR within range of send frames pending + * for acknowledgement ?? + */ + if (sbm_frame_in_range (nr)) + { + ker_s_handler (cBit, pFBit, rlp_data->ker.SF, nr, &retransError); + if (retransError) + { + SET_STATE(KER, RLP_DISCONNECT_INITIATED); + TRACE_EVENT("#5"); + } + } + } + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_rr_i_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_RR_I_IND received from process rcv. +| +| Parameters : cBit - +| pFBit - +| nr - +| ns - +| +| Return : - ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_rr_i_ind + ( + T_BIT cBit, + T_BIT pFBit, + T_FRAME_NUM nr, + T_FRAME_NUM ns + ) +{ + + BOOL retransError; + + TRACE_FUNCTION ("sig_rcv_ker_rr_i_ind()"); + + switch (GET_STATE (KER)) + { + case RLP_CONNECTION_ESTABLISHED: + rlp_data->ker.SF = SF_RR; + + /* + * unsolicited F_Bit ? + */ + if (!(pFBit EQ 1 AND cBit EQ 0 AND rlp_data->ker.Poll_State NEQ ISW_WAIT)) + { + /* + * NR within range of send frames pending + * for acknowledgement ?? + */ + if (sbm_frame_in_range (nr)) + if (!ker_i_handler (ns)) + { + ker_s_handler (cBit, pFBit, rlp_data->ker.SF, nr, &retransError); + if (retransError) + { + SET_STATE(KER, RLP_DISCONNECT_INITIATED); + TRACE_EVENT("#6"); + } + } + } + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_rnr_i_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_RNR_I_IND received from process rcv. +| +| Parameters : cBit +| pFBit +| nr +| ns +| +| Return : ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_rnr_i_ind + ( + T_BIT cBit, + T_BIT pFBit, + T_FRAME_NUM nr, + T_FRAME_NUM ns + ) +{ + + BOOL retransError; + + TRACE_FUNCTION ("sig_rcv_ker_rnr_i_ind()"); + + switch (GET_STATE (KER)) + { + case RLP_CONNECTION_ESTABLISHED: + /* + * processing for state RLP_CONNECTION_ESTABLISHED + */ + rlp_data->ker.SF = SF_RNR; + + /* + * unsolicited F_Bit ? + */ + if (!(pFBit EQ 1 AND cBit EQ 0 AND rlp_data->ker.Poll_State NEQ ISW_WAIT)) + { + /* + * NR within range of send frames pending + * for acknowledgement ?? + */ + if (sbm_frame_in_range (nr)) + if (!ker_i_handler (ns)) + { + ker_s_handler (cBit, pFBit, rlp_data->ker.SF, nr, &retransError); + if (retransError) + { + SET_STATE(KER, RLP_DISCONNECT_INITIATED); + TRACE_EVENT("#7"); + } + } + } + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_rej_i_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_REJ_I_IND received from process rcv. +| +| +| Parameters : cBit - +| pFBit - +| nr - +| : ns - +| Return ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_rej_i_ind + ( + T_BIT cBit, + T_BIT pFBit, + T_FRAME_NUM nr, + T_FRAME_NUM ns + ) +{ + + BOOL retransError; + + TRACE_FUNCTION ("sig_rcv_ker_rej_i_ind()"); + + switch (GET_STATE (KER)) + { + case RLP_CONNECTION_ESTABLISHED: + /* + * processing for state RLP_CONNECTION_ESTABLISHED + */ + rlp_data->ker.SF = SF_REJ; + + /* + * unsolicited F_Bit ? + */ + if (!(pFBit EQ 1 AND cBit EQ 0 AND rlp_data->ker.Poll_State NEQ ISW_WAIT)) + { + /* + * NR within range of send frames pending + * for acknowledgement ?? + */ + if (sbm_frame_in_range (nr)) + if (!ker_i_handler (ns)) + { + ker_s_handler (cBit, pFBit, rlp_data->ker.SF, nr, &retransError); + if (retransError) + { + SET_STATE(KER, RLP_DISCONNECT_INITIATED); + TRACE_EVENT("#8"); + } + } + } + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_srej_i_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_SREJ_I_IND received from process rcv. +| +| Parameters : cBit - +| pFBit - +| nr - +| ns - +| +| Return : ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_srej_i_ind + ( + T_BIT cBit, + T_BIT pFBit, + T_FRAME_NUM nr, + T_FRAME_NUM ns + ) +{ + + BOOL retransError; + + TRACE_FUNCTION ("sig_rcv_ker_srej_i_ind()"); + + switch (GET_STATE (KER)) + { + case RLP_CONNECTION_ESTABLISHED: + /* + * processing for state RLP_CONNECTION_ESTABLISHED + */ + rlp_data->ker.SF = SF_SREJ; + + /* + * unsolicited F_Bit ? + */ + if (!(pFBit EQ 1 AND cBit EQ 0 AND rlp_data->ker.Poll_State NEQ ISW_WAIT)) + { + /* + * NR within range of send frames pending + * for acknowledgement ?? + */ + if (sbm_frame_in_range (nr)) + if (!ker_i_handler (ns)) + { + ker_s_handler (cBit, pFBit, rlp_data->ker.SF, nr, &retransError); + if (retransError) + { + SET_STATE(KER, RLP_DISCONNECT_INITIATED); + TRACE_EVENT("#9"); + } + } + } + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_ui_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_UI_IND received from process rcv. +| +| Parameters : cBit - +| pFBit - +| +| Return : - ++------------------------------------------------------------------------------ +*/ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_xid_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_XID_IND received from process rcv. +| +| Parameters : cBit +| pFBit +| +| Return : - ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_xid_ind + ( + T_BIT cBit, + T_BIT pFBit + ) +{ + TRACE_FUNCTION ("sig_rcv_ker_xid_ind()"); + + switch (GET_STATE (KER)) + { + case RLP_ADM_AND_DETACHED: + /* + * processing for state RLP_ADM_AND_DETACHED + */ + + break; + + default: + /* + * processing for all other kernel states + */ + if (cBit EQ 1) + { + switch (GET_STATE(KERXID_C)) + { + case ISW_WAIT: + { + rlp_data->ker.Poll_xchg = IW_IDLE; + SET_STATE(KERXID_C, ISW_IDLE); + + /* + TIMERSTOP (rlp_data->txid_handle); + + TIMERSTART + ( + TXID, + rlp_data->ker.T1, + rlp_data->txid_handle + ); + */ + } + break; + + default: + { + PALLOC (rlp_xid_ind, RLP_XID_IND); + + ker_get_xid_data + ( + rbm_get_current_frame () + HEADER_LEN, + 0, + rlp_xid_ind, + FALSE, + &rlp_data->ker.XID_R_Used_Flg + ); + + PSENDX (L2R, rlp_xid_ind); + + ker_put_xid_data + ( + rlp_data->ker.XID_R_Frame + HEADER_LEN, + 0, + rlp_data->ker.XID_R_Used_Flg, + FALSE, + rlp_data->ker.Rlp_Vers, + rlp_data->ker.K_iwf_ms, + rlp_data->ker.K_ms_iwf, + rlp_data->ker.T1, + rlp_data->ker.N2, + rlp_data->ker.T2, + rlp_data->ker.Pt, + rlp_data->ker.P0, + rlp_data->ker.P1, + rlp_data->ker.P2 + ); + + rlp_data->ker.XID_R_State = IS_SEND; + + rlp_data->ker.XID_R_FBit = pFBit; + + SET_STATE(KERXID_C, ISW_IDLE); + } + break; + } + } + else + { + switch (GET_STATE(KERXID_C)) + { + case ISW_WAIT: + if (pFBit EQ 1) + { + PALLOC (rlp_xid_ind, RLP_XID_IND); + + rlp_data->ker.Poll_xchg = IW_IDLE; + + TIMERSTOP (TXID_HANDLE); + ker_get_xid_data + ( + rbm_get_current_frame () + HEADER_LEN, + 0, + rlp_xid_ind, + TRUE, + &rlp_data->ker.XID_C_Used_Flg + ); + + PSENDX (L2R, rlp_xid_ind); + + SET_STATE(KERXID_C, ISW_IDLE); + } + break; + + default: + break; + } + } + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_test_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_TEST_IND received from process rcv. +| +| Parameters : cBit - +| pFBit - +| +| Return : - ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_test_ind + ( + T_BIT cBit, + T_BIT pFBit + ) +{ + TRACE_FUNCTION ("sig_rcv_ker_test_ind()"); + + switch (GET_STATE (KER)) + { + case RLP_ADM_AND_DETACHED: + /* + * no processing for state RLP_ADM_AND_DETACHED + */ + break; + + default: + /* + * processing for all other kernel states + */ + if (cBit EQ 1) + { + rlp_data->ker.TEST_R_State = IS_SEND; + rlp_data->ker.TEST_R_FBit = pFBit; + memcpy + ( + rlp_data->ker.TEST_R_Frame, + rbm_get_current_frame (), + rlp_data->ker.FrameSize + ); + } + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_remap_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_REMAP_IND received from process rcv. +| +| Parameters : - +| +| +| Return : - ++------------------------------------------------------------------------------ +*/ + + +GLOBAL void sig_rcv_ker_remap_ind + ( + void + ) +{ + T_RBM_FRAMEPTR remapFrame; + + TRACE_FUNCTION ("sig_rcv_ker_remap_ind()"); + + switch (GET_STATE (KER)) + { + case RLP_PENDING_REMAP_REQ: + { + PALLOC (rlp_xid_ind, RLP_XID_IND); + + remapFrame = rbm_get_current_frame(); + + rlp_data->ker.RemapNr = (*(T_RLP_FRAME_LONG *)remapFrame)[HEADER_LEN] >> 2; + + sbm_ack_upto_n (rlp_data->ker.RemapNr); + + ker_get_xid_data + ( + remapFrame + HEADER_LEN, + 2, + rlp_xid_ind, + TRUE, + &rlp_data->ker.XID_C_Used_Flg + ); + + PSENDX (L2R, rlp_xid_ind); + + if (!ker_send_remap_data ()) + { + PALLOC (rlp_remap_cnf, RLP_REMAP_CNF); + + sbm_reset_after_remap + ( + rlp_data->ker.FrameSize, + rlp_data->ker.RemapNr + ); + + PSENDX (L2R, rlp_remap_cnf); + SET_STATE (KER, RLP_CONNECTION_ESTABLISHED); + break; + } + + SET_STATE (KER, RLP_REMAP_DATA); + break; + } + + default: + break; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_ready_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_READY_IND received from process rcv. +| +| Parameters : - +| +| +| Return : - ++------------------------------------------------------------------------------ +*/ + +GLOBAL void sig_rcv_ker_ready_ind(void) +{ + /* + * FreeCalypso: when we tried to compile this code from TCS3.2 + * in our TCS211-mimicking Magnetite environment, we hit a BUG + * in TI's compiler, or more precisely, the compiler version used + * in TCS211: compiling this C module would fail as the compiler + * was producing bad assembly which the asm step rejected. + * Analysis of the generated asm showed that the switch table + * and all of the switch case code was omitted, but the reference + * to the switch table was still there, hence asm failing. + * + * The following four volatile char initialized but otherwise unused + * automatic variables constitute the workaround we have added to + * get this C module past the broken compiler. This workaround was + * inspired by the disassembly of the rlp_kers.obj binary object + * from the TCS211 blob library: it appears that TI had applied a + * very similar workaround on their end to get this code past the + * same broken compiler. The generated code we get is not exactly + * the same as what's in the blob, so our recreation of TI's compiler + * workaround is probably inexact, but it does the job of getting + * this C module past the compiler. + */ + volatile char bug1 = 'A'; + volatile char bug2 = 'B'; + volatile char bug3 = 'C'; + volatile char bug4 = 0; + + TRACE_FUNCTION ("sig_rcv_ker_ready_ind()"); + + switch (GET_STATE (KER)) + { + case RLP_ADM_AND_DETACHED: + switch (rlp_data->ker.DM_State) + { + case IS_IDLE: + sig_ker_snd_null_req (); + break; + + case IS_SEND: + sig_ker_snd_dm_req (rlp_data->ker.DM_FBit); + rlp_data->ker.DM_State = IS_IDLE; + break; + } + break; + + case RLP_ADM_AND_ATTACHED: + if (!ker_send_txu()) + { + switch(rlp_data->ker.DM_State) + { + case IS_IDLE: + switch (rlp_data->ker.UA_State) + { + case IS_IDLE: + sig_ker_snd_null_req (); + break; + + case IS_SEND: + sig_ker_snd_ua_req (rlp_data->ker.UA_FBit); + rlp_data->ker.UA_State = IS_IDLE; + break; + } + break; + + case IS_SEND: + sig_ker_snd_dm_req(rlp_data->ker.DM_FBit); + rlp_data->ker.DM_State = IS_IDLE; + break; + } + } + break; + + case RLP_PENDING_CONNECT_REQ: + if (!ker_send_txu()) + { + switch (rlp_data->ker.SABM_State) + { + case ISW_SEND: + switch (rlp_data->ker.Poll_xchg) + { + case IW_IDLE: + sig_ker_snd_sabm_req (); + rlp_data->ker.SABM_State = ISW_WAIT; + rlp_data->ker.SABM_Count++; + rlp_data->ker.Poll_xchg = IW_WAIT; + TIMERSTART(TT_HANDLE, rlp_data->ker.T1); + break; + + default: + sig_ker_snd_null_req (); + break; + } + break; + + default: + sig_ker_snd_null_req (); + break; + } + } + break; + + case RLP_PENDING_CONNECT_IND: + if (!ker_send_txu()) + sig_ker_snd_null_req (); + break; + + case RLP_CONNECTION_ESTABLISHED: + if (!ker_send_txu()) + ker_send_data (); + break; + + case RLP_DISCONNECT_INITIATED: + if (!ker_send_txu()) + { + switch (rlp_data->ker.DISC_State) + { + case ISW_WAIT: + sig_ker_snd_null_req (); + break; + + default: + if (rlp_data->ker.DISC_PBit EQ 1 AND rlp_data->ker.Poll_xchg EQ IW_WAIT) + { + sig_ker_snd_null_req (); + } + else + { + sig_ker_snd_disc_req (rlp_data->ker.DISC_PBit); + if (rlp_data->ker.DISC_PBit EQ 1) + rlp_data->ker.Poll_xchg = IW_WAIT; + + rlp_data->ker.DISC_State = ISW_WAIT; + rlp_data->ker.DISC_Count++; + TIMERSTART (TT_HANDLE, rlp_data->ker.T1); + } + break; + } + } + break; + + case RLP_PENDING_RESET_REQ: + if (!ker_send_txu()) + { + switch (rlp_data->ker.SABM_State) + { + case ISW_WAIT: + sig_ker_snd_null_req (); + break; + + case ISW_SEND: + switch (rlp_data->ker.Poll_xchg) + { + case IW_IDLE: + sig_ker_snd_sabm_req (); + rlp_data->ker.SABM_State = ISW_WAIT; + rlp_data->ker.SABM_Count++; + rlp_data->ker.Poll_xchg = IW_WAIT; + TIMERSTART (TT_HANDLE, rlp_data->ker.T1); + break; + + default: + sig_ker_snd_null_req (); + break; + } + break; + } + } + break; + + case RLP_PENDING_RESET_IND: + if (!ker_send_txu()) + sig_ker_snd_null_req (); + break; + + case RLP_PENDING_REMAP_REQ: + if (!ker_send_txu()) + { + if (rlp_data->ker.Poll_xchg EQ IW_IDLE) + { + TIMERSTART(TT_HANDLE, rlp_data->ker.T1 * rlp_data->ker.N2); + rlp_data->ker.Poll_xchg = IW_WAIT; + } + sig_ker_snd_remap_req (&rlp_data->ker.REMAP_FrameDesc); + } + break; + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : RLP_KERF | +| STATE : code ROUTINE : ker_interpret_rlp_frame | ++--------------------------------------------------------------------+ + + PURPOSE : decodes the elements from the given RLP frame + +*/ + +LOCAL void ker_interpret_rlp_frame + ( + T_RLP_FRAMEPTR frame, + T_PDU_TYPE *pduType, + T_BIT *cBit, + T_BIT *pFBit, + T_FRAME_NUM *nr, + T_FRAME_NUM *ns, + BOOL *crcOk + ) +{ +#ifdef TRACE_INTERPRETED_RLP_FRAME + T_RLP_DEBUG *deb = &rlp_data->deb; + + deb->idx=0; + deb->trc_buf[deb->idx++] = ((crcOk NEQ NULL) ? 'D' : 'U'); + deb->trc_buf[deb->idx++] = ':'; +#endif + +#ifdef _SIMULATION_ + TRACE_FUNCTION ("ker_interpret_rlp_frame()"); +#endif + + *cBit = (T_BIT) (frame[0] & 1); + *ns = (T_FRAME_NUM) ((frame[0] >> 3) | ((frame[1] & 1)<<5)); + *pFBit = (T_BIT) ((frame[1] & 2)>>1); + + switch (*ns) + { + case 62: /* S-Frame */ + { + T_SF sFrame; + + *nr = (T_FRAME_NUM) ((frame[1]>>2) & 0x3f); + +#ifdef TRACE_INTERPRETED_RLP_FRAME + deb->trc_buf[deb->idx++] = 'S'; + deb->trc_buf[deb->idx++] = 'r'; + DEC_BYTE (*nr, &deb->trc_buf[deb->idx]); deb->idx+=3; + deb->trc_buf[deb->idx++] = ' '; +#endif + + sFrame = (T_SF) ((frame[0]>>1) & 0x03); + + /* + * maybe optimize with a table!! + */ + switch (sFrame) + { + case SF_RR: + *pduType = PDU_RR; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "RR ",3); +#endif + break; + + case SF_RNR: + *pduType = PDU_RNR; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "RNR",3); +#endif + break; + case SF_REJ: + *pduType = PDU_REJ; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "REJ",3); +#endif + break; + case SF_SREJ: + *pduType = PDU_SREJ; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "SRJ",3); +#endif + break; + default: +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "***",3); +#endif + break; + + } +#ifdef TRACE_INTERPRETED_RLP_FRAME + deb->idx+=3; +#endif + break; + } + + case 63: /* U-Frame */ + { + T_UF uFrame; + uFrame = (T_UF) ((frame[1]>>2) & 0x1f); + +#ifdef TRACE_INTERPRETED_RLP_FRAME + deb->trc_buf[deb->idx++] = 'U'; + deb->trc_buf[deb->idx++] = ' '; +#endif + + /* + * maybe optimize with a table!! + */ + switch (uFrame) + { + case UF_UI: + *pduType = PDU_UI; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "UI ",4); +#endif + break; + + case UF_DM: + *pduType = PDU_DM; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "DM ",4); +#endif + break; + + case UF_SABM: + *pduType = PDU_SABM; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "SABM",4); +#endif + break; + + case UF_DISC: + *pduType = PDU_DISC; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "DISC",4); +#endif + break; + + case UF_UA: + *pduType = PDU_UA; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "UA ",4); +#endif + break; + + case UF_NULL: + *pduType = PDU_NULL; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "NULL",4); +#endif + break; + + case UF_XID: + *pduType = PDU_XID; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "XID ",4); +#endif + break; + + case UF_TEST: + *pduType = PDU_TEST; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "TEST",4); +#endif + break; + + case UF_REMAP: + *pduType = PDU_REMAP; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "RMAP",4); +#endif + break; + + default: + *pduType = PDU_INVALID; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "****",4); +#endif + break; + } + *nr = 0; +#ifdef TRACE_INTERPRETED_RLP_FRAME + deb->idx += 4; +#endif + break; + } + + default: /* I+S-Frame */ + { + T_SF sFrame; + + *nr = (T_FRAME_NUM) ((frame[1]>>2) & 0x3f); + + sFrame = (T_SF) ((frame[0]>>1) & 0x03); + +#ifdef TRACE_INTERPRETED_RLP_FRAME + deb->trc_buf[deb->idx++] = 'I'; + deb->trc_buf[deb->idx++] = 'r'; + DEC_BYTE (*nr, &deb->trc_buf[deb->idx]); deb->idx+=3; + deb->trc_buf[deb->idx++] = 's'; + DEC_BYTE (*ns, &deb->trc_buf[deb->idx]); deb->idx+=3; + deb->trc_buf[deb->idx++] = ' '; +#endif + /* + * maybe optimize with a table!! + */ + switch (sFrame) + { + case SF_RR: + *pduType = PDU_RR_I; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "RR ",3); +#endif + break; + + case SF_RNR: + *pduType = PDU_RNR_I; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "RNR",3); +#endif + break; + case SF_REJ: + *pduType = PDU_REJ_I; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "REJ",3); +#endif + break; + case SF_SREJ: + *pduType = PDU_SREJ_I; +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "SRJ",3); +#endif + break; + default: +#ifdef TRACE_INTERPRETED_RLP_FRAME + memcpy(&deb->trc_buf[deb->idx], "***",3); +#endif + break; + } +#ifdef TRACE_INTERPRETED_RLP_FRAME + deb->idx += 3; +#endif + break; + } + } +#ifdef TRACE_INTERPRETED_RLP_FRAME + if ( + (*pduType NEQ PDU_NULL) + AND + ( + (crcOk EQ NULL AND rlp_data->uplink_frame_trace) + OR + (crcOk NEQ NULL AND rlp_data->downlink_frame_trace) + ) + ) + { + deb->trc_buf[deb->idx++] = ' '; + deb->trc_buf[deb->idx++] = ((*cBit) ? 'C' : 'R'); + deb->trc_buf[deb->idx++] = ((*cBit) ? 'P' : 'F'); + deb->trc_buf[deb->idx++] = ' '; + HEX_BYTE (frame[1], &deb->trc_buf[deb->idx]); deb->idx+=2; + HEX_BYTE (frame[0], &deb->trc_buf[deb->idx]); deb->idx+=2; + deb->trc_buf[deb->idx++] = ' '; + HEX_BYTE (frame[2], &deb->trc_buf[deb->idx]); deb->idx+=2; + HEX_BYTE (frame[3], &deb->trc_buf[deb->idx]); deb->idx+=2; + + deb->trc_buf[deb->idx] = '\0'; + TRACE_EVENT (deb->trc_buf); + } +#endif + /* + * no CRC checking at this point. Checking is performed at + * Layer 1, so only correct frames are forwared. + */ +#ifdef TRACE_INTERPRETED_RLP_FRAME + if (crcOk NEQ NULL) +#endif + *crcOk = TRUE; +} + +#ifdef _SIMULATION_ +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : RLP_KERF | +| STATE : code ROUTINE : ker_get_frame_from_sdu | ++--------------------------------------------------------------------+ + + PURPOSE : + +*/ + +LOCAL T_RLP_FRAMEPTR ker_get_frame_from_sdu(T_sdu *sdu) +{ + TRACE_FUNCTION ("ker_get_frame_from_sdu()"); + + return sdu->buf+(sdu->o_buf>>3); +} +#endif + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : RLP_KERF | +| STATE : code ROUTINE : ker_analyse_prim | ++--------------------------------------------------------------------+ + + PURPOSE : + +*/ + +#ifdef _SIMULATION_ +LOCAL void ker_analyse_prim(T_RA_DATA_IND *ra_data_ind) +#else +LOCAL void ker_analyse_prim(void) +#endif +{ + T_RLP_FRAMEPTR frame; + T_PDU_TYPE pduType; + T_BIT cBit; + T_BIT pFBit; + T_FRAME_NUM nr, ns; + BOOL crcOk; + + TRACE_FUNCTION ("ker_analyse_prim()"); + +#ifdef _SIMULATION_ + PACCESS (ra_data_ind); + frame = ker_get_frame_from_sdu (&ra_data_ind->sdu); + rbm_store_frame (frame); + PFREE (ra_data_ind); +#endif + + frame = rbm_get_current_frame (); + +/* + TRACE_DATA_RLP_FRAME(frame); +*/ + + ker_interpret_rlp_frame + ( + frame, + &pduType, + &cBit, + &pFBit, + &nr, + &ns, + &crcOk + ); + + sig_ker_rcv_rawdata_res + ( + pduType, + cBit, + pFBit, + nr, + ns, + crcOk + ); + +} + +/* ++------------------------------------------------------------------------------ +| Function : sig_rcv_ker_rawdata_ind ++------------------------------------------------------------------------------ +| Description : Process signal SIG_RAWDATA_IND received from process rcv. +| +| Parameters : ra_data_ind - +| +| +| Return : - ++------------------------------------------------------------------------------ +*/ + +#ifdef _SIMULATION_ +GLOBAL void sig_rcv_ker_rawdata_ind(T_RA_DATA_IND *ra_data_ind) +#else +GLOBAL void sig_rcv_ker_rawdata_ind(void) +#endif +{ + TRACE_FUNCTION ("sig_rcv_ker_rawdata_ind()"); + +#ifdef _SIMULATION_ + ker_analyse_prim(ra_data_ind); +#else + ker_analyse_prim(); +#endif +}