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