This commit was manufactured by cvs2svn to create branch 'decode'.
[gnokii.git] / include / data / rlp-common.h
diff --git a/include/data/rlp-common.h b/include/data/rlp-common.h
new file mode 100644 (file)
index 0000000..a03a497
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+
+  $Id$
+
+  G N O K I I
+
+  A Linux/Unix toolset and driver for Nokia mobile phones.
+
+  Released under the terms of the GNU GPL, see file COPYING for more details.
+
+  The development of RLP protocol is sponsored by SuSE CR, s.r.o. (Pavel use
+  the SIM card from SuSE for testing purposes).
+
+  Header file for RLP protocol.
+
+*/
+
+#ifndef __data_rlp_common_h
+#define __data_rlp_common_h
+
+#ifndef __misc_h
+  #include "misc.h"
+#endif
+
+/* Global variables */
+
+/* Defines */
+
+/* Data types */
+
+/* Typedef for frame type - they are the same for RLP version 0, 1 and 2. */
+
+typedef enum {
+  RLPFT_X, /* Unknown. */
+  RLPFT_U, /* Unnumbered frame. */
+  RLPFT_S, /* Supervisory frame. */
+  RLPFT_IS /* Information plus Supervisory (I+S) frame. */
+} RLP_FrameType;
+
+/* Define the various Unnumbered frame types. Numbering is bit reversed
+   relative to ETSI GSM 04.22 for easy parsing. */
+
+typedef enum {
+  RLPU_SABM  = 0x07, /* Set Asynchronous Balanced Mode. */
+  RLPU_UA    = 0x0c, /* Unnumbered Acknowledge. */
+  RLPU_DISC  = 0x08, /* Disconnect. */
+  RLPU_DM    = 0x03, /* Disconnected Mode. */
+  RLPU_NULL  = 0x0f, /* Null information. */
+  RLPU_UI    = 0x00, /* Unnumbered Information. */
+  RLPU_XID   = 0x17, /* Exchange Identification. */
+  RLPU_TEST  = 0x1c, /* Test. */
+  RLPU_REMAP = 0x11  /* Remap. */
+} RLP_UFrameType;
+
+/* Define supervisory frame field. */
+
+typedef enum {
+  RLPS_RR   = 0x00, /* Receive Ready. */
+  RLPS_REJ  = 0x02, /* Reject. */
+  RLPS_RNR  = 0x01, /* Receive Not Ready. */
+  RLPS_SREJ = 0x03  /* Selective Reject. */
+} RLP_SFrameField;
+
+/* Used for CurrentFrameType. */
+
+typedef enum {
+  RLPFT_U_SABM = 0x00,
+  RLPFT_U_UA,
+  RLPFT_U_DISC,
+  RLPFT_U_DM,
+  RLPFT_U_NULL,
+  RLPFT_U_UI,
+  RLPFT_U_XID,
+  RLPFT_U_TEST,
+  RLPFT_U_REMAP,
+  RLPFT_S_RR,
+  RLPFT_S_REJ,
+  RLPFT_S_RNR,
+  RLPFT_S_SREJ,
+  RLPFT_SI_RR,
+  RLPFT_SI_REJ,
+  RLPFT_SI_RNR,
+  RLPFT_SI_SREJ,
+  RLPFT_BAD
+} RLP_FrameTypes;
+
+/* Frame definition for TCH/F9.6 frame. */
+
+typedef struct {
+  u8 Header[2];
+  u8 Data[25];    
+  u8 FCS[3];
+} RLP_F96Frame;   
+
+/* Header data "split up" for TCH/F9.6 frame. */
+
+typedef struct {
+  u8            Ns;   /* Send sequence number. */
+  u8            Nr;   /* Receive sequence number. */
+  u8            M;    /* Unumbered frame type. */
+  u8            S;    /* Status. */
+  bool          PF;   /* Poll/Final. */
+  bool          CR;   /* Command/Response. */
+  RLP_FrameType Type; /* Frame type. */
+} RLP_F96Header;
+
+
+/* RLP User requests */
+
+typedef struct {
+  bool Conn_Req;
+  bool Attach_Req;
+  bool Conn_Req_Neg;
+  bool Reset_Resp;
+  bool Disc_Req;
+} RLP_UserRequestStore;
+
+typedef enum {
+  Conn_Req,
+  Attach_Req,
+  Conn_Req_Neg,
+  Reset_Resp,
+  Disc_Req
+} RLP_UserRequests;
+
+typedef enum {
+  Conn_Ind,
+  Conn_Conf,
+  Disc_Ind,
+  Reset_Ind,
+  Data,                /* FIXME: This should really be called RLP_Data, otherwise it hogs name "Data"! */
+  StatusChange,
+  GetData
+} RLP_UserInds;
+
+/* RLP (main) states. See GSM specification 04.22 Annex A, Section A.1.1. */
+
+typedef enum {
+  RLP_S0, /* ADM and Detached */
+  RLP_S1, /* ADM and Attached */
+  RLP_S2, /* Pending Connect Request */
+  RLP_S3, /* Pending Connect Indication */
+  RLP_S4, /* ABM and Connection Established */
+  RLP_S5, /* Disconnect Initiated */
+  RLP_S6, /* Pending Reset Request */
+  RLP_S7, /* Pending Reset Indication */
+  RLP_S8  /* Error */
+} RLP_State;
+
+/* RLP specification defines several states in which variables can be. */
+
+typedef enum {
+  _idle=0,
+  _send,
+  _wait,
+  _rcvd,
+  _ackn,
+  _rej,
+  _srej
+} RLP_StateVariable;
+
+
+/* RLP Data */
+
+typedef struct { 
+  u8 Data[25];
+  RLP_StateVariable State;
+} RLP_Data;
+
+
+
+/* Prototypes for functions. */
+
+void RLP_DisplayF96Frame(RLP_F96Frame *frame);
+void RLP_DecodeF96Header(RLP_F96Frame *frame, RLP_F96Header *header);
+void RLP_DisplayXID(u8 *frame);
+void RLP_Initialise(bool (*rlp_send_function)(RLP_F96Frame *frame, bool out_dtx), int (*rlp_passup)(RLP_UserInds ind, u8 *buffer, int length));
+void RLP_Init_link_vars(void);
+void RLP_SetUserRequest(RLP_UserRequests type, bool value);
+void RLP_Send(char *buffer, int length);
+
+#endif /* __data_rlp_common_h */