FreeCalypso > hg > fc-magnetite
view src/g23m-fad/rlp/rlp.h @ 516:1ed9de6c90bd
src/g23m-gsm/sms/sms_for.c: bogus malloc removed
The new error handling code that was not present in TCS211 blob version
contains a malloc call that is bogus for 3 reasons:
1) The memory allocation in question is not needed in the first place;
2) libc malloc is used instead of one of the firmware's proper ways;
3) The memory allocation is made inside a function and then never freed,
i.e., a memory leak.
This bug was caught in gcc-built FreeCalypso fw projects (Citrine
and Selenite) because our gcc environment does not allow any use of
libc malloc (any reference to malloc produces a link failure),
but this code from TCS3.2 is wrong even for Magnetite: if this code
path is executed repeatedly over a long time, the many small allocations
made by this malloc call without a subsequent free will eventually
exhaust the malloc heap provided by the TMS470 environment, malloc will
start returning NULL, and the bogus code will treat it as an error.
Because the memory allocation in question is not needed at all,
the fix entails simply removing it.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 22 Jul 2018 06:04:49 +0000 |
parents | 90eb61ecd093 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : CSD (8411) | Modul : Rlp.h +----------------------------------------------------------------------------- | 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 : Definitions for the Protocol Stack Entity | Radio Link Protocol +----------------------------------------------------------------------------- */ #ifndef RLP_H #define RLP_H /* * Conditional Compiling */ #undef TRACE_INTERPRETED_RLP_FRAME #undef TRACE_RLP_FRAME #define V42BIS /* * Macros */ /* * instance management */ #define GET_INSTANCE(p) &rlp_data_base[0] /* * Constants */ /* * global unchangable constants */ #ifdef V42BIS #define ORIG_RLP_VERS 1 /* rlp version (1=single link ext)*/ #else #define ORIG_RLP_VERS 0 /* rlp version (0=single link)*/ #endif #define WIND_SIZE_MAX 61 /* max window size RLP */ #define DATA_SIZE_SHORT 25 /* num of data bytes in rlp frame (short format) */ #define DATA_SIZE_LONG 67 /* num of data bytes in rlp frame (long format, version 1) */ /* * default timeout for the RLP timer */ #define GEN_TO TT_VALUE /* default retransmission timer*/ #define UL_TO TUL_RCV_VALUE /* * max number of outstanding SREJs */ #define MAX_SREJ_COUNT 10 /* * timer indices * * 0..MAX_SREJ_COUNT reserved for field */ #define TT_HANDLE (MAX_SREJ_COUNT+1) #define TRCVR_HANDLE (MAX_SREJ_COUNT+2) #define TXID_HANDLE (MAX_SREJ_COUNT+3) #define TUL_RCV_HANDLE (MAX_SREJ_COUNT+4) /* * number of frames that are requested in case if low water */ /* * maximum number N2 can have */ #define N2_MAX 255 /* * derived constants */ #define HEADER_LEN (RLP_HEADER_LEN/8) #define TRAILER_LEN (RLP_TRAILER_LEN/8) #define FRAME_SIZE_SHORT (DATA_SIZE_SHORT+HEADER_LEN+TRAILER_LEN) #define FRAME_SIZE_LONG (DATA_SIZE_LONG+HEADER_LEN+TRAILER_LEN) /* * constants for XID parameter types */ #define XID_T_NULL 0 /* end tag */ #define XID_T_RLP_VERS 1 /* rlp version number */ #define XID_T_K_IWF_MS 2 /* window size iwf->ms */ #define XID_T_K_MS_IWF 3 /* window size ms->iwf */ #define XID_T_T1 4 /* acknowledge timer */ #define XID_T_N2 5 /* max num of retrans attempts */ #define XID_T_T2 6 /* reply delay */ #define XID_T_COMPR 7 /* data compression */ /* * constants for XID parameter length in bytes */ #define XID_L_RLP_VERS 1 /* rlp version number */ #define XID_L_K_MS_IWF 1 /* window size ms->iwf */ #define XID_L_K_IWF_MS 1 /* window size iwf->ms */ #define XID_L_T1 1 /* acknowledge timer */ #define XID_L_N2 1 /* max num of retrans attempts */ #define XID_L_T2 1 /* reply delay */ #define XID_L_COMPR 4 /* data compression */ /* * constants, to indicate parameters, which are used in XID */ #define UF_SET_RLP_VERS 0x01 #define UF_SET_K_IWF_MS 0x02 #define UF_SET_K_MS_IWF 0x04 #define UF_SET_T1 0x08 #define UF_SET_N2 0x10 #define UF_SET_T2 0x20 #define UF_SET_COMPR 0x40 #define UF_ALL 0x7F /* * default values for XID */ #define DEF_RLP_VERS 0 #define DEF_K_MS_IWF 61 #define DEF_K_IWF_MS 61 #define DEF_T1_FR14400 520 #define DEF_T1_FR9600 480 #define DEF_T1_FR4800 540 #define DEF_T1_HR4800 780 #define DEF_T2 80 #define DEF_N2 6 #define DEF_PT 0 #define DEF_P0 0 #define DEF_P1 512 #define DEF_P2 6 /* * Bitoffset for encoding/decoding */ #define ENCODE_OFFSET 0 /* * Parameter of dynamic configuration commands */ #ifndef NTRACE /* for trace purposes */ #define SERVICE_NAME_KER "KER" #define SERVICE_NAME_KERXID_C "XID_C" #define SERVICE_NAME_RCV "RCV" #define SERVICE_NAME_SND "SND" #endif #define KER ker. #define KERXID_C ker.XID_C. #define RCV rcv. #define SND snd. /* * State index for the entity processes */ /* * States of the entity process KERNEL */ #define RLP_ADM_AND_DETACHED 0 #define RLP_ADM_AND_ATTACHED 1 #define RLP_PENDING_CONNECT_REQ 2 #define RLP_PENDING_CONNECT_IND 3 #define RLP_CONNECTION_ESTABLISHED 4 #define RLP_PENDING_RESET_REQ 5 #define RLP_PENDING_RESET_IND 6 #define RLP_DISCONNECT_INITIATED 7 #define RLP_PERMANENT_ERROR 9 #define RLP_PENDING_REMAP_REQ 10 #define RLP_REMAP_DATA 11 /* * States of the entity process RCV */ #define RPDU_WAIT_FOR_A_BLOCK 0 /* * States of the entity process SND */ #define SPDU_WAIT_EVENT 0 /*==== TYPES ======================================================*/ /* * RLP global typedefs */ typedef ULONG T_BITSET; typedef UBYTE T_BIT_INT; typedef T_BIT_INT T_BIT; typedef UBYTE T_FRAME_NUM; typedef UBYTE T_EXT_FRAME_NUM; /* * structure of a RLP Frame */ typedef UBYTE T_RLP_FRAMEDATA; /* typedef UBYTE T_RLP_FRAME_SHORT[FRAME_SIZE_SHORT]; */ typedef UBYTE T_RLP_FRAME_LONG[FRAME_SIZE_LONG]; typedef UBYTE* T_RLP_FRAMEPTR; /* * bitcoding of the M5-M1 of the RLP header for the * different frame types. */ typedef enum { UF_UI =0x00, UF_DM =0x03, UF_SABM =0x07, UF_DISC =0x08, UF_UA =0x0C, UF_NULL =0x0F, UF_XID =0x17, UF_TEST =0x1C, UF_REMAP =0x11 } T_UF; /* * bitcoding of the S2-S1 of the RLP header for the * different frame types. */ typedef enum { SF_RR =0x00, SF_RNR =0x01, SF_REJ =0x02, SF_SREJ =0x03 } T_SF; typedef enum { PDU_INVALID, PDU_SABM, PDU_DISC, PDU_UA, PDU_DM, PDU_TEST, PDU_NULL, PDU_XID, PDU_UI, PDU_RR_I, PDU_RNR_I, PDU_SREJ_I, PDU_REJ_I, PDU_RR, PDU_RNR, PDU_SREJ, PDU_REJ, PDU_REMAP } T_PDU_TYPE; /* * Process kernel specific types */ #define IS_IDLE 0 #define IS_SEND 1 #define IW_IDLE 0 #define IW_WAIT 1 #define ISW_IDLE 0 #define ISW_SEND 1 #define ISW_WAIT 2 #define DTX_N 0 #define DTX_RR 1 #define DTX_RNR 2 typedef UBYTE T_COUNTER; #define INVALID_IDX ((UBYTE) -1) /* * send buffer management */ #define SBM_INVALID_IDX INVALID_IDX #define SBM_BUF_SIZE (WIND_SIZE_MAX+1) #define SBM_PRIMBUF_SIZE SBM_BUF_SIZE typedef T_RLP_DATA_REQ T_SBM_PRIM; typedef UBYTE T_SBM_BUFFER_INDEX; typedef UBYTE T_SBM_BUFFER_EXTIDX; typedef USHORT T_SBM_PRIM_INDEX; typedef USHORT T_SBM_PRIM_EXTIDX; typedef struct { T_SBM_PRIM *Prim; UBYTE RefCount; } T_SBM_PRIMSLOT; typedef enum { SBM_IDLE, SBM_SEND, SBM_WAIT } T_SBM_STATE; typedef struct { T_SBM_PRIM_EXTIDX PrimSlot1; /* Index on T_SBM_PRIM */ T_SBM_PRIM_EXTIDX PrimSlot2; /* Index on T_SBM_PRIM */ USHORT Offset1; /* Offset of data in primitive */ USHORT Offset2; /* Offset of data in primitive */ USHORT Len1; /* Length of data in primitive */ USHORT Len2; /* Length of data in primitive */ T_SBM_STATE S_State; /* 'SBM_SEND' means, data has to be sent (with seq. num. n) */ T_SBM_BUFFER_EXTIDX NextSREJ; } T_SBM_SLOT; /* * receive buffer management */ #define RBM_INVALID_IDX INVALID_IDX #define RBM_BUF_SIZE (WIND_SIZE_MAX+1) #ifdef _SIMULATION_ #define RBM_PQ_MAX_PRIM 10 #else #define RBM_PQ_MAX_PRIM 4 #endif #define RBM_PQ_THRE_RNR (RBM_PQ_MAX_PRIM-2) #define RBM_PQ_SIZE (RBM_PQ_MAX_PRIM+1) typedef T_RLP_DATA_IND T_RBM_PRIM; typedef UBYTE T_RBM_BUFFER_INDEX; typedef UBYTE T_RBM_BUFFER_EXTIDX; typedef UBYTE T_RBM_PQ_INDEX; typedef T_RLP_FRAME_LONG T_RBM_FRAME_LONG; typedef T_RLP_FRAMEPTR T_RBM_FRAMEPTR; typedef enum { RBM_IDLE, RBM_RCVD, RBM_SREJ, RBM_WAIT } T_RBM_STATE; typedef struct { T_RBM_FRAME_LONG Frame; /* To store user information */ T_RBM_STATE R_State; /* 'RBM_RCVD': data has been received (with seq. num. n) 'RBM_SREJ': the retrans. has to be requested using srej(n) 'RBM_WAIT': the entity waits for the requested retransmitted data */ } T_RBM_SLOT; /* * SREJ timer managment */ #define SRM_DATA_SIZE (WIND_SIZE_MAX+1) typedef T_COUNTER T_SRM_COUNTER; typedef struct { T_SRM_COUNTER count; } T_SRM_SLOT; /* * process global data */ /* * data for process kernel */ /* * table entry for timeout handling of the T_RCVS timer */ typedef struct { BOOL isFree; T_FRAME_NUM slot; UBYTE trcvs_running; } T_RCVS_ENTRY; typedef struct { UBYTE state; #ifndef NTRACE char *name; char *state_name; #endif } T_SUB_STATE; typedef struct { UBYTE state; #ifndef NTRACE char *name; char *state_name; #endif /*------------ variables according to GSM 04.22 ----------------------------------*/ T_BIT ABit; /* to store the Ack_Flg value of a received Connect_Resp frame */ T_BIT Ackn_FBit; /* Value of the F-Bit used in the next acknowledging PDU. */ UBYTE Ackn_State; /* 'SEND': an acknowledging PDU (Supervisory or Data) has to be sent */ /* after receiving an I-frame or a command frame with the Poll bit = 1 */ USHORT BytesPerPrim; /* number of bytes in RLP data primitives */ BOOL Connected; /* Process in RLP_CONNECTION_ESTABLISHED state */ USHORT Def_T1; /* Default value for T1, depends on transmission rate */ T_COUNTER DISC_Count; /* to count the transmissions of DISC.*/ BOOL DISC_Ind; /* In RLP_DISCONNECT_INITIATED: Indicate succesfull DISC by RLP_DISC_IND */ T_BIT DISC_PBit; /* The value of the P-bit in the next DISC command PDU.*/ UBYTE DISC_State; /* 'SEND': the DISC command PDU has to be sent at the next possible opportunity. */ /* 'WAIT': the RLP entity waits for the corresponding response.*/ T_BIT DM_FBit; /* Value of the F-Bit used in the next DM response PDU.*/ UBYTE DM_State; /* 'SEND': the PDU DM has to be sent. */ UBYTE DTX_SF; /* to store the last Superv. frame for DTX (only RR or RNR can be suppressed) */ T_FRAME_NUM DTX_VR; /* to store the last transmitted value of VR (used to decide the DTX condition) */ USHORT FrameSize; /* Size of RLP frame may be FRAME_SIZE_SHORT or FRAME_SIZE_LONG */ USHORT FramesPerPrim;/* number of frames in RLP data primitives (calculated from BytesPerPrim) */ T_FRAME_NUM K_ms_iwf; /* window size ms->iwf */ T_FRAME_NUM K_iwf_ms; /* window size iwf->ms */ BOOL LRFull; /* Local Receiver Full */ BOOL LRReady; /* Local Receiver Ready */ UBYTE N2; /* maximum numer of retransmission attempts */ USHORT OldFrameSize; /* Size of RLP frame before REMAP */ T_FRAME_NUM Orig_K_iwf_ms; /* original value for k_iwf_ms */ T_FRAME_NUM Orig_K_ms_iwf; /* original value for k_ms_iwf */ UBYTE Orig_N2; /* original value for n2 */ UBYTE Orig_P0; /* original value for p0 */ USHORT Orig_P1; /* original value for p1 */ UBYTE Orig_P2; /* original value for p2 */ UBYTE Orig_Pt; /* original value for pt */ USHORT Orig_T1; /* original value for t1 */ USHORT Orig_T2; /* original value for t2 */ UBYTE P0; /* V.42bis data compression request */ USHORT P1; /* number of possible codewords */ UBYTE P2; /* maximum encodable string length */ T_COUNTER Poll_Count; /* to count the transmissions of poll requests*/ UBYTE Poll_State; /* 'SEND': a supervisory PDU with P-bit set to one has to be sent*/ /* 'WAIT': the RLP entity waits for the response with F-bit set to one */ UBYTE Poll_xchg; /* 'IDLE': sending of a frame with P-bit set is allowed */ /* 'WAIT': an acknowledgement of a previous P-bit is outstanding */ UBYTE Pt; /* type of data compression */ UBYTE REJ_State; /* The REJ_State is send if and only if a REJ PDU has to be sent */ T_RLP_FRAME_LONG REMAP_Frame; /* frame to be sent in the next REMAP PDU*/ T_FRAME_DESC REMAP_FrameDesc; /* Descriptor for REMAP_Frame (static) */ T_FRAME_NUM RemapNr; /* Frame number taken from REMAP response */ UBYTE Rlp_Vers; /* negotiated RLP version */ BOOL RRReady; /* Remote Receiver Ready*/ T_COUNTER SABM_Count; /* to count the transmissions of SABM*/ UBYTE SABM_State; /* 'SEND': the SABM PDU has to be sent */ /* 'WAIT': the RLP entity waits for the UA response */ T_SF SF; /* to store the last superv. PDU type*/ USHORT SREJ_Count; /* number of outstanding SREJs == number of running SREJ timers (downlink) */ USHORT T1; /* value for acknowledge timer */ USHORT T2; /* reply delay */ USHORT T_ul; /* value for timer T_UL_RCV (upper layer waiting for data) */ T_RLP_FRAME_LONG TEST_R_Frame; /* data to be sent in the next TEST response PDU */ T_FRAME_DESC TEST_R_FrameDesc; /* descriptor for TEST_R_Frame (static) */ T_BIT TEST_R_FBit; /* value of the P-Bit used in the next TEST response PDU */ UBYTE TEST_R_State; /* 'SEND': the TEST response PDU has to be sent */ T_BIT UA_FBit; /* value of the F-Bit used in the next UA response */ UBYTE UA_State; /* if (UA_State = SEND) an UA PDU has to be sent */ T_RLP_FRAME_LONG UI_Frame; /* frame to be sent in the next UI PDU*/ T_FRAME_DESC UI_FrameDesc; /* Descriptor for UI_Frame (static) */ T_BIT UI_PBit; /* value of the P-Bit used in the next UI PDU */ UBYTE UI_State; /* 'SEND': a UI PDU has to be sent */ UBYTE UL_Rcv_State; /* 'WAIT': Upper layer is waiting for data */ UBYTE UL_Snd_State; /* 'WAIT': RLP is waiting for data from upper layer*/ T_COUNTER XID_Count; /* to count the transmissions of XID commands */ T_RLP_FRAME_LONG XID_C_Frame; /* data to be sent in the next XID command PDU */ T_FRAME_DESC XID_C_FrameDesc;/* Descriptor for XID_C_Frame (static) */ T_BIT XID_C_PBit; /* value of the P-Bit used in the next XID command PDU */ T_SUB_STATE XID_C; /* 'SEND': the XID command PDU has to be sent */ /* 'WAIT': the RLP entity waits for the next XID response */ T_BITSET XID_C_Used_Flg; /* Contains bits that indicate which parameters have been received in the last XID command PDU */ T_RLP_FRAME_LONG XID_R_Frame; /* frame to be sent in the next XID response PDU */ T_FRAME_DESC XID_R_FrameDesc; /* Descriptor for XID_R_Frame (static) */ T_BIT XID_R_FBit; /* value of the P-Bit used in the next XID response PDU */ UBYTE XID_R_State; /* 'SEND': the XID response PDU has to be sent*/ T_BITSET XID_R_Used_Flg; /* Contains bits that indicate which parameters have to be send in the next XID response PDU */ T_RCVS_ENTRY rcvsTab[MAX_SREJ_COUNT]; } T_KER; /* * data for process receive_pdu */ /* no global data */ /* * data for process send_pdu */ typedef struct { UBYTE state; #ifndef NTRACE char *name; char *state_name; #endif T_RLP_FRAME_LONG HO_Frame; /* Buffer and Descriptor for RLP Frames with header only */ T_FRAME_DESC HO_FrameDesc; USHORT FrameSize; /* Size of RLP frame may be FRAME_SIZE_SHORT or FRAME_SIZE_LONG */ } T_SND; /* * data for send buffer management */ typedef struct { T_SBM_PRIM_INDEX CurrPrimSlot; USHORT CurrPrimOff; USHORT CurrPrimLen; T_SBM_BUFFER_INDEX K; T_SBM_BUFFER_EXTIDX LastSentFrame; T_SBM_PRIMSLOT Prim[SBM_PRIMBUF_SIZE]; T_SBM_SLOT Frame[SBM_BUF_SIZE]; USHORT FrameSize; T_SBM_BUFFER_EXTIDX SREJ_List; T_SBM_BUFFER_INDEX REJ_Buf[N2_MAX +1]; UBYTE REJ_BufLo; UBYTE REJ_BufHi; UBYTE REJ_BufSize; T_SBM_BUFFER_INDEX REJ_BufLastN; T_SBM_BUFFER_INDEX VA; T_SBM_BUFFER_INDEX VD; T_SBM_BUFFER_INDEX VS; } T_SBM; /* * data for receive buffer management */ typedef struct { BOOL Initialised; BOOL FrameInRiBu; T_RBM_PRIM *CurrPrim; USHORT CurrPrimCou; USHORT FramesPerPrim; T_RBM_BUFFER_INDEX K; T_RBM_SLOT Slot[RBM_BUF_SIZE]; USHORT FrameSize; T_RBM_FRAME_LONG Frame; T_RBM_PRIM *PQ_Array[RBM_PQ_SIZE]; T_RBM_PQ_INDEX PQ_Read; T_RBM_PQ_INDEX PQ_Write; T_RBM_BUFFER_INDEX VR; T_RBM_BUFFER_INDEX LastVR; } T_RBM; /* * data for srej timer management */ typedef struct { T_SRM_SLOT Data[SRM_DATA_SIZE]; } T_SRM; #if defined (TRACE_INTERPRETED_RLP_FRAME) || defined (TRACE_RLP_FRAME) typedef struct { char trc_buf[80]; UBYTE idx; } T_RLP_DEBUG; #endif /* * entity data for each RLP instance */ typedef struct { UBYTE tul_rcv_running; T_FRAME_NUM rcvs_slot; T_KER ker; /* process kernel */ T_SND snd; /* process send_pdu */ T_SBM sbm; /* send buffer manager */ T_SUB_STATE rcv; T_RBM rbm; /* receive buffer manager */ T_SRM srm; /* srej timer manager */ /* Flags for frame trace */ BOOL uplink_frame_trace; BOOL downlink_frame_trace; #if defined (TRACE_INTERPRETED_RLP_FRAME) || defined (TRACE_RLP_FRAME) T_RLP_DEBUG deb; #endif } T_RLP_DATA; /*==== EXPORT =====================================================*/ /* * data base */ /* * instance data base */ #ifdef RLP_PEI_C /*lint -e759 : header declaration for symbol 'rlp_data_base' could be moved from header to module */ GLOBAL T_RLP_DATA rlp_data_base[1], *rlp_data; GLOBAL ULONG rlp_data_base_size; GLOBAL ULONG rlp_data_magic_num; #else EXTERN T_RLP_DATA rlp_data_base [], *rlp_data; EXTERN ULONG rlp_data_magic_num; #endif #define ENTITY_DATA rlp_data #define RLP_DATA_MAGIC_NUM (('R'<<24) + ('L'<<16) + ('P'<<8)) /* "FAD",NUL */ /* * Prototypes * * RLP KERNEL * * KERNEL primitive processing */ EXTERN void ker_rlp_attach_req (T_RLP_ATTACH_REQ *rlp_attach_req); EXTERN void ker_rlp_detach_req (T_RLP_DETACH_REQ *rlp_detach_req); EXTERN void ker_rlp_connect_req (T_RLP_CONNECT_REQ *rlp_connect_req); EXTERN void ker_rlp_connect_res (T_RLP_CONNECT_RES *rlp_connect_res); EXTERN void ker_rlp_disc_req (T_RLP_DISC_REQ *rlp_disc_req); EXTERN void ker_rlp_reset_req (T_RLP_RESET_REQ *rlp_reset_req); EXTERN void ker_rlp_reset_res (T_RLP_RESET_RES *rlp_reset_res); EXTERN void ker_rlp_data_req (T_RLP_DATA_REQ *rlp_data_req); EXTERN void ker_rlp_getdata_req (T_RLP_GETDATA_REQ *rlp_getdata_req); EXTERN void ker_rlp_ui_req (T_RLP_UI_REQ *rlp_ui_req); EXTERN void ker_rlp_remap_req (T_RLP_REMAP_REQ *rlp_remap_req); EXTERN void ker_rlp_remap_data_res (T_RLP_REMAP_DATA_RES *ker_rlp_remap_data_res); /* * KERNEL signal processing */ #ifdef OPTION_MULTITHREAD #define sig_rcv_ker_sabm_ind _ENTITY_PREFIXED(sig_rcv_ker_sabm_ind) #define sig_rcv_ker_disc_ind _ENTITY_PREFIXED(sig_rcv_ker_disc_ind) #define sig_rcv_ker_ua_ind _ENTITY_PREFIXED(sig_rcv_ker_ua_ind) #define sig_rcv_ker_dm_ind _ENTITY_PREFIXED(sig_rcv_ker_dm_ind) #define sig_rcv_ker_rr_ind _ENTITY_PREFIXED(sig_rcv_ker_rr_ind) #define sig_rcv_ker_rnr_ind _ENTITY_PREFIXED(sig_rcv_ker_rnr_ind) #define sig_rcv_ker_rej_ind _ENTITY_PREFIXED(sig_rcv_ker_rej_ind) #define sig_rcv_ker_srej_ind _ENTITY_PREFIXED(sig_rcv_ker_srej_ind) #define sig_rcv_ker_rr_i_ind _ENTITY_PREFIXED(sig_rcv_ker_rr_i_ind) #define sig_rcv_ker_rnr_i_ind _ENTITY_PREFIXED(sig_rcv_ker_rnr_i_ind) #define sig_rcv_ker_rej_i_ind _ENTITY_PREFIXED(sig_rcv_ker_rej_i_ind) #define sig_rcv_ker_srej_i_ind _ENTITY_PREFIXED(sig_rcv_ker_srej_i_ind) #define sig_rcv_ker_xid_ind _ENTITY_PREFIXED(sig_rcv_ker_xid_ind) #define sig_rcv_ker_test_ind _ENTITY_PREFIXED(sig_rcv_ker_test_ind) #define sig_rcv_ker_ready_ind _ENTITY_PREFIXED(sig_rcv_ker_ready_ind) #define sig_rcv_ker_remap_ind _ENTITY_PREFIXED(sig_rcv_ker_remap_ind) #define sig_rcv_ker_rawdata_ind _ENTITY_PREFIXED(sig_rcv_ker_rawdata_ind) #endif EXTERN void sig_rcv_ker_sabm_ind (void); EXTERN void sig_rcv_ker_disc_ind (T_BIT); EXTERN void sig_rcv_ker_ua_ind (T_BIT); EXTERN void sig_rcv_ker_dm_ind (T_BIT); EXTERN void sig_rcv_ker_rr_ind (T_BIT, T_BIT, T_FRAME_NUM); EXTERN void sig_rcv_ker_rnr_ind (T_BIT, T_BIT, T_FRAME_NUM); EXTERN void sig_rcv_ker_rej_ind (T_BIT, T_BIT, T_FRAME_NUM); EXTERN void sig_rcv_ker_srej_ind (T_BIT, T_BIT, T_FRAME_NUM); EXTERN void sig_rcv_ker_rr_i_ind (T_BIT, T_BIT, T_FRAME_NUM, T_FRAME_NUM); EXTERN void sig_rcv_ker_rnr_i_ind (T_BIT, T_BIT, T_FRAME_NUM, T_FRAME_NUM); EXTERN void sig_rcv_ker_rej_i_ind (T_BIT, T_BIT, T_FRAME_NUM, T_FRAME_NUM); EXTERN void sig_rcv_ker_srej_i_ind (T_BIT, T_BIT, T_FRAME_NUM, T_FRAME_NUM); EXTERN void sig_rcv_ker_xid_ind (T_BIT, T_BIT); EXTERN void sig_rcv_ker_test_ind (T_BIT, T_BIT); EXTERN void sig_rcv_ker_ready_ind (void); EXTERN void sig_rcv_ker_remap_ind (void); #ifdef _SIMULATION_ EXTERN void sig_rcv_ker_rawdata_ind (T_RA_DATA_IND *); #else EXTERN void sig_rcv_ker_rawdata_ind (void); #endif /* * KERNEL procedures */ #ifdef OPTION_MULTITHREAD #define ker_init _ENTITY_PREFIXED(ker_init) #define ker_get_xid_data _ENTITY_PREFIXED(ker_get_xid_data) #define ker_put_xid_data _ENTITY_PREFIXED(ker_put_xid_data) #define ker_copy_frame_to_sdu _ENTITY_PREFIXED(ker_copy_frame_to_sdu) #define ker_copy_sdu_to_frame _ENTITY_PREFIXED(ker_copy_sdu_to_frame) #define ker_get_frame_desc _ENTITY_PREFIXED(ker_get_frame_desc) #define ker_i_handler _ENTITY_PREFIXED(ker_i_handler) #define ker_init_link_vars _ENTITY_PREFIXED(ker_init_link_vars) #define ker_reset_all_t_rcvs _ENTITY_PREFIXED(ker_reset_all_t_rcvs) #define ker_s_handler _ENTITY_PREFIXED(ker_s_handler) #define ker_send_data _ENTITY_PREFIXED(ker_send_data) #define ker_send_txu _ENTITY_PREFIXED(ker_send_txu) #define ker_deinit_link_vars _ENTITY_PREFIXED(ker_deinit_link_vars) #define ker_send_rlp_error_ind _ENTITY_PREFIXED(ker_send_rlp_error_ind) #define ker_init_xid_data _ENTITY_PREFIXED(ker_init_xid_data) #define ker_getSlotTRCVS _ENTITY_PREFIXED(ker_getSlotTRCVS) #define ker_fill_remap_frame _ENTITY_PREFIXED(ker_fill_remap_frame) #define ker_send_remap_data _ENTITY_PREFIXED(ker_send_remap_data) #define ker_set_frame_size _ENTITY_PREFIXED(ker_set_frame_size) #ifdef TRACE_RLP_FRAME #define ker_trace_rlp_frame _ENTITY_PREFIXED(ker_trace_rlp_frame) #endif #endif EXTERN void ker_init(void); EXTERN void ker_get_xid_data ( T_RLP_FRAMEDATA *raw_data, UBYTE index, T_RLP_XID_IND *xid_data, BOOL ms_is_initiator, ULONG *used_flags ); EXTERN void ker_put_xid_data ( T_RLP_FRAMEDATA *l_Data, /* buffer for data */ UBYTE index, /* start index in buffer */ ULONG l_uf, /* valid parameters */ BOOL ms_is_initiator, /* MS is sending XID*/ UBYTE l_rlp_version, /* negotiated vers. */ T_FRAME_NUM l_k_iwf_ms, /* winSize ms->iwf */ T_FRAME_NUM l_k_ms_iwf, /* winSize iwf->ms */ USHORT l_t1, /* ack timer value */ UBYTE l_n2, /* num restransmiss */ USHORT l_t2, /* reply delay */ UBYTE l_pt, /* type data compr. */ UBYTE l_p0, /* v42bis comp. req */ USHORT l_p1, /* num possible code*/ UBYTE l_p2 /* max encod. strlen*/ ); EXTERN void ker_copy_frame_to_sdu ( T_RLP_FRAMEPTR frame, T_sdu *sdu ); EXTERN void ker_copy_sdu_to_frame ( T_sdu *sdu, T_RLP_FRAMEPTR frame, USHORT n ); EXTERN void ker_get_frame_desc ( T_RLP_FRAMEPTR frame, T_FRAME_DESC *frameDesc ); EXTERN BOOL ker_i_handler(T_FRAME_NUM ns); EXTERN void ker_init_link_vars ( void ); #ifdef TRACE_RLP_FRAME EXTERN void ker_trace_rlp_frame ( T_RLP_FRAMEPTR frame ); #endif EXTERN void ker_reset_all_t_rcvs ( void ); EXTERN void ker_s_handler ( T_BIT cBit, T_BIT pFBit, T_SF sf, T_FRAME_NUM nr, BOOL *retransError ); EXTERN void ker_send_data ( void ); EXTERN BOOL ker_send_txu ( void ); EXTERN void ker_deinit_link_vars ( void ); EXTERN void ker_send_rlp_error_ind ( USHORT cause ); EXTERN void ker_init_xid_data ( T_RLP_ATTACH_REQ *rlp_attach_request ); EXTERN T_FRAME_NUM ker_getSlotTRCVS ( USHORT index ); EXTERN void ker_fill_remap_frame ( T_FRAME_NUM vr ); EXTERN BOOL ker_send_remap_data ( void ); EXTERN void ker_set_frame_size ( UBYTE rate ); /* * RLP RCV * * RCV primitive processing */ #ifdef _SIMULATION_ EXTERN const void rcv_ra_ready_ind(T_RA_READY_IND *ra_ready_ind); #else EXTERN void rcv_ra_ready_ind(void); #endif EXTERN void rcv_ra_data_ind(T_RA_DATA_IND *ra_data_ind); /* * RCV signal processing */ #ifdef OPTION_MULTITHREAD #define sig_ker_rcv_rawdata_res _ENTITY_PREFIXED(sig_ker_rcv_rawdata_res) #endif EXTERN void sig_ker_rcv_rawdata_res ( T_PDU_TYPE pduType, T_BIT cBit, T_BIT pFBit, T_FRAME_NUM nr, T_FRAME_NUM ns, BOOL crc ); /* * RCV procedures */ #ifdef OPTION_MULTITHREAD #define rcv_init _ENTITY_PREFIXED(rcv_init) #endif EXTERN void rcv_init(void); /* * RLP SND */ /* * SND signal processing */ #ifdef OPTION_MULTITHREAD #define sig_ker_snd_sabm_req _ENTITY_PREFIXED(sig_ker_snd_sabm_req) #define sig_ker_snd_disc_req _ENTITY_PREFIXED(sig_ker_snd_disc_req) #define sig_ker_snd_ua_req _ENTITY_PREFIXED(sig_ker_snd_ua_req) #define sig_ker_snd_dm_req _ENTITY_PREFIXED(sig_ker_snd_dm_req) #define sig_ker_snd_rr_req _ENTITY_PREFIXED(sig_ker_snd_rr_req) #define sig_ker_snd_rnr_req _ENTITY_PREFIXED(sig_ker_snd_rnr_req) #define sig_ker_snd_rej_req _ENTITY_PREFIXED(sig_ker_snd_rej_req) #define sig_ker_snd_srej_req _ENTITY_PREFIXED(sig_ker_snd_srej_req) #define sig_ker_snd_rr_i_req _ENTITY_PREFIXED(sig_ker_snd_rr_i_req) #define sig_ker_snd_rnr_i_req _ENTITY_PREFIXED(sig_ker_snd_rnr_i_req) #define sig_ker_snd_rej_i_req _ENTITY_PREFIXED(sig_ker_snd_rej_i_req) #define sig_ker_snd_srej_i_req _ENTITY_PREFIXED(sig_ker_snd_srej_i_req) #define sig_ker_snd_ui_req _ENTITY_PREFIXED(sig_ker_snd_ui_req) #define sig_ker_snd_xid_req _ENTITY_PREFIXED(sig_ker_snd_xid_req) #define sig_ker_snd_test_req _ENTITY_PREFIXED(sig_ker_snd_test_req) #define sig_ker_snd_remap_req _ENTITY_PREFIXED(sig_ker_snd_remap_req) #define sig_ker_snd_null_req _ENTITY_PREFIXED(sig_ker_snd_null_req) #define sig_ker_snd_set_frame_size_req _ENTITY_PREFIXED(sig_ker_snd_set_frame_size_req) #endif EXTERN void sig_ker_snd_sabm_req (void); EXTERN void sig_ker_snd_disc_req (T_BIT); EXTERN void sig_ker_snd_ua_req (T_BIT); EXTERN void sig_ker_snd_dm_req (T_BIT); #ifdef ENABLE_DTX EXTERN void sig_ker_snd_rr_req (T_BIT, T_BIT, T_FRAME_NUM, T_BIT); #else EXTERN void sig_ker_snd_rr_req (T_BIT, T_BIT, T_FRAME_NUM); #endif EXTERN void sig_ker_snd_rnr_req (T_BIT, T_BIT, T_FRAME_NUM, T_BIT); EXTERN void sig_ker_snd_rej_req (T_BIT, T_BIT, T_FRAME_NUM); EXTERN void sig_ker_snd_srej_req (T_BIT, T_BIT, T_FRAME_NUM); EXTERN void sig_ker_snd_rr_i_req (T_BIT, T_BIT, T_FRAME_NUM, T_FRAME_NUM, T_FRAME_DESC *); EXTERN void sig_ker_snd_rnr_i_req (T_BIT, T_BIT, T_FRAME_NUM, T_FRAME_NUM, T_FRAME_DESC *); EXTERN void sig_ker_snd_rej_i_req (T_BIT, T_BIT, T_FRAME_NUM, T_FRAME_NUM, T_FRAME_DESC *); EXTERN void sig_ker_snd_srej_i_req (T_BIT, T_BIT, T_FRAME_NUM, T_FRAME_NUM, T_FRAME_DESC *); EXTERN void sig_ker_snd_ui_req (T_BIT, T_BIT, T_FRAME_DESC *); EXTERN void sig_ker_snd_xid_req (T_BIT, T_BIT, T_FRAME_DESC *); EXTERN void sig_ker_snd_test_req (T_BIT, T_BIT, T_FRAME_DESC *); EXTERN void sig_ker_snd_remap_req (T_FRAME_DESC *); EXTERN void sig_ker_snd_null_req (void); EXTERN void sig_ker_snd_set_frame_size_req (USHORT); /* * SND procedures */ #ifdef OPTION_MULTITHREAD #define snd_init _ENTITY_PREFIXED(snd_init) #define snd_send_u_frame _ENTITY_PREFIXED(snd_send_u_frame) #define snd_send_s_frame _ENTITY_PREFIXED(snd_send_s_frame) #define snd_send_si_frame _ENTITY_PREFIXED(snd_send_si_frame) #endif EXTERN void snd_init(T_SND *snd); EXTERN void snd_send_u_frame ( T_UF frameType, T_BIT pFBit, T_BIT crBit, T_FRAME_DESC *dataDesc ); EXTERN void snd_send_s_frame ( T_SF frameType, T_FRAME_NUM nr, T_BIT pFBit, T_BIT crBit, T_FRAME_DESC *dataDesc ); EXTERN void snd_send_si_frame ( T_SF frameType, T_FRAME_NUM nr, T_BIT pFBit, T_FRAME_NUM ns, T_BIT crBit, T_FRAME_DESC *dataDesc ); /* * Send Buffer Management SBM */ #ifdef OPTION_MULTITHREAD #define sbm_set_wind_size _ENTITY_PREFIXED(sbm_set_wind_size) #define sbm_init _ENTITY_PREFIXED(sbm_init) #define sbm_store_prim _ENTITY_PREFIXED(sbm_store_prim) #define sbm_ack_upto_n _ENTITY_PREFIXED(sbm_ack_upto_n) #define sbm_srej_frame _ENTITY_PREFIXED(sbm_srej_frame) #define sbm_get_frame _ENTITY_PREFIXED(sbm_get_frame) #define sbm_rej_from_n _ENTITY_PREFIXED(sbm_rej_from_n) #define sbm_frame_in_range _ENTITY_PREFIXED(sbm_frame_in_range) #define sbm_space_in_buf _ENTITY_PREFIXED(sbm_space_in_buf) #define sbm_deinit _ENTITY_PREFIXED(sbm_deinit) #define sbm_set_retrans _ENTITY_PREFIXED(sbm_set_retrans) #define sbm_check_rej_count _ENTITY_PREFIXED(sbm_check_rej_count) #define sbm_recall_prim _ENTITY_PREFIXED(sbm_recall_prim) #endif EXTERN void sbm_set_wind_size ( T_SBM_BUFFER_INDEX windSize ); EXTERN void sbm_init ( T_SBM_BUFFER_INDEX windSize, USHORT frameSize, UBYTE n2 ); EXTERN void sbm_store_prim ( T_SBM_PRIM *sendPrim ); EXTERN BOOL sbm_ack_upto_n ( T_SBM_BUFFER_EXTIDX ); EXTERN void sbm_srej_frame ( T_SBM_BUFFER_INDEX n ); EXTERN void sbm_get_frame ( T_FRAME_DESC *frameDesc, T_SBM_BUFFER_INDEX *frameNo, BOOL *framesCouldBeSent, BOOL *ok ); EXTERN void sbm_rej_from_n ( T_SBM_BUFFER_INDEX n, BOOL *retransError ); EXTERN BOOL sbm_frame_in_range ( T_SBM_BUFFER_INDEX n ); EXTERN USHORT sbm_space_in_buf ( void ); EXTERN void sbm_deinit ( void ); EXTERN void sbm_set_retrans ( UBYTE n2 ); EXTERN void sbm_check_rej_count ( BOOL *retransError ); EXTERN BOOL sbm_recall_prim ( T_SBM_PRIM **sendPrim ); EXTERN void sbm_reset_after_remap ( USHORT newFrameSize, T_SBM_BUFFER_INDEX new_vs ); /* * Receive Buffer Management RBM */ #ifdef OPTION_MULTITHREAD #define rbm_set_wind_size _ENTITY_PREFIXED(rbm_set_wind_size) #define rbm_init _ENTITY_PREFIXED(rbm_init) #define rbm_deinit _ENTITY_PREFIXED(rbm_deinit) #define rbm_reset _ENTITY_PREFIXED(rbm_reset) #define rbm_reset_srej_slots _ENTITY_PREFIXED(rbm_reset_srej_slots) #define rbm_reset_all_r_states _ENTITY_PREFIXED(rbm_reset_all_r_states) #define rbm_check_slots_srej _ENTITY_PREFIXED(rbm_check_slots_srej) #define rbm_set_rslot_wait _ENTITY_PREFIXED(rbm_set_rslot_wait) #define rbm_set_rslot_wait2srej _ENTITY_PREFIXED(rbm_set_rslot_wait2srej) #define rbm_set_rslot_rcvd _ENTITY_PREFIXED(rbm_set_rslot_rcvd) #define rbm_get_current_frame _ENTITY_PREFIXED(rbm_get_current_frame) #define rbm_accept_current_frame _ENTITY_PREFIXED(rbm_accept_current_frame) #define rbm_mark_missing_i_frames_srej _ENTITY_PREFIXED(rbm_mark_missing_i_frames_srej) #define rbm_count_missing_i_frames _ENTITY_PREFIXED(rbm_count_missing_i_frames) #define rbm_buffer_all_in_sequence_frames _ENTITY_PREFIXED(rbm_buffer_all_in_sequence_frames) #define rbm_ns_check _ENTITY_PREFIXED(rbm_ns_check) #define rbm_get_vr _ENTITY_PREFIXED(rbm_get_vr) #define rbm_get_prim _ENTITY_PREFIXED(rbm_get_prim) #define rbm_get_curr_prim _ENTITY_PREFIXED(rbm_get_curr_prim) #define rbm_move_current_frame _ENTITY_PREFIXED(rbm_move_current_frame) #define rbm_is_state_wait _ENTITY_PREFIXED(rbm_is_state_wait) #define rbm_prepare_remap _ENTITY_PREFIXED(rbm_prepare_remap) #ifdef _SIMULATION_ #define rbm_store_frame _ENTITY_PREFIXED(rbm_store_frame) #endif #endif EXTERN BOOL rbm_set_wind_size ( T_RBM_BUFFER_INDEX windSize ); EXTERN void rbm_init ( T_RBM_BUFFER_INDEX windSize, USHORT frameSize, USHORT framesPerPrim ); EXTERN void rbm_deinit ( void ); EXTERN void rbm_reset(T_RBM *rbm); EXTERN void rbm_reset_srej_slots ( void ); EXTERN void rbm_reset_all_r_states ( void ); EXTERN T_RBM_BUFFER_EXTIDX rbm_check_slots_srej ( void ); EXTERN void rbm_set_rslot_wait ( T_RBM_BUFFER_INDEX slot ); EXTERN void rbm_set_rslot_wait2srej ( T_RBM_BUFFER_INDEX slot ); EXTERN void rbm_set_rslot_rcvd ( T_RBM_BUFFER_INDEX slot, BOOL *resetTimer ); EXTERN T_RBM_FRAMEPTR rbm_get_current_frame ( void ); EXTERN void rbm_accept_current_frame ( void ); EXTERN void rbm_mark_missing_i_frames_srej ( T_RBM_BUFFER_INDEX ns ); EXTERN void rbm_count_missing_i_frames ( T_RBM_BUFFER_INDEX ns, T_RBM_BUFFER_INDEX *count ); EXTERN void rbm_buffer_all_in_sequence_frames ( T_RBM_BUFFER_INDEX fromSlot, BOOL *primIsReady, BOOL *rcvReady, BOOL *rcvFull ); EXTERN void rbm_ns_check ( T_RBM_BUFFER_INDEX ns, BOOL *valid, BOOL *expected ); EXTERN T_RBM_BUFFER_INDEX rbm_get_vr ( void ); EXTERN BOOL rbm_get_prim ( T_RBM_PRIM **prim, BOOL *rcvReady, BOOL *rcvFull ); EXTERN T_RBM_PRIM *rbm_get_curr_prim ( void ); EXTERN void rbm_move_current_frame ( T_RBM_BUFFER_INDEX slot ); EXTERN BOOL rbm_is_state_wait ( T_RBM_BUFFER_INDEX slot ); EXTERN T_FRAME_NUM rbm_prepare_remap ( USHORT frameSize ); #ifdef _SIMULATION_ EXTERN void rbm_store_frame(T_RBM_FRAMEPTR frame); #endif /* * SREJ Timer Management SRM */ #ifdef OPTION_MULTITHREAD #define srm_init _ENTITY_PREFIXED(srm_init) #define srm_deinit _ENTITY_PREFIXED(srm_deinit) #define srm_reset _ENTITY_PREFIXED(srm_reset) #define srm_clear _ENTITY_PREFIXED(srm_clear) #define srm_count _ENTITY_PREFIXED(srm_count) #define srm_get_counter _ENTITY_PREFIXED(srm_get_counter) #endif EXTERN void srm_init ( void ); EXTERN void srm_deinit ( void ); EXTERN void srm_reset ( void ); EXTERN void srm_clear ( T_FRAME_NUM n ); EXTERN void srm_count ( T_FRAME_NUM n ); EXTERN T_COUNTER srm_get_counter ( T_FRAME_NUM n ); /* * timer */ #define TIMERSTART(i,v) vsi_t_start(VSI_CALLER i,v); #define TIMERSTOP(i) vsi_t_stop(VSI_CALLER i); /* * time * xid parameters are given in 10^2 s, we store in 10^3 s (ms) */ #define TIME_INT2EXT(t) ((t) / 10) #define TIME_EXT2INT(t) ((t) * 10) /* * Communication handles */ #ifdef OPTION_MULTITHREAD #define hCommL2R _ENTITY_PREFIXED(hCommL2R) #ifdef _SIMULATION_ #define hCommRA _ENTITY_PREFIXED(hCommRA) #endif #endif #ifdef RLP_PEI_C GLOBAL T_HANDLE rlp_handle; GLOBAL T_HANDLE hCommL2R = VSI_ERROR; /* L2R Communication */ #ifdef _SIMULATION_ GLOBAL T_HANDLE hCommRA = VSI_ERROR; /* RA Communication */ #endif #else EXTERN T_HANDLE rlp_handle; EXTERN T_HANDLE hCommL2R; /* L2R Communication */ #ifdef _SIMULATION_ EXTERN T_HANDLE hCommRA; /* RA Communication */ #endif #endif GLOBAL void rlp_exec_timeout (USHORT index); #ifdef _SIMULATION_ #define HEX_BYTE(B,H) { UBYTE b, *a = (UBYTE*)H;\ b = (((UBYTE)B) >> 4) & 0x0F;\ if (b > 9) b += 'A'-10; else b += '0'; *a = b;\ b = ((UBYTE)B) & 0x0F;\ if (b > 9) b += 'A'-10; else b += '0'; *(a+1) = b;} #endif #if defined (TRACE_INTERPRETED_RLP_FRAME) || defined (TRACE_RLP_FRAME) #define DEC_BYTE(B,A) {UBYTE b, rep, *a = ((UBYTE*)A)+2; b = (UBYTE) B;\ for (rep=0;rep<3;rep++) {*a = (b%10) + '0'; b /= 10; a--;}} #endif #endif