]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/i4b/layer2/i4b_l2.h
This commit was generated by cvs2svn to compensate for changes in r54359,
[FreeBSD/FreeBSD.git] / sys / i4b / layer2 / i4b_l2.h
1 /*
2  * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  *
25  *---------------------------------------------------------------------------
26  *
27  *      i4b_l2.h - ISDN layer 2 (Q.921) definitions
28  *      ---------------------------------------------
29  *
30  * $FreeBSD$ 
31  *
32  *      last edit-date: [Fri May 28 15:51:17 1999]
33  *
34  *---------------------------------------------------------------------------*/
35
36 #ifndef _I4B_L2_H_
37 #define _I4B_L2_H_
38
39 typedef struct {
40         int     unit;           /* unit number this entry is for */
41
42         int     Q921_state;     /* state according to Q.921 */
43
44         u_char  last_ril;       /* last reference number from TEI management */
45         u_char  last_rih;
46
47         int     tei_valid;      /* tei is valid flag */
48 #define TEI_INVALID     0
49 #define TEI_VALID       1       
50         int     tei;            /* tei, if tei flag valid */
51
52         int     ph_active;      /* Layer 1 active flag */
53 #define PH_INACTIVE     0       /* layer 1 inactive */
54 #define PH_ACTIVEPEND   1       /* already tried to activate */
55 #define PH_ACTIVE       2       /* layer 1 active */
56
57         int     T200;           /* Multiframe timeout timer */
58         int     T201;           /* min time between TEI ID check */
59         int     T202;           /* min time between TEI ID Req messages */
60         int     N202;           /* TEI ID Req tx counter */
61         void(*T202func)(void *);/* function to be called when T202 expires */
62         int     T203;           /* max line idle time */
63
64 #if defined(__FreeBSD_version) && __FreeBSD_version >= 300001
65         struct  callout_handle T200_callout;
66         struct  callout_handle T202_callout;
67         struct  callout_handle T203_callout;
68         struct  callout_handle IFQU_callout;    
69 #endif
70
71 /*
72  * i4b_iframe.c, i4b_i_frame_queued_up(): value of IFQU_DLY
73  * some experimentation Gary did showed a minimal value of (hz/20) was
74  * possible to let this work, Gary suggested using (hz/10) but i settled
75  * down to using (hz/5) for now (-hm).
76  */
77 #define IFQU_DLY (hz/5)         /* reschedule I-FRAME-QUEUED-UP 0.2 sec */
78
79         int     vr;             /* receive sequence frame counter */
80         int     vs;             /* transmit sequence frame counter */
81         int     va;             /* acknowledge sequence frame counter */
82
83         int     ack_pend;       /* acknowledge pending */
84         int     rej_excpt;      /* reject exception */
85         int     peer_busy;      /* peer receiver busy */
86         int     own_busy;       /* own receiver busy */
87         int     l3initiated;    /* layer 3 initiated */
88
89         struct ifqueue i_queue; /* queue of outgoing i frames */
90 #define IQUEUE_MAXLEN   20
91
92         /* this implementation only supports a k-value of 1 !!! */
93         struct mbuf *ua_frame;  /* last unacked frame */
94         int     ua_num;         /* last unacked frame number */
95 #define UA_EMPTY (-1)           /* ua_frame is unused   */      
96
97         int     rxd_CR;         /* received Command Response bit */
98         int     rxd_PF;         /* received Poll/Final bit */
99         int     rxd_NR;         /* received N(R) field */
100         int     RC;             /* Retry Counter */
101
102         int     iframe_sent;    /* check if i frame acked by another i frame */
103         
104         int (*postfsmfunc)(int);/* function to be called at fsm exit */
105         int     postfsmarg;     /* argument for above function */
106
107         /* statistics */
108
109         lapdstat_t      stat;   /* lapd protocol statistics */
110
111 } l2_softc_t;
112
113 extern l2_softc_t l2_softc[];
114
115 /* Q.912 system parameters (Q.921 03/93 pp 43) */
116
117 #define MAX_K_VALUE     1       /* BRI - # of outstanding frames        */
118
119 #define N200    3               /* max no of retransmissions */
120 #define N201DEF 260             /* max no of octetts in information field */
121 #define N202DEF 3               /* max no of TEI ID Request message transmissions */
122
123 #define T200DEF (hz*1)          /* default T200 timer value = 1 second  */
124 #define T201DEF T200DEF         /* default T201 timer value = T200DEF   */
125 #define T202DEF (hz*2)          /* default T202 timer value = 2 seconds */
126 #define T203DEF (hz*10)         /* default T203 timer value = 10 seconds*/
127
128 /* modulo 128 operations */
129
130 #define M128INC(v)      (v)++;          \
131                         if((v)>127)     \
132                         {               \
133                                 v = 0;  \
134                         }
135                         
136 #define M128DEC(v)      (v)--;          \
137                         if((v)<0)       \
138                         {               \
139                                 v = 127;\
140                         }
141                         
142 /* P-bit values */
143
144 typedef enum {
145         P0,
146         P1
147 } pbit_t;
148
149 /* F-bit values */
150
151 typedef enum {
152         F0,
153         F1
154 } fbit_t;
155
156 /* CR-bit values to NT */
157
158 typedef enum {
159         CR_CMD_TO_NT,
160         CR_RSP_TO_NT
161 } crbit_to_nt_t;
162
163 /* CR-bit values from NT */
164
165 typedef enum {
166         CR_RSP_FROM_NT,
167         CR_CMD_FROM_NT
168 } crbit_from_nt_t;
169
170 /* address field - octett 2 */
171
172 #define OFF_SAPI        0       /* SAPI offset, HDLC flag is eaten by L1 */
173 #define SAPI_CCP        0       /* SAPI = 0 - call control procedures */
174 #define SAPI_X25        16      /* SAPI = 16 - X.25 packet procedures */
175 #define SAPI_L2M        63      /* SAPI = 63 - Layer 2 management procedures */
176
177 /* extract and insert macros for SAPI octett */
178
179 #define GETSAPI(octett)         (((octett) >> 2) & 0x3f)
180 #define PUTSAPI(sapi,cr,octett) ((octett) = (((sapi << 2) & 0xfc) | ((cr & 0x01) << 1)))
181 #define GETCR(octett)           (((octett) >> 1) & 0x01)
182 #define GETEA(octett)           ((octett) & 0x01)
183
184 /* address field - octett 3 */
185
186 #define OFF_TEI         1       /* TEI offset */
187 #define GETTEI(octett) (((octett) >> 1) & 0x7f)
188 #define PUTTEI(tei, octett) ((octett) = ((((tei) << 1) & 0xfe)) | 0x01) 
189 #define GROUP_TEI       127     /* broadcast TEI for LME */
190
191 /* control field - octett 4 */
192
193 #define OFF_CNTL        2       /* 1st byte of control field */
194
195 /* S frames */
196
197 #define S_FRAME_LEN     4       /* lenght of a U-frame */
198 #define OFF_SRCR        2       /* 1st byte of control field,   */
199                                 /* R-commands and R-responses   */
200 #define OFF_SNR         3       /* 2nd byte of control field, N(R) and PF */
201 #define SPFBIT          0x01    /* poll/final bit mask */
202 #define SPBITSET        SPFBIT
203 #define SFBITSET        SPFBIT
204 #define GETSNR(octett) (((octett) >> 1) & 0x7f)
205 #define GETSPF(octett) ((octett) & SPFBIT)
206 #define RR              0x01    /* RR and bit 0 set */
207 #define RNR             0x05    /* RNR and bit 0 set */
208 #define REJ             0x09    /* REJ and bit 0 set */
209
210 /* U frames */
211
212 #define UI_HDR_LEN      3       /* length of UI header in front of L3 frame */
213 #define U_FRAME_LEN     3       /* lenght of a U-frame */
214 #define UPFBIT          0x10    /* poll/final bit mask */
215 #define UPBITSET        UPFBIT
216 #define UFBITSET        UPFBIT
217 #define GETUPF(octett) (((octett) >> 4) & 0x01)
218
219 /* commands/responses with pf bit set to 0 */
220
221 #define SABME           0x6f
222 #define DM              0x0f
223 #define UI              0x03
224 #define DISC            0x43
225 #define UA              0x63
226 #define FRMR            0x87
227 #define XID             0xaf
228
229 /* control field - octett 3 */
230
231 #define OFF_MEI         3       /* 2nd byte of control field */
232
233 /* control field - octett 4,5 */
234
235 #define OFF_RIL         4       /* Ri low byte */
236 #define OFF_RIH         5       /* Ri high byte */
237
238 /* control field - octett 6 */
239
240 #define OFF_MT          6       /* Message Type */
241 #define OFF_AI          7       /* Action Indicator  */
242 #define GET_TEIFROMAI(octett) (((octett) >> 1) & 0x7f)
243
244 /* I frame */
245
246 #define I_HDR_LEN       4       /* length of I header in front of L3 frame */
247 #define OFF_INS         2       /* transmit sequence number */
248 #define OFF_INR         3       /* receive sequence number */
249 #define IPFBIT          0x01    /* poll/final bit mask */
250 #define IPBITSET        0x01
251 #define GETINR(octett)  (((octett) >> 1) & 0x7f)
252 #define GETINS(octett)  (((octett) >> 1) & 0x7f)
253 #define GETIP(octett)   ((octett) & IPFBIT)
254
255 /* structure of a TEI management frame */
256
257 #define TEI_MGMT_FRM_LEN   8            /* frame length */
258 #define TEIM_SAPIO      0x00            /* SAPI, CR, EA */
259 #define TEIM_TEIO       0x01            /* TEI, EA */
260 #define TEIM_UIO        0x02            /* frame type = UI = 0x03 */
261 #define TEIM_MEIO       0x03            /* management entity id = 0x0f */
262 #define         MEI     0x0f    
263 #define TEIM_RILO       0x04            /* reference number, low  */
264 #define TEIM_RIHO       0x05            /* reference number, high */
265 #define TEIM_MTO        0x06            /* message type */
266 #define         MT_ID_REQEST    0x01
267 #define         MT_ID_ASSIGN    0x02
268 #define         MT_ID_DENY      0x03
269 #define         MT_ID_CHK_REQ   0x04
270 #define         MT_ID_CHK_RSP   0x05
271 #define         MT_ID_REMOVE    0x06
272 #define         MT_ID_VERIFY    0x07
273 #define TEIM_AIO        0x07            /* action indicator */
274
275 /* i4b_mdl_error_ind codes */
276
277 enum MDL_ERROR_CODES {
278         MDL_ERR_A,
279         MDL_ERR_B,
280         MDL_ERR_C,
281         MDL_ERR_D,
282         MDL_ERR_E,
283         MDL_ERR_F,
284         MDL_ERR_G,
285         MDL_ERR_H,
286         MDL_ERR_I,
287         MDL_ERR_J,
288         MDL_ERR_K,
289         MDL_ERR_L,
290         MDL_ERR_M,
291         MDL_ERR_N,
292         MDL_ERR_O,
293         MDL_ERR_MAX     
294 };
295
296 /* forward decl */
297
298 extern void i4b_acknowledge_pending ( l2_softc_t *l2sc );
299 extern struct mbuf * i4b_build_s_frame ( l2_softc_t *l2sc, crbit_to_nt_t crbit, pbit_t pbit, u_char type );
300 extern struct mbuf * i4b_build_u_frame ( l2_softc_t *l2sc, crbit_to_nt_t crbit, pbit_t pbit, u_char type );
301 extern void i4b_clear_exception_conditions ( l2_softc_t *l2sc );
302 extern int i4b_dl_data_req ( int unit, struct mbuf *m );
303 extern int i4b_dl_establish_req ( int unit );
304 extern int i4b_dl_release_req ( int unit );
305 extern int i4b_dl_unit_data_req ( int unit, struct mbuf *m );
306 extern void i4b_enquiry_response ( l2_softc_t *l2sc );
307 extern void i4b_establish_data_link ( l2_softc_t *l2sc );
308 extern void i4b_invoke_retransmission ( l2_softc_t *l2sc, int nr );
309 extern void i4b_i_frame_queued_up ( l2_softc_t *l2sc );
310 extern void i4b_l1_activate ( l2_softc_t *l2sc );
311 extern int i4b_l2_nr_ok ( int nr, int va, int vs );
312 extern void i4b_make_rand_ri ( l2_softc_t *l2sc );
313 extern void i4b_mdl_assign_ind ( l2_softc_t *l2sc );
314 extern void i4b_mdl_error_ind ( l2_softc_t *l2sc, char *where, int errorcode );
315 extern int i4b_mph_attach_ind ( int unit, int type );
316 extern int i4b_mph_status_ind ( int unit, int status, int parm );
317 extern void i4b_next_l2state ( l2_softc_t *l2sc, int event );
318 extern void i4b_nr_error_recovery ( l2_softc_t *l2sc );
319 extern int i4b_ph_activate_ind ( int unit );
320 extern int i4b_ph_deactivate_ind ( int unit );
321 extern int i4b_ph_data_ind ( int unit, struct mbuf *m );
322 extern void i4b_print_frame ( int len, u_char *buf );
323 extern char *i4b_print_l2state ( l2_softc_t *l2sc );
324 extern void i4b_print_l2var ( l2_softc_t *l2sc );
325 extern void i4b_rxd_ack(l2_softc_t *l2sc, int nr);
326 extern void i4b_rxd_i_frame ( int unit, struct mbuf *m );
327 extern void i4b_rxd_s_frame ( int unit, struct mbuf *m );
328 extern void i4b_rxd_u_frame ( int unit, struct mbuf *m );
329 extern void i4b_T200_restart ( l2_softc_t *l2sc );
330 extern void i4b_T200_start ( l2_softc_t *l2sc );
331 extern void i4b_T200_stop ( l2_softc_t *l2sc );
332 extern void i4b_T202_start ( l2_softc_t *l2sc );
333 extern void i4b_T202_stop ( l2_softc_t *l2sc );
334 extern void i4b_T203_restart ( l2_softc_t *l2sc );
335 extern void i4b_T203_start ( l2_softc_t *l2sc );
336 extern void i4b_T203_stop ( l2_softc_t *l2sc );
337 extern void i4b_tei_assign ( l2_softc_t *l2sc );
338 extern void i4b_tei_chkresp ( l2_softc_t *l2sc );
339 extern void i4b_tei_rxframe ( int unit, struct mbuf *m );
340 extern void i4b_tei_verify ( l2_softc_t *l2sc );
341 extern void i4b_transmit_enquire ( l2_softc_t *l2sc );
342 extern void i4b_tx_disc ( l2_softc_t *l2sc, pbit_t pbit );
343 extern void i4b_tx_dm ( l2_softc_t *l2sc, fbit_t fbit );
344 extern void i4b_tx_frmr ( l2_softc_t *l2sc, fbit_t fbit );
345 extern void i4b_tx_rej_response ( l2_softc_t *l2sc, fbit_t fbit );
346 extern void i4b_tx_rnr_command ( l2_softc_t *l2sc, pbit_t pbit );
347 extern void i4b_tx_rnr_response ( l2_softc_t *l2sc, fbit_t fbit );
348 extern void i4b_tx_rr_command ( l2_softc_t *l2sc, pbit_t pbit );
349 extern void i4b_tx_rr_response ( l2_softc_t *l2sc, fbit_t fbit );
350 extern void i4b_tx_sabme ( l2_softc_t *l2sc, pbit_t pbit );
351 extern void i4b_tx_ua ( l2_softc_t *l2sc, fbit_t fbit );
352
353 #endif /* _I4B_L2_H_ */