1*1802d0beSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 21b2b03f8SKarsten Keil /* 31b2b03f8SKarsten Keil * Layer 2 defines 41b2b03f8SKarsten Keil * 51b2b03f8SKarsten Keil * Copyright 2008 by Karsten Keil <kkeil@novell.com> 61b2b03f8SKarsten Keil */ 71b2b03f8SKarsten Keil 81b2b03f8SKarsten Keil #include <linux/mISDNif.h> 91b2b03f8SKarsten Keil #include <linux/skbuff.h> 101b2b03f8SKarsten Keil #include "fsm.h" 111b2b03f8SKarsten Keil 121b2b03f8SKarsten Keil #define MAX_WINDOW 8 131b2b03f8SKarsten Keil 141b2b03f8SKarsten Keil struct manager { 151b2b03f8SKarsten Keil struct mISDNchannel ch; 161b2b03f8SKarsten Keil struct mISDNchannel bcast; 171b2b03f8SKarsten Keil u_long options; 181b2b03f8SKarsten Keil struct list_head layer2; 191b2b03f8SKarsten Keil rwlock_t lock; 201b2b03f8SKarsten Keil struct FsmInst deact; 211b2b03f8SKarsten Keil struct FsmTimer datimer; 221b2b03f8SKarsten Keil struct sk_buff_head sendq; 231b2b03f8SKarsten Keil struct mISDNchannel *up; 241b2b03f8SKarsten Keil u_int nextid; 251b2b03f8SKarsten Keil u_int lastid; 261b2b03f8SKarsten Keil }; 271b2b03f8SKarsten Keil 281b2b03f8SKarsten Keil struct teimgr { 291b2b03f8SKarsten Keil int ri; 301b2b03f8SKarsten Keil int rcnt; 311b2b03f8SKarsten Keil struct FsmInst tei_m; 321b2b03f8SKarsten Keil struct FsmTimer timer; 331b2b03f8SKarsten Keil int tval, nval; 341b2b03f8SKarsten Keil struct layer2 *l2; 351b2b03f8SKarsten Keil struct manager *mgr; 361b2b03f8SKarsten Keil }; 371b2b03f8SKarsten Keil 381b2b03f8SKarsten Keil struct laddr { 391b2b03f8SKarsten Keil u_char A; 401b2b03f8SKarsten Keil u_char B; 411b2b03f8SKarsten Keil }; 421b2b03f8SKarsten Keil 431b2b03f8SKarsten Keil struct layer2 { 441b2b03f8SKarsten Keil struct list_head list; 451b2b03f8SKarsten Keil struct mISDNchannel ch; 461b2b03f8SKarsten Keil u_long flag; 471b2b03f8SKarsten Keil int id; 481b2b03f8SKarsten Keil struct mISDNchannel *up; 491b2b03f8SKarsten Keil signed char sapi; 501b2b03f8SKarsten Keil signed char tei; 511b2b03f8SKarsten Keil struct laddr addr; 521b2b03f8SKarsten Keil u_int maxlen; 531b2b03f8SKarsten Keil struct teimgr *tm; 541b2b03f8SKarsten Keil u_int vs, va, vr; 551b2b03f8SKarsten Keil int rc; 561b2b03f8SKarsten Keil u_int window; 571b2b03f8SKarsten Keil u_int sow; 581b2b03f8SKarsten Keil struct FsmInst l2m; 591b2b03f8SKarsten Keil struct FsmTimer t200, t203; 601b2b03f8SKarsten Keil int T200, N200, T203; 611b2b03f8SKarsten Keil u_int next_id; 621b2b03f8SKarsten Keil u_int down_id; 631b2b03f8SKarsten Keil struct sk_buff *windowar[MAX_WINDOW]; 641b2b03f8SKarsten Keil struct sk_buff_head i_queue; 651b2b03f8SKarsten Keil struct sk_buff_head ui_queue; 661b2b03f8SKarsten Keil struct sk_buff_head down_queue; 671b2b03f8SKarsten Keil struct sk_buff_head tmp_queue; 681b2b03f8SKarsten Keil }; 691b2b03f8SKarsten Keil 701b2b03f8SKarsten Keil enum { 711b2b03f8SKarsten Keil ST_L2_1, 721b2b03f8SKarsten Keil ST_L2_2, 731b2b03f8SKarsten Keil ST_L2_3, 741b2b03f8SKarsten Keil ST_L2_4, 751b2b03f8SKarsten Keil ST_L2_5, 761b2b03f8SKarsten Keil ST_L2_6, 771b2b03f8SKarsten Keil ST_L2_7, 781b2b03f8SKarsten Keil ST_L2_8, 791b2b03f8SKarsten Keil }; 801b2b03f8SKarsten Keil 811b2b03f8SKarsten Keil #define L2_STATE_COUNT (ST_L2_8 + 1) 821b2b03f8SKarsten Keil 831b2b03f8SKarsten Keil extern struct layer2 *create_l2(struct mISDNchannel *, u_int, 845b277b86SAndreas Eversberg u_long, int, int); 851b2b03f8SKarsten Keil extern int tei_l2(struct layer2 *, u_int, u_long arg); 861b2b03f8SKarsten Keil 871b2b03f8SKarsten Keil 881b2b03f8SKarsten Keil /* from tei.c */ 891b2b03f8SKarsten Keil extern int l2_tei(struct layer2 *, u_int, u_long arg); 90c5b61d59SKarsten Keil extern void TEIrelease(struct layer2 *); 911b2b03f8SKarsten Keil extern int TEIInit(u_int *); 921b2b03f8SKarsten Keil extern void TEIFree(void); 931b2b03f8SKarsten Keil 941b2b03f8SKarsten Keil #define MAX_L2HEADER_LEN 4 951b2b03f8SKarsten Keil 961b2b03f8SKarsten Keil #define RR 0x01 971b2b03f8SKarsten Keil #define RNR 0x05 981b2b03f8SKarsten Keil #define REJ 0x09 991b2b03f8SKarsten Keil #define SABME 0x6f 1001b2b03f8SKarsten Keil #define SABM 0x2f 1011b2b03f8SKarsten Keil #define DM 0x0f 1021b2b03f8SKarsten Keil #define UI 0x03 1031b2b03f8SKarsten Keil #define DISC 0x43 1041b2b03f8SKarsten Keil #define UA 0x63 1051b2b03f8SKarsten Keil #define FRMR 0x87 1061b2b03f8SKarsten Keil #define XID 0xaf 1071b2b03f8SKarsten Keil 1081b2b03f8SKarsten Keil #define CMD 0 1091b2b03f8SKarsten Keil #define RSP 1 1101b2b03f8SKarsten Keil 1111b2b03f8SKarsten Keil #define LC_FLUSH_WAIT 1 1121b2b03f8SKarsten Keil 1131b2b03f8SKarsten Keil #define FLG_LAPB 0 1141b2b03f8SKarsten Keil #define FLG_LAPD 1 1151b2b03f8SKarsten Keil #define FLG_ORIG 2 1161b2b03f8SKarsten Keil #define FLG_MOD128 3 1171b2b03f8SKarsten Keil #define FLG_PEND_REL 4 1181b2b03f8SKarsten Keil #define FLG_L3_INIT 5 1191b2b03f8SKarsten Keil #define FLG_T200_RUN 6 1201b2b03f8SKarsten Keil #define FLG_ACK_PEND 7 1211b2b03f8SKarsten Keil #define FLG_REJEXC 8 1221b2b03f8SKarsten Keil #define FLG_OWN_BUSY 9 1231b2b03f8SKarsten Keil #define FLG_PEER_BUSY 10 1241b2b03f8SKarsten Keil #define FLG_DCHAN_BUSY 11 1251b2b03f8SKarsten Keil #define FLG_L1_ACTIV 12 1261b2b03f8SKarsten Keil #define FLG_ESTAB_PEND 13 1271b2b03f8SKarsten Keil #define FLG_PTP 14 1281b2b03f8SKarsten Keil #define FLG_FIXED_TEI 15 1291b2b03f8SKarsten Keil #define FLG_L2BLOCK 16 1301b2b03f8SKarsten Keil #define FLG_L1_NOTREADY 17 1311b2b03f8SKarsten Keil #define FLG_LAPD_NET 18 132