xref: /linux/drivers/isdn/mISDN/layer2.h (revision 1802d0be)
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