[go: nahoru, domu]

11b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil/*
21b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil * Layer 2 defines
31b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil *
41b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil * Copyright 2008  by Karsten Keil <kkeil@novell.com>
51b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil *
61b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil * This program is free software; you can redistribute it and/or modify
71b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil * it under the terms of the GNU General Public License version 2 as
81b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil * published by the Free Software Foundation.
91b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil *
101b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil * This program is distributed in the hope that it will be useful,
111b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil * but WITHOUT ANY WARRANTY; without even the implied warranty of
121b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
131b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil * GNU General Public License for more details.
141b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil *
151b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil */
161b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
171b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#include <linux/mISDNif.h>
181b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#include <linux/skbuff.h>
191b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#include "fsm.h"
201b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
211b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define MAX_WINDOW	8
221b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
231b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keilstruct manager {
241b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct mISDNchannel	ch;
251b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct mISDNchannel	bcast;
261b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	u_long			options;
271b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct list_head	layer2;
281b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	rwlock_t		lock;
291b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct FsmInst		deact;
301b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct FsmTimer		datimer;
311b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct sk_buff_head	sendq;
321b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct mISDNchannel	*up;
331b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	u_int			nextid;
341b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	u_int			lastid;
351b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil};
361b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
371b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keilstruct teimgr {
381b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	int			ri;
391b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	int			rcnt;
401b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct FsmInst		tei_m;
411b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct FsmTimer		timer;
421b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	int			tval, nval;
431b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct layer2		*l2;
441b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct manager		*mgr;
451b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil};
461b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
471b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keilstruct laddr {
481b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	u_char	A;
491b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	u_char	B;
501b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil};
511b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
521b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keilstruct layer2 {
531b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct list_head	list;
541b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct mISDNchannel	ch;
551b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	u_long			flag;
561b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	int			id;
571b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct mISDNchannel	*up;
581b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	signed char		sapi;
591b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	signed char		tei;
601b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct laddr		addr;
611b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	u_int			maxlen;
621b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct teimgr		*tm;
631b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	u_int			vs, va, vr;
641b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	int			rc;
651b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	u_int			window;
661b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	u_int			sow;
671b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct FsmInst		l2m;
681b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct FsmTimer		t200, t203;
691b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	int			T200, N200, T203;
701b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	u_int			next_id;
711b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	u_int			down_id;
721b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct sk_buff		*windowar[MAX_WINDOW];
731b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct sk_buff_head	i_queue;
741b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct sk_buff_head	ui_queue;
751b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct sk_buff_head	down_queue;
761b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	struct sk_buff_head	tmp_queue;
771b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil};
781b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
791b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keilenum {
801b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	ST_L2_1,
811b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	ST_L2_2,
821b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	ST_L2_3,
831b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	ST_L2_4,
841b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	ST_L2_5,
851b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	ST_L2_6,
861b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	ST_L2_7,
871b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil	ST_L2_8,
881b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil};
891b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
90475be4d85a274d0961593db41cf85689db1d583cJoe Perches#define L2_STATE_COUNT (ST_L2_8 + 1)
911b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
921b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keilextern struct layer2	*create_l2(struct mISDNchannel *, u_int,
93475be4d85a274d0961593db41cf85689db1d583cJoe Perches				   u_long, int, int);
941b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keilextern int		tei_l2(struct layer2 *, u_int, u_long arg);
951b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
961b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
971b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil/* from tei.c */
98475be4d85a274d0961593db41cf85689db1d583cJoe Perchesextern int		l2_tei(struct layer2 *, u_int, u_long arg);
99475be4d85a274d0961593db41cf85689db1d583cJoe Perchesextern void		TEIrelease(struct layer2 *);
100475be4d85a274d0961593db41cf85689db1d583cJoe Perchesextern int		TEIInit(u_int *);
101475be4d85a274d0961593db41cf85689db1d583cJoe Perchesextern void		TEIFree(void);
1021b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
1031b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define MAX_L2HEADER_LEN 4
1041b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
1051b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define RR	0x01
1061b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define RNR	0x05
1071b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define REJ	0x09
1081b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define SABME	0x6f
1091b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define SABM	0x2f
1101b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define DM	0x0f
1111b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define UI	0x03
1121b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define DISC	0x43
1131b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define UA	0x63
1141b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FRMR	0x87
1151b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define XID	0xaf
1161b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
1171b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define CMD	0
1181b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define RSP	1
1191b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
1201b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define LC_FLUSH_WAIT 1
1211b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil
1221b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_LAPB	0
1231b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_LAPD	1
1241b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_ORIG	2
1251b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_MOD128	3
1261b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_PEND_REL	4
1271b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_L3_INIT	5
1281b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_T200_RUN	6
1291b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_ACK_PEND	7
1301b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_REJEXC	8
1311b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_OWN_BUSY	9
1321b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_PEER_BUSY	10
1331b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_DCHAN_BUSY	11
1341b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_L1_ACTIV	12
1351b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_ESTAB_PEND	13
1361b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_PTP		14
1371b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_FIXED_TEI	15
1381b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_L2BLOCK	16
1391b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_L1_NOTREADY	17
1401b2b03f8e514e4f68e293846ba511a948b80243cKarsten Keil#define FLG_LAPD_NET	18
141