162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Layer 2 defines 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2008 by Karsten Keil <kkeil@novell.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/mISDNif.h> 962306a36Sopenharmony_ci#include <linux/skbuff.h> 1062306a36Sopenharmony_ci#include "fsm.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define MAX_WINDOW 8 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistruct manager { 1562306a36Sopenharmony_ci struct mISDNchannel ch; 1662306a36Sopenharmony_ci struct mISDNchannel bcast; 1762306a36Sopenharmony_ci u_long options; 1862306a36Sopenharmony_ci struct list_head layer2; 1962306a36Sopenharmony_ci rwlock_t lock; 2062306a36Sopenharmony_ci struct FsmInst deact; 2162306a36Sopenharmony_ci struct FsmTimer datimer; 2262306a36Sopenharmony_ci struct sk_buff_head sendq; 2362306a36Sopenharmony_ci struct mISDNchannel *up; 2462306a36Sopenharmony_ci u_int nextid; 2562306a36Sopenharmony_ci u_int lastid; 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistruct teimgr { 2962306a36Sopenharmony_ci int ri; 3062306a36Sopenharmony_ci int rcnt; 3162306a36Sopenharmony_ci struct FsmInst tei_m; 3262306a36Sopenharmony_ci struct FsmTimer timer; 3362306a36Sopenharmony_ci int tval, nval; 3462306a36Sopenharmony_ci struct layer2 *l2; 3562306a36Sopenharmony_ci struct manager *mgr; 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct laddr { 3962306a36Sopenharmony_ci u_char A; 4062306a36Sopenharmony_ci u_char B; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct layer2 { 4462306a36Sopenharmony_ci struct list_head list; 4562306a36Sopenharmony_ci struct mISDNchannel ch; 4662306a36Sopenharmony_ci u_long flag; 4762306a36Sopenharmony_ci int id; 4862306a36Sopenharmony_ci struct mISDNchannel *up; 4962306a36Sopenharmony_ci signed char sapi; 5062306a36Sopenharmony_ci signed char tei; 5162306a36Sopenharmony_ci struct laddr addr; 5262306a36Sopenharmony_ci u_int maxlen; 5362306a36Sopenharmony_ci struct teimgr *tm; 5462306a36Sopenharmony_ci u_int vs, va, vr; 5562306a36Sopenharmony_ci int rc; 5662306a36Sopenharmony_ci u_int window; 5762306a36Sopenharmony_ci u_int sow; 5862306a36Sopenharmony_ci struct FsmInst l2m; 5962306a36Sopenharmony_ci struct FsmTimer t200, t203; 6062306a36Sopenharmony_ci int T200, N200, T203; 6162306a36Sopenharmony_ci u_int next_id; 6262306a36Sopenharmony_ci u_int down_id; 6362306a36Sopenharmony_ci struct sk_buff *windowar[MAX_WINDOW]; 6462306a36Sopenharmony_ci struct sk_buff_head i_queue; 6562306a36Sopenharmony_ci struct sk_buff_head ui_queue; 6662306a36Sopenharmony_ci struct sk_buff_head down_queue; 6762306a36Sopenharmony_ci struct sk_buff_head tmp_queue; 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cienum { 7162306a36Sopenharmony_ci ST_L2_1, 7262306a36Sopenharmony_ci ST_L2_2, 7362306a36Sopenharmony_ci ST_L2_3, 7462306a36Sopenharmony_ci ST_L2_4, 7562306a36Sopenharmony_ci ST_L2_5, 7662306a36Sopenharmony_ci ST_L2_6, 7762306a36Sopenharmony_ci ST_L2_7, 7862306a36Sopenharmony_ci ST_L2_8, 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#define L2_STATE_COUNT (ST_L2_8 + 1) 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ciextern struct layer2 *create_l2(struct mISDNchannel *, u_int, 8462306a36Sopenharmony_ci u_long, int, int); 8562306a36Sopenharmony_ciextern int tei_l2(struct layer2 *, u_int, u_long arg); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci/* from tei.c */ 8962306a36Sopenharmony_ciextern int l2_tei(struct layer2 *, u_int, u_long arg); 9062306a36Sopenharmony_ciextern void TEIrelease(struct layer2 *); 9162306a36Sopenharmony_ciextern int TEIInit(u_int *); 9262306a36Sopenharmony_ciextern void TEIFree(void); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#define MAX_L2HEADER_LEN 4 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#define RR 0x01 9762306a36Sopenharmony_ci#define RNR 0x05 9862306a36Sopenharmony_ci#define REJ 0x09 9962306a36Sopenharmony_ci#define SABME 0x6f 10062306a36Sopenharmony_ci#define SABM 0x2f 10162306a36Sopenharmony_ci#define DM 0x0f 10262306a36Sopenharmony_ci#define UI 0x03 10362306a36Sopenharmony_ci#define DISC 0x43 10462306a36Sopenharmony_ci#define UA 0x63 10562306a36Sopenharmony_ci#define FRMR 0x87 10662306a36Sopenharmony_ci#define XID 0xaf 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci#define CMD 0 10962306a36Sopenharmony_ci#define RSP 1 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#define LC_FLUSH_WAIT 1 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci#define FLG_LAPB 0 11462306a36Sopenharmony_ci#define FLG_LAPD 1 11562306a36Sopenharmony_ci#define FLG_ORIG 2 11662306a36Sopenharmony_ci#define FLG_MOD128 3 11762306a36Sopenharmony_ci#define FLG_PEND_REL 4 11862306a36Sopenharmony_ci#define FLG_L3_INIT 5 11962306a36Sopenharmony_ci#define FLG_T200_RUN 6 12062306a36Sopenharmony_ci#define FLG_ACK_PEND 7 12162306a36Sopenharmony_ci#define FLG_REJEXC 8 12262306a36Sopenharmony_ci#define FLG_OWN_BUSY 9 12362306a36Sopenharmony_ci#define FLG_PEER_BUSY 10 12462306a36Sopenharmony_ci#define FLG_DCHAN_BUSY 11 12562306a36Sopenharmony_ci#define FLG_L1_ACTIV 12 12662306a36Sopenharmony_ci#define FLG_ESTAB_PEND 13 12762306a36Sopenharmony_ci#define FLG_PTP 14 12862306a36Sopenharmony_ci#define FLG_FIXED_TEI 15 12962306a36Sopenharmony_ci#define FLG_L2BLOCK 16 13062306a36Sopenharmony_ci#define FLG_L1_NOTREADY 17 13162306a36Sopenharmony_ci#define FLG_LAPD_NET 18 132