view src/g23m-fad/rlp/rlp.h @ 673:62a5285e014a

Lorekeeping: allow tpudrv-leonardo.lib on Leonardo/Tango Back in 2015 the Mother's idea was to produce a FreeCalypso development board that would be a clone of TI Leonardo, including the original quadband RFFE; one major additional stipulation was that this board needed to be able to run original unmodified TCS211-20070608 firmware with all blobs intact, with only minimal binary patches to main.lib and tpudrv.lib. The necessary patched libs were produced at that time in the tcs211-patches repository. That plan was changed and we produced FCDEV3B instead, with Openmoko's triband RFFE instead of Leonardo quadband, but when FC Magnetite started in 2016, a TPUDRV_blob= provision was still made, allowing the possibility of patching OM's tpudrv.lib for a restored Leonardo RFFE. Now in 2020 we have FC Tango which is essentially a verbatim clone of Leonardo core, including the original quadband RFFE. We have also deblobbed our firmware so much that we have absolutely no real need for a blob version of tpudrv.lib - but I thought it would be neat to put the ancient TPUDRV_blob= mechanism (classic config) to its originally intended use, just for the heck of it.
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 29 May 2020 03:55:36 +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