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