1 /* $NetBSD: i4b_l2.h,v 1.13 2007/03/04 06:03:31 christos Exp $ */
4 * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 *---------------------------------------------------------------------------
29 * i4b_l2.h - ISDN layer 2 (Q.921) definitions
30 * ---------------------------------------------
32 * $Id: i4b_l2.h,v 1.14 2009/03/14 14:46:11 dsl Exp $
36 * last edit-date: [Sat Mar 18 10:28:22 2000]
38 *---------------------------------------------------------------------------*/
40 #ifndef _NETISDN_I4B_L2_H_
41 #define _NETISDN_I4B_L2_H_
43 typedef struct l2_softc
{
44 const struct isdn_layer1_isdnif_driver
* driver
;
46 struct isdn_l3_driver
*drv
;
48 int Q921_state
; /* state according to Q.921 */
50 u_char last_ril
; /* last reference number from TEI management */
53 int tei_valid
; /* tei is valid flag */
56 int tei
; /* tei, if tei flag valid */
58 int ph_active
; /* Layer 1 active flag */
59 #define PH_INACTIVE 0 /* layer 1 inactive */
60 #define PH_ACTIVEPEND 1 /* already tried to activate */
61 #define PH_ACTIVE 2 /* layer 1 active */
63 int T200
; /* Multiframe timeout timer */
64 int T201
; /* min time between TEI ID check */
65 int T202
; /* min time between TEI ID Req messages */
66 int N202
; /* TEI ID Req tx counter */
67 void(*T202func
)(void *);/* function to be called when T202 expires */
68 int T203
; /* max line idle time */
69 struct callout T200_callout
;
70 struct callout T202_callout
;
71 struct callout T203_callout
;
72 struct callout IFQU_callout
;
75 * i4b_iframe.c, i4b_i_frame_queued_up(): value of IFQU_DLY
76 * some experimentation Gary did showed a minimal value of (hz/20) was
77 * possible to let this work, Gary suggested using (hz/10) but i settled
78 * down to using (hz/5) for now (-hm).
80 #define IFQU_DLY (hz/5) /* reschedule I-FRAME-QUEUED-UP 0.2 sec */
82 int vr
; /* receive sequence frame counter */
83 int vs
; /* transmit sequence frame counter */
84 int va
; /* acknowledge sequence frame counter */
86 int ack_pend
; /* acknowledge pending */
87 int rej_excpt
; /* reject exception */
88 int peer_busy
; /* peer receiver busy */
89 int own_busy
; /* own receiver busy */
90 int l3initiated
; /* layer 3 initiated */
94 struct ifqueue i_queue
; /* queue of outgoing i frames */
95 #define IQUEUE_MAXLEN 20
97 /* this implementation only supports a k-value of 1 !!! */
98 struct mbuf
*ua_frame
; /* last unacked frame */
99 int ua_num
; /* last unacked frame number */
100 #define UA_EMPTY (-1) /* ua_frame is unused */
102 int rxd_CR
; /* received Command Response bit */
103 int rxd_PF
; /* received Poll/Final bit */
104 int rxd_NR
; /* received N(R) field */
105 int RC
; /* Retry Counter */
107 int iframe_sent
; /* check if i frame acked by another i frame */
109 int (*postfsmfunc
)(struct isdn_l3_driver
*drv
);/* function to be called at fsm exit */
110 struct isdn_l3_driver
*postfsmarg
; /* argument for above function */
114 lapdstat_t stat
; /* lapd protocol statistics */
118 /* Q.912 system parameters (Q.921 03/93 pp 43) */
120 #define MAX_K_VALUE 1 /* BRI - # of outstanding frames */
122 #define N200 3 /* max no of retransmissions */
123 #define N201DEF 260 /* max no of octetts in information field */
124 #define N202DEF 3 /* max no of TEI ID Request message transmissions */
126 #define T200DEF (hz*1) /* default T200 timer value = 1 second */
127 #define T201DEF T200DEF /* default T201 timer value = T200DEF */
128 #define T202DEF (hz*2) /* default T202 timer value = 2 seconds */
129 #define T203DEF (hz*10) /* default T203 timer value = 10 seconds*/
131 /* modulo 128 operations */
133 #define M128INC(v) (v)++; \
139 #define M128DEC(v) (v)--; \
159 /* CR-bit values to NT */
166 /* CR-bit values from NT */
173 /* address field - octett 2 */
175 #define OFF_SAPI 0 /* SAPI offset, HDLC flag is eaten by L1 */
176 #define SAPI_CCP 0 /* SAPI = 0 - call control procedures */
177 #define SAPI_X25 16 /* SAPI = 16 - X.25 packet procedures */
178 #define SAPI_L2M 63 /* SAPI = 63 - Layer 2 management procedures */
180 /* extract and insert macros for SAPI octett */
182 #define GETSAPI(octett) (((octett) >> 2) & 0x3f)
183 #define PUTSAPI(sapi,cr,octett) ((octett) = (((sapi << 2) & 0xfc) | ((cr & 0x01) << 1)))
184 #define GETCR(octett) (((octett) >> 1) & 0x01)
185 #define GETEA(octett) ((octett) & 0x01)
187 /* address field - octett 3 */
189 #define OFF_TEI 1 /* TEI offset */
190 #define GETTEI(octett) (((octett) >> 1) & 0x7f)
191 #define PUTTEI(tei, octett) ((octett) = ((((tei) << 1) & 0xfe)) | 0x01)
192 #define GROUP_TEI 127 /* broadcast TEI for LME */
194 /* control field - octett 4 */
196 #define OFF_CNTL 2 /* 1st byte of control field */
200 #define S_FRAME_LEN 4 /* length of a U-frame */
201 #define OFF_SRCR 2 /* 1st byte of control field, */
202 /* R-commands and R-responses */
203 #define OFF_SNR 3 /* 2nd byte of control field, N(R) and PF */
204 #define SPFBIT 0x01 /* poll/final bit mask */
205 #define SPBITSET SPFBIT
206 #define SFBITSET SPFBIT
207 #define GETSNR(octett) (((octett) >> 1) & 0x7f)
208 #define GETSPF(octett) ((octett) & SPFBIT)
209 #define RR 0x01 /* RR and bit 0 set */
210 #define RNR 0x05 /* RNR and bit 0 set */
211 #define REJ 0x09 /* REJ and bit 0 set */
215 #define UI_HDR_LEN 3 /* length of UI header in front of L3 frame */
216 #define U_FRAME_LEN 3 /* length of a U-frame */
217 #define UPFBIT 0x10 /* poll/final bit mask */
218 #define UPBITSET UPFBIT
219 #define UFBITSET UPFBIT
220 #define GETUPF(octett) (((octett) >> 4) & 0x01)
222 /* commands/responses with pf bit set to 0 */
232 /* control field - octett 3 */
234 #define OFF_MEI 3 /* 2nd byte of control field */
236 /* control field - octett 4,5 */
238 #define OFF_RIL 4 /* Ri low byte */
239 #define OFF_RIH 5 /* Ri high byte */
241 /* control field - octett 6 */
243 #define OFF_MT 6 /* Message Type */
244 #define OFF_AI 7 /* Action Indicator */
245 #define GET_TEIFROMAI(octett) (((octett) >> 1) & 0x7f)
249 #define I_HDR_LEN 4 /* length of I header in front of L3 frame */
250 #define OFF_INS 2 /* transmit sequence number */
251 #define OFF_INR 3 /* receive sequence number */
252 #define IPFBIT 0x01 /* poll/final bit mask */
253 #define IPBITSET 0x01
254 #define GETINR(octett) (((octett) >> 1) & 0x7f)
255 #define GETINS(octett) (((octett) >> 1) & 0x7f)
256 #define GETIP(octett) ((octett) & IPFBIT)
258 /* structure of a TEI management frame */
260 #define TEI_MGMT_FRM_LEN 8 /* frame length */
261 #define TEIM_SAPIO 0x00 /* SAPI, CR, EA */
262 #define TEIM_TEIO 0x01 /* TEI, EA */
263 #define TEIM_UIO 0x02 /* frame type = UI = 0x03 */
264 #define TEIM_MEIO 0x03 /* management entity id = 0x0f */
266 #define TEIM_RILO 0x04 /* reference number, low */
267 #define TEIM_RIHO 0x05 /* reference number, high */
268 #define TEIM_MTO 0x06 /* message type */
269 #define MT_ID_REQEST 0x01
270 #define MT_ID_ASSIGN 0x02
271 #define MT_ID_DENY 0x03
272 #define MT_ID_CHK_REQ 0x04
273 #define MT_ID_CHK_RSP 0x05
274 #define MT_ID_REMOVE 0x06
275 #define MT_ID_VERIFY 0x07
276 #define TEIM_AIO 0x07 /* action indicator */
278 /* i4b_mdl_error_ind codes */
280 enum MDL_ERROR_CODES
{
300 struct isdn_l3_driver
;
301 extern void i4b_acknowledge_pending ( l2_softc_t
*l2sc
);
302 extern struct mbuf
* i4b_build_s_frame ( l2_softc_t
*l2sc
, crbit_to_nt_t crbit
, pbit_t pbit
, u_char type
);
303 extern struct mbuf
* i4b_build_u_frame ( l2_softc_t
*l2sc
, crbit_to_nt_t crbit
, pbit_t pbit
, u_char type
);
304 extern void i4b_clear_exception_conditions ( l2_softc_t
*l2sc
);
305 extern int i4b_dl_data_req ( l2_softc_t
*, struct isdn_l3_driver
*drv
, struct mbuf
*m
);
306 extern int i4b_dl_establish_req ( l2_softc_t
*, struct isdn_l3_driver
*drv
);
307 extern int i4b_dl_release_req ( l2_softc_t
*, struct isdn_l3_driver
*drv
);
308 extern int i4b_dl_unit_data_req ( l2_softc_t
*, struct isdn_l3_driver
*drv
, struct mbuf
*m
);
309 extern void i4b_enquiry_response ( l2_softc_t
*l2sc
);
310 extern void i4b_establish_data_link ( l2_softc_t
*l2sc
);
311 extern void i4b_invoke_retransmission ( l2_softc_t
*l2sc
, int nr
);
312 extern void i4b_i_frame_queued_up ( l2_softc_t
*l2sc
);
313 extern void i4b_l1_activate ( l2_softc_t
*l2sc
);
314 extern int i4b_l2_nr_ok ( int nr
, int va
, int vs
);
315 extern void i4b_make_rand_ri ( l2_softc_t
*l2sc
);
316 extern void i4b_mdl_assign_ind ( l2_softc_t
*l2sc
);
317 extern void i4b_mdl_error_ind ( l2_softc_t
*l2sc
, const char *where
, int errorcode
);
318 extern void i4b_next_l2state ( l2_softc_t
*l2sc
, struct isdn_l3_driver
*drv
, int event
);
319 extern void i4b_nr_error_recovery ( l2_softc_t
*l2sc
);
320 extern int i4b_ph_activate_ind ( l2_softc_t
* );
321 extern int i4b_ph_deactivate_ind ( l2_softc_t
* );
322 extern void i4b_print_frame ( int len
, u_char
*buf
);
323 extern const 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
, struct isdn_l3_driver
*drv
, int nr
);
326 extern void i4b_rxd_i_frame ( l2_softc_t
*, struct isdn_l3_driver
*drv
, struct mbuf
*m
);
327 extern void i4b_rxd_s_frame ( l2_softc_t
*, struct isdn_l3_driver
*drv
, struct mbuf
*m
);
328 extern void i4b_rxd_u_frame ( l2_softc_t
*, struct isdn_l3_driver
*drv
, 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 ( l2_softc_t
*, struct isdn_l3_driver
*, 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
);
353 struct isdn_l3_driver
;
354 extern int i4b_l2_channel_get_state(struct isdn_l3_driver
*drv
, int b_chanid
);
355 extern void i4b_l2_channel_set_state(struct isdn_l3_driver
*drv
, int b_chanid
, int state
);
356 extern int i4b_mdl_status_ind ( struct isdn_l3_driver
*drv
, int status
, int parm
);
357 extern int i4b_dl_release_ind ( struct isdn_l3_driver
*drv
);
358 extern int i4b_dl_establish_ind ( struct isdn_l3_driver
*drv
);
359 extern int i4b_dl_release_cnf ( struct isdn_l3_driver
*drv
);
360 extern int i4b_dl_establish_cnf ( struct isdn_l3_driver
*drv
);
361 extern int i4b_dl_unit_data_ind ( struct isdn_l3_driver
*drv
, struct mbuf
*m
);
362 extern int i4b_dl_data_ind ( struct isdn_l3_driver
*drv
, struct mbuf
*m
);
363 int i4b_mdl_command_req(struct isdn_l3_driver
*drv
, int, void *);
364 void *isdn_find_softc_by_isdnif(int isdnif
);
365 extern int isdn_bchan_silence( unsigned char *data
, int len
);
367 #endif /* !_NETISDN_I4B_L2_H_ */