1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Layer 2 defines 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright 2008 by Karsten Keil <kkeil@novell.com> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/mISDNif.h> 9*4882a593Smuzhiyun #include <linux/skbuff.h> 10*4882a593Smuzhiyun #include "fsm.h" 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define MAX_WINDOW 8 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun struct manager { 15*4882a593Smuzhiyun struct mISDNchannel ch; 16*4882a593Smuzhiyun struct mISDNchannel bcast; 17*4882a593Smuzhiyun u_long options; 18*4882a593Smuzhiyun struct list_head layer2; 19*4882a593Smuzhiyun rwlock_t lock; 20*4882a593Smuzhiyun struct FsmInst deact; 21*4882a593Smuzhiyun struct FsmTimer datimer; 22*4882a593Smuzhiyun struct sk_buff_head sendq; 23*4882a593Smuzhiyun struct mISDNchannel *up; 24*4882a593Smuzhiyun u_int nextid; 25*4882a593Smuzhiyun u_int lastid; 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct teimgr { 29*4882a593Smuzhiyun int ri; 30*4882a593Smuzhiyun int rcnt; 31*4882a593Smuzhiyun struct FsmInst tei_m; 32*4882a593Smuzhiyun struct FsmTimer timer; 33*4882a593Smuzhiyun int tval, nval; 34*4882a593Smuzhiyun struct layer2 *l2; 35*4882a593Smuzhiyun struct manager *mgr; 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct laddr { 39*4882a593Smuzhiyun u_char A; 40*4882a593Smuzhiyun u_char B; 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun struct layer2 { 44*4882a593Smuzhiyun struct list_head list; 45*4882a593Smuzhiyun struct mISDNchannel ch; 46*4882a593Smuzhiyun u_long flag; 47*4882a593Smuzhiyun int id; 48*4882a593Smuzhiyun struct mISDNchannel *up; 49*4882a593Smuzhiyun signed char sapi; 50*4882a593Smuzhiyun signed char tei; 51*4882a593Smuzhiyun struct laddr addr; 52*4882a593Smuzhiyun u_int maxlen; 53*4882a593Smuzhiyun struct teimgr *tm; 54*4882a593Smuzhiyun u_int vs, va, vr; 55*4882a593Smuzhiyun int rc; 56*4882a593Smuzhiyun u_int window; 57*4882a593Smuzhiyun u_int sow; 58*4882a593Smuzhiyun struct FsmInst l2m; 59*4882a593Smuzhiyun struct FsmTimer t200, t203; 60*4882a593Smuzhiyun int T200, N200, T203; 61*4882a593Smuzhiyun u_int next_id; 62*4882a593Smuzhiyun u_int down_id; 63*4882a593Smuzhiyun struct sk_buff *windowar[MAX_WINDOW]; 64*4882a593Smuzhiyun struct sk_buff_head i_queue; 65*4882a593Smuzhiyun struct sk_buff_head ui_queue; 66*4882a593Smuzhiyun struct sk_buff_head down_queue; 67*4882a593Smuzhiyun struct sk_buff_head tmp_queue; 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun enum { 71*4882a593Smuzhiyun ST_L2_1, 72*4882a593Smuzhiyun ST_L2_2, 73*4882a593Smuzhiyun ST_L2_3, 74*4882a593Smuzhiyun ST_L2_4, 75*4882a593Smuzhiyun ST_L2_5, 76*4882a593Smuzhiyun ST_L2_6, 77*4882a593Smuzhiyun ST_L2_7, 78*4882a593Smuzhiyun ST_L2_8, 79*4882a593Smuzhiyun }; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define L2_STATE_COUNT (ST_L2_8 + 1) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun extern struct layer2 *create_l2(struct mISDNchannel *, u_int, 84*4882a593Smuzhiyun u_long, int, int); 85*4882a593Smuzhiyun extern int tei_l2(struct layer2 *, u_int, u_long arg); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* from tei.c */ 89*4882a593Smuzhiyun extern int l2_tei(struct layer2 *, u_int, u_long arg); 90*4882a593Smuzhiyun extern void TEIrelease(struct layer2 *); 91*4882a593Smuzhiyun extern int TEIInit(u_int *); 92*4882a593Smuzhiyun extern void TEIFree(void); 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #define MAX_L2HEADER_LEN 4 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun #define RR 0x01 97*4882a593Smuzhiyun #define RNR 0x05 98*4882a593Smuzhiyun #define REJ 0x09 99*4882a593Smuzhiyun #define SABME 0x6f 100*4882a593Smuzhiyun #define SABM 0x2f 101*4882a593Smuzhiyun #define DM 0x0f 102*4882a593Smuzhiyun #define UI 0x03 103*4882a593Smuzhiyun #define DISC 0x43 104*4882a593Smuzhiyun #define UA 0x63 105*4882a593Smuzhiyun #define FRMR 0x87 106*4882a593Smuzhiyun #define XID 0xaf 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define CMD 0 109*4882a593Smuzhiyun #define RSP 1 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun #define LC_FLUSH_WAIT 1 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #define FLG_LAPB 0 114*4882a593Smuzhiyun #define FLG_LAPD 1 115*4882a593Smuzhiyun #define FLG_ORIG 2 116*4882a593Smuzhiyun #define FLG_MOD128 3 117*4882a593Smuzhiyun #define FLG_PEND_REL 4 118*4882a593Smuzhiyun #define FLG_L3_INIT 5 119*4882a593Smuzhiyun #define FLG_T200_RUN 6 120*4882a593Smuzhiyun #define FLG_ACK_PEND 7 121*4882a593Smuzhiyun #define FLG_REJEXC 8 122*4882a593Smuzhiyun #define FLG_OWN_BUSY 9 123*4882a593Smuzhiyun #define FLG_PEER_BUSY 10 124*4882a593Smuzhiyun #define FLG_DCHAN_BUSY 11 125*4882a593Smuzhiyun #define FLG_L1_ACTIV 12 126*4882a593Smuzhiyun #define FLG_ESTAB_PEND 13 127*4882a593Smuzhiyun #define FLG_PTP 14 128*4882a593Smuzhiyun #define FLG_FIXED_TEI 15 129*4882a593Smuzhiyun #define FLG_L2BLOCK 16 130*4882a593Smuzhiyun #define FLG_L1_NOTREADY 17 131*4882a593Smuzhiyun #define FLG_LAPD_NET 18 132