Update: orig2001_11_27_05_17 -> orig2001_11_27_22_58
[gnokii.git] / include / data / rlp-common.h
1 /*
2
3   $Id$
4
5   G N O K I I
6
7   A Linux/Unix toolset and driver for Nokia mobile phones.
8
9   Copyright (C) 1999, 2000 Hugh Blemings & Pavel Janík ml.
10
11   Released under the terms of the GNU GPL, see file COPYING for more details.
12
13   The development of RLP protocol is sponsored by SuSE CR, s.r.o. (Pavel use
14   the SIM card from SuSE for testing purposes).
15
16   This file:  rlp-common.h   Version 0.3.1
17
18   Header file for RLP protocol.
19
20   $Log$
21   Revision 1.1.1.1.8.1  2001/11/27 23:06:09  short
22   Update: orig2001_11_27_05_17 -> orig2001_11_27_22_58
23
24   Revision 1.1.1.1.2.1  2001/11/27 22:48:37  short
25   Update: orig2001_11_27_05_17 -> orig2001_11_27_22_58
26
27   Revision 1.1.1.2  2001/11/27 22:01:28  short
28   :pserver:cvs@pserver.samba.org:/cvsroot - gnokii - Tue Nov 27 22:58 CET 2001
29
30   Revision 1.3  2001/11/27 12:19:01  pkot
31   Cleanup, indentation, ANSI complaint preprocesor symbols (Jan Kratochvil, me)
32
33   Revision 1.2  2001/06/10 11:29:49  machek
34   It is very bad idea to name enum "Data", because it is then impossible
35   to use variable called "Data".
36
37   Revision 1.1  2001/02/21 19:57:11  chris
38   More fiddling with the directory layout
39 */
40
41 #ifndef __data_rlp_common_h
42 #define __data_rlp_common_h
43
44 #ifndef __misc_h
45 #  include "misc.h"
46 #endif
47
48 /* Global variables */
49
50 /* Defines */
51
52 /* Data types */
53
54 /* Typedef for frame type - they are the same for RLP version 0, 1 and 2. */
55 typedef enum {
56         RLPFT_X, /* Unknown. */
57         RLPFT_U, /* Unnumbered frame. */
58         RLPFT_S, /* Supervisory frame. */
59         RLPFT_IS /* Information plus Supervisory (I+S) frame. */
60 } RLP_FrameType;
61
62 /* Define the various Unnumbered frame types. Numbering is bit reversed
63    relative to ETSI GSM 04.22 for easy parsing. */
64 typedef enum {
65         RLPU_SABM  = 0x07, /* Set Asynchronous Balanced Mode. */
66         RLPU_UA    = 0x0c, /* Unnumbered Acknowledge. */
67         RLPU_DISC  = 0x08, /* Disconnect. */
68         RLPU_DM    = 0x03, /* Disconnected Mode. */
69         RLPU_NULL  = 0x0f, /* Null information. */
70         RLPU_UI    = 0x00, /* Unnumbered Information. */
71         RLPU_XID   = 0x17, /* Exchange Identification. */
72         RLPU_TEST  = 0x1c, /* Test. */
73         RLPU_REMAP = 0x11  /* Remap. */
74 } RLP_UFrameType;
75
76 /* Define supervisory frame field. */
77 typedef enum {
78         RLPS_RR   = 0x00, /* Receive Ready. */
79         RLPS_REJ  = 0x02, /* Reject. */
80         RLPS_RNR  = 0x01, /* Receive Not Ready. */
81         RLPS_SREJ = 0x03  /* Selective Reject. */
82 } RLP_SFrameField;
83
84 /* Used for CurrentFrameType. */
85 typedef enum {
86         RLPFT_U_SABM = 0x00,
87         RLPFT_U_UA,
88         RLPFT_U_DISC,
89         RLPFT_U_DM,
90         RLPFT_U_NULL,
91         RLPFT_U_UI,
92         RLPFT_U_XID,
93         RLPFT_U_TEST,
94         RLPFT_U_REMAP,
95         RLPFT_S_RR,
96         RLPFT_S_REJ,
97         RLPFT_S_RNR,
98         RLPFT_S_SREJ,
99         RLPFT_SI_RR,
100         RLPFT_SI_REJ,
101         RLPFT_SI_RNR,
102         RLPFT_SI_SREJ,
103         RLPFT_BAD
104 } RLP_FrameTypes;
105
106 /* Frame definition for TCH/F9.6 frame. */
107 typedef struct {
108         u8 Header[2];
109         u8 Data[25];    
110         u8 FCS[3];
111 } RLP_F96Frame;   
112
113 /* Header data "split up" for TCH/F9.6 frame. */
114 typedef struct {
115         u8            Ns;   /* Send sequence number. */
116         u8            Nr;   /* Receive sequence number. */
117         u8            M;    /* Unumbered frame type. */
118         u8            S;    /* Status. */
119         bool          PF;   /* Poll/Final. */
120         bool          CR;   /* Command/Response. */
121         RLP_FrameType Type; /* Frame type. */
122 } RLP_F96Header;
123
124
125 /* RLP User requests */
126 typedef struct {
127         bool Conn_Req;
128         bool Attach_Req;
129         bool Conn_Req_Neg;
130         bool Reset_Resp;
131         bool Disc_Req;
132 } RLP_UserRequestStore;
133
134 typedef enum {
135         Conn_Req,
136         Attach_Req,
137         Conn_Req_Neg,
138         Reset_Resp,
139         Disc_Req
140 } RLP_UserRequests;
141
142 typedef enum {
143         Conn_Ind,
144         Conn_Conf,
145         Disc_Ind,
146         Reset_Ind,
147         Data,           /* FIXME: This should really be called RLP_Data, otherwise it hogs name "Data"! */
148         StatusChange,
149         GetData
150 } RLP_UserInds;
151
152 /* RLP (main) states. See GSM specification 04.22 Annex A, Section A.1.1. */
153 typedef enum {
154         RLP_S0, /* ADM and Detached */
155         RLP_S1, /* ADM and Attached */
156         RLP_S2, /* Pending Connect Request */
157         RLP_S3, /* Pending Connect Indication */
158         RLP_S4, /* ABM and Connection Established */
159         RLP_S5, /* Disconnect Initiated */
160         RLP_S6, /* Pending Reset Request */
161         RLP_S7, /* Pending Reset Indication */
162         RLP_S8  /* Error */
163 } RLP_State;
164
165 /* RLP specification defines several states in which variables can be. */
166 typedef enum {
167         _idle=0,
168         _send,
169         _wait,
170         _rcvd,
171         _ackn,
172         _rej,
173         _srej
174 } RLP_StateVariable;
175
176 /* RLP Data */
177 typedef struct { 
178         u8 Data[25];
179         RLP_StateVariable State;
180 } RLP_Data;
181
182 /* Prototypes for functions. */
183 void RLP_DisplayF96Frame(RLP_F96Frame *frame);
184 void RLP_DecodeF96Header(RLP_F96Frame *frame, RLP_F96Header *header);
185 void RLP_DisplayXID(u8 *frame);
186 void RLP_Initialise(bool (*rlp_send_function)(RLP_F96Frame *frame, bool out_dtx), int (*rlp_passup)(RLP_UserInds ind, u8 *buffer, int length));
187 void RLP_Init_link_vars(void);
188 void RLP_SetUserRequest(RLP_UserRequests type, bool value);
189 void RLP_Send(char *buffer, int length);
190
191 #endif  /* __data_rlp_common_h */