1 /* $NetBSD: i4b_l2.h,v 1.8 2003/10/03 16:38:44 pooka Exp $ */ 2 3 /* 4 * Copyright (c) 1997, 2000 Hellmuth Michaelis. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 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. 14 * 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 25 * SUCH DAMAGE. 26 * 27 *--------------------------------------------------------------------------- 28 * 29 * i4b_l2.h - ISDN layer 2 (Q.921) definitions 30 * --------------------------------------------- 31 * 32 * $Id: i4b_l2.h,v 1.1 2003/04/06 04:37:48 tg Exp $ 33 * 34 * $FreeBSD$ 35 * 36 * last edit-date: [Sat Mar 18 10:28:22 2000] 37 * 38 *---------------------------------------------------------------------------*/ 39 40 #ifndef _I4B_L2_H_ 41 #define _I4B_L2_H_ 42 #include <sys/timeout.h> 43 typedef struct l2_softc { 44 const struct isdn_layer1_isdnif_driver * driver; 45 void* l1_token; 46 struct isdn_l3_driver *drv; 47 48 int Q921_state; /* state according to Q.921 */ 49 50 u_char last_ril; /* last reference number from TEI management */ 51 u_char last_rih; 52 53 int tei_valid; /* tei is valid flag */ 54 #define TEI_INVALID 0 55 #define TEI_VALID 1 56 int tei; /* tei, if tei flag valid */ 57 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 */ 62 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 timeout T200_callout; 70 struct timeout T202_callout; 71 struct timeout T203_callout; 72 struct timeout IFQU_callout; 73 74 /* 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). 79 */ 80 #define IFQU_DLY (hz/5) /* reschedule I-FRAME-QUEUED-UP 0.2 sec */ 81 82 int vr; /* receive sequence frame counter */ 83 int vs; /* transmit sequence frame counter */ 84 int va; /* acknowledge sequence frame counter */ 85 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 */ 91 92 int bchan_state[2]; 93 94 struct ifqueue i_queue; /* queue of outgoing i frames */ 95 #define IQUEUE_MAXLEN 20 96 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 */ 101 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 */ 106 107 int iframe_sent; /* check if i frame acked by another i frame */ 108 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 */ 111 112 /* statistics */ 113 114 lapdstat_t stat; /* lapd protocol statistics */ 115 116 } l2_softc_t; 117 118 /* Q.912 system parameters (Q.921 03/93 pp 43) */ 119 120 #define MAX_K_VALUE 1 /* BRI - # of outstanding frames */ 121 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 */ 125 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*/ 130 131 /* modulo 128 operations */ 132 133 #define M128INC(v) (v)++; \ 134 if((v)>127) \ 135 { \ 136 v = 0; \ 137 } 138 139 #define M128DEC(v) (v)--; \ 140 if((v)<0) \ 141 { \ 142 v = 127;\ 143 } 144 145 /* P-bit values */ 146 147 typedef enum { 148 P0, 149 P1 150 } pbit_t; 151 152 /* F-bit values */ 153 154 typedef enum { 155 F0, 156 F1 157 } fbit_t; 158 159 /* CR-bit values to NT */ 160 161 typedef enum { 162 CR_CMD_TO_NT, 163 CR_RSP_TO_NT 164 } crbit_to_nt_t; 165 166 /* CR-bit values from NT */ 167 168 typedef enum { 169 CR_RSP_FROM_NT, 170 CR_CMD_FROM_NT 171 } crbit_from_nt_t; 172 173 /* address field - octett 2 */ 174 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 */ 179 180 /* extract and insert macros for SAPI octett */ 181 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) 186 187 /* address field - octett 3 */ 188 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 */ 193 194 /* control field - octett 4 */ 195 196 #define OFF_CNTL 2 /* 1st byte of control field */ 197 198 /* S frames */ 199 200 #define S_FRAME_LEN 4 /* lenght 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 */ 212 213 /* U frames */ 214 215 #define UI_HDR_LEN 3 /* length of UI header in front of L3 frame */ 216 #define U_FRAME_LEN 3 /* lenght 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) 221 222 /* commands/responses with pf bit set to 0 */ 223 224 #define SABME 0x6f 225 #define DM 0x0f 226 #define UI 0x03 227 #define DISC 0x43 228 #define UA 0x63 229 #define FRMR 0x87 230 #define XID 0xaf 231 232 /* control field - octett 3 */ 233 234 #define OFF_MEI 3 /* 2nd byte of control field */ 235 236 /* control field - octett 4,5 */ 237 238 #define OFF_RIL 4 /* Ri low byte */ 239 #define OFF_RIH 5 /* Ri high byte */ 240 241 /* control field - octett 6 */ 242 243 #define OFF_MT 6 /* Message Type */ 244 #define OFF_AI 7 /* Action Indicator */ 245 #define GET_TEIFROMAI(octett) (((octett) >> 1) & 0x7f) 246 247 /* I frame */ 248 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) 257 258 /* structure of a TEI management frame */ 259 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 */ 265 #define MEI 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 */ 277 278 /* i4b_mdl_error_ind codes */ 279 280 enum MDL_ERROR_CODES { 281 MDL_ERR_A, 282 MDL_ERR_B, 283 MDL_ERR_C, 284 MDL_ERR_D, 285 MDL_ERR_E, 286 MDL_ERR_F, 287 MDL_ERR_G, 288 MDL_ERR_H, 289 MDL_ERR_I, 290 MDL_ERR_J, 291 MDL_ERR_K, 292 MDL_ERR_L, 293 MDL_ERR_M, 294 MDL_ERR_N, 295 MDL_ERR_O, 296 MDL_ERR_MAX 297 }; 298 299 /* forward decl */ 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, 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 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 ); 352 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 __P(( unsigned char *data, int len )); 366 367 #endif /* _I4B_L2_H_ */ 368