# 
# /*************************************************
# *     rpld - an IBM style RIPL server            *
# *************************************************/
# 
# /* Copyright (c) 1999,2000, James McKenzie.
#  *                      All rights reserved
#  * Copyright (c) 1998,2000, Christopher Lightfoot.
#  *                      All rights reserved
#  *
#  * By using this file, you agree to the terms and conditions set
#  * forth in the LICENCE file which can be found at the top level of
#  * the rpld distribution.
#  *
#  * IBM is a trademark of IBM corp.
#  *
#  */
# 			    NO WARRANTY
# 
# BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
# FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
# OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
# PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
# OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
# TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
# PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
# REPAIR OR CORRECTION.
#
# this patch is hacked together from an old release of the linux-sna
# patches and some extensive bugfixes by me.
#

diff -uNr linux/Documentation/networking/llc.txt linux-llc/Documentation/networking/llc.txt
--- linux/Documentation/networking/llc.txt	Thu Jan  1 01:00:00 1970
+++ linux-llc/Documentation/networking/llc.txt	Mon Sep 25 06:47:02 2000
@@ -0,0 +1,80 @@
+llc.txt: Documentation for the Linux IEEE 802.2 and Linux LLC UI layers.
+         Written by: Jay Schulist <jschlst@turbolinux.com>
+
+LLC User Interface Notes:
+
+LLC Class 1 socket types:
+	- SOCK_DGRAM
+LLC Class 2 socket types:
+	- SOCK_STREAM
+
+Besides normal data transfer, the user can send a test request 
+from either socket type. just set the sllc_test to 1 in the sockaddr_llc
+structure.
+
+struct sockaddr_llc {
+	sa_family_t	sllc_family;
+
+	unsigned char 	sllc_dmac[14];
+	unsigned char   sllc_dsap;
+	unsigned char	sllc_smac[14];
+	unsigned char	sllc_ssap;
+	unsigned char	sllc_test;
+};
+
+
+IEEE 802.2 Layer Notes:
+Initialization/LLC load:
+1). LLC scans for LLC interfaces in the IFF_UP state. For each interface
+    found a independent Station Component (SC) is created. *
+2). We register a device notifier to alert us of devices going up and/or
+    down. We then either add or delete a SC for the appropriate device. *
+
+* Required for protocol compliance.
+
+Operation:
+
+LLC commands are executed by the llc_queue_cmd() call unless otherwise
+noted. The following commands are available depending on the llc class type.
+([] = only available by this command)
+
+Class One:
+- LLC_STATE_SAP_ACTIVATION_REQUEST	[register_8022_client()]
+- LLC_STATE_SAP_DEACTIVATION_REQUEST	[unregister_8022_client()]
+
+- LLC_STATE_XID_REQUEST
+
+- LLC_STATE_TEST_REQUEST		[dl->datalink_header()]
+					[dev_queue_xmit() or llc_queue_xmit()]
+- LLC_STATE_UNITDATA_REQUEST		[dl->datalink_header()]
+					[dev_queue_xmit() or llc_queue_xmit()]
+
+Class Two:
+- LLC_STATE_CONNECT_REQUEST		[llc_connect()]
+- LLC_STATE_CONNECT_RESPONSE		[llc_connect()]
+- LLC_STATE_DISCONNECT_REQUEST		[llc_disconnect()]
+- LLC_STATE_DISCONNECT_RESPONSE		[llc_disconnect()]
+- LLC_STATE_RESET_REQUEST		[llc_reset()]
+- LLC_STATE_RESET_RESPONSE		[llc_reset()]
+
+- LLC_STATE_DATA_REQUEST		[dl->datalink_header()]
+					[llc_queue_xmit()]
+
+Check linux/net/llc/af_llc.c for a great reference on how to connect your
+networking layer into the llc layer, it is great fun and worth a try.
+
+
+- Transmit and Receive Processor paths
+
+Receive:
+- llc_rcv
+  - llc_find_client
+  - llc_decode_pdu
+  - llc_demux_pdu
+    - llc_process_pdu_type2
+
+Transmit
+- llc_datalink_header
+  - llc_demux_cmd
+    - llc_process_cmd_type2
+      - llc_build_pdu
diff -uNr linux/MAINTAINERS linux-llc/MAINTAINERS
--- linux/MAINTAINERS	Fri Jun 23 10:57:58 2000
+++ linux-llc/MAINTAINERS	Mon Sep 25 06:47:02 2000
@@ -533,6 +533,13 @@
 W:    http://linux.msede.com/lvm
 S:    Maintained
 
+LLC NETWORK LAYER
+P:	Jay Schulist
+M:	jschlst@turbolinux.com
+W:	http://www.linux-sna.org
+L:	linux-sna@tubrolinux.com
+S:	Maintained
+
 MAESTRO PCI SOUND DRIVER
 P:	Zach Brown
 M:	zab@redhat.com
diff -uNr linux/include/linux/llc.h linux-llc/include/linux/llc.h
--- linux/include/linux/llc.h	Thu Jan  1 01:00:00 1970
+++ linux-llc/include/linux/llc.h	Mon Sep 25 06:47:02 2000
@@ -0,0 +1,109 @@
+/*
+ * IEEE 802.2 for Linux, data structures and indicators.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ * None of the authors or maintainers or their employers admit
+ * liability nor provide warranty for any of this software.
+ * This material is provided "as is" and at no charge.
+ */
+
+#ifndef __LINUX_LLC_H
+#define __LINUX_LLC_H
+
+#ifdef __KERNEL__
+
+struct llc_msg_head
+{
+	struct llc_msg *next;
+	struct llc_msg *prev;
+	unsigned long qlen;
+};
+
+struct llc_msg
+{
+	struct llc_msg *next;
+	struct llc_msg *prev;
+
+	struct llc_msg_head *list;
+	struct llc_pinfo *llc;
+
+	unsigned char cmd;
+	unsigned char rsp;
+
+	struct sk_buff *skb;
+};
+#endif
+
+struct sockaddr_llc {
+        sa_family_t     sllc_family;
+        unsigned char   sllc_dmac[14];
+        unsigned char   sllc_dsap;
+        unsigned char   sllc_smac[14];
+        unsigned char   sllc_ssap;
+	unsigned char	sllc_test;
+};
+
+#define LLC_IOCTL_RETRY			0x01	/* Max retrans attempts. */
+#define LLC_IOCTL_SIZE			0x02	/* Max PDU size. */
+#define LLC_IOCTL_WINDOW		0x03	/* Max PDU window size. */
+#define LLC_IOCTL_ACK_TIMER_EXPIRE	0x04
+#define LLC_IOCTL_P_TIMER_EXPIRE	0x05
+#define LLC_IOCTL_REJ_TIMER_EXPIRE	0x06
+#define LLC_IOCTL_BUSY_TIMER_EXPIRE	0x07
+#define LLC_IOCTL_SSAP			0x08
+#define LLC_IOCTL_CLASS			0x09
+
+#define LLC_MAX_RETRY			100
+#define	LLC_MAX_SIZE			sizeof(int)
+#define LLC_MAX_WINDOW			50
+#define LLC_MAX_ACK_TIMER_EXPIRE	60 * HZ
+#define LLC_MAX_P_TIMER_EXPIRE		60 * HZ
+#define LLC_MAX_REJ_TIMER_EXPIRE	60 * HZ
+#define LLC_MAX_BUSY_TIMER_EXPIRE	60 * HZ
+
+struct llc_data
+{
+	unsigned char	ssap;
+};
+
+/* LLC socket operations. */
+#define LLC_REG_SAP_CLIENT	0xAA		/* Reg. LLC UI client w/ LLC */
+#define LLC_SET_SAP_CLASS	0xBB		/* Set class (LLC1 or LLC2) */
+#define LLC_QUE_MSG		0xCC		/* UI SAP Event Indication. */
+
+/* LLC types. */
+#define LLC_SAP_CLASS_1		0x01
+#define LLC_SAP_CLASS_2         0x02
+
+/* Linux LLC header sizes. */
+#define LLC_TYPE1_SIZE          3       /* 3 bytes. */
+#define LLC_TYPE2_SIZE          4       /* 4 bytes. */
+
+/* LLC SAP types. */
+#define LLC_SAP_NULL	0x00		/* NULL SAP. 			*/
+#define LLC_SAP_LLC	0x02		/* LLC Sublayer Managment. 	*/
+#define LLC_SAP_SNA	0x04		/* SNA Path Control. 		*/
+#define LLC_SAP_PNM	0x0E		/* Proway Network Managment.	*/	
+#define LLC_SAP_IP	0x06		/* TCP/IP. 			*/
+#define LLC_SAP_BSPAN	0x42		/* Bridge Spanning Tree Proto	*/
+#define LLC_SAP_MMS	0x4E		/* Manufacturing Message Srv.	*/
+#define LLC_SAP_8208	0x7E		/* ISO 8208			*/
+#define LLC_SAP_3COM	0x80		/* 3COM. 			*/
+#define LLC_SAP_PRO	0x8E		/* Proway Active Station List	*/
+#define LLC_SAP_SNAP	0xAA		/* SNAP. 			*/
+#define LLC_SAP_BANYAN	0xBC		/* Banyan. 			*/
+#define LLC_SAP_IPX	0xE0		/* IPX/SPX. 			*/
+#define LLC_SAP_NETBIOS	0xF0		/* NetBIOS. 			*/
+#define LLC_SAP_LANMGR	0xF4		/* LanManager. 			*/
+#define LLC_SAP_IMPL	0xF8		/* IMPL				*/
+#define LLC_SAP_DISC	0xFC		/* Discovery			*/
+#define LLC_SAP_OSI	0xFE		/* OSI Network Layers. 		*/
+#define LLC_SAP_LAR	0xDC		/* LAN Address Resolution 	*/
+#define LLC_SAP_RM	0xD4		/* Resource Management 		*/
+#define LLC_SAP_GLOBAL	0xFF		/* Global SAP. 			*/
+
+#endif /* __LINUX_LLC_H */
diff -uNr linux/include/linux/skbuff.h linux-llc/include/linux/skbuff.h
--- linux/include/linux/skbuff.h	Fri Jun 23 11:12:47 2000
+++ linux-llc/include/linux/skbuff.h	Mon Sep 25 07:16:54 2000
@@ -36,6 +36,7 @@
 					   for using debugging */
 };
 
+
 struct sk_buff {
 	struct sk_buff	* next;			/* Next buffer in list 				*/
 	struct sk_buff	* prev;			/* Previous buffer in list 			*/
@@ -66,7 +67,14 @@
 		unsigned char	*raw;
 	} nh;
   
-	/* Link layer header */
+	/* Link layer header, ie. 802.2 */
+        union
+        {
+                struct llchdr   *llc;
+                unsigned char   *raw;
+        } link;
+
+	/* Mac/Hardware header. */
 	union 
 	{	
 	  	struct ethhdr	*ethernet;
@@ -76,6 +84,10 @@
 	struct  dst_entry *dst;
 
 	char		cb[48];	 
+
+	/* LLC layer. */
+	unsigned int llc_cmd;
+	struct packet_type *pt;
 
 	unsigned int 	len;			/* Length of actual data			*/
 	unsigned int	csum;			/* Checksum 					*/
diff -uNr linux/include/linux/socket.h linux-llc/include/linux/socket.h
--- linux/include/linux/socket.h	Fri Jun 23 11:12:46 2000
+++ linux-llc/include/linux/socket.h	Mon Sep 25 06:47:02 2000
@@ -155,6 +155,7 @@
 #define AF_ATMSVC	20	/* ATM SVCs			*/
 #define AF_SNA		22	/* Linux SNA Project (nutters!) */
 #define AF_IRDA		23	/* IRDA sockets			*/
+#define AF_LLC          30      /* LLC Class One and Two.       */
 #define AF_MAX		32	/* For now.. */
 
 /* Protocol families, same as address families. */
@@ -183,6 +184,7 @@
 #define PF_ATMSVC	AF_ATMSVC
 #define PF_SNA		AF_SNA
 #define PF_IRDA		AF_IRDA
+#define PF_LLC		AF_LLC
 
 #define PF_MAX		AF_MAX
 
@@ -235,6 +237,7 @@
 #define SOL_ATM		264	/* ATM layer (cell level) */
 #define SOL_AAL		265	/* ATM Adaption Layer (packet level) */
 #define SOL_IRDA        266
+#define SOL_LLC		277	/* LLC User Interface SAPs */
 
 /* IPX options */
 #define IPX_TYPE	1
diff -uNr linux/include/linux/sysctl.h linux-llc/include/linux/sysctl.h
--- linux/include/linux/sysctl.h	Wed Jun  7 22:26:44 2000
+++ linux-llc/include/linux/sysctl.h	Mon Sep 25 06:50:30 2000
@@ -143,7 +143,8 @@
 	NET_X25=13,
 	NET_TR=14,
 	NET_DECNET=15,
-	NET_ECONET=16
+	NET_ECONET=16,
+	NET_LLC=17
 };
 
 /* /proc/sys/bus/isa */
@@ -171,7 +172,17 @@
 
 /* /proc/sys/net/ethernet */
 
-/* /proc/sys/net/802 */
+/* /proc/sys/net/llc */
+enum {
+        NET_LLC_MAX_RETRY=1,
+        NET_LLC_MAX_SIZE=2,
+        NET_LLC_MAX_WINDOW=3,
+        NET_LLC_ACK_TIMER_EXPIRE=4,
+        NET_LLC_P_TIMER_EXPIRE=5,
+        NET_LLC_REJ_TIMER_EXPIRE=6,
+        NET_LLC_BUSY_TIMER_EXPIRE=7,
+	NET_LLC_DEBUG=8
+};
 
 /* /proc/sys/net/unix */
 
diff -uNr linux/include/net/datalink.h linux-llc/include/net/datalink.h
--- linux/include/net/datalink.h	Tue Oct 24 13:26:07 1995
+++ linux-llc/include/net/datalink.h	Mon Sep 25 07:21:02 2000
@@ -2,15 +2,24 @@
 #define _NET_INET_DATALINK_H_
 
 struct datalink_proto {
-	unsigned short	type_len;
-	unsigned char	type[8];
-	const char	*string_name;
-	unsigned short	header_length;
-	int	(*rcvfunc)(struct sk_buff *, struct device *, 
-				struct packet_type *);
-	void	(*datalink_header)(struct datalink_proto *, struct sk_buff *,
-					unsigned char *);
-	struct datalink_proto	*next;
+        unsigned short  type_len;
+        unsigned char   type[8];
+        const char      *string_name;
+
+        union {
+                struct llc_pinfo *llc;
+        } ll_pinfo;
+
+	struct llc_sc_info *llc_sc;
+	struct sock *sock;
+
+        unsigned short  header_length;
+
+        int     (*rcvfunc)(struct sk_buff *, struct device *,
+                                struct packet_type *);
+        void    (*datalink_header)(struct datalink_proto *, struct sk_buff *,
+                                        unsigned char *);
+        struct datalink_proto   *next;
 };
 
 #endif
diff -uNr linux/include/net/llc.h linux-llc/include/net/llc.h
--- linux/include/net/llc.h	Wed Dec 10 17:45:16 1997
+++ linux-llc/include/net/llc.h	Mon Sep 25 07:25:33 2000
@@ -1,135 +1,1538 @@
 #include <linux/skbuff.h>
 
-#define LLC_MODULE
-
-typedef struct llc_struct llc;
-typedef struct llc_struct *llcptr;
-
 /*
- *	LLC private data area structure.
+ * IEEE 802.2 for Linux, data structures and indicators.
  */
 
-struct llc_struct
-{ 
-	char eye[4];			/* To recognize llc area in dump */
-	int retry_count;		/* LLC link state variables */
-	unsigned char name[9];		/* name of this llc instance */
-	unsigned char s_flag;
-	unsigned char p_flag;
-	unsigned char f_flag;
-	unsigned char data_flag;
-	unsigned char cause_flag;
-	unsigned char vs;		/* Send state variable */
-	unsigned char vr;		/* Receive state variable */
-	unsigned char remote_busy;
-	unsigned char state;		/* Current state of type2 llc procedure */
-	int n1;				/* Maximum number of bytes in I pdu 7.8.2 */
-	int n2;				/* Naximum number of retransmissions 7.8.2 */
-	unsigned char k;		/* Transmit window size 7.8.4, tw in IBM doc*/ 
-	unsigned char rw;		/* Receive window size */
-	struct 
-	{     				
-		/*
-		 *	FRMR_RSP info field structure: 5.4.2.3.5 p55
-		 */
-
-		unsigned char cntl1;
-		unsigned char cntl2;
-		unsigned char vs;
-		unsigned char vr_cr;
-		unsigned char xxyz;
-	} frmr_info_fld;
-
-	/*
-	 *	Timers in 7.8.1 page 78 
-	 */
-
-#define P_TIMER         0
-#define REJ_TIMER       1
-#define ACK_TIMER       2 
-#define BUSY_TIMER      3
-	unsigned long timer_expire_time[4];	
-	unsigned char timer_state[4];	/* The state of each timer */
-#define TIMER_IDLE      0
-#define TIMER_RUNNING   1
-#define TIMER_EXPIRED   2
-	unsigned long timer_interval[4]; 
-	struct timer_list tl[4];
-
-	/* 
-	 *	Client entry point, called by the LLC.
-	 */
-	 
-	void	(*llc_event)(struct llc_struct *);
-	
-	/*
-	 *	Mux and Demux variables
-	 */
-	 
-	char * client_data;		/* Pointer to clients context */
-	unsigned char local_sap;
-	unsigned char remote_sap ;
-	char remote_mac[MAX_ADDR_LEN];  /* MAC address of remote session partner */ 
-	struct device *dev;		/* Device we are attached to */
-		     
-	unsigned char llc_mode;		/* See doc 7.1 on p70 */
-#define MODE_ADM 1
-#define MODE_ABM 2
-
-	int llc_callbacks;		/* Pending callbacks */
-#define LLC_CONN_INDICATION	1	/* We have to ensure the names don't */
-#define LLC_CONN_CONFIRM	2	/* mix up with the 802 state table */
-#define LLC_DATA_INDIC		4
-#define LLC_DISC_INDICATION	8
-#define LLC_RESET_INDIC_LOC	16
-#define LLC_RESET_INDIC_REM	32
-#define LLC_RST_CONFIRM		64
-#define LLC_FRMR_RECV		128
-#define LLC_FRMR_SENT		256
-#define LLC_REMOTE_BUSY		512
-#define LLC_REMOTE_NOTBUSY	1024
-#define LLC_TEST_INDICATION	2048
-#define LLC_XID_INDICATION	4096
-#define LLC_UI_DATA		8192
-
-	struct sk_buff *inc_skb;	/* Saved data buffer for indications */
-	
-	struct sk_buff_head rtq;	/* Retransmit queue */
-	struct sk_buff_head atq;	/* Await transit queue */
-      
-	unsigned char xid_count;
+#ifndef __NET_LLC_H
+#define __NET_LLC_H
+
+#include <linux/skbuff.h>
+#include <linux/llc.h>
+
+#define LLC_SC_SAP		0x12	/* Linux Specific SC SAP. */
+
+#define LLC_MSG_QUEUE_SIZE	20
+
+/* LLC timer indicators. */
+#define LLC_P_TIMER         	0
+#define LLC_REJ_TIMER       	1
+#define LLC_ACK_TIMER       	2
+#define LLC_BUSY_TIMER      	3
+#define LLC_TIMER_IDLE      	0
+#define LLC_TIMER_RUNNING   	1
+#define LLC_TIMER_EXPIRED   	2
+
+/* LLC operational modes. */
+#define LLC_MODE_ADM		1
+#define LLC_MODE_ABM 		2
+
+typedef struct
+{
+	unsigned pdu_type:1;	/* PDU type field. */
+	unsigned ns:7;		/* Send sequence #, network-order. */
+	unsigned pf:1;		/* Poll/Final command/response bit. */
+	unsigned nr:7;		/* Receive sequence #, network-order. */
+} llc_ictrl;
+
+typedef struct
+{
+	unsigned pdu_type:2;	/* PDU type field. */
+	unsigned cmd:2;		/* Supervisory command. */
+	unsigned __pad:4;	/* Zero'd out padding. */
+	unsigned pf:1;		/* Poll/Final command/response bit. */
+	unsigned nr:7;		/* Receive sequence #, network-order. */
+} llc_sctrl;
+
+typedef struct
+{
+	unsigned pdu_type:2;	/* PDU type field. */
+	unsigned mod1:2;	/* Modifer bits, field one. */
+	unsigned pf:1;		/* Poll/Final command/response bit. */
+	unsigned mod2:3;	/* Modifier bits, field two. */
+} llc_uctrl;
+
+typedef struct
+{
+	unsigned f1:1;
+	unsigned f2:1;
+	unsigned f3:6;
+} llc_bits;
+
+/* LLC data link header. */
+typedef struct
+{
+	__u8	dsap:8;	/* Destination Service Access Point. */
+	__u8	ssap:8;	/* Source Service Access Point. */
+
+	union {
+		llc_bits bits __attribute__ ((packed));
+		/* I PDU control bit fields. */
+		llc_ictrl ictrl __attribute__ ((packed));
+		/* S PDU control bit fields. */
+		llc_sctrl sctrl __attribute__ ((packed));
+		/* U PDU control bit fields. */
+		llc_uctrl uctrl __attribute__ ((packed));
+		__u8 ctrl __attribute__ ((packed));
+	} ctrl;
+} llchdr;
+
+typedef struct
+{
+	__u16	ctrl;
+	unsigned __pad1:1;
+	unsigned vs:7;
+	unsigned cr:1;
+	unsigned vr:7;
+	unsigned wxyz:4;
+	unsigned v:4;
+} llc_frmr;
+
+typedef struct
+{
+	__u8	format;		/* 10000001, IEEE Basic Format. */
+	unsigned class:5;	/* LLC Type/Class. */
+	unsigned __pad:4;
+	unsigned window:7;	/* Recieve window size (k). */
+} llc_xid;
+
+typedef struct
+{
+	unsigned vs:7;
+	unsigned vr:7;
+} llc_seq;
+
+/* LLC SC information */
+struct llc_sc_info
+{
+	struct llc_sc_info *next;
+	struct llc_sc_info *prev;
+
+	struct datalink_proto *llc_sap_list;
+	struct device *dev;
+
+	int state;
+};
+
+/* LLC SAP information per socket. */
+struct llc_pinfo 
+{
+	int event;		/* Current event on the link. */
+	int state;		/* Current state of the link. LLC 1 */
+	int state2;		/* Current state of the link. LLC 2 */
+
+	int build;		/* Current PDU to be built. */
+	__u8 build_pf:1;	/* PF to use when Building PDU. */
+	int build_dsap;		/* DSAP to use when Building PDU. */
+
+	__u8 dmac[14];		/* XXX??? Destination Mac. may not stay */
+
+	__u8 dsap;
+	__u8 ssap;
+
+	int class;		/* LLC communication class. */
 
-	struct llc_struct *nextllc;	/* ptr to next llc struct in proto chain */
+	int s_flag;		/* Supervisory function bit. */
+	int p_flag;		/* Poll function bit. */
+	int f_flag;		/* Final function bit. */
+	int data_flag;		/* Number of toss'd PDUs due to a local busy. */
+	int remote_busy;	/* Indicates if the DSAP is busy. */
+
+	llc_seq seq;		/* Tx/Rx sequence numbers */
+
+#ifdef NOT
+	__u8 vs;		/* Send state variable. (Tx sequence #) */
+	__u8 vr;		/* Receive state variable. (Rx sequence #) */
+#endif
+
+	int retry_count;	/* Number of retransmits/retrys. */
+	int window_count;	/* Number of outstanding I PDUs. */
+	int xid_r_count;	/* Number of XID responses. */
+
+	int max_retry;		/* Maximm number of transmissions, N2. */
+	int max_size;		/* Maximum number of octets in an I PDU, N1. */
+	int max_window;		/* Maximum number of outstanding I PDUs, k. */
+
+	struct sk_buff_head rx_queue;
+
+	int tx_queue_depth;
+	struct sk_buff_head tx_queue;
+
+	int retransmitting;
+	int retx_queue_depth;
+	struct sk_buff_head retx_queue;
+
+	struct datalink_proto *dl;
+
+	int (*rcvfunc)(int rsp, struct sk_buff *);
+
+	int ack_expire;			/* Ack time-out value. */
+	struct timer_list ack_timer;	/* Acknowledgment timer. */
+	int p_expire;			/* P time-out value. */
+	struct timer_list p_timer;	/* P-bit timer. */
+	int rej_expire;			/* Reject time-out value. */
+	struct timer_list rej_timer;	/* Reject timer. */
+	int busy_expire;		/* Busy time-out value. */
+	struct timer_list busy_timer;	/* Busy timer. */
 };
 
-#define ADD_TO_RTQ(skb) skb_queue_tail(&lp->rtq,skb)
-#define ADD_TO_ATQ(skb) skb_queue_tail(&lp->atq,skb)
+#define LLC_PDU_RSP		0x01
+#define LLC_P_FLAG		1
+#define LLC_F_FLAG		1
+#define LLC_X_FLAG		0
+
+#define LLC_XID_SIZE		3
+#define LLC_FRMR_SIZE		5
+
+/* LLC timer time-outs, these are linux specific (not to spec). */
+#define LLC_ACK_TIMER_EXPIRE	3 * HZ;
+#define LLC_P_TIMER_EXPIRE	3 * HZ;
+#define LLC_REJ_TIMER_EXPIRE	10 * HZ;
+#define LLC_BUSY_TIMER_EXPIRE	15 * HZ;
+
+/* LLC maximum counts, these are linux specific (not to spec). */
+#define LLC_RETRY		10
+#define LLC_SIZE		65535	/* Should hold us for a while ;) */
+#define LLC_WINDOW		15
+
+/* LLC PDU types. */
+#define LLC_I_CMD			0x00
+#define LLC_I_RSP			0x01
+#define LLC_RR_CMD			0x02
+#define LLC_RR_RSP			0x03
+#define LLC_ACK_CMD			LLC_RR_CMD
+#define LLC_ACK_RSP			LLC_RR_RSP
+#define LLC_RNR_CMD			0x04
+#define LLC_RNR_RSP			0x05
+#define LLC_REJ_CMD			0x06
+#define LLC_REJ_RSP			0x07
+#define LLC_FRMR_RSP			0x08
+#define LLC_UI_CMD			0x09
+#define LLC_TEST_CMD			0x0A
+#define LLC_TEST_RSP			0x0B
+#define LLC_DISC_CMD			0x0C
+#define LLC_UA_RSP			0x0D
+#define LLC_DM_RSP			0x0E
+#define LLC_XID_CMD			0x0F
+#define LLC_XID_RSP			0x10
+#define LLC_SABME_CMD			0x11
+
+/* LLC Control Byte Assignments. */
+#define LLC_CTRL_I_CMD			0x00
+#define LLC_CTRL_I_RSP			LLC_CTRL_I_CMD
+#define LLC_CTRL_RR_CMD			0x01
+#define LLC_CTRL_RR_RSP			LLC_CTRL_RR_CMD
+#define LLC_CTRL_RNR_CMD		0x05
+#define LLC_CTRL_RNR_RSP		LLC_CTRL_RNR_CMD
+#define LLC_CTRL_REJ_CMD		0x09
+#define LLC_CTRL_REJ_RSP		LLC_CTRL_REJ_CMD
+#define LLC_CTRL_DISC_CMD		0x43
+#define LLC_CTRL_SABME_CMD		0x7F
+#define LLC_CTRL_UA_RSP			0x63
+#define LLC_CTRL_DM_RSP			0x0F
+#define LLC_CTRL_FRMR_RSP		0x87
+#define LLC_CTRL_UI_CMD			0x03
+#define LLC_CTRL_XID_CMD		0xBF
+#define LLC_CTRL_XID_RSP		LLC_CTRL_XID_CMD
+#define LLC_CTRL_TEST_CMD		0xF3		/* Was 0xE3 */
+#define LLC_CTRL_TEST_RSP		LLC_CTRL_TEST_CMD
+
+/* LLC connection states, Type 1 and Type 2. */
+#define LLC_STATE_DISCONNECTED		0x00
+#define LLC_STATE_DISCONNECTING		0x01
+#define LLC_STATE_RESETTING		0x02
+#define LLC_STATE_FRMR_TX		0x03
+#define LLC_STATE_FRMR_RX		0x04
+#define LLC_STATE_CONNECTING		0x05
+#define LLC_STATE_CONNECTED		0x06
+#define LLC_STATE_CHKPOINT		0x07
+#define LLC_STATE_LOCAL_BUSY		0x08	/* User and Buffer. */
+#define LLC_STATE_REMOTE_BUSY		0x09
+#define LLC_STATE_REJECTION		0x0A
+#define LLC_STATE_CLEARING		0x0B
+#define LLC_STATE_DYNWINDOW		0x0C
+
+/* Message/Command action words. */
+#define ENABLE_W_DUP_ADDR_CHK	LLC_STATE_ENABLE_W_DUPLICATE_ADDRESS_CHK
+#define ENABLE			LLC_STATE_ENABLE_WOUT_DUPLICATE_ADDRESS_CHK
+
+#define LLC_R_XID_C_INDICATION			0x01
+#define LLC_R_XID_R_INDICATION			0x02
+#define LLC_R_TEST_C_INDICATION			0x03
+#define LLC_R_TEST_R_INDICATION			0x04
+
+
+
+#define LLC_STATE_SEND_XID_R_DATA		0x9F	/* Linux specific. */
+
+/* Linux LLC states for the Linux LLC state machine. 
+ * - IEEE 802.2-1989 state naratives are provided for the enjoyment
+ *   of the reader.
+ */
+
+/* Linux LLC Type 1 states. */
+#define LLC_STATE_DOWN			0x90	/* DOWN_STATE. The station
+						 * component is powered off,
+						 * not initialized, and/or
+						 * disabled from operating in
+						 * the local area network.
+						 */
+#define LLC_STATE_DUPLICATE_ADDRESS_CHK	0x91	/* DUPLICATE_ADDRESS_CHECK_STATE
+						 * The station component is in
+						 * the process of checking for
+						 * duplicate MAC addresses on
+						 * the LAN. The main purpose of
+						 * this state shall be to allow
+						 * the LLC station component to
+						 * verify that this station's
+						 * MAC address is unique on the
+						 * LAN. The station component
+						 * shall send XID command PDUs
+						 * with identical MAC DA and SA
+						 * addresses, and shall wait for
+						 * a possible XID Response PDU
+						 * indicating the existance of
+						 * other stations with identical
+						 * MAC link addresses.
+						 */
+#define LLC_STATE_UP			0x92	/* UP_STATE. The station 
+						 * component is enabled, powered
+						 * on, initialized, and 
+						 * operating in the local area
+						 * network. The LLC shall allow
+						 * SAPs to exchange LLC PDUs on
+						 * the medium.
+						 */
+#define LLC_STATE_ENABLE_W_DUPLICATE_ADDRESS_CHK 0x93
+						/* ENABLE_WITH_DUPLICATE_
+						 * ADDRESS_CHECK. Station
+						 * component user has 
+						 * initialized/enabled the
+						 * station equipment, and has
+						 * requested that the LLC check
+						 * for MAC service access point
+						 * address duplications before
+						 * participating in data link
+						 * communications.
+						 */
+#define LLC_STATE_ENABLE_WOUT_DUPLICATE_ADDRESS_CHK 0x94
+						/* ENABLE_WITHOUT_DUPLICATE_
+						 * ADDRESS_CHECK. Station
+						 * component user has
+						 * initialized/enabled the
+						 * station equipment, but
+						 * duplicate MAC service access
+						 * point address checking by the
+						 * LLC is not supported/desired.
+						 */
+#define LLC_STATE_ACK_TIMER_EXPIRED_AND_RETRY_COUNT_OK 0x95
+						/* ACK_TIMER_EXPIRED_AND_RETRY_
+						 * COUNT<MAXIMUM_RETRY.
+						 * Acknowledgment timer has
+						 * expired and retry count is
+						 * less than maximum retry 
+						 * limit.
+						 */
+#define LLC_STATE_ACK_TIMER_EXPIRED_AND_RETRY_COUNT_MAX 0x96
+						/* ACK_TIMER_EXPIRED_AND_RETRY_
+						 * COUNT=MAXIMUM_RETRY.
+						 * Acknowledgment timer has
+						 * expired and retry count is
+						 * equal to the maximum retry
+						 * limit.
+						 */
+#define LLC_STATE_RECEIVE_NULL_DSAP_XID_C 0x97	/* RECEIVE_NULL_DSAP_XID_C. An
+						 * XID command PDU with the
+						 * NULL DSAP address has been
+						 * received.
+						 */
+#define LLC_STATE_RECEIVE_NULL_DSAP_XID_R 0x98
+						/* RECEIVE_NULL_DSAP_XID_R_AND_
+						 * XID_R_COUNT=0. A single XID
+						 * response PDU with the null
+						 * DSAP address has been 
+						 * received.
+						 */
+#define LLC_STATE_RECEIVE_NULL_DSAP_XID_R_AND_XID_R_CNT_1 0x99
+						/* RECEIVE_NULL_DSAP_XID_R_AND_
+						 * XID_R_COUNT=1. A second XID
+						 * response PDU with the null
+						 * DSAP address have been
+						 * received.
+						 */
+#define LLC_STATE_RECEIVE_NULL_DSAP_TEST_C 0x9A	/* RECEIVE_NULL_DSAP_TEST_C. A
+						 * TEST command PDU with the
+						 * null DSAP address has been
+						 * received.
+						 */
+#define LLC_STATE_DISABLE_REQUEST	0x9B	/* DISABLE_REQUEST. Station user
+						 * has requested that the
+						 * equipment be disabled from
+						 * operating on the medium.
+						 */
+#define LLC_STATE_XID_R_COUNT_0		0x9F	/* XID_R_COUNT:=0. Initialize
+						 * the XID response PDU counter.
+						 */
+#define LLC_STATE_XID_R_COUNT_PLUS_1	0xA0	/* XID_R_COUNT:=XID_R_COUNT+1.
+						 * Increment the XID response
+						 * PDU counter.
+						 */
+#define LLC_STATE_SEND_NULL_DSAP_XID_C	0xA1	/* SEND_NULL_DSAP_XID_C. The LLC
+						 * shall send an XID command PDU
+						 * with null SSAP and null DSAP
+						 * addresses and with identical
+						 * MAC DA and SA addresses.
+						 */
+#define LLC_STATE_SEND_XID_R		0xA2	/* SEND_XID_R. The LLC shall 
+						 * send an XID response PDU,
+						 * using the SSAP address of the
+						 * XID command PDU as the DSAP
+						 * address of the response PDU,
+						 * and using a null SSAP 
+						 * address.
+						 */
+#define LLC_STATE_SEND_TEST_R		0xA3	/* SEND_TEST_R. The LLC shall
+						 * send a TEST response PDU,
+						 * using the SSAP address of the
+						 * TEST command PDU as the DSAP
+						 * address of the response PDU,
+						 * and using a null SSAP 
+						 * address.
+						 */
+#define LLC_STATE_RPT_STATION_UP	0xA4	/* REPORT_STATUS(STATION_UP).
+						 * LLC entity is now 
+						 * operational.
+						 */
+#define LLC_STATE_RPT_STATION_DOWN	0xA5	/* REPORT_STATUS(STATION_DOWN).
+						 * The LLC entity is now
+						 * non-operational.
+						 */
+#define LLC_STATE_RPT_DUPLOCATE_ADDRESS_FOUND 0xA6
+						/* REPORT_STATUS(DUPLICATE_
+						 * ADDRESS_FOUNT). LLC entity 
+						 * has detected another LLC
+						 * entity on the LAN with a MAC
+						 * service access point address
+						 * identical to its own.
+						 */
+#define LLC_STATE_INACTIVE		0xA7	/* INACTIVE_STATE. LLC SAP
+						 * component is not active,
+						 * functioning, or operational.
+						 * No PDUs are accepted and/or
+						 * sent.
+						 */
+#define LLC_STATE_ACTIVE		0xA8	/* ACTIVE_STATE. LLC SAP
+						 * component is active, 
+						 * functioning, and operational.
+						 * PDUs are received and sent.
+						 */
+#define LLC_STATE_SAP_ACTIVATION_REQUEST 0xA9	/* SAP_ACTIVATION_REQUEST. The
+						 * SAP user has requested that
+						 * the particular LLC SAP
+						 * component be activated and
+						 * begin logical data link
+						 * operation of the Type 1
+						 * services.
+						 */
+#define LLC_STATE_SAP_DEACTIVATION_REQUEST 0xAA	/* SAP_DEACTIVATION_REQUEST. The
+						 * SAP user has requested that
+						 * the particular LLC SAP
+						 * component be deactivated and
+						 * no longer allow to operate on
+						 * the logical data link.
+						 */
+#define LLC_STATE_XID_REQUEST		0xAB	/* XID_REQUEST. The SAP user has
+						 * requested that the LLC SAP
+						 * component send an XID
+						 * command PDU to one or more
+						 * remote SAPs.
+						 */
+#define LLC_STATE_TEST_REQUEST		0xAC	/* TEST_REQUEST. The SAP user 
+						 * has requested that the LLC
+						 * SAP component send a TEST
+						 * command PDU to one or more
+						 * remote SAPs.
+						 */
+#define LLC_STATE_RECEIVE_UI		0xAD	/* RECEIVE_UI. The local SAP
+						 * component has received a UI
+						 * PDU from a remote SAP.
+						 */
+#define LLC_STATE_UNITDATA_REQUEST	0xAE	/* UNITDATA_REQUEST. The SAP
+						 * user has requested that a
+						 * data unit be passed to a
+						 * remote LLC SAP, via a UI PDU.
+						 */
+#define LLC_STATE_RECEIVE_XID_C		0xAF	/* RECEIVE_XID_C. The local SAP
+						 * component has received an XID
+						 * command PDU from a remote 
+						 * SAP.
+						 */
+#define LLC_STATE_RECEIVE_XID_R		0xB0	/* RECEIVE_XID_R. The local SAP
+						 * component has received an XID
+						 * response PDU from a remote 
+						 * SAP.
+						 */
+#define LLC_STATE_RECEIVE_TEST_C	0xB1	/* RECEIVE_TEST_C. The local SAP
+						 * component has received a TEST
+						 * command PDU from the remote
+						 * SAP.
+						 */
+#define LLC_STATE_RECEIVE_TEST_R	0xB2	/* RECEIVE_TEST_R. The local SAP
+						 * component has received a TEST
+						 * response PDU from the remote
+						 * SAP.
+						 */
+#define LLC_STATE_UNITDATA_INDICATION	0xB3	/* UNITDATA_INDICATION. LLC SAP
+						 * component has received a UI
+						 * PDU from a remote SAP. The
+						 * service data unit is given to
+						 * the SAP user.
+						 */
+#define LLC_STATE_SEND_UI		0xB4	/* SEND_UI. A UI PDU is sent to
+						 * one or more remote SAPs in
+						 * response to a user request to
+						 * send a service data unit.
+						 */
+#define LLC_STATE_SEND_XID_C		0xB5	/* SEND_XID_C. LLC SAP component
+						 * shall send an XID command PDU
+						 * to remote SAPs in response to
+						 * a SAP user request to 
+						 * identify other SAPs.
+						 */
+#define LLC_STATE_SEND_TEST_C		0xB7	/* SEND_TEST_C. LLC SAP 
+						 * component shall send a TEST
+						 * command PDU in response to
+						 * a SAP user request to test
+						 * a remote SAP.
+						 */
+#define LLC_STATE_RPT_SAP_ACTIVE	0xB9	/* REPORT_STATUS(SAP_ACTIVE).
+						 * The SAP_ACTIVATION_REQUEST
+						 * has been successfully
+						 * processed and the component
+						 * is now operational.
+						 */
+#define LLC_STATE_RPT_SAP_INACTIVE	0xBA	/* REPORT_STATUS(SAP_INACTIVE).
+						 * The SAP_DEACTIVATION_REQUEST
+						 * has been successfully
+						 * processed and the component
+						 * is now deactivated.
+						 */
+#define LLC_STATE_XID_INDICATION	0xBB	/* XID_INDICATION. LLC SAP
+						 * component has received an XID
+						 * response PDU from a remote
+						 * SAP. An indication of this
+						 * event is passed to the SAP
+						 * user, and may also return the
+						 * XID information field.
+						 */
+#define LLC_STATE_TEST_INDICATION	0xBC	/* TEST_INDICATION. LLC SAP
+						 * component has received a
+						 * TEST response PDU from a
+						 * remote SAP. An indication of
+						 * this event is passed to the
+						 * SAP user, and may also return
+						 * the TEST information field.
+						 */
+
+/* Linux LLC Type 2 states. */
+#define LLC_STATE_ADM			0x00	/* ADM. The connection component
+						 * is in the asynchronous
+						 * disconnected mode. It can
+						 * accept an SABME PDU from a
+						 * remote LLC SSAP or, at the
+						 * request of the service access
+						 * point user, can initiate an
+						 * SABME PDU transmission to a
+						 * remote LLC DSAP, to establish
+						 * a data link connection. It
+						 * also responds to a DISC
+						 * command PDU and to any 
+						 * command PDU with the P bit
+						 * set to "1".
+						 */
+#define LLC_STATE_SETUP			0x01	/* SETUP. The connection 
+						 * component has transmitted an
+						 * SABME command PDU to a remote
+						 * LLC DSAP and is waiting for
+						 * a reply.
+						 */
+#define LLC_STATE_NORMAL		0x02	/* NORMAL. A data link 
+						 * connection exists between the
+						 * local LLC service access 
+						 * point and the remote LLC
+						 * service access point. Sending
+						 * and reception of information
+						 * and supervisory PDUs can be
+						 * performed.
+						 */
+#define LLC_STATE_BUSY			0x03	/* BUSY. A data link connection
+						 * exists between the local LLC
+						 * service access point and the
+						 * remote LLC service access
+						 * point. I PDUs may be sent.
+						 * Local conditions make it 
+						 * likely that the information
+						 * field of received I PDUs will
+						 * be ignored. Supervisory PDUs
+						 * may be both sent and received
+						 */
+#define LLC_STATE_REJECT		0x04	/* REJECT. A data link 
+						 * connection exists between the
+						 * local LLC service access 
+						 * point and the remote LLC
+						 * service point The remote
+						 * connection component has
+						 * requested that the remote
+						 * connection component resend
+						 * a specified I PDU that the
+						 * local connection component
+						 * has detected as being out
+						 * of sequence. Both I PDUs and
+						 * supervisory PDUs may be
+						 * sent and received.
+						 */
+#define LLC_STATE_AWAIT			0x05	/* AWAIT. A data link connection
+						 * exists between the local LLC
+						 * service access point and the
+						 * remote LLC service access
+						 * point. The local LLC is
+						 * performing a timer recovery
+						 * operation and has sent a
+						 * command PDU with the P bit
+						 * set to "1", and is awaiting
+						 * an acknowledgment from the
+						 * remote LLC. I PDUs may be
+						 * received but not sent.
+						 * Supervisory PDUs may be both
+						 * sent and received.
+						 */
+#define LLC_STATE_AWAIT_BUSY		0x06	/* AWAIT_BUSY. A data link
+						 * connection exists between the
+						 * local LLC service access
+						 * point and the remote LLC
+						 * service access point. The 
+						 * local LLC is performing a
+						 * timer recovery operation and
+						 * has sent a command PDU with 
+						 * the P bit set to "1", and is
+						 * awaiting an acknowledgment
+						 * from the remote LLC. I PDUs
+						 * may not be sent. Local
+						 * conditions make it likely
+						 * that the information field of
+						 * received I PDUs will be 
+						 * ignored. Supervisory PDUs may
+						 * be both sent and received.
+						 */
+#define LLC_STATE_AWAIT_REJECT		0x07	/* AWAIT_REJECT. A data link
+						 * connection exists between the
+						 * local LLC service access
+						 * point and the remote LLC
+						 * service access point. The
+						 * local connection component
+						 * has requested that the remote
+						 * connection component
+						 * re-transmit a specified I PDU
+						 * that the local connection
+						 * component has detected as
+						 * being out of sequence. Before
+						 * the local LLC entered this
+						 * state it was performing a
+						 * timer recovery operation and
+						 * had sent a command PDU with
+						 * the P bit set to "1", and is
+						 * still awaiting an 
+						 * acknowledgment from the 
+						 * remote LLC. I PDUs may be
+						 * received but not transmitted.
+						 * Supervisory PDUs may be both
+						 * transmitted and received.
+						 */
+#define LLC_STATE_D_CONN		0x08	/* D_CONN. At the request of the
+						 * service access point user, 
+						 * the local LLC has sent a DISC
+						 * command PDU to the remote LLC
+						 * DSAP and it waiting for a
+						 * reply.
+						 */
+#define LLC_STATE_RESET			0x09	/* RESET. As a result of a 
+						 * service access point user
+						 * request or the receipt of a
+						 * FRMR response PDU, the local
+						 * connection component has sent
+						 * an SABME command PDU to the
+						 * remote LLC DSAP to reset the
+						 * data link connection and is
+						 * waiting for a reply.
+						 */
+#define LLC_STATE_ERROR			0x0A	/* ERROR. The local connection
+						 * component has detected an
+						 * error in a received PDU and
+						 * has sent a FRMR response PDU.
+						 * It is waiting for a reply
+						 * from the remote connection
+						 * component.
+						 */
+#define LLC_STATE_CONN			0x0B	/* CONN. The local connection
+						 * component has received an
+						 * SABME PDU from a remote LLC
+						 * SSAP, and it is waiting for
+						 * the local user to accept or
+						 * refuse the connection.
+						 */
+#define LLC_STATE_RESET_CHECK		0x0C	/* RESET_CHECK. The local
+						 * connection component is 
+						 * waiting for the local user to
+						 * accept or refuse a remote
+						 * reset request.
+						 */
+#define LLC_STATE_RESET_WAIT		0x0D	/* RESET_WAIT. The local 
+						 * connection component is 
+						 * waiting for the local user to
+						 * indicate a RESET_REQUEST or a
+						 * DISCONNECT_REQUEST.
+						 */
+#define LLC_STATE_CONNECT_REQUEST	0x10	/* CONNECT_REQUEST. The user has
+						 * requested that a data link
+						 * connection be established 
+						 * with a remote LLC DSAP.
+						 */
+#define LLC_STATE_CONNECT_RESPONSE	0x11	/* CONNECT_RESPONSE. The user
+						 * has accepted the data link
+						 * connection.
+						 */
+#define LLC_STATE_DATA_REQUEST		0x12	/* DATA_REQUEST. The user has
+						 * requested that a data unit
+						 * be sent to the remote LLC
+						 * DSAP.
+						 */
+#define LLC_STATE_DISCONNECT_REQUEST	0x13	/* DISCONNECT_REQUEST. The user
+						 * has requested that the data
+						 * link connection with the
+						 * remote LLC DSAP be 
+						 * terminated.
+						 */
+#define LLC_STATE_RESET_REQUEST		0x14	/* RESET_REQUEST. The user has
+						 * requested that the data link
+						 * connection with the remote
+						 * LLC DSAP be reset.
+						 */
+#define LLC_STATE_RESET_RESPONSE	0x15	/* RESET_RESPONSE. The user has
+						 * accepted the reset of the 
+						 * data link connection.
+						 */
+#define LLC_STATE_LOCAL_BUSY_DETECTED	0x16	/* LOCAL_BUSY_DETECTED. The
+						 * local station has entered a
+						 * busy condition and may not
+						 * be able to accept I PDUs from
+						 * the remote LLC SSAP.
+						 */
+#define LLC_STATE_LOCAL_BUSY_CLEARED	0x17	/* LOCAL_BUSY_CLEARED. The local
+						 * station busy condition has
+						 * ended and the station can
+						 * accept I PDUs from the remote
+						 * LLC SSAP.
+						 */
+#define LLC_STATE_RECEIVE_BAD_PDU	0x18	/* RECEIVE_BAD_PDU. The remote
+						 * SSAP has sent to the local
+						 * DSAP a command or response
+						 * PDU which is not implemented,
+						 * or has an information field
+						 * when not permitted, or is an
+						 * I PDU with an information
+						 * field length greater than can
+						 * be accommodated by the local
+						 * LLC.
+						 */
+#define LLC_STATE_RECEIVE_DISC_CMD	0x19	/* RECEIVE_DISC_CMD(P=X). The
+						 * remote SSAP has sent a DISC
+						 * command PDU with the P bit
+						 * set to "X" addressed to the
+						 * local DSAP.
+						 */
+#define LLC_STATE_RECEIVE_DM_RSP	0x1A	/* RECEIVE_DM_RSP(F=X). The
+						 * remote SSAP has sent a DM
+						 * response PDU with the F bit
+						 * set to "X" addressed to the
+						 * local DSAP.
+						 */
+#define LLC_STATE_RECEIVE_FRMR_RSP	0x1B	/* RECEIVE_FRMR_RSP(F=X). The
+						 * remote SSAP has sent a
+						 * FRMR response PDU with the F
+						 * bit set to "X" addressed to
+						 * the local DSAP.
+						 */
+#define LLC_STATE_RECEIVE_I_CMD		0x1C	/* RECEIVE_I_CMD(P=X). The 
+						 * remote SSAP has sent a I
+						 * command PDU with the P bit 
+						 * set to "X" addressed to the
+						 * local DSAP. Both the N(R) and
+						 * N(S) fields are valid and the
+						 * N(S) value is the expected
+						 * sequence number.
+						 */
+#define LLC_STATE_RECEIVE_I_CMD_W_UNEXPECTED_SEQ 0x1D
+						/* RECEIVE_I_CMD(P=X)_WITH_
+						 * UNEXPECTED_N(S). The remote
+						 * SSAP has sent an I command
+						 * PDU with the P bit set to
+						 * "X" addressed to the local
+						 * DSAP. The N(S) field of the
+						 * command does not contain the
+						 * expected sequence number but
+						 * is within the windows size.
+						 * The N(R) field is valid.
+						 */
+#define LLC_STATE_RECEIVE_I_CMD_W_INVALID_SEQ 0x1E
+						/* RECEIVE_I_CMD(P=X)_WITH_
+						 * INVALID_N(S). The remote SSAP
+						 * has sent an I command PDU 
+						 * with the P bit set to "X"
+						 * addressed to the local DSAP.
+						 * The N(S) field of the command
+						 * is invalid. The N(R) field is
+						 * valid.
+						 */
+#define LLC_STATE_RECEIVE_I_RSP		0x1F	/* RECEIVE_I_RSP(F=X). The 
+						 * remote SSAP has sent a I
+						 * response PDU with the F bit
+						 * set to "X" addressed to the
+						 * local DSAP. Both the N(R) and
+						 * N(S) fields are valid and the
+						 * N(S) value is the expected
+						 * sequence number.
+						 */
+#define LLC_STATE_RECEIVE_I_RSP_W_UNEXPECTED_SEQ 0x20
+						/* RECEIVE_I_RSP(F=X)_WITH_
+						 * UNEXPECTED_N(S). The remote
+						 * SSAP has sent an I response
+						 * PDU with the F bit set to "X"
+						 * addressed to the local DSAP.
+						 * The N(S) field of the command
+						 * does not contain the expected
+						 * sequence number but is within
+						 * the window size.
+						 */
+#define LLC_STATE_RECEIVE_I_RSP_W_INVALID_SEQ 0x21
+						/* RECEIVE_I_RSP(F=X)_WITH_
+						 * INVALID_N(S). The remote SSAP
+						 * has sent an I response PDU
+						 * with the F bit set to "X"
+						 * addressed to the local DSAP.
+						 * The N(S) field of the 
+						 * response is invalid. The N(R)
+						 * field is valid.
+						 */
+#define LLC_STATE_RECEIVE_REJ_CMD	0x22	/* RECEIVE_REJ_CMD(P=X). The
+						 * remote SSAP has sent a REJ
+						 * command PDU with the P bit 
+						 * set to "X" addressed to the
+						 * local DSAP.
+						 */
+#define LLC_STATE_RECEIVE_REJ_RSP	0x23	/* RECEIVE_REJ_RSP(F=X). The
+						 * remote SSAP has sent a REJ
+						 * response PDU with the F bit
+						 * set to "X" addressed to the
+						 * local DSAP.
+						 */
+#define LLC_STATE_RECEIVE_RNR_CMD	0x24	/* RECEIVE_RNR_CMD(P=X). The
+						 * remote SSAP has sent a REJ
+						 * response PDU with the P bit
+						 * set to "X" addressed to the
+						 * local DSAP.
+						 */
+#define LLC_STATE_RECEIVE_RNR_RSP	0x25	/* RECEIVE_RNR_RSP(F=X). The
+						 * remote SSAP has sent a RNR
+						 * response PDU with the F bit
+						 * set to "X" addressed to the
+						 * local DSAP.
+						 */
+#define LLC_STATE_RECEIVE_RR_CMD	0x26	/* RECEIVE_RR_CMD(P=X). The
+						 * remote SSAP has sent a RNR
+						 * command PDU with the F bit
+						 * set to "X" addressed to the
+						 * local DSAP.
+						 */
+#define LLC_STATE_RECEIVE_RR_RSP	0x27	/* RECEIVE_RR_RSP(F=X). The
+						 * remote SSAP has sent a RR
+						 * response PDU with the F bit
+						 * set to "X" addressed to the
+						 * local DSAP.
+						 */
+#define LLC_STATE_RECEIVE_SABME_CMD	0x28	/* RECEIVE_SABME_CMD(P=X). The
+						 * remote SSAP has sent an SABME
+						 * command PDU with the P bit
+						 * set to "X" addressed to the
+						 * local DSAP.
+						 */
+#define LLC_STATE_RECEIVE_UA_RSP	0x29	/* RECEIVE_UA_RSP(F=X). The
+						 * remote SSAP has sent a UA
+						 * response PDU with the F bit
+						 * set to "X" addressed to the
+						 * local DSAP.
+						 */
+#define LLC_STATE_RECEIVE_XXX_CMD	0x2A	/* RECEIVE_XXX_CMD(F=X). The
+						 * remote SSAP has sent a Type 2
+						 * command PDU with the P bit
+						 * set to "X" addressed to the
+						 * local DSAP. The command is
+						 * any command not specificly
+						 * listed for that state.
+						 */
+#define LLC_STATE_RECEIVE_XXX_RSP	0x2B	/* RECEIVE_XXX_RSP(F=X). The
+						 * remote SSAP has sent a Type 2
+						 * response PDU with the F bit
+						 * set to "X" addressed to the
+						 * local DSAP. The response is
+						 * any response not specifically
+						 * listed for that state.
+						 */
+#define LLC_STATE_RECEIVE_XXX_YYY	0x2C	/* RECEIVE_XXX_YYY. The remote
+						 * SSAP has sent a Type 2 PDU
+						 * addressed to the local DSAP.
+						 * The PDU is any command or
+						 * response not specificly 
+						 * listed for that state.
+						 */
+#define LLC_STATE_RECEIVE_ZZZ_CMD_W_INVALID_SEQ	0x2D
+						/* RECEIVE_ZZZ_CMD(P=X)_WITH_
+						 * INVALID_N(R). The remote
+						 * SSAP has sent an I, RR, RNR,
+						 * or REJ command PDU with the
+						 * P bit set to "X" addressed to
+						 * the local DSAP. The N(R) 
+						 * field of the command is 
+						 * invalid.
+						 */
+#define LLC_STATE_RECEIVE_ZZZ_RSP_W_INVALID_SEQ	0x2E
+						/* RECEIVE_ZZZ_RSP(F=X)_WITH_
+						 * INVALID_N(R). The remote SSAP
+						 * has sent an I, RR, RNR, or
+						 * REJ command PDU with the F 
+						 * bit set to "X" addressed to 
+						 * the local DSAP. The N(R) 
+						 * field of the response is
+						 * invalid.
+						 */
+#define LLC_STATE_P_TIMER_EXPIRED	0x2F	/* P_TIMER_EXPIRED. The P/F 
+						 * cycle timer has expired.
+						 */
+#define LLC_STATE_ACK_TIMER_EXPIRED	0x30	/* ACK_TIMER_EXPIRED. The
+						 * acknowledgment timer has
+						 * expired.
+						 */
+#define LLC_STATE_REJ_TIMER_EXPIRED	0x31	/* REJ_TIMER_EXPIRED. The "sent
+						 * REJ" timer has expired.
+						 */
+#define LLC_STATE_BUSY_TIMER_EXPIRED	0x32	/* BUSY_TIMER_EXPIRED. The
+						 * remote-busy timer has expired
+						 * In the state transition table
+						 * some of the above events are
+						 * qualified by the following
+						 * conditions. The event is
+						 * recognized only when the
+						 * condition is true.
+						 */
+#define LLC_STATE_P_FLAG_1		0x37	/* P_FLAG=1. P_FLAG has a value
+						 * of one when a command with 
+						 * the P bit set to "1" has been
+						 * sent and a response with the
+						 * F bit set to "1" is expected.
+						 */
+#define LLC_STATE_P_FLAG_F		0x38	/* P_FLAG=F. P_FLAG has a value
+						 * equal to the F bit in the
+						 * response PDU received.
+						 */
+#define LLC_STATE_REMOTE_BUSY_1		0x39	/* REMOTE_BUSY=1. When
+						 * REMOTE_BUSY has a value of
+						 * one, an RNR PDU has been
+						 * received from the remote
+						 * connection commponent to
+						 * indicate that I PDUs should
+						 * not be sent. DATA_REQUEST
+						 * events are not recognized
+						 * until this flag is reset to
+						 * zero.
+						 */
+#define LLC_STATE_RETRY_COUNT_OK	0x3B	/* RETRY_COUNT<N2. The number of
+						 * retries is less than the
+						 * maximum number of retries.
+						 */
+#define LLC_STATE_RETRY_COUNT_MAX	0x3C	/* RETRY_COUNT>=N2. The number
+						 * of retries has reached the
+						 * maximum number permissible.
+						 */
+#define LLC_STATE_INIT_PF_CYCLE		0x3F	/* INITIATE_P/F_CYCLE. The local
+						 * LLC wants to initiate a P/F
+						 * cycle. (This is only required
+						 * if the local LLC is not
+						 * generating other command PDUs
+						 * for some reason.
+						 */
+#define LLC_STATE_CLEAR_REMOTE_BUSY	0x40	/* CLEAR_REMOTE_BUSY. If
+						 * REMOTE_BUSY has a value of
+						 * one, then set REMOTE_BUSY to
+						 * zero to indicate the remote
+						 * LLC is now able to accept I
+						 * PDUs, stop the BUSY_TIMER,
+						 * inform the user by issuing
+						 * REPORT_STATUS(
+						 * REMOTE_NOT_BUSY) and, 
+						 * provided the local LLC is in
+						 * the NORMAL, REJECT, or BUSY
+						 * state, start the (re)sending
+						 * of any I PDUs that were 
+						 * waiting for the remote busy
+						 * to be cleared.
+						 */
+#define LLC_STATE_CONNECT_INDICATION	0x41	/* CONNECT_INDICATION. Inform
+						 * the user that a connection
+						 * has been requested by a
+						 * remote LLC SSAP.
+						 */
+#define LLC_STATE_CONNECT_CONFIRM	0x42	/* CONENCT_CONFIRM. The
+						 * connection service component
+						 * indicates that the remote
+						 * network entity has accepted
+						 * the connection.
+						 */
+#define LLC_STATE_DATA_INDICATION	0x43	/* DATA_INDICATION. The 
+						 * connection service component
+						 * passes the data unit from the
+						 * received I PDU to the user.
+						 */
+#define LLC_STATE_DISCONNECT_INDICATION	0x44	/* DISCONNECT_INDICATION. Inform
+						 * the user that the remote
+						 * network entity has initiated
+						 * disconnection of the data 
+						 * link connection.
+						 */
+#define LLC_STATE_REMOTE_RESET_INDICATION 0x45	/* REMOTE_RESET_INDICATION. The
+						 * remote network entity or
+						 * remote peer has initiated a
+						 * reset of the data link
+						 * connection.
+						 */
+#define LLC_STATE_LOCAL_RESET_INDICATION 0x46	/* LOCAL_RESET_INDICATION. The
+						 * local LLC has determined that
+						 * the data link connection is
+						 * in need of reinitialization.
+						 */
+#define LLC_STATE_RESET_CONFIRM		0x47	/* RESET_CONFIRM. The connection
+						 * service component indicated
+						 * that the remote network
+						 * entity has accepted the
+						 * reset.
+						 */
+#define LLC_STATE_RPT_FRMR_RECEIVED	0x48	/* REPORT_STATUS. FRMR_RECEIVED.
+						 * The local connection service
+						 * component has received a FRMR
+						 * response PDU.
+						 */
+#define LLC_STATE_RPT_FRMR_SENT		0x49	/* REPORT_STATUS. FRMR_SENT. The
+						 * local connection service
+						 * component has received an
+						 * invalid PDU, and has sent a
+						 * FRMR response PDU.
+						 */
+#define LLC_STATE_RPT_REMOTE_BUSY	0x4A	/* REPORT_STATUS. REMOTE_BUSY.
+						 * The remote LLC DSAP is busy.
+						 * The local connection service
+						 * component will not accept a
+						 * DATA_REQUEST.
+						 */
+#define LLC_STATE_RPT_REMOTE_NOT_BUSY	0x4B	/* REPORT_STATUS. 
+						 * REMOTE_NOT_BUSY. The remote
+						 * LLC DSAP is no longer busy.
+						 * The local connection service
+						 * component will now accept a
+						 * DATA_REQUEST.
+						 */
+#define LLC_STATE_IF_F_1_CLEAR_REMOTE_BUSY 0x4C	/* IF_F=1_CLEAR_REMOTE_BUSY. If
+						 * the I PDU is a response with
+						 * the F bit set to "1" in
+						 * response to a command PDU 
+						 * with the P bit set to "1",
+						 * then perform the 
+						 * CLEAR_REMOTE_BUSY action.
+						 */
+#define LLC_STATE_IF_DATA_FLAG_2_STOP_REJ_TIMER 0x4D /* 
+						 * IF_DATA_FLAG=2_STOP_REJ_TIMER
+						 * If DATA_FLAG has a value of
+						 * two, indicating that a REJ
+						 * PDU has been sent, stop the
+						 * "sent REJ" timer.
+						 */
+#define LLC_STATE_SEND_DISC_CMD		0x4E	/* SEND_DISC_CMD(P=X). Transmit
+						 * a DISC command PDU with the
+						 * P bit set to "X" to the 
+						 * remote LLC DSAP.
+						 */
+#define LLC_STATE_SEND_DM_RSP		0x4F	/* SEND_DM_RSP(F=X). Send a DM
+						 * response PDU with the F bit
+						 * set to "X" to the remote LLC
+						 * DSAP.
+						 */
+#define LLC_STATE_SEND_FRMR_RSP		0x50	/* SEND_FRMR_RSP(F=X). Send a
+						 * FRMR response PDU with the F
+						 * bit set to "X" to the remote
+						 * LLC DSAP.
+						 */
+#define LLC_STATE_RESEND_FRMR_RSP_0	0x51	/* RE-SEND_FRMR_RSP(F=0). Send
+						 * the same FRMR response PDU
+						 * with the same information
+						 * field as sent earlier to the
+						 * remote LLC DSAP. Set the F
+						 * bit to "0".
+						 */
+#define LLC_STATE_RESEND_FRMR_RSP_P	0x52	/* RE-SEND_FRMR_RSP(F=P). Send
+						 * the same FRMR response PDU
+						 * with the same information
+						 * field as sent earlier to the
+						 * remote LLC DSAP. Set the F
+						 * bit equal to the P bit of the
+						 * received command PDU.
+						 */
+#define LLC_STATE_SEND_I_CMD		0x53	/* SEND_I_CMD(P=1). Send an I
+						 * command PDU with the P bit
+						 * set to "1" to the remote LLC
+						 * DSAP with the data unit
+						 * supplied by the user with the
+						 * DATA_REQUEST. Before 
+						 * transmission, copy the 
+						 * current values of the send
+						 * state variable V(S) and the
+						 * receive state variable V(R)
+						 * into the N(S) and N(R)
+						 * fields, respectively, of the
+						 * I PDU and increment (modulo 
+						 * 128) the send state variable
+						 * V(S).
+						 */
+#define LLC_STATE_RESEND_I_CMD		0x54	/* RE-SEND_I_CMD(P=1). Start
+						 * resending all the 
+						 * unacknowledged I PDUs for 
+						 * this data link connection
+						 * begining with the N(R) given
+						 * in the received PDU. Send the
+						 * first as a command with the P
+						 * bit set to "1". If the queue
+						 * contains more than one I PDU,
+						 * the balance must be sent as
+						 * commands with the P bit set
+						 * to "0", or as response with
+						 * the F bit set to "0".
+						 */
+#define LLC_STATE_RESEND_I_CMD_OR_SEND_RR 0x55	/* RE-SEND_I_CMD(P=I)_OR_SEND_RR
+						 * Start resending all the
+						 * unacknowledged I PDUs for
+                                                 * this data link connection
+                                                 * begining with the N(R) given
+                                                 * in the received PDU. Send the                                                 * first as a command with the P                                                 * bit set to "1". If the queue
+                                                 * contains more than one I PDU,                                                 * the balance must be sent as
+                                                 * commands with the P bit set
+                                                 * to "0", or as response with
+                                                 * the F bit set to "0". It is
+						 * permissable to send a RR
+						 * command PDU with the P bit
+						 * set to "0", or as a response
+						 * with the F bit set to "0". If
+						 * no I PDU is ready to send, a							 * RR command PDU with the P bit
+						 * set to "1" must be sent to
+						 * the remote LLC DSAP.
+						 */
+#define LLC_STATE_SEND_I_XXX		0x56	/* SEND_I_XXX(X=0). Send either
+						 * an I response PDU with the
+						 * F bit set to "0" or an I
+						 * command PDU with the P bit
+						 * set to "0" to the remote LLC
+						 * DSAP with the data unit
+						 * supplied by the user with the
+						 * DATA_REQUEST. Before 
+						 * transmission, copy the
+						 * current values of the send
+						 * state variable V(S) and the
+						 * receive state variable V(R)
+						 * into the N(S) and N(R) fields
+						 * respectively, of the I PDU
+						 * and increment (modulo 128)
+						 * the send state variable V(S).
+						 */
+#define LLC_STATE_RESEND_I_XXX		0x57	/* RE-SEND_I_XXX(X=0). Start
+						 * resending all the 
+						 * unacknowledged I PDUs for
+						 * this data link connection
+						 * begining with the N(R) given
+						 * in the received PDU. They
+						 * must be sent as either 
+						 * commands with the P bit set 
+						 * to "0" or as responses with 
+						 * the F bit set to "0".
+						 */
+#define LLC_STATE_RESEND_I_XXX_OR_SEND_RR 0x58	/* RE-SEND_I_XXX(X=0)_OR_SEND_RR
+						 * Start resending all the
+                                                 * unacknowledged I PDUs for
+                                                 * this data link connection
+                                                 * begining with the N(R) given
+                                                 * in the received PDU. They
+                                                 * must be sent as either
+                                                 * commands with the P bit set
+                                                 * to "0" or as responses with
+                                                 * the F bit set to "0". It is
+						 * permissable to send either
+						 * a RR response PDU with the
+						 * F bit set to "0" or a RR
+						 * command PDU with the P bit
+						 * set to "0" to the remote
+						 * LLC DSAP before starting the
+						 * resending of the I PDUs. If
+						 * no I PDU is ready to send,
+						 * either an RR response PDU
+						 * with the F bit set to "0" or
+						 * an RR command PDU with the P
+						 * bit set to "0" must be sent
+						 * to the remote LLC DSAP.
+						 */
+#define LLC_STATE_RESEND_I_RSP		0x59	/* RE-SEND_I_RSP(F=1). Start
+						 * resending all the
+						 * unacknowledged I PDUs for
+						 * this data link connection
+						 * begining with the N(R) given
+						 * in the received PDU. Send the
+						 * first as a response with the
+						 * F bit set to "1". If the
+						 * queue contains more than one
+						 * I PDU, the balance must be
+						 * transmitted as commands with
+						 * the P bit set to "0" or as
+						 * responses with the F bit set
+						 * to "0".
+						 */
+#define LLC_STATE_SEND_REJ_CMD		0x5A	/* SEND_REJ_CMD(P=1). Send a REJ
+						 * command PDU with the P bit
+						 * set to "1" to the remote LLC
+						 * DSAP.
+						 */
+#define LLC_STATE_SEND_REJ_RSP		0x5B	/* SEND_REJ_RSP(F=1). Send a REJ
+						 * response PDU with the F bit
+						 * set to "1" to the remote LLC
+						 * DSAP.
+						 */
+#define LLC_STATE_SEND_REJ_XXX		0x5C	/* SEND_REJ_XXX(X=0). Send
+						 * either a REJ response PDU
+						 * with the F bit set to "0" or
+						 * a REJ command PDU with the P
+						 * bit set to "0" to the remote
+						 * LLC DSAP.
+						 */
+#define LLC_STATE_SEND_RNR_CMD		0x5D	/* SEND_RNR_CMD(P=1). Send a RNR
+						 * command PDU with the P bit
+						 * set to "1" to the remote LLC
+						 * DSAP.
+						 */
+#define LLC_STATE_SEND_RNR_RSP		0x5E	/* SEND_RNR_RSP(F=I). Send a RNR
+						 * response PDU with the F bit
+						 * set to "1"  to the remote LLC
+						 * DSAP.
+						 */
+#define LLC_STATE_SEND_RNR_XXX		0x5F	/* SEND_RNR_XXX(X=0). Send
+						 * either a RNR response PDU 
+						 * with the F bit set to "0" or
+						 * a RNR command PDU with the P
+						 * bit set to "0" to the remote
+						 * LLC DSAP.
+						 */
+#define LLC_STATE_SET_REMOTE_BUSY	0x60	/* SET_REMOTE_BUSY. If 
+						 * REMOTE_BUSY is zero, then set
+						 * REMOTE_BUSY to one to 
+						 * indicate the remote LLC is in
+						 * the busy state and is no able
+						 * to accept I PDUs, start the
+						 * BUSY timer, inform the 
+						 * sublayer management function
+						 * by using REPORT_STATUS(
+						 * REMOTE_BUSY) and stop any
+						 * (re)sending of I PDUs that is
+						 * in progess.
+						 */
+#define LLC_STATE_OPTIONAL_SEND_RNR_XXX	0x61	/* OPTIONAL_SEND_RNR_XXX(X=0).
+						 * It is permissible to send a
+						 * RNR command PDU with the P
+						 * bit set to "0" or a RNR
+						 * response PDU with the
+						 * F bit set to "0" to the 
+						 * remote LLC DSAP in case the
+						 * remote LLC did no receive the
+						 * first RNR sent when the busy
+						 * state was entered.
+						 */
+#define LLC_STATE_SEND_RR_CMD		0x62	/* SEND_RR_CMD(P=1). Send a RR
+						 * command PDU with the P bit
+						 * set to "1" to the remote LLC
+						 * DSAP.
+						 */
+#define LLC_STATE_SEND_ACKNOWLEDGE_CMD	0x63	/* SEND_ACKNOWLEDGE_CMD(P=1).
+						 * Under all conditions it is
+						 * permissible to send a RR
+						 * command PDU with the P bit
+						 * set to "1" to the remote LLC
+						 * DSAP. If no I PDU is ready to
+						 * send, the RR command PDU with
+						 * the P bit set to "1" must be
+						 * sent to the remote LLC DSAP.
+						 * (This RR PDU may be delayed
+						 * by a time bounded by the
+						 * ACK_TIMER value, to wait for
+						 * the generation of an I PDU.)
+						 * However, if an I PDU is ready
+						 * send, and can be modified to
+						 * a command with the P bit set
+						 * to "1", then the RR command
+						 * PDU does not need to be sent.
+						 */
+#define LLC_STATE_SEND_RR_RSP		0x64	/* SEND_RR_RSP(F=I). Send a RR
+						 * response PDU with the F bit
+						 * set to "1" to the remote LLC
+						 * DSAP.
+						 */
+#define LLC_STATE_SEND_ACKNOWLEDGE_RSP	0x65	/* SEND_ACKNOWLEDGE_RSP(F=I).
+						 * Under all conditions it is
+						 * permissible to send a RR 
+						 * response PDU with the F bit
+						 * set to "1" to the remote LLC
+						 * DSAP. If no I PDU is ready to
+						 * send, the RR response PDU 
+						 * with the F bit set to "1" 
+						 * must be sent to the remote
+						 * LLC DSAP. However, if an I 
+						 * PDU is ready to send, and can
+						 * be modified to a response 
+						 * with the F bit set to "1," 
+						 * then the RR response PDU does
+						 * not need to be sent.
+						 */
+#define LLC_STATE_SEND_RR_XXX		0x66	/* SEND_RR_XXX(X=0). Send either
+						 * a RR response PDU with the F
+						 * bit set to "0" or a RR 
+						 * command PDU with the P bit
+						 * set to "0" to the remote LLC
+						 * DSAP.
+						 */
+#define LLC_STATE_SEND_ACKNOWLEDGE_XXX	0x67	/* SEND_ACKNOWLEDGE_XXX(X=0).
+						 * Under all conditions it is
+						 * permissible to send either a
+						 * RR response PDU with the F
+						 * bit set to "0" or a RR 
+						 * command PDU with the P bit
+						 * set to "0" to the remote LLC
+						 * DSAP. If no I PDU is ready to
+						 * send, either an RR response
+						 * with the F bit set to "0" or
+						 * an RR command PDU with the P
+						 * bit set to "0" must be sent 
+						 * to the remote LLC DSAP. (This
+						 * RR PDU may be delayed, by a
+						 * time bounded by the ACK_TIMER
+						 * value, to wait for the
+						 * generation of an I PDU.)
+						 * However, if an I PDU is ready
+						 * to send, then the RR PDU does
+						 * not need to be sent.
+						 */
+#define LLC_STATE_SEND_SABME_CMD	0x68	/* SEND_SABME_CMD(P=X). Send a
+						 * SABME command PDU with the P
+						 * bit set to "X" to the remote
+						 * LLC DSAP.
+						 */
+#define LLC_STATE_SEND_UA_RSP		0x69	/* SEND_UA_RSP(F=X). Send a UA
+						 * response PDU with the F bit
+						 * set to "X" to the remote LLC
+						 * DSAP.
+						 */
+#define LLC_STATE_S_FLAG_0		0x6A	/* S_FLAG:=0. Set S_FLAG to zero
+						 * to indicate that a SABME PDU
+						 * has not been received from
+						 * the remote LLC while the
+						 * local connection service
+						 * component is in the RESET,
+						 * SETUP, or RESET_WAIT state.
+						 */
+#define LLC_STATE_S_FLAG_1		0x6B	/* S_FLAG:=1. Set S_FLAG to one
+						 * to indicate that a SABME PDU
+						 * has been received from the
+						 * remote LLC while the local
+						 * connection service component
+						 * is in the RESET, SETUP, or
+						 * RESET_WAIT state.
+						 */
+#define LLC_STATE_START_P_TIMER		0x6C	/* START_P_TIMER. Start the P/F
+						 * cycle timer from zero; if the
+						 * P_FLAG is zero, initialize
+						 * RETRY_COUNT to zero, and set
+						 * P_FLAG to one.
+						 */
+#define LLC_STATE_START_ACK_TIMER	0x6D	/* START_ACK_TIMER. Start the
+						 * acknowledgment timer from
+						 * zero.
+						 */
+#define LLC_STATE_START_REJ_TIMER	0x6E	/* START_REJ_TIMER. Start the
+						 * "sent REJ" timer from zero.
+						 */
+#define LLC_STATE_START_ACK_TIMER_IF_NOT_RUNNING 0x6F
+						/* START_ACK_TIMER_IF_NOT_
+						 * RUNNING. If the 
+						 * acknowledgment timer is not
+						 * currently running, then start
+						 * the acknowledgment timer from
+						 * zero.
+						 */
+#define LLC_STATE_STOP_ACK_TIMER	0x6F	/* STOP_ACK_TIMER. Stop the
+						 * acknowledgment timer.
+						 */
+#define LLC_STATE_STOP_P_TIMER		0x70	/* STOP_P_TIMER. Stop the P/F
+						 * cycle timer and set P_FLAG
+						 * to zero.
+						 */
+#define LLC_STATE_STOP_REJ_TIMER	0x71	/* STOP_REJ_TIMER. Stop the
+						 * "sent REJ" timer.
+						 */
+#define LLC_STATE_STOP_ALL_TIMERS	0x72	/* STOP_ALL_TIMERS. Stop the
+						 * P/F cycle timer, the "sent
+						 * REJ" timer, the remote-busy
+						 * timer, and the acknowledgment
+						 * timer.
+						 */
+#define LLC_STATE_STOP_OTHER_TIMERS	0x73	/* STOP_OTHER_TIMERS. Stop the
+						 * P/F cycle timer, the "sent
+						 * REJ" timer, and the remote-
+						 * busy timer.
+						 */
+#define LLC_STATE_UPDATE_SEQ_RECEIVED	0x74	/* UPDATE_N(R)_RECEIVED. If the
+						 * N(R) of the received PDU
+						 * acknowledges the receipt of
+						 * one or more previously
+						 * unacknowledged I PDUs, update
+						 * the local record of 
+						 * N(R)_RECEIVED, set 
+						 * RETRY_COUNT to zero, and stop
+						 * the acknowledgment timer. If
+						 * unacknowledged I PDUs still
+						 * exist, start the 
+						 * acknowledgment timer if it
+						 * was stopped.
+						 */
+#define LLC_STATE_UPDATE_P_FLAG		0x75	/* UPDATE_P_FLAG. If the 
+						 * received PDU was a response
+						 * with the F bit set to "1",
+						 * set the P_FLAG to zero and
+						 * stop the P/F cycle timer.
+						 */
+#define LLC_STATE_DATA_FLAG_0		0x76	/* DATA_FLAG:=0. Set the 
+						 * DATA_FLAG to zero to indicate
+						 * that the data units from
+						 * received I PDUs were not
+						 * discarded during a local busy
+						 * period.
+						 */
+#define LLC_STATE_DATA_FLAG_1		0x77	/* DATA_FLAG:=1. Set the 
+						 * DATA_FLAG to one to indicate
+						 * that the data units from
+						 * receieved I PDUs were 
+						 * discarded during a local busy
+						 * period.
+						 */
+#define LLC_STATE_DATA_FLAG_2		0x78	/* DATA_FLAG:=2. Set the
+						 * DATA_FLAG to two to record
+						 * that the BUSY state was 
+						 * entered with a REJ PDU
+						 * outstanding.
+						 */
+#define LLC_STATE_DATA_FLAG_0_THEN_DATA_FLAG_1 0x79
+						/* DATA_FLAG=0_THEN_DATA_FLAG:=1
+						 * If the DATA_FLAG had been
+						 * zero, indicating that no data
+						 * units had been discarded, set
+						 * it to one to indicate that
+						 * data units have now been
+						 * discarded.
+						 */
+#define LLC_STATE_P_FLAG_0		0x7A	/* P_FLAG:=0. Initialize the
+						 * P_FLAG to zero. This 
+						 * indicates that the reception
+						 * of a response PDU with the F
+						 * bit set to "1" is not 
+						 * expected.
+						 */
+#define LLC_STATE_P_FLAG_P		0x7B	/* P_FLAG:=P. Set the P_FLAG to
+						 * the value of the P bit in the
+						 * command PDU being sent.
+						 */
+#define LLC_STATE_REMOTE_BUSY_0		0x7C	/* REMOTE_BUSY:=0. Set 
+						 * REMOTE_BUSY to zero to 
+						 * indicate that the remote LLC
+						 * is avle to accept I PDUs.
+						 */
+#define LLC_STATE_RETRY_COUNT_0		0x7D	/* RETRY_COUNT:=0. Initialize
+						 * RETRY_COUNT to zero.
+						 */
+#define LLC_STATE_RETRY_COUNT_PLUS_1	0x7E	/* RETRY_COUNT:=RETRY_COUNT+1.
+						 * Increment RETRY_COUNT by one.
+						 */
+#define LLC_STATE_RECEIVE_SEQ_0		0x7F	/* V(R):=0. Initialize the 
+						 * receive state variable. This
+						 * is the expected sequence
+						 * number of the next I PDU
+						 * received.
+						 */
+#define LLC_STATE_RECEIVE_SEQ_PLUS_1	0x80	/* V(R):=V(R)+1. Increment
+						 * (modulo 128) the receive
+						 * state variable. This is the
+						 * expected sequence number of 
+						 * the next I PDU received.
+						 */
+#define LLC_STATE_SEND_SEQ_0		0x81	/* V(S):=0. Initialize the send
+						 * state variable. This is the
+						 * sequence number of the next
+						 * I PDU to be sent.
+						 */
+#define LLC_STATE_SEND_SEQ_TO_RECEIVE_PDU 0x82	/* V(S):=N(R). Reset the send
+						 * state variable to the value
+						 * specified by the N(R) field
+						 * of the PDU just received.
+						 */
+#define LLC_STATE_F_FLAG_P		0x83	/* F_FLAG:=P. Set the F_FLAG to
+						 * the value of the P bit
+						 * received. This is the value
+						 * of the F bit to be sent in
+						 * UA or DM PDUs.
+						 */
+#define LLC_STATE_SEND_I_RSP		0x84
+#define LLC_STATE_DISCONNECT_RESPONSE	0x85
+#define LLC_STATE_SEND_RR_RESPONSE	0x86
+#define LLC_STATE_SEND_RR_REQUEST	0x87
+#define LLC_STATE_SEND_REJ_REQUEST	0x88
+#define LLC_STATE_SEND_REJ_RESPONSE	0x89
+#define LLC_STATE_SEND_RNR_REQUEST	0x8A
+#define LLC_STATE_SEND_RNR_RESPONSE	0x8B
+#define LLC_STATE_SEND_DM_RESPONSE	0x8C
+#define LLC_STATE_SEND_UA_RESPONSE	0x8D
+#define LLC_STATE_SEND_NULL_DSAP_TEST_R	0x8E
 
-void 		llc_cancel_timers(llcptr lp);
-int		llc_decode_frametype(frameptr fr);
-llcptr 		llc_find(void);
-int		llc_free_acknowledged_skbs(llcptr lp, unsigned char ack);
-void		llc_handle_xid_indication( char *chsp, short int ll, char *xid_data);
-void		llc_interpret_pseudo_code(llcptr lp, int pc_label, struct sk_buff *skb, char type);
-void		llc_add_to_queue(struct sk_buff *skb, struct sk_buff **f, struct sk_buff **b);
-void		llc_process_otype2_frame(llcptr lp, struct sk_buff *skb, char type);
-struct sk_buff *llc_pull_from_atq(llcptr lp); 
-int 		llc_resend_ipdu(llcptr lp, unsigned char ack_nr, unsigned char type, char p);
-void 		llc_sendpdu(llcptr lp, char type, char pf, int data_len, char *pdu_data);
-void 		llc_sendipdu(llcptr lp, char type, char pf, struct sk_buff *skb);
-void		llc_start_timer(llcptr lp, int t);
-void		llc_stop_timer(llcptr lp, int t);
-void		llc_timer_expired(llcptr lp, int t);
-int		llc_validate_seq_nos(llcptr lp, frameptr fr);
-
-int		llc_data_request(llcptr lp, struct sk_buff *skb);
-void		llc_unit_data_request(llcptr lp, int ll, char * data);
-void		llc_disconnect_request(llcptr lp);
-void		llc_connect_request(llcptr lp);
-void		llc_xid_request(llcptr lp, char opt, int data_len, char *pdu_data);
-void		llc_test_request(llcptr lp, int data_len, char *pdu_data);
-
-int		register_cl2llc_client(llcptr llc, const char *device, void (*ops)(llcptr), u8 *rmac, u8 ssap, u8 dsap);
-void		unregister_cl2llc_client(llcptr lp);
-int 		llc_mac_data_indicate(llcptr lp, struct sk_buff *skb );
+extern int llc_queue_xmit(struct sk_buff *skb);
+extern struct datalink_proto *register_8022_client(unsigned char type,
+        int (*rcvfunc)(struct sk_buff*,struct device*,struct packet_type*),
+        int (*msgrcvfunc)(int rsp, struct sk_buff *));
+extern void unregister_8022_client(unsigned char type);
+extern int llc_connect(struct datalink_proto *dl, struct device *dev,
+        __u8 *dmac, __u8 dsap, int rsp);
+extern int llc_reset(struct datalink_proto *dl, struct device *dev,
+        __u8 *dmac, __u8 dsap, int rsp);
+extern int llc_disconnect(struct datalink_proto *dl, struct device *dev,
+        __u8 *dmac, __u8 dsap, int rsp);
+extern int llc_decode_pdu(llchdr *llc);
+extern int llc_data(__u8 ssap, __u8 dsap, __u8 *dmac,
+        struct sk_buff *skb, struct device *dev);
+extern int llc_test(__u8 ssap, __u8 dsap, __u8 *dmac,
+        struct sk_buff *skb, struct device *dev);
 
+#endif /* __NET_LLC_H */
diff -uNr linux/include/net/llc_frame.h linux-llc/include/net/llc_frame.h
--- linux/include/net/llc_frame.h	Thu Dec 12 14:54:21 1996
+++ linux-llc/include/net/llc_frame.h	Thu Jan  1 01:00:00 1970
@@ -1,98 +0,0 @@
-/* if_ether.h needed for definition of ETH_DATA_LEN and ETH_ALEN
- */
-#include "linux/if_ether.h"
-
-/* frame layout based on par3.2 "LLC PDU format"
- */
-typedef union {			/* pdu layout from pages 40 & 44 */
-    struct {			/* general header, all pdu types */
-	unsigned dsap : 8;	/* dest service access point */
-	unsigned ssap : 8;	/* source service access point */
-	unsigned f1 : 1;	/* I- U- or S- format id bits */
-	unsigned f2 : 1;
-	unsigned : 6;
-	unsigned : 8;
-   } pdu_hdr;
-   struct {
-        char dummy1[2];   	/* dsap + ssap */
-	char byte1;
-	char byte2;
-   } pdu_cntl;			/* unformatted control bytes */
-   struct {			/* header of an Information pdu */
-	unsigned char dummy2[2];
-	unsigned : 1;
-	unsigned ns : 7;
-	unsigned i_pflag : 1;   /* poll/final bit */
-	unsigned nr : 7;	/* N(R)  */	
-	unsigned char is_info[ ETH_DATA_LEN ];
-   }  i_hdr;
-   struct {			/* header of a Supervisory pdu */
- 	unsigned char dummy3[2];
-	unsigned : 2;
-	unsigned ss : 2;	/* supervisory function bits */
-	unsigned : 4;
-	unsigned s_pflag : 1;   /* poll/final bit  */
-	unsigned nr : 7;	/* N(R)  */
-   } s_hdr;
-
-/* when accessing the P/F bit or the N(R) field there's no need to distinguish
-   I pdus from S pdus i_pflag and s_pflag / i_nr and s_nr map to the same
-   physical location.
- */ 
-   struct {			/* header of an Unnumbered pdu */
-	unsigned char dummy4[2];
-	unsigned : 2;
-	unsigned mm1 : 2;	/* modifier function part1 */
-	unsigned u_pflag : 1;    /* P/F for U- pdus */
-	unsigned mm2 : 3;	/* modifier function part2 */
-	unsigned char u_info[ ETH_DATA_LEN-1];
-   } u_hdr;
-   struct {			/* mm field in an Unnumbered pdu */
-	unsigned char dummy5[2];
-	unsigned : 2;
-	unsigned mm : 6;	/* must be masked to get ridd of P/F !  */
-   } u_mm;
-   	 
-} frame_type, *frameptr;
-
-/* frame format test macros: */
-
-#define IS_UFRAME( fr ) ( ( (fr)->pdu_hdr.f1) & ( (fr)->pdu_hdr.f2) )
-
-#define IS_IFRAME( fr ) ( !( (fr)->pdu_hdr.f1) )
-
-#define IS_SFRAME( fr ) ( ( (fr)->pdu_hdr.f1) & !( (fr)->pdu_hdr.f2) )
-
-#define IS_RSP( fr ) ( fr->pdu_hdr.ssap & 0x01 )
-
-
-/* The transition table, the _encode tables and some tests in the
-   source code depend on the numeric order of these values.
-   Think twice before changing.
- */
-
-/* frame names for TYPE 2 operation: */
-#define I_CMD		0
-#define RR_CMD		1
-#define RNR_CMD		2
-#define REJ_CMD		3
-#define DISC_CMD	4
-#define SABME_CMD	5
-#define I_RSP		6
-#define RR_RSP		7
-#define RNR_RSP		8
-#define REJ_RSP		9
-#define UA_RSP		10
-#define DM_RSP		11
-#define FRMR_RSP	12
-
-/* junk frame name: */
-#define BAD_FRAME	13
-#define NO_FRAME	13
-
-/* frame names for TYPE 1 operation: */
-#define UI_CMD		14
-#define XID_CMD		15
-#define TEST_CMD	16
-#define XID_RSP		17
-#define TEST_RSP	18
diff -uNr linux/include/net/llc_name.h linux-llc/include/net/llc_name.h
--- linux/include/net/llc_name.h	Thu Dec 12 14:54:21 1996
+++ linux-llc/include/net/llc_name.h	Thu Jan  1 01:00:00 1970
@@ -1,7 +0,0 @@
-char *frame_names[] =
-    {"I_CMD","RR_CMD","RNR_CMD","REJ_CMD","DISC_CMD",
-    "SABME_CMD","I_RSP","RR_RSP","RNR_RSP","REJ_RSP",
-    "UA_RSP","DM_RSP","FRMR_RSP","BAD_FRAME","UI_CMD",
-    "XID_CMD","TEST_CMD","XID_RSP","TEST_RSP"
-};
- 
diff -uNr linux/include/net/llc_state.h linux-llc/include/net/llc_state.h
--- linux/include/net/llc_state.h	Thu Dec 12 14:54:21 1996
+++ linux-llc/include/net/llc_state.h	Thu Jan  1 01:00:00 1970
@@ -1,4 +0,0 @@
-char *state_names[] = { 
-	"ADM","CONN","RESET_WAIT","RESET_CHECK","SETUP",
-	"RESET","D_CONN","ERROR","NORMAL"
-};
diff -uNr linux/include/net/llccall.h linux-llc/include/net/llccall.h
--- linux/include/net/llccall.h	Thu Dec 12 14:54:21 1996
+++ linux-llc/include/net/llccall.h	Mon Sep 25 06:47:02 2000
@@ -1,3 +1,2 @@
 /* Separate to keep compilation of protocols.c simpler */
-extern void llc_init(struct net_proto *pro);
-
+extern void llc_proto_init(struct net_proto *);
diff -uNr linux/include/net/p8022.h linux-llc/include/net/p8022.h
--- linux/include/net/p8022.h	Mon Mar 25 06:58:22 1996
+++ linux-llc/include/net/p8022.h	Thu Jan  1 01:00:00 1970
@@ -1,7 +0,0 @@
-#ifndef _NET_P8022_H
-#define _NET_P8022_H
-
-extern struct datalink_proto *register_8022_client(unsigned char type, int (*rcvfunc)(struct sk_buff *, struct device *, struct packet_type *));
-extern void unregister_8022_client(unsigned char type);
-
-#endif
diff -uNr linux/include/net/p8023.h linux-llc/include/net/p8023.h
--- linux/include/net/p8023.h	Thu Jan  1 01:00:00 1970
+++ linux-llc/include/net/p8023.h	Mon Sep 25 06:47:27 2000
@@ -0,0 +1,2 @@
+extern struct datalink_proto *make_8023_client(void);
+extern void destroy_8023_client(struct datalink_proto *);
diff -uNr linux/include/net/sock.h linux-llc/include/net/sock.h
--- linux/include/net/sock.h	Fri Jun 23 11:13:52 2000
+++ linux-llc/include/net/sock.h	Mon Sep 25 07:21:08 2000
@@ -461,6 +461,11 @@
 	struct sk_filter      	*filter;
 #endif /* CONFIG_FILTER */
 
+#if defined(CONFIG_LLC_UI) || defined(CONFIG_LLC_UI_MODULE)
+        __u8                    sap;
+        struct datalink_proto   *llc_proto;
+#endif
+
 	/* This is where all the private (optional) areas that don't
 	 * overlap will eventually live. 
 	 */
diff -uNr linux/net/802/Makefile linux-llc/net/802/Makefile
--- linux/net/802/Makefile	Thu Aug 26 01:29:53 1999
+++ linux-llc/net/802/Makefile	Thu Jan  1 01:00:00 1970
@@ -1,60 +0,0 @@
-#
-# Makefile for the Linux 802.x protocol layers.
-#
-# Note! Dependencies are done automagically by 'make dep', which also
-# removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
-#
-# Note 2! The CFLAGS definition is now in the main makefile...
-
-O_TARGET := 802.o
-O_OBJS	  = p8023.o
-
-ifeq ($(CONFIG_SYSCTL),y)
-O_OBJS += sysctl_net_802.o
-endif
-
-ifeq ($(CONFIG_LLC),y)
-SUB_DIRS += transit
-O_OBJS += llc_sendpdu.o llc_utility.o cl2llc.o
-OX_OBJS += llc_macinit.o
-SNAP = y
-endif
-
-ifdef CONFIG_TR
-O_OBJS += tr.o
-	SNAP=y
-endif
-
-ifdef CONFIG_NET_FC
-O_OBJS += fc.o
-endif
-
-ifdef CONFIG_FDDI
-O_OBJS += fddi.o
-endif
-
-ifdef CONFIG_HIPPI
-O_OBJS += hippi.o
-endif
-
-ifdef CONFIG_IPX
-	SNAP=y
-endif
-
-ifdef CONFIG_ATALK
-	SNAP=y
-endif
-
-ifeq ($(SNAP),y)
-OX_OBJS += p8022.o psnap.o
-endif
-
-
-include $(TOPDIR)/Rules.make
-
-cl2llc.c: cl2llc.pre
-	sed -f ./pseudo/opcd2num.sed cl2llc.pre >cl2llc.c
-
-tar:
-		tar -cvf /dev/f1 .
diff -uNr linux/net/802/TODO linux-llc/net/802/TODO
--- linux/net/802/TODO	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/TODO	Thu Jan  1 01:00:00 1970
@@ -1,29 +0,0 @@
-Remaining Problems:
-
-1. Serialization of access to variables in the llc structure
-by mac_data_indicate(), timer expired functions, and data_request() .
-There is not serialization of any kind right now.
-While testing, I have not seen any problems that stem from this lack of
-serialization, but it wories me...
-
-2. The code is currently able to handle one connection only,
-there is more work in register_cl2llc_client() to make a chain
-of llc structures and in mac_data_indicate() to find back
-the llc structure addressed by an incomming frame.
-According to IEEE, connections are identified by (remote mac + local mac
-+ dsap + ssap). dsap and ssap do not seem important: existing applications
-always use the same dsap/ssap. Its probably sufficient to index on 
-the remote mac only. 
- 
-3. There is no test to see if the transmit window is full in data_request()
-as described in the doc p73, "7.5.1 Sending I PDUs" 3th alinea.
-The pdus presented to data_request() could probably go on the 
-awaiting-transmit-queue (atq). The real difficulty is coding a test
-to see if the transmit window is used up and to send the queue
-when space in the window becomes available.
-As I have no network layer that can generate a continous flow of pdus it is
-difficult to simulate a remote busy condition and hence to test the code
-to handle it.
- 
-4. A simple flow control algorithm, steering the size of the transmit
-window would be nice to have.
diff -uNr linux/net/802/cl2llc.c linux-llc/net/802/cl2llc.c
--- linux/net/802/cl2llc.c	Sat Nov 29 18:41:10 1997
+++ linux-llc/net/802/cl2llc.c	Thu Jan  1 01:00:00 1970
@@ -1,615 +0,0 @@
-/*
- * NET		An implementation of the IEEE 802.2 LLC protocol for the
- *		LINUX operating system.  LLC is implemented as a set of 
- *		state machines and callbacks for higher networking layers.
- *
- *		Class 2 llc algorithm.
- *		Pseudocode interpreter, transition table lookup,
- *			data_request & indicate primitives...
- *
- *		Code for initialization, termination, registration and 
- *		MAC layer glue.
- *
- *		Copyright Tim Alpaerts, 
- *			<Tim_Alpaerts@toyota-motor-europe.com>
- *
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- *
- *	Changes
- *		Alan Cox	:	Chainsawed into Linux format
- *					Modified to use llc_ names
- *					Changed callbacks
- *
- *	This file must be processed by sed before it can be compiled.
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/malloc.h>
-#include <linux/netdevice.h>
-#include <linux/skbuff.h>
-#include <net/p8022.h>
-#include <linux/proc_fs.h>
-#include <linux/stat.h>
-#include <asm/byteorder.h>
-
-#include "pseudo/pseudocode.h"
-#include "transit/pdutr.h"
-#include "transit/timertr.h"
-#include <net/llc_frame.h>
-#include <net/llc.h>
-
-/*
- *	Data_request() is called by the client to present a data unit
- *	to the llc for transmission.
- *	In the future this function should also check if the transmit window
- *	allows the sending of another pdu, and if not put the skb on the atq
- *	for deferred sending.
- */
-
-int llc_data_request(llcptr lp, struct sk_buff *skb)
-{
-	if (skb_headroom(skb) < (lp->dev->hard_header_len +4)){
-		printk("cl2llc: data_request() not enough headroom in skb\n");
-		return -1;
-	};
-
-	skb_push(skb, 4);
-
-	if ((lp->state != NORMAL) && (lp->state != BUSY) && (lp->state != REJECT))
-	{
-		printk("cl2llc: data_request() while no llc connection\n"); 
-		return -1;  
-	}
-
-	if (lp->remote_busy)
-	{     /* if the remote llc is BUSY, */
-		ADD_TO_ATQ(skb);      /* save skb in the await transmit queue */
-		return 0;
-	}                           
-	else
-	{
-		/*
-		 *	Else proceed with xmit 
-		 */
-
-		switch(lp->state)
-		{
-			case NORMAL:
-				if(lp->p_flag)
-					llc_interpret_pseudo_code(lp, NORMAL2, skb, NO_FRAME);
-				else
-					llc_interpret_pseudo_code(lp, NORMAL1, skb, NO_FRAME);
-				break;
-			case BUSY:
-				if (lp->p_flag)
-					llc_interpret_pseudo_code(lp, BUSY2, skb, NO_FRAME);
-				else
-					llc_interpret_pseudo_code(lp, BUSY1, skb, NO_FRAME);
-				break;
-			case REJECT:
-				if (lp->p_flag)
-					llc_interpret_pseudo_code(lp, REJECT2, skb, NO_FRAME);
-				else
-					llc_interpret_pseudo_code(lp, REJECT1, skb, NO_FRAME);
-				break;
-			default:
-		}
-		if(lp->llc_callbacks)
-		{
-			lp->llc_event(lp);
-			lp->llc_callbacks=0;
-		}
-		return 0;  
-	}              
-}
-
-
-
-/* 
- *	Disconnect_request() requests that the llc to terminate a connection
- */
-
-void disconnect_request(llcptr lp)
-{
-	if ((lp->state == NORMAL) ||
-    		(lp->state == BUSY) ||
-		(lp->state == REJECT) ||
-		(lp->state == AWAIT) ||
-		(lp->state == AWAIT_BUSY) ||
-		(lp->state == AWAIT_REJECT))
-	{
-		lp->state = D_CONN;
-		llc_interpret_pseudo_code(lp, SH1, NULL, NO_FRAME);
-		if(lp->llc_callbacks)
-		{
-			lp->llc_event(lp);
-			lp->llc_callbacks=0;
-		}
-		/*
- 		 *	lp may be invalid after the callback
-		 */
-	}
-}
-
-
-/*
- *	Connect_request() requests that the llc to start a connection
- */
-
-void connect_request(llcptr lp)
-{
-	if (lp->state == ADM)
-	{
-		lp->state = SETUP;
-		llc_interpret_pseudo_code(lp, ADM1, NULL, NO_FRAME);
-		if(lp->llc_callbacks)
-		{
-			lp->llc_event(lp);
-			lp->llc_callbacks=0;
-		}
-		/*
- 		 *	lp may be invalid after the callback
-		 */
-	}
-}
-
-
-/*
- *	Interpret_pseudo_code() executes the actions in the connection component
- *	state transition table. Table 4 in document on p88.
- *
- *	If this function is called to handle an incomming pdu, skb will point
- *	to the buffer with the pdu and type will contain the decoded pdu type.
- *
- *	If called by data_request skb points to an skb that was skb_alloc-ed by 
- *	the llc client to hold the information unit to be transmitted, there is
- *	no valid type in this case.  
- *
- *	If called because a timer expired no skb is passed, and there is no 
- *	type.
- */
-
-void llc_interpret_pseudo_code(llcptr lp, int pc_label, struct sk_buff *skb, 
-		char type)
-{    
-	short int pc;	/* program counter in pseudo code array */ 
-	char p_flag_received;
-	frameptr fr;
-	int resend_count;   /* number of pdus resend by llc_resend_ipdu() */
-	int ack_count;      /* number of pdus acknowledged */
-	struct sk_buff *skb2;
-
-	if (skb != NULL) 
-	{
-		fr = (frameptr) skb->data;
-	}
-	else
-		fr = NULL;
-
-	pc = pseudo_code_idx[pc_label];
-	while(pseudo_code[pc])
-	{
-		switch(pseudo_code[pc])
-		{
-			case 9:
-				if ((type != I_CMD) || (fr->i_hdr.i_pflag == 0))
-					break;
-			case 1:
-				lp->remote_busy = 0;
-				llc_stop_timer(lp, BUSY_TIMER);
-				if ((lp->state == NORMAL) ||
-					(lp->state == REJECT) ||
-					(lp->state == BUSY))
-				{
-					skb2 = llc_pull_from_atq(lp);
-					if (skb2 != NULL) 
-						llc_start_timer(lp, ACK_TIMER);
-					while (skb2 != NULL)
-					{
-						llc_sendipdu( lp, I_CMD, 0, skb2);
-						skb2 = llc_pull_from_atq(lp);
-					}
-				}	   
-				break;
-			case 2:
-				lp->state = NORMAL;  /* needed to eliminate connect_response() */
-				lp->llc_mode = MODE_ABM;
-				lp->llc_callbacks|=LLC_CONN_INDICATION;
-				break;
-			case 3:
-				lp->llc_mode = MODE_ABM;
-				lp->llc_callbacks|=LLC_CONN_CONFIRM;
-				break;
-			case 4:
-				skb_pull(skb, 4);
-				lp->inc_skb=skb;
-				lp->llc_callbacks|=LLC_DATA_INDIC;
-				break;
-			case 5:
-				lp->llc_mode = MODE_ADM;
-				lp->llc_callbacks|=LLC_DISC_INDICATION;
-				break;
-			case 70:
-				lp->llc_callbacks|=LLC_RESET_INDIC_LOC;
-				break;
-			case 71:
-				lp->llc_callbacks|=LLC_RESET_INDIC_REM;
-				break;
-			case 7:
-				lp->llc_callbacks|=LLC_RST_CONFIRM;
-				break;
-			case 66:
-				lp->llc_callbacks|=LLC_FRMR_RECV;
-				break;
-			case 67:
-				lp->llc_callbacks|=LLC_FRMR_SENT;
-				break;
-			case 68:
-				lp->llc_callbacks|=LLC_REMOTE_BUSY;
-				break;
-			case 69:
-				lp->llc_callbacks|=LLC_REMOTE_NOTBUSY;
-				break;
-			case 11:
-				llc_sendpdu(lp, DISC_CMD, lp->f_flag, 0, NULL);
-				break;
-			case 12:
-				llc_sendpdu(lp, DM_RSP, 0, 0, NULL);
-				break;
-			case 13:                        
-				lp->frmr_info_fld.cntl1 = fr->pdu_cntl.byte1;
-				lp->frmr_info_fld.cntl2 = fr->pdu_cntl.byte2;
-				lp->frmr_info_fld.vs = lp->vs;
-				lp->frmr_info_fld.vr_cr = lp->vr;
-				llc_sendpdu(lp, FRMR_RSP, 0, 5, (char *) &lp->frmr_info_fld);
-				break;
-			case 14:
-				llc_sendpdu(lp, FRMR_RSP, 0, 5, (char *) &lp->frmr_info_fld);
-				break;
-			case 15:
-				llc_sendpdu(lp, FRMR_RSP, lp->p_flag,
-					5, (char *) &lp->frmr_info_fld);
-				break;
-			case 16:
-				llc_sendipdu(lp, I_CMD, 1, skb);   
-				break;
-			case 17:
-				resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 1);
-				break;
-			case 18:
-				resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 1);
-				if (resend_count == 0) 
-				{
-					llc_sendpdu(lp, RR_CMD, 1, 0, NULL);
-				}    
-				break;
-			case 19:
-				llc_sendipdu(lp, I_CMD, 0, skb);   
-				break;
-			case 20:
-				resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 0);
-				break;
-			case 21:
-				resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 0);
-				if (resend_count == 0) 
-				{
-					llc_sendpdu(lp, RR_CMD, 0, 0, NULL);
-				}    
-				break;
-			case 22:
-				resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_RSP, 1);
-				break;
-			case 23:
-				llc_sendpdu(lp, REJ_CMD, 1, 0, NULL);
-				break;
-			case 24:
-				llc_sendpdu(lp, REJ_RSP, 1, 0, NULL);
-				break;
-			case 25:
-				if (IS_RSP(fr))
-					llc_sendpdu(lp, REJ_CMD, 0, 0, NULL);
-				else
-					llc_sendpdu(lp, REJ_RSP, 0, 0, NULL);
-				break;
-			case 26:
-				llc_sendpdu(lp, RNR_CMD, 1, 0, NULL);
-				break;
-			case 27:
-				llc_sendpdu(lp, RNR_RSP, 1, 0, NULL);
-				break;
-			case 28:
-				if (IS_RSP(fr))
-					llc_sendpdu(lp, RNR_CMD, 0, 0, NULL);
-				else
-					llc_sendpdu(lp, RNR_RSP, 0, 0, NULL);
-				break;
-			case 29:
-				if (lp->remote_busy == 0)
-				{
-					lp->remote_busy = 1;
-					llc_start_timer(lp, BUSY_TIMER);
-					lp->llc_callbacks|=LLC_REMOTE_BUSY;
-				}
-				else if (lp->timer_state[BUSY_TIMER] == TIMER_IDLE)
-				{
-					llc_start_timer(lp, BUSY_TIMER);
-				}
-				break;
-			case 30:
-				if (IS_RSP(fr)) 
-					llc_sendpdu(lp, RNR_CMD, 0, 0, NULL);
-				else
-					llc_sendpdu(lp, RNR_RSP, 0, 0, NULL);
-				break;
-			case 31:
-				llc_sendpdu(lp, RR_CMD, 1, 0, NULL);
-				break;
-			case 32:
-				llc_sendpdu(lp, RR_CMD, 1, 0, NULL);
-				break;
-			case 33:
-				llc_sendpdu(lp, RR_RSP, 1, 0, NULL);
-				break;
-			case 34:
-				llc_sendpdu(lp, RR_RSP, 1, 0, NULL);
-				break;
-			case 35:
-				llc_sendpdu(lp, RR_RSP, 0, 0, NULL);
-				break;
-			case 36:
-				if (IS_RSP(fr)) 
-					llc_sendpdu(lp, RR_CMD, 0, 0, NULL);
-				else
-					llc_sendpdu(lp, RR_RSP, 0, 0, NULL);
-				break;
-			case 37:
-				llc_sendpdu(lp, SABME_CMD, 0, 0, NULL);
-				lp->f_flag = 0;
-				break;
-			case 38:
-				llc_sendpdu(lp, UA_RSP, lp->f_flag, 0, NULL);
-				break;
-			case 39:
-				lp->s_flag = 0;
-				break;
-			case 40:
-				lp->s_flag = 1;
-				break;
-			case 41:
-				if(lp->timer_state[P_TIMER] == TIMER_RUNNING)
-					llc_stop_timer(lp, P_TIMER);
-				llc_start_timer(lp, P_TIMER);
-				if (lp->p_flag == 0)
-				{
-					lp->retry_count = 0;
-					lp->p_flag = 1;
-				}
-				break;
-			case 44:
-				if (lp->timer_state[ACK_TIMER] == TIMER_IDLE)
-					llc_start_timer(lp, ACK_TIMER);
-				break;
-			case 42:
-				llc_start_timer(lp, ACK_TIMER);
-				break;
-			case 43:
-				llc_start_timer(lp, REJ_TIMER);
-				break;
-			case 45:
-				llc_stop_timer(lp, ACK_TIMER);
-				break;
-			case 46:
-				llc_stop_timer(lp, ACK_TIMER);
-				lp->p_flag = 0;
-				break;
-			case 10:
-				if (lp->data_flag == 2)
-					llc_stop_timer(lp, REJ_TIMER);
-				break;
-			case 47:
-				llc_stop_timer(lp, REJ_TIMER);
-				break;
-			case 48:
-				llc_stop_timer(lp, ACK_TIMER);
-				llc_stop_timer(lp, P_TIMER);
-				llc_stop_timer(lp, REJ_TIMER);
-				llc_stop_timer(lp, BUSY_TIMER);
-				break;
-			case 49:
-				llc_stop_timer(lp, P_TIMER);
-				llc_stop_timer(lp, REJ_TIMER);
-				llc_stop_timer(lp, BUSY_TIMER);
-				break;
-			case 50:             
-				ack_count = llc_free_acknowledged_skbs(lp,
-					(unsigned char) fr->s_hdr.nr);
-				if (ack_count > 0)
-				{
-					lp->retry_count = 0;
-					llc_stop_timer(lp, ACK_TIMER);  
-					if (skb_peek(&lp->rtq) != NULL)
-					{
-						/*
- 						 *	Re-transmit queue not empty 
-						 */
-						llc_start_timer(lp, ACK_TIMER);  
-					}
-				}        
-				break;
-			case 51:
-				if (IS_UFRAME(fr)) 
-					p_flag_received = fr->u_hdr.u_pflag;
-				else
-					p_flag_received = fr->i_hdr.i_pflag;
-				if ((fr->pdu_hdr.ssap & 0x01) && (p_flag_received))
-				{
-					lp->p_flag = 0;
-					llc_stop_timer(lp, P_TIMER);  
-				}
-				break;
-			case 52:
-				lp->data_flag = 2;
-				break;
-			case 53:
-				lp->data_flag = 0;
-				break;
-			case 54:
-				lp->data_flag = 1;
-				break;
-			case 55:
-				if (lp->data_flag == 0)
-					lp->data_flag = 1;
-				break;
-			case 56:
-				lp->p_flag = 0;
-				break;
-			case 57:
-				lp->p_flag = lp->f_flag;
-				break;
-			case 58:
-				lp->remote_busy = 0;
-				break;
-			case 59:
-				lp->retry_count = 0;
-				break;
-			case 60:
-				lp->retry_count++;
-				break;
-			case 61:
-				lp->vr = 0;
-				break;
-			case 62:
-				lp->vr++;
-				break;
-			case 63:
-				lp->vs = 0;
-				break;
-			case 64:
-				lp->vs = fr->i_hdr.nr;
-				break;
-			case 65:
-				if (IS_UFRAME(fr)) 
-					lp->f_flag = fr->u_hdr.u_pflag;
-				else
-					lp->f_flag = fr->i_hdr.i_pflag;
-				break;
-			default:
-		}
-		pc++;	
-	}
-}
-
-
-/*
- *	Process_otype2_frame will handle incoming frames
- *	for 802.2 Type 2 Procedure.
- */
-
-void llc_process_otype2_frame(llcptr lp, struct sk_buff *skb, char type)
-{
-	int idx;		/*	index in transition table */
-	int pc_label;		/*	action to perform, from tr tbl */
-	int validation;		/*	result of validate_seq_nos */
-	int p_flag_received;	/*	p_flag in received frame */
-	frameptr fr;
-
-	fr = (frameptr) skb->data;
-
-	if (IS_UFRAME(fr))
-		p_flag_received = fr->u_hdr.u_pflag;
-	else
-		p_flag_received = fr->i_hdr.i_pflag;
-
-	switch(lp->state)
-	{
-		/*	Compute index in transition table: */
-		case ADM:
-			idx = type;
-			idx = (idx << 1) + p_flag_received;
-			break;
-		case CONN:
-		case RESET_WAIT:
-		case RESET_CHECK:
-		case ERROR:
-			idx = type;
-			break;
-		case SETUP:
-		case RESET:
-		case D_CONN:
-			idx = type;
-			idx = (idx << 1) + lp->p_flag;
-			break;
-		case NORMAL:
-		case BUSY:
-		case REJECT:
-		case AWAIT:
-		case AWAIT_BUSY:
-		case AWAIT_REJECT:
-			validation = llc_validate_seq_nos(lp, fr);
-			if (validation > 3) 
-				type = BAD_FRAME;
-			idx = type;
-			idx = (idx << 1);
-			if (validation & 1) 
-				idx = idx +1;
-			idx = (idx << 1) + p_flag_received;
-			idx = (idx << 1) + lp->p_flag;
-		default:
-			printk("llc_proc: bad state\n");
-			return;
-	}
-	idx = (idx << 1) + pdutr_offset[lp->state];
-	lp->state = pdutr_entry[idx +1]; 
-	pc_label = pdutr_entry[idx];
-	if (pc_label != 0)
-	{ 
-		llc_interpret_pseudo_code(lp, pc_label, skb, type);
-		if(lp->llc_callbacks)
-		{
-			lp->llc_event(lp);
-			lp->llc_callbacks=0;
-		}
-		/*
- 		 *	lp may no longer be valid after this point. Be
-		 *	careful what is added!
-		 */
-	}
-}
-
-
-void llc_timer_expired(llcptr lp, int t)
-{
-	int idx;		/* index in transition table	*/
-	int pc_label;       	/* action to perform, from tr tbl */
-
-	lp->timer_state[t] = TIMER_EXPIRED;
-	idx = lp->state;            /* Compute index in transition table: */
-	idx = (idx << 2) + t;
-	idx = idx << 1;
-	if (lp->retry_count >= lp->n2) 
-		idx = idx + 1;
-	idx = (idx << 1) + lp->s_flag;
-	idx = (idx << 1) + lp->p_flag;
-	idx = idx << 1;             /* 2 bytes per entry: action & newstate */
-
-	pc_label = timertr_entry[idx];
-	if (pc_label != 0)
-	{
-		llc_interpret_pseudo_code(lp, pc_label, NULL, NO_FRAME);
-		lp->state = timertr_entry[idx +1];
-	}
-	lp->timer_state[t] = TIMER_IDLE;
-	if(lp->llc_callbacks)
-	{
-		lp->llc_event(lp);
-		lp->llc_callbacks=0;
-	}
-	/*
- 	 *	And lp may have vanished in the event callback
- 	 */
-}
-
diff -uNr linux/net/802/cl2llc.pre linux-llc/net/802/cl2llc.pre
--- linux/net/802/cl2llc.pre	Sat Nov 29 18:41:10 1997
+++ linux-llc/net/802/cl2llc.pre	Thu Jan  1 01:00:00 1970
@@ -1,615 +0,0 @@
-/*
- * NET		An implementation of the IEEE 802.2 LLC protocol for the
- *		LINUX operating system.  LLC is implemented as a set of 
- *		state machines and callbacks for higher networking layers.
- *
- *		Class 2 llc algorithm.
- *		Pseudocode interpreter, transition table lookup,
- *			data_request & indicate primitives...
- *
- *		Code for initialization, termination, registration and 
- *		MAC layer glue.
- *
- *		Copyright Tim Alpaerts, 
- *			<Tim_Alpaerts@toyota-motor-europe.com>
- *
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- *
- *	Changes
- *		Alan Cox	:	Chainsawed into Linux format
- *					Modified to use llc_ names
- *					Changed callbacks
- *
- *	This file must be processed by sed before it can be compiled.
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/malloc.h>
-#include <linux/netdevice.h>
-#include <linux/skbuff.h>
-#include <net/p8022.h>
-#include <linux/proc_fs.h>
-#include <linux/stat.h>
-#include <asm/byteorder.h>
-
-#include "pseudo/pseudocode.h"
-#include "transit/pdutr.h"
-#include "transit/timertr.h"
-#include <net/llc_frame.h>
-#include <net/llc.h>
-
-/*
- *	Data_request() is called by the client to present a data unit
- *	to the llc for transmission.
- *	In the future this function should also check if the transmit window
- *	allows the sending of another pdu, and if not put the skb on the atq
- *	for deferred sending.
- */
-
-int llc_data_request(llcptr lp, struct sk_buff *skb)
-{
-	if (skb_headroom(skb) < (lp->dev->hard_header_len +4)){
-		printk("cl2llc: data_request() not enough headroom in skb\n");
-		return -1;
-	};
-
-	skb_push(skb, 4);
-
-	if ((lp->state != NORMAL) && (lp->state != BUSY) && (lp->state != REJECT))
-	{
-		printk("cl2llc: data_request() while no llc connection\n"); 
-		return -1;  
-	}
-
-	if (lp->remote_busy)
-	{     /* if the remote llc is BUSY, */
-		ADD_TO_ATQ(skb);      /* save skb in the await transmit queue */
-		return 0;
-	}                           
-	else
-	{
-		/*
-		 *	Else proceed with xmit 
-		 */
-
-		switch(lp->state)
-		{
-			case NORMAL:
-				if(lp->p_flag)
-					llc_interpret_pseudo_code(lp, NORMAL2, skb, NO_FRAME);
-				else
-					llc_interpret_pseudo_code(lp, NORMAL1, skb, NO_FRAME);
-				break;
-			case BUSY:
-				if (lp->p_flag)
-					llc_interpret_pseudo_code(lp, BUSY2, skb, NO_FRAME);
-				else
-					llc_interpret_pseudo_code(lp, BUSY1, skb, NO_FRAME);
-				break;
-			case REJECT:
-				if (lp->p_flag)
-					llc_interpret_pseudo_code(lp, REJECT2, skb, NO_FRAME);
-				else
-					llc_interpret_pseudo_code(lp, REJECT1, skb, NO_FRAME);
-				break;
-			default:
-		}
-		if(lp->llc_callbacks)
-		{
-			lp->llc_event(lp);
-			lp->llc_callbacks=0;
-		}
-		return 0;  
-	}              
-}
-
-
-
-/* 
- *	Disconnect_request() requests that the llc to terminate a connection
- */
-
-void disconnect_request(llcptr lp)
-{
-	if ((lp->state == NORMAL) ||
-    		(lp->state == BUSY) ||
-		(lp->state == REJECT) ||
-		(lp->state == AWAIT) ||
-		(lp->state == AWAIT_BUSY) ||
-		(lp->state == AWAIT_REJECT))
-	{
-		lp->state = D_CONN;
-		llc_interpret_pseudo_code(lp, SH1, NULL, NO_FRAME);
-		if(lp->llc_callbacks)
-		{
-			lp->llc_event(lp);
-			lp->llc_callbacks=0;
-		}
-		/*
- 		 *	lp may be invalid after the callback
-		 */
-	}
-}
-
-
-/*
- *	Connect_request() requests that the llc to start a connection
- */
-
-void connect_request(llcptr lp)
-{
-	if (lp->state == ADM)
-	{
-		lp->state = SETUP;
-		llc_interpret_pseudo_code(lp, ADM1, NULL, NO_FRAME);
-		if(lp->llc_callbacks)
-		{
-			lp->llc_event(lp);
-			lp->llc_callbacks=0;
-		}
-		/*
- 		 *	lp may be invalid after the callback
-		 */
-	}
-}
-
-
-/*
- *	Interpret_pseudo_code() executes the actions in the connection component
- *	state transition table. Table 4 in document on p88.
- *
- *	If this function is called to handle an incomming pdu, skb will point
- *	to the buffer with the pdu and type will contain the decoded pdu type.
- *
- *	If called by data_request skb points to an skb that was skb_alloc-ed by 
- *	the llc client to hold the information unit to be transmitted, there is
- *	no valid type in this case.  
- *
- *	If called because a timer expired no skb is passed, and there is no 
- *	type.
- */
-
-void llc_interpret_pseudo_code(llcptr lp, int pc_label, struct sk_buff *skb, 
-		char type)
-{    
-	short int pc;	/* program counter in pseudo code array */ 
-	char p_flag_received;
-	frameptr fr;
-	int resend_count;   /* number of pdus resend by llc_resend_ipdu() */
-	int ack_count;      /* number of pdus acknowledged */
-	struct sk_buff *skb2;
-
-	if (skb != NULL) 
-	{
-		fr = (frameptr) skb->data;
-	}
-	else
-		fr = NULL;
-
-	pc = pseudo_code_idx[pc_label];
-	while(pseudo_code[pc])
-	{
-		switch(pseudo_code[pc])
-		{
-			case IF_F=1_CLEAR_REMOTE_BUSY:
-				if ((type != I_CMD) || (fr->i_hdr.i_pflag == 0))
-					break;
-			case CLEAR_REMOTE_BUSY:
-				lp->remote_busy = 0;
-				llc_stop_timer(lp, BUSY_TIMER);
-				if ((lp->state == NORMAL) ||
-					(lp->state == REJECT) ||
-					(lp->state == BUSY))
-				{
-					skb2 = llc_pull_from_atq(lp);
-					if (skb2 != NULL) 
-						llc_start_timer(lp, ACK_TIMER);
-					while (skb2 != NULL)
-					{
-						llc_sendipdu( lp, I_CMD, 0, skb2);
-						skb2 = llc_pull_from_atq(lp);
-					}
-				}	   
-				break;
-			case CONNECT_INDICATION:
-				lp->state = NORMAL;  /* needed to eliminate connect_response() */
-				lp->llc_mode = MODE_ABM;
-				lp->llc_callbacks|=LLC_CONN_INDICATION;
-				break;
-			case CONNECT_CONFIRM:
-				lp->llc_mode = MODE_ABM;
-				lp->llc_callbacks|=LLC_CONN_CONFIRM;
-				break;
-			case DATA_INDICATION:
-				skb_pull(skb, 4);
-				lp->inc_skb=skb;
-				lp->llc_callbacks|=LLC_DATA_INDIC;
-				break;
-			case DISCONNECT_INDICATION:
-				lp->llc_mode = MODE_ADM;
-				lp->llc_callbacks|=LLC_DISC_INDICATION;
-				break;
-			case RESET_INDICATION(LOCAL):
-				lp->llc_callbacks|=LLC_RESET_INDIC_LOC;
-				break;
-			case RESET_INDICATION(REMOTE):
-				lp->llc_callbacks|=LLC_RESET_INDIC_REM;
-				break;
-			case RESET_CONFIRM:
-				lp->llc_callbacks|=LLC_RST_CONFIRM;
-				break;
-			case REPORT_STATUS(FRMR_RECEIVED):
-				lp->llc_callbacks|=LLC_FRMR_RECV;
-				break;
-			case REPORT_STATUS(FRMR_SENT):
-				lp->llc_callbacks|=LLC_FRMR_SENT;
-				break;
-			case REPORT_STATUS(REMOTE_BUSY):
-				lp->llc_callbacks|=LLC_REMOTE_BUSY;
-				break;
-			case REPORT_STATUS(REMOTE_NOT_BUSY):
-				lp->llc_callbacks|=LLC_REMOTE_NOTBUSY;
-				break;
-			case SEND_DISC_CMD(P=X):
-				llc_sendpdu(lp, DISC_CMD, lp->f_flag, 0, NULL);
-				break;
-			case SEND_DM_RSP(F=X):
-				llc_sendpdu(lp, DM_RSP, 0, 0, NULL);
-				break;
-			case SEND_FRMR_RSP(F=X):                        
-				lp->frmr_info_fld.cntl1 = fr->pdu_cntl.byte1;
-				lp->frmr_info_fld.cntl2 = fr->pdu_cntl.byte2;
-				lp->frmr_info_fld.vs = lp->vs;
-				lp->frmr_info_fld.vr_cr = lp->vr;
-				llc_sendpdu(lp, FRMR_RSP, 0, 5, (char *) &lp->frmr_info_fld);
-				break;
-			case RE-SEND_FRMR_RSP(F=0):
-				llc_sendpdu(lp, FRMR_RSP, 0, 5, (char *) &lp->frmr_info_fld);
-				break;
-			case RE-SEND_FRMR_RSP(F=P):
-				llc_sendpdu(lp, FRMR_RSP, lp->p_flag,
-					5, (char *) &lp->frmr_info_fld);
-				break;
-			case SEND_I_CMD(P=1):
-				llc_sendipdu(lp, I_CMD, 1, skb);   
-				break;
-			case RE-SEND_I_CMD(P=1):
-				resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 1);
-				break;
-			case RE-SEND_I_CMD(P=1)_OR_SEND_RR:
-				resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 1);
-				if (resend_count == 0) 
-				{
-					llc_sendpdu(lp, RR_CMD, 1, 0, NULL);
-				}    
-				break;
-			case SEND_I_XXX(X=0):
-				llc_sendipdu(lp, I_CMD, 0, skb);   
-				break;
-			case RE-SEND_I_XXX(X=0):
-				resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 0);
-				break;
-			case RE-SEND_I_XXX(X=0)_OR_SEND_RR:
-				resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_CMD, 0);
-				if (resend_count == 0) 
-				{
-					llc_sendpdu(lp, RR_CMD, 0, 0, NULL);
-				}    
-				break;
-			case RE-SEND_I_RSP(F=1):
-				resend_count = llc_resend_ipdu(lp, fr->i_hdr.nr, I_RSP, 1);
-				break;
-			case SEND_REJ_CMD(P=1):
-				llc_sendpdu(lp, REJ_CMD, 1, 0, NULL);
-				break;
-			case SEND_REJ_RSP(F=1):
-				llc_sendpdu(lp, REJ_RSP, 1, 0, NULL);
-				break;
-			case SEND_REJ_XXX(X=0):
-				if (IS_RSP(fr))
-					llc_sendpdu(lp, REJ_CMD, 0, 0, NULL);
-				else
-					llc_sendpdu(lp, REJ_RSP, 0, 0, NULL);
-				break;
-			case SEND_RNR_CMD(F=1):
-				llc_sendpdu(lp, RNR_CMD, 1, 0, NULL);
-				break;
-			case SEND_RNR_RSP(F=1):
-				llc_sendpdu(lp, RNR_RSP, 1, 0, NULL);
-				break;
-			case SEND_RNR_XXX(X=0):
-				if (IS_RSP(fr))
-					llc_sendpdu(lp, RNR_CMD, 0, 0, NULL);
-				else
-					llc_sendpdu(lp, RNR_RSP, 0, 0, NULL);
-				break;
-			case SET_REMOTE_BUSY:
-				if (lp->remote_busy == 0)
-				{
-					lp->remote_busy = 1;
-					llc_start_timer(lp, BUSY_TIMER);
-					lp->llc_callbacks|=LLC_REMOTE_BUSY;
-				}
-				else if (lp->timer_state[BUSY_TIMER] == TIMER_IDLE)
-				{
-					llc_start_timer(lp, BUSY_TIMER);
-				}
-				break;
-			case OPTIONAL_SEND_RNR_XXX(X=0):
-				if (IS_RSP(fr)) 
-					llc_sendpdu(lp, RNR_CMD, 0, 0, NULL);
-				else
-					llc_sendpdu(lp, RNR_RSP, 0, 0, NULL);
-				break;
-			case SEND_RR_CMD(P=1):
-				llc_sendpdu(lp, RR_CMD, 1, 0, NULL);
-				break;
-			case SEND_ACKNOWLEDGE_CMD(P=1):
-				llc_sendpdu(lp, RR_CMD, 1, 0, NULL);
-				break;
-			case SEND_RR_RSP(F=1):
-				llc_sendpdu(lp, RR_RSP, 1, 0, NULL);
-				break;
-			case SEND_ACKNOWLEDGE_RSP(F=1):
-				llc_sendpdu(lp, RR_RSP, 1, 0, NULL);
-				break;
-			case SEND_RR_XXX(X=0):
-				llc_sendpdu(lp, RR_RSP, 0, 0, NULL);
-				break;
-			case SEND_ACKNOWLEDGE_XXX(X=0):
-				if (IS_RSP(fr)) 
-					llc_sendpdu(lp, RR_CMD, 0, 0, NULL);
-				else
-					llc_sendpdu(lp, RR_RSP, 0, 0, NULL);
-				break;
-			case SEND_SABME_CMD(P=X):
-				llc_sendpdu(lp, SABME_CMD, 0, 0, NULL);
-				lp->f_flag = 0;
-				break;
-			case SEND_UA_RSP(F=X):
-				llc_sendpdu(lp, UA_RSP, lp->f_flag, 0, NULL);
-				break;
-			case S_FLAG:=0:
-				lp->s_flag = 0;
-				break;
-			case S_FLAG:=1:
-				lp->s_flag = 1;
-				break;
-			case START_P_TIMER:
-				if(lp->timer_state[P_TIMER] == TIMER_RUNNING)
-					llc_stop_timer(lp, P_TIMER);
-				llc_start_timer(lp, P_TIMER);
-				if (lp->p_flag == 0)
-				{
-					lp->retry_count = 0;
-					lp->p_flag = 1;
-				}
-				break;
-			case START_ACK_TIMER_IF_NOT_RUNNING:
-				if (lp->timer_state[ACK_TIMER] == TIMER_IDLE)
-					llc_start_timer(lp, ACK_TIMER);
-				break;
-			case START_ACK_TIMER:
-				llc_start_timer(lp, ACK_TIMER);
-				break;
-			case START_REJ_TIMER:
-				llc_start_timer(lp, REJ_TIMER);
-				break;
-			case STOP_ACK_TIMER:
-				llc_stop_timer(lp, ACK_TIMER);
-				break;
-			case STOP_P_TIMER:
-				llc_stop_timer(lp, ACK_TIMER);
-				lp->p_flag = 0;
-				break;
-			case IF_DATA_FLAG=2_STOP_REJ_TIMER:
-				if (lp->data_flag == 2)
-					llc_stop_timer(lp, REJ_TIMER);
-				break;
-			case STOP_REJ_TIMER:
-				llc_stop_timer(lp, REJ_TIMER);
-				break;
-			case STOP_ALL_TIMERS:
-				llc_stop_timer(lp, ACK_TIMER);
-				llc_stop_timer(lp, P_TIMER);
-				llc_stop_timer(lp, REJ_TIMER);
-				llc_stop_timer(lp, BUSY_TIMER);
-				break;
-			case STOP_OTHER_TIMERS:
-				llc_stop_timer(lp, P_TIMER);
-				llc_stop_timer(lp, REJ_TIMER);
-				llc_stop_timer(lp, BUSY_TIMER);
-				break;
-			case UPDATE_N(R)_RECEIVED:             
-				ack_count = llc_free_acknowledged_skbs(lp,
-					(unsigned char) fr->s_hdr.nr);
-				if (ack_count > 0)
-				{
-					lp->retry_count = 0;
-					llc_stop_timer(lp, ACK_TIMER);  
-					if (skb_peek(&lp->rtq) != NULL)
-					{
-						/*
- 						 *	Re-transmit queue not empty 
-						 */
-						llc_start_timer(lp, ACK_TIMER);  
-					}
-				}        
-				break;
-			case UPDATE_P_FLAG:
-				if (IS_UFRAME(fr)) 
-					p_flag_received = fr->u_hdr.u_pflag;
-				else
-					p_flag_received = fr->i_hdr.i_pflag;
-				if ((fr->pdu_hdr.ssap & 0x01) && (p_flag_received))
-				{
-					lp->p_flag = 0;
-					llc_stop_timer(lp, P_TIMER);  
-				}
-				break;
-			case DATA_FLAG:=2:
-				lp->data_flag = 2;
-				break;
-			case DATA_FLAG:=0:
-				lp->data_flag = 0;
-				break;
-			case DATA_FLAG:=1:
-				lp->data_flag = 1;
-				break;
-			case IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1:
-				if (lp->data_flag == 0)
-					lp->data_flag = 1;
-				break;
-			case P_FLAG:=0:
-				lp->p_flag = 0;
-				break;
-			case P_FLAG:=P:
-				lp->p_flag = lp->f_flag;
-				break;
-			case REMOTE_BUSY:=0:
-				lp->remote_busy = 0;
-				break;
-			case RETRY_COUNT:=0:
-				lp->retry_count = 0;
-				break;
-			case RETRY_COUNT:=RETRY_COUNT+1:
-				lp->retry_count++;
-				break;
-			case V(R):=0:
-				lp->vr = 0;
-				break;
-			case V(R):=V(R)+1:
-				lp->vr++;
-				break;
-			case V(S):=0:
-				lp->vs = 0;
-				break;
-			case V(S):=N(R):
-				lp->vs = fr->i_hdr.nr;
-				break;
-			case F_FLAG:=P:
-				if (IS_UFRAME(fr)) 
-					lp->f_flag = fr->u_hdr.u_pflag;
-				else
-					lp->f_flag = fr->i_hdr.i_pflag;
-				break;
-			default:
-		}
-		pc++;	
-	}
-}
-
-
-/*
- *	Process_otype2_frame will handle incoming frames
- *	for 802.2 Type 2 Procedure.
- */
-
-void llc_process_otype2_frame(llcptr lp, struct sk_buff *skb, char type)
-{
-	int idx;		/*	index in transition table */
-	int pc_label;		/*	action to perform, from tr tbl */
-	int validation;		/*	result of validate_seq_nos */
-	int p_flag_received;	/*	p_flag in received frame */
-	frameptr fr;
-
-	fr = (frameptr) skb->data;
-
-	if (IS_UFRAME(fr))
-		p_flag_received = fr->u_hdr.u_pflag;
-	else
-		p_flag_received = fr->i_hdr.i_pflag;
-
-	switch(lp->state)
-	{
-		/*	Compute index in transition table: */
-		case ADM:
-			idx = type;
-			idx = (idx << 1) + p_flag_received;
-			break;
-		case CONN:
-		case RESET_WAIT:
-		case RESET_CHECK:
-		case ERROR:
-			idx = type;
-			break;
-		case SETUP:
-		case RESET:
-		case D_CONN:
-			idx = type;
-			idx = (idx << 1) + lp->p_flag;
-			break;
-		case NORMAL:
-		case BUSY:
-		case REJECT:
-		case AWAIT:
-		case AWAIT_BUSY:
-		case AWAIT_REJECT:
-			validation = llc_validate_seq_nos(lp, fr);
-			if (validation > 3) 
-				type = BAD_FRAME;
-			idx = type;
-			idx = (idx << 1);
-			if (validation & 1) 
-				idx = idx +1;
-			idx = (idx << 1) + p_flag_received;
-			idx = (idx << 1) + lp->p_flag;
-		default:
-			printk("llc_proc: bad state\n");
-			return;
-	}
-	idx = (idx << 1) + pdutr_offset[lp->state];
-	lp->state = pdutr_entry[idx +1]; 
-	pc_label = pdutr_entry[idx];
-	if (pc_label != NOP)
-	{ 
-		llc_interpret_pseudo_code(lp, pc_label, skb, type);
-		if(lp->llc_callbacks)
-		{
-			lp->llc_event(lp);
-			lp->llc_callbacks=0;
-		}
-		/*
- 		 *	lp may no longer be valid after this point. Be
-		 *	careful what is added!
-		 */
-	}
-}
-
-
-void llc_timer_expired(llcptr lp, int t)
-{
-	int idx;		/* index in transition table	*/
-	int pc_label;       	/* action to perform, from tr tbl */
-
-	lp->timer_state[t] = TIMER_EXPIRED;
-	idx = lp->state;            /* Compute index in transition table: */
-	idx = (idx << 2) + t;
-	idx = idx << 1;
-	if (lp->retry_count >= lp->n2) 
-		idx = idx + 1;
-	idx = (idx << 1) + lp->s_flag;
-	idx = (idx << 1) + lp->p_flag;
-	idx = idx << 1;             /* 2 bytes per entry: action & newstate */
-
-	pc_label = timertr_entry[idx];
-	if (pc_label != NOP)
-	{
-		llc_interpret_pseudo_code(lp, pc_label, NULL, NO_FRAME);
-		lp->state = timertr_entry[idx +1];
-	}
-	lp->timer_state[t] = TIMER_IDLE;
-	if(lp->llc_callbacks)
-	{
-		lp->llc_event(lp);
-		lp->llc_callbacks=0;
-	}
-	/*
- 	 *	And lp may have vanished in the event callback
- 	 */
-}
-
diff -uNr linux/net/802/fc.c linux-llc/net/802/fc.c
--- linux/net/802/fc.c	Tue Jan  4 18:12:26 2000
+++ linux-llc/net/802/fc.c	Thu Jan  1 01:00:00 1970
@@ -1,99 +0,0 @@
-/*
- * NET3:	Fibre Channel device handling subroutines
- * 
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- *
- *		Vineet Abraham <vma@iol.unh.edu>
- *		v 1.0 03/22/99
- */
-
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <linux/config.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/socket.h>
-#include <linux/in.h>
-#include <linux/inet.h>
-#include <linux/netdevice.h>
-#include <linux/fcdevice.h>
-#include <linux/skbuff.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/timer.h>
-#include <linux/net.h>
-#include <linux/proc_fs.h>
-#include <linux/init.h>
-#include <net/arp.h>
-
-/*
- *	Put the headers on a Fibre Channel packet. 
- */
- 
-int fc_header(struct sk_buff *skb, struct device *dev, unsigned short type,
-              void *daddr, void *saddr, unsigned len) 
-{
-	struct fch_hdr *fch;
-	int hdr_len;
-
-	/* 
-	 * Add the 802.2 SNAP header if IP as the IPv4 code calls  
-	 * dev->hard_header directly.
-	 */
-	if (type == ETH_P_IP || type == ETH_P_ARP)
-	{
-		struct fcllc *fcllc=(struct fcllc *)(fch+1);
-
-		hdr_len = sizeof(struct fch_hdr) + sizeof(struct fcllc);
-		fch = (struct fch_hdr *)skb_push(skb, hdr_len);
-		fcllc = (struct fcllc *)(fch+1);
-		fcllc->dsap = fcllc->ssap = EXTENDED_SAP;
-		fcllc->llc = UI_CMD;
-		fcllc->protid[0] = fcllc->protid[1] = fcllc->protid[2] = 0x00;
-		fcllc->ethertype = htons(type);
-	}
-	else
-	{
-		hdr_len = sizeof(struct fch_hdr);
-		fch = (struct fch_hdr *)skb_push(skb, hdr_len);	
-	}
-
-	if(saddr)
-		memcpy(fch->saddr,saddr,dev->addr_len);
-	else
-		memcpy(fch->saddr,dev->dev_addr,dev->addr_len);
-
-	if(daddr) 
-	{
-		memcpy(fch->daddr,daddr,dev->addr_len);
-		return(hdr_len);
-	}
-	return -hdr_len;
-}
-	
-/*
- *	A neighbour discovery of some species (eg arp) has completed. We
- *	can now send the packet.
- */
- 
-int fc_rebuild_header(struct sk_buff *skb) 
-{
-	struct fch_hdr *fch=(struct fch_hdr *)skb->data;
-	struct fcllc *fcllc=(struct fcllc *)(skb->data+sizeof(struct fch_hdr));
-	if(fcllc->ethertype != htons(ETH_P_IP)) {
-		printk("fc_rebuild_header: Don't know how to resolve type %04X addresses ?\n",(unsigned int)htons(fcllc->ethertype));
-		return 0;
-	}
-#ifdef CONFIG_INET
-	return arp_find(fch->daddr, skb);
-#else
-	return 0; /* Cannot happen because of ETH_P_IP test */
-#endif	
-}
-	
diff -uNr linux/net/802/fddi.c linux-llc/net/802/fddi.c
--- linux/net/802/fddi.c	Sun Nov 15 17:52:28 1998
+++ linux-llc/net/802/fddi.c	Thu Jan  1 01:00:00 1970
@@ -1,165 +0,0 @@
-/*
- * INET		An implementation of the TCP/IP protocol suite for the LINUX
- *		operating system.  INET is implemented using the BSD Socket
- *		interface as the means of communication with the user level.
- *
- *		FDDI-type device handling.
- *
- * Version:	@(#)fddi.c	1.0.0	08/12/96
- *
- * Authors:	Lawrence V. Stefani, <stefani@lkg.dec.com>
- *
- *		fddi.c is based on previous eth.c and tr.c work by
- *			Ross Biro, <bir7@leland.Stanford.Edu>
- *			Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
- *			Mark Evans, <evansmp@uhura.aston.ac.uk>
- *			Florian La Roche, <rzsfl@rz.uni-sb.de>
- *			Alan Cox, <gw4pts@gw4pts.ampr.org>
- * 
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- *
- *	Changes
- *		Alan Cox	:	New arp/rebuild header
- */
- 
-#include <linux/config.h>
-#include <asm/segment.h>
-#include <asm/system.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/socket.h>
-#include <linux/in.h>
-#include <linux/inet.h>
-#include <linux/netdevice.h>
-#include <linux/fddidevice.h>
-#include <linux/if_ether.h>
-#include <linux/skbuff.h>
-#include <linux/errno.h>
-#include <net/arp.h>
-#include <net/sock.h>
-
-/*
- * Create the FDDI MAC header for an arbitrary protocol layer
- *
- * saddr=NULL	means use device source address
- * daddr=NULL	means leave destination address (eg unresolved arp)
- */
-
-int fddi_header(struct sk_buff	*skb, struct device *dev, unsigned short type,
-		void *daddr, void *saddr, unsigned len)
-{
-	int hl = FDDI_K_SNAP_HLEN;
-	struct fddihdr *fddi;
-	
-	if(type != ETH_P_IP && type != ETH_P_ARP)
-		hl=FDDI_K_8022_HLEN-3;
-	fddi = (struct fddihdr *)skb_push(skb, hl);
-	fddi->fc			 = FDDI_FC_K_ASYNC_LLC_DEF;
-	if(type == ETH_P_IP || type == ETH_P_ARP)
-	{
-		fddi->hdr.llc_snap.dsap		 = FDDI_EXTENDED_SAP;
-		fddi->hdr.llc_snap.ssap		 = FDDI_EXTENDED_SAP;
-		fddi->hdr.llc_snap.ctrl		 = FDDI_UI_CMD;
-		fddi->hdr.llc_snap.oui[0]	 = 0x00;
-		fddi->hdr.llc_snap.oui[1]	 = 0x00;
-		fddi->hdr.llc_snap.oui[2]	 = 0x00;
-		fddi->hdr.llc_snap.ethertype	 = htons(type);
-	}
-
-	/* Set the source and destination hardware addresses */
-	 
-	if (saddr != NULL)
-		memcpy(fddi->saddr, saddr, dev->addr_len);
-	else
-		memcpy(fddi->saddr, dev->dev_addr, dev->addr_len);
-
-	if (daddr != NULL)
-	{
-		memcpy(fddi->daddr, daddr, dev->addr_len);
-		return(hl);
-	}
-
-	return(-hl);
-}
-
-
-/*
- * Rebuild the FDDI MAC header. This is called after an ARP
- * (or in future other address resolution) has completed on
- * this sk_buff.  We now let ARP fill in the other fields.
- */
- 
-int fddi_rebuild_header(struct sk_buff	*skb)
-{
-	struct fddihdr *fddi = (struct fddihdr *)skb->data;
-
-#ifdef CONFIG_INET
-	if (fddi->hdr.llc_snap.ethertype == __constant_htons(ETH_P_IP))
-		/* Try to get ARP to resolve the header and fill destination address */
-		return arp_find(fddi->daddr, skb);
-	else
-#endif	
-	{
-		printk("%s: Don't know how to resolve type %02X addresses.\n",
-		       skb->dev->name, htons(fddi->hdr.llc_snap.ethertype));
-		return(0);
-	}
-}
-
-
-/*
- * Determine the packet's protocol ID and fill in skb fields.
- * This routine is called before an incoming packet is passed
- * up.  It's used to fill in specific skb fields and to set
- * the proper pointer to the start of packet data (skb->data).
- */
- 
-unsigned short fddi_type_trans(struct sk_buff *skb, struct device *dev)
-{
-	struct fddihdr *fddi = (struct fddihdr *)skb->data;
-	unsigned short type;
-	
-	/*
-	 * Set mac.raw field to point to FC byte, set data field to point
-	 * to start of packet data.  Assume 802.2 SNAP frames for now.
-	 */
-
-	skb->mac.raw = skb->data;	/* point to frame control (FC) */
-	
-	if(fddi->hdr.llc_8022_1.dsap==0xe0)
-	{
-		skb_pull(skb, FDDI_K_8022_HLEN-3);
-		type = __constant_htons(ETH_P_802_2);
-	}
-	else
-	{
-		skb_pull(skb, FDDI_K_SNAP_HLEN);		/* adjust for 21 byte header */
-		type=fddi->hdr.llc_snap.ethertype;
-	}
-	
-	/* Set packet type based on destination address and flag settings */
-			
-	if (*fddi->daddr & 0x01)
-	{
-		if (memcmp(fddi->daddr, dev->broadcast, FDDI_K_ALEN) == 0)
-			skb->pkt_type = PACKET_BROADCAST;
-		else
-			skb->pkt_type = PACKET_MULTICAST;
-	}
-	
-	else if (dev->flags & IFF_PROMISC)
-	{
-		if (memcmp(fddi->daddr, dev->dev_addr, FDDI_K_ALEN))
-			skb->pkt_type = PACKET_OTHERHOST;
-	}
-
-	/* Assume 802.2 SNAP frames, for now */
-
-	return(type);
-}
diff -uNr linux/net/802/hippi.c linux-llc/net/802/hippi.c
--- linux/net/802/hippi.c	Wed Oct  7 19:13:49 1998
+++ linux-llc/net/802/hippi.c	Thu Jan  1 01:00:00 1970
@@ -1,154 +0,0 @@
-/*
- * INET		An implementation of the TCP/IP protocol suite for the LINUX
- *		operating system.  INET is implemented using the  BSD Socket
- *		interface as the means of communication with the user level.
- *
- *		HIPPI-type device handling.
- *
- * Version:	@(#)hippi.c	1.0.0	05/29/97
- *
- * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
- *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
- *		Mark Evans, <evansmp@uhura.aston.ac.uk>
- *		Florian  La Roche, <rzsfl@rz.uni-sb.de>
- *		Alan Cox, <gw4pts@gw4pts.ampr.org>
- *		Jes Sorensen, <Jes.Sorensen@cern.ch>
- *
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/socket.h>
-#include <linux/in.h>
-#include <linux/inet.h>
-#include <linux/netdevice.h>
-#include <linux/hippidevice.h>
-#include <linux/skbuff.h>
-#include <linux/errno.h>
-#include <net/arp.h>
-#include <net/sock.h>
-#include <asm/uaccess.h>
-#include <asm/checksum.h>
-#include <asm/segment.h>
-#include <asm/system.h>
-
-/*
- * hippi_net_init()
- *
- * Do nothing, this is just to pursuade the stupid linker to behave.
- */
-
-void hippi_net_init(void)
-{
-	return;
-}
-
-/*
- * Create the HIPPI MAC header for an arbitrary protocol layer 
- *
- * saddr=NULL	means use device source address
- * daddr=NULL	means leave destination address (eg unresolved arp)
- */
-
-int hippi_header(struct sk_buff *skb, struct device *dev,
-		 unsigned short type, void *daddr, void *saddr,
-		 unsigned len)
-{
-	struct hippi_hdr *hip = (struct hippi_hdr *)skb_push(skb, HIPPI_HLEN);
-
-	if (!len){
-		len = skb->len - HIPPI_HLEN;
-		printk("hippi_header(): length not supplied\n");
-	}
-
-	/*
-	 * Due to the stupidity of the little endian byte-order we
-	 * have to set the fp field this way.
-	 */
-	hip->fp.fixed		= __constant_htonl(0x04800018);
-	hip->fp.d2_size		= htonl(len + 8);
-	hip->le.fc		= 0;
-	hip->le.double_wide	= 0;	/* only HIPPI 800 for the time being */
-	hip->le.message_type	= 0;	/* Data PDU */
-
-	hip->le.dest_addr_type	= 2;	/* 12 bit SC address */
-	hip->le.src_addr_type	= 2;	/* 12 bit SC address */
-
-	memcpy(hip->le.src_switch_addr, dev->dev_addr + 3, 3);
-	memset(&hip->le.reserved, 0, 16);
-
-	hip->snap.dsap		= HIPPI_EXTENDED_SAP;
-	hip->snap.ssap		= HIPPI_EXTENDED_SAP;
-	hip->snap.ctrl		= HIPPI_UI_CMD;
-	hip->snap.oui[0]	= 0x00;
-	hip->snap.oui[1]	= 0x00;
-	hip->snap.oui[2]	= 0x00;
-	hip->snap.ethertype	= htons(type);
-
-	if (daddr)
-	{
-		memcpy(hip->le.dest_switch_addr, daddr + 3, 3);
-		memcpy(&skb->private.ifield, daddr + 2, 4);
-		return HIPPI_HLEN;
-	}
-	return -HIPPI_HLEN;
-}
-
-
-/*
- * Rebuild the HIPPI MAC header. This is called after an ARP has
- * completed on this sk_buff. We now let ARP fill in the other fields.
- */
-
-int hippi_rebuild_header(struct sk_buff *skb)
-{
-	struct hippi_hdr *hip = (struct hippi_hdr *)skb->data;
-
-	/*
-	 * Only IP is currently supported
-	 */
-	 
-	if(hip->snap.ethertype != __constant_htons(ETH_P_IP)) 
-	{
-		printk(KERN_DEBUG "%s: unable to resolve type %X addresses.\n",skb->dev->name,ntohs(hip->snap.ethertype));
-		return 0;
-	}
-
-	/*
-	 * We don't support dynamic ARP on HIPPI, but we use the ARP
-	 * static ARP tables to hold the I-FIELDs.
-	 */
-	return arp_find(hip->le.daddr, skb);
-}
-
-
-/*
- *	Determine the packet's protocol ID.
- */
- 
-unsigned short hippi_type_trans(struct sk_buff *skb, struct device *dev)
-{
-	struct hippi_hdr *hip;
-	
-	hip = (struct hippi_hdr *) skb->data;
-
-	/*
-	 * This is actually wrong ... question is if we really should
-	 * set the raw address here.
-	 */
-	 skb->mac.raw = skb->data;
-	 skb_pull(skb, HIPPI_HLEN);
-
-	/*
-	 * No fancy promisc stuff here now.
-	 */
-
-	return hip->snap.ethertype;
-}
diff -uNr linux/net/802/llc_macinit.c linux-llc/net/802/llc_macinit.c
--- linux/net/802/llc_macinit.c	Sat Feb 21 02:28:23 1998
+++ linux-llc/net/802/llc_macinit.c	Thu Jan  1 01:00:00 1970
@@ -1,224 +0,0 @@
-/*
- * NET		An implementation of the IEEE 802.2 LLC protocol for the
- *		LINUX operating system.  LLC is implemented as a set of
- *		state machines and callbacks for higher networking layers.
- *
- *		Code for initialization, termination, registration and
- *		MAC layer glue.
- *
- *		Written by Tim Alpaerts, Tim_Alpaerts@toyota-motor-europe.com
- *
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- *
- *	Changes
- *		Alan Cox	:	Chainsawed to Linux format
- *					Added llc_ to names
- *					Started restructuring handlers
- */
-
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/kernel.h>
-#include <linux/malloc.h>
-#include <linux/unistd.h>
-#include <linux/netdevice.h>
-#include <linux/init.h>
-#include <net/p8022.h>
-
-#include <asm/byteorder.h>
-
-#include <net/llc_frame.h>
-#include <net/llc.h>
-
-/*
- *	All incoming frames pass thru mac_data_indicate().
- *	On entry the llc structure related to the frame is passed as parameter. 
- *	The received sk_buffs with pdus other than I_CMD and I_RSP
- *	are freed by mac_data_indicate() after processing,
- *	the I pdu buffers are freed by the cl2llc client when it no longer needs
- *	the skb.
-*/
-
-int llc_mac_data_indicate(llcptr lp, struct sk_buff *skb)
-{
-	int ll;      		/* logical length == 802.3 length field */
-	unsigned char p_flag;
-	unsigned char type;
-	frameptr fr;
-	int free=1;
-
-	lp->inc_skb=NULL;
-	
-	/*
-	 *	Truncate buffer to true 802.3 length
-	 *	[FIXME: move to 802.2 demux]
-	 */
-
-	ll = *(skb->data -2) * 256 + *(skb->data -1);
-	skb_trim( skb, ll );
-
-	fr = (frameptr) skb->data;
-	type = llc_decode_frametype( fr );
-
-
-	if (type <= FRMR_RSP)
-	{
-		/*
-		 *	PDU is of the type 2 set
-		 */
-		if ((lp->llc_mode == MODE_ABM)||(type == SABME_CMD))
-			llc_process_otype2_frame(lp, skb, type);
-
-	}
-	else
-	{
-		/*
-		 *	PDU belongs to type 1 set
-		 */
-	        p_flag = fr->u_hdr.u_pflag;
-        	switch(type)
-        	{
-		        case TEST_CMD:
-				llc_sendpdu(lp, TEST_RSP, 0,ll -3,
-					fr->u_hdr.u_info);
-				break;
-			case TEST_RSP:
-				lp->llc_callbacks|=LLC_TEST_INDICATION;
-				lp->inc_skb=skb;
-				free=0;
-				break;
-			case XID_CMD:
-				/*
-				 *	Basic format XID is handled by LLC itself
-				 *	Doc 5.4.1.1.2 p 48/49
-				 */
-
-				if ((ll == 6)&&(fr->u_hdr.u_info[0] == 0x81))
-				{
-					lp->k = fr->u_hdr.u_info[2];
-					llc_sendpdu(lp, XID_RSP,
-						fr->u_hdr.u_pflag, ll -3,
-						fr->u_hdr.u_info);
-				}
-				break;
-
-			case XID_RSP:
-				if( ll == 6 && fr->u_hdr.u_info[0] == 0x81 )
-				{
-					lp->k = fr->u_hdr.u_info[2];
-				}
-				lp->llc_callbacks|=LLC_XID_INDICATION;
-				lp->inc_skb=skb;
-				free=0;
-				break;
-
-			case UI_CMD:
-				lp->llc_callbacks|=LLC_UI_DATA;
-				skb_pull(skb,3);
-				lp->inc_skb=skb;
-				free=0;
-				break;
-
-			default:
-				/*
-				 *	All other type 1 pdus ignored for now
-				 */
-		}
-	}
-
-	if (free&&(!(IS_IFRAME(fr))))
-	{
-		/*
-		 *	No auto free for I pdus
-		 */
-		skb->sk = NULL;
-		kfree_skb(skb);
-	}
-
-	if(lp->llc_callbacks)
-	{
-		if ( lp->llc_event != NULL ) lp->llc_event(lp);
-		lp->llc_callbacks=0;
-	}
-	return 0;
-}
-
-
-/*
- *	Create an LLC client. As it is the job of the caller to clean up
- *	LLC's on device down, the device list must be locked before this call.
- */
-
-int register_cl2llc_client(llcptr lp, const char *device, void (*event)(llcptr), u8 *rmac, u8 ssap, u8 dsap)
-{
-	char eye_init[] = "LLC\0";
-
-	memset(lp, 0, sizeof(*lp));
-	lp->dev = dev_get(device);
-	if(lp->dev == NULL)
-		return -ENODEV;
-	memcpy(lp->eye, eye_init, sizeof(lp->eye));
-	lp->rw = 1;
-	lp->k = 127;
-	lp->n1 = 1490;
-	lp->n2 = 10;
-	lp->timer_interval[P_TIMER] = HZ;    /* 1 sec */
-	lp->timer_interval[REJ_TIMER] = HZ/8;
-	lp->timer_interval[ACK_TIMER] = HZ/8;
-	lp->timer_interval[BUSY_TIMER] = HZ*2;
-	lp->local_sap = ssap;
-	lp->llc_event = event;
-	memcpy(lp->remote_mac, rmac, sizeof(lp->remote_mac));
-	lp->state = 0;
-	lp->llc_mode = MODE_ADM;
-	lp->remote_sap = dsap;
-	skb_queue_head_init(&lp->atq);
-	skb_queue_head_init(&lp->rtq);
-	MOD_INC_USE_COUNT;
-	return 0;
-}
-
-
-void unregister_cl2llc_client(llcptr lp)
-{
-	llc_cancel_timers(lp);
-	MOD_DEC_USE_COUNT;
-	kfree(lp);
-}
-
-
-EXPORT_SYMBOL(register_cl2llc_client);
-EXPORT_SYMBOL(unregister_cl2llc_client);
-EXPORT_SYMBOL(llc_data_request);
-EXPORT_SYMBOL(llc_unit_data_request);
-EXPORT_SYMBOL(llc_test_request);
-EXPORT_SYMBOL(llc_xid_request);
-EXPORT_SYMBOL(llc_mac_data_indicate);
-EXPORT_SYMBOL(llc_cancel_timers);
-
-#define ALL_TYPES_8022 0
-
-__initfunc(void llc_init(struct net_proto *proto))
-{
-	printk(KERN_NOTICE "IEEE 802.2 LLC for Linux 2.1 (c) 1996 Tim Alpaerts\n");
-	return;
-}
-
-#ifdef MODULE
-
-
-int init_module(void)
-{
-	llc_init(NULL);
-	return 0;
-}
-
-void cleanup_module(void)
-{
-
-}
-
-#endif
diff -uNr linux/net/802/llc_sendpdu.c linux-llc/net/802/llc_sendpdu.c
--- linux/net/802/llc_sendpdu.c	Tue Feb 10 21:07:49 1998
+++ linux-llc/net/802/llc_sendpdu.c	Thu Jan  1 01:00:00 1970
@@ -1,357 +0,0 @@
-/*
- * NET		An implementation of the IEEE 802.2 LLC protocol for the
- *		LINUX operating system.  LLC is implemented as a set of 
- *		state machines and callbacks for higher networking layers.
- *
- *		llc_sendpdu(), llc_sendipdu(), resend() + queue handling code
- *
- *		Written by Tim Alpaerts, Tim_Alpaerts@toyota-motor-europe.com
- *
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- *
- *	Changes
- *		Alan Cox	:	Chainsawed into Linux format, style
- *					Added llc_ to function names
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/malloc.h>
-#include <linux/netdevice.h>
-#include <linux/skbuff.h>
-#include <net/p8022.h>
-#include <linux/stat.h>
-#include <asm/byteorder.h>
-#include <net/llc_frame.h>
-#include <net/llc.h>
-
-static unsigned char cntl_byte_encode[] = 
-{
-	0x00,   /* I_CMD */
-	0x01,   /* RR_CMD */
-	0x05,   /* RNR_CMD */
-	0x09,   /* REJ_CMD */
-	0x43,   /* DISC_CMD */
-	0x7F,   /* SABME_CMD */
-	0x00,   /* I_RSP */
-	0x01,   /* RR_RSP */
-	0x05,   /* RNR_RSP */
-	0x09,   /* REJ_RSP */
-	0x63,   /* UA_RSP */
-	0x0F,   /* DM_RSP */
-	0x87,   /* FRMR_RSP */
-	0xFF,   /* BAD_FRAME */
-	0x03,   /* UI_CMD */
-	0xBF,   /* XID_CMD */
-	0xE3,   /* TEST_CMD */
-	0xBF,   /* XID_RSP */
-	0xE3    /* TEST_RSP */
-};
-
-static unsigned char fr_length_encode[] = 
-{
-	0x04,   /* I_CMD */
-	0x04,   /* RR_CMD */
-	0x04,   /* RNR_CMD */
-	0x04,   /* REJ_CMD */
-	0x03,   /* DISC_CMD */
-	0x03,   /* SABME_CMD */
-	0x04,   /* I_RSP */
-	0x04,   /* RR_RSP */
-	0x04,   /* RNR_RSP */
-	0x04,   /* REJ_RSP */
-	0x03,   /* UA_RSP */
-	0x03,   /* DM_RSP */
-	0x03,   /* FRMR_RSP */
-	0x00,   /* BAD_FRAME */
-	0x03,   /* UI_CMD */
-	0x03,   /* XID_CMD */
-	0x03,   /* TEST_CMD */
-	0x03,   /* XID_RSP */
-	0x03    /* TEST_RSP */
-};
-
-static unsigned char cr_bit_encode[] = {
-	0x00,   /* I_CMD */
-	0x00,   /* RR_CMD */
-	0x00,   /* RNR_CMD */
-	0x00,   /* REJ_CMD */
-	0x00,   /* DISC_CMD */
-	0x00,   /* SABME_CMD */
-	0x01,   /* I_RSP */
-	0x01,   /* RR_RSP */
-	0x01,   /* RNR_RSP */
-	0x01,   /* REJ_RSP */
-	0x01,   /* UA_RSP */
-	0x01,   /* DM_RSP */
-	0x01,   /* FRMR_RSP */
-	0x00,   /* BAD_FRAME */
-	0x00,   /* UI_CMD */
-	0x00,   /* XID_CMD */
-	0x00,   /* TEST_CMD */
-	0x01,   /* XID_RSP */
-	0x01    /* TEST_RSP */
-};
-
-/*
- *	Sendpdu() constructs an output frame in a new skb and
- *	gives it to the MAC layer for transmision.
- *	This function is not used to send I pdus.
- *	No queues are updated here, nothing is saved for retransmission.
- *
- *	Parameter pf controls both the poll/final bit and dsap
- *	fields in the output pdu. 
- *	The dsap trick was needed to implement XID_CMD send with
- *	zero dsap field as described in doc 6.6 item 1 of enum.  
- */
-
-void llc_sendpdu(llcptr lp, char type, char pf, int data_len, char *pdu_data)
-{
-	frameptr fr;                /* ptr to output pdu buffer */
-	unsigned short int fl;      /* frame length == 802.3 "length" value */
-	struct sk_buff *skb;
-
-	fl = data_len + fr_length_encode[(int)type];
-	skb = alloc_skb(16 + fl, GFP_ATOMIC); 
-	if (skb != NULL)
-	{
-		skb->dev = lp->dev;	
-	        skb_reserve(skb, 16);
-		fr = (frameptr) skb_put(skb, fl);
-		memset(fr, 0, fl);
-                /*
-                 *	Construct 802.2 header 
-                 */
-		if (pf & 0x02) 
-			fr->pdu_hdr.dsap = 0;
-		else
-			fr->pdu_hdr.dsap = lp->remote_sap;
-		fr->pdu_hdr.ssap = lp->local_sap + cr_bit_encode[(int)type];
-		fr->pdu_cntl.byte1 = cntl_byte_encode[(int)type];
-		/* 
-		 *	Fill in pflag and seq nbrs: 
-		 */
-		if (IS_SFRAME(fr)) 
-		{
-		  	/* case S-frames */
-			if (pf & 0x01) 
-				fr->i_hdr.i_pflag = 1;
-			fr->i_hdr.nr = lp->vr;
-		}
-		else
-		{
-			/* case U frames */ 
-			if (pf & 0x01) 
-				fr->u_hdr.u_pflag = 1;
-		}
-                       
-		if (data_len > 0) 
-		{ 			/* append data if any  */ 
-			if (IS_UFRAME(fr)) 
-			{
-				memcpy(fr->u_hdr.u_info, pdu_data, data_len);
-			}
-			else 
-			{
-				memcpy(fr->i_hdr.is_info, pdu_data, data_len);
-			}
-		}
-		lp->dev->hard_header(skb, lp->dev, ETH_P_802_3,
-			 lp->remote_mac, NULL, fl);
-		skb->dev=lp->dev;
-		dev_queue_xmit(skb);
-	}
-	else
-		printk(KERN_DEBUG "cl2llc: skb_alloc() in llc_sendpdu() failed\n");     
-}
-
-void llc_xid_request(llcptr lp, char opt, int ll, char * data)
-{
-	llc_sendpdu(lp, XID_CMD, opt, ll, data); 
-}
-
-void llc_test_request(llcptr lp, int ll, char * data)
-{
-	llc_sendpdu(lp, TEST_CMD, 0, ll, data); 
-}
-
-void llc_unit_data_request(llcptr lp, int ll, char * data)
-{
-	llc_sendpdu(lp, UI_CMD, 0, ll, data); 
-}
-
-
-/*
- *	llc_sendipdu() Completes an I pdu in an existing skb and gives it
- *	to the MAC layer for transmision.
- *	Parameter "type" must be either I_CMD or I_RSP.
- *	The skb is not freed after xmit, it is kept in case a retransmission
- *	is requested. If needed it can be picked up again from the rtq.
- */
-
-void llc_sendipdu(llcptr lp, char type, char pf, struct sk_buff *skb)
-{
-	frameptr fr;                /* ptr to output pdu buffer */
-	struct sk_buff *tmp;
-	
-	fr = (frameptr) skb->data;
-
-	fr->pdu_hdr.dsap = lp->remote_sap;
-	fr->pdu_hdr.ssap = lp->local_sap + cr_bit_encode[(int)type];
-	fr->pdu_cntl.byte1 = cntl_byte_encode[(int)type];
-			
-	if (pf)
-		fr->i_hdr.i_pflag = 1; /* p/f and seq numbers */  
-	fr->i_hdr.nr = lp->vr;
-	fr->i_hdr.ns = lp->vs;
-	lp->vs++;
-	if (lp->vs > 127) 
-		lp->vs = 0;
-	lp->dev->hard_header(skb, lp->dev, ETH_P_802_3,
-		lp->remote_mac, NULL, skb->len);
-	ADD_TO_RTQ(skb);		/* add skb to the retransmit queue */
-	tmp=skb_clone(skb, GFP_ATOMIC);
-	if(tmp!=NULL)
-	{
-		tmp->dev=lp->dev;
-		dev_queue_xmit(tmp);
-	}
-}
-
-
-/*
- *	Resend_ipdu() will resend the pdus in the retransmit queue (rtq)
- *	the return value is the number of pdus resend.
- *	ack_nr is N(R) of 1st pdu to resent.
- *	Type is I_CMD or I_RSP for 1st pdu resent.
- *	p is p/f flag 0 or 1 for 1st pdu resent.
- *	All subsequent pdus will be sent as I_CMDs with p/f set to 0
- */ 
-
-int llc_resend_ipdu(llcptr lp, unsigned char ack_nr, unsigned char type, char p)
-{
-	struct sk_buff *skb,*tmp;
-	int resend_count;
-	frameptr fr;
-	unsigned long flags;
-	
-
-	resend_count = 0;
-	
-	save_flags(flags);
-	cli();
-	
-	skb = skb_peek(&lp->rtq);
-
-	while(skb && skb != (struct sk_buff *)&lp->rtq)
-	{
-		fr = (frameptr) (skb->data + lp->dev->hard_header_len);
-		if (resend_count == 0) 
-		{
-			/* 
-			 *	Resending 1st pdu: 
-			 */
-
-			if (p) 
-				fr->i_hdr.i_pflag = 1;
-			else
-				fr->i_hdr.i_pflag = 0;
-            
-			if (type == I_CMD)           
-				fr->pdu_hdr.ssap = fr->pdu_hdr.ssap & 0xfe;
-			else
-				fr->pdu_hdr.ssap = fr->pdu_hdr.ssap | 0x01;
-		}
-	        else
-	        {
-	        	/*
-	        	 *	Resending pdu 2...n 
-	        	 */
-
-			fr->pdu_hdr.ssap = fr->pdu_hdr.ssap & 0xfe;
-			fr->i_hdr.i_pflag = 0;
-		}
-		fr->i_hdr.nr = lp->vr;
-		fr->i_hdr.ns = lp->vs;
-		lp->vs++;
-		if (lp->vs > 127) 
-			lp->vs = 0;
-		tmp=skb_clone(skb, GFP_ATOMIC);
-		if(tmp!=NULL)
-		{
-			tmp->dev = lp->dev;
-			dev_queue_xmit(skb);
-		}
-		resend_count++;
-		skb = skb->next;
-	}
-	restore_flags(flags);
-	return resend_count;
-}
-
-/* ************** internal queue management code ****************** */
-
-
-/*
- *	Remove one skb from the front of the awaiting transmit queue
- *	(this is the skb longest on the queue) and return a pointer to 
- *	that skb. 
- */ 
-
-struct sk_buff *llc_pull_from_atq(llcptr lp) 
-{
-	return skb_dequeue(&lp->atq);
-}
- 
-/*
- *	Free_acknowledged_skbs(), remove from retransmit queue (rtq)
- *	and free all skbs with an N(S) chronologicaly before 'pdu_ack'.
- *	The return value is the number of pdus acknowledged.
- */
- 
-int llc_free_acknowledged_skbs(llcptr lp, unsigned char pdu_ack)
-{
-	struct sk_buff *pp;
-	frameptr fr; 
-	int ack_count;
-	unsigned char ack; 	/* N(S) of most recently ack'ed pdu */
-	unsigned char ns_save; 
-	unsigned long flags;
-
-	if (pdu_ack > 0) 
-		ack = pdu_ack -1;
-	else 
-		ack = 127;
-
-	ack_count = 0;
-
-	save_flags(flags);
-	cli();
-
-	pp = skb_dequeue(&lp->rtq); 
-	while (pp != NULL)
-	{
-		/* 
-		 *	Locate skb with N(S) == ack 
-		 */
-
-		/*
-		 *	BUG: FIXME - use skb->h.*
-		 */
-		fr = (frameptr) (pp->data + lp->dev->hard_header_len);
-		ns_save = fr->i_hdr.ns;
-
-		kfree_skb(pp);
-		ack_count++;
-
-		if (ns_save == ack) 
-			break;  
-		pp = skb_dequeue(&lp->rtq);
-	}
-	restore_flags(flags);
-	return ack_count; 
-}
-
diff -uNr linux/net/802/llc_utility.c linux-llc/net/802/llc_utility.c
--- linux/net/802/llc_utility.c	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/llc_utility.c	Thu Jan  1 01:00:00 1970
@@ -1,253 +0,0 @@
-/*
- * NET		An implementation of the IEEE 802.2 LLC protocol for the
- *		LINUX operating system.  LLC is implemented as a set of 
- *		state machines and callbacks for higher networking layers.
- *
- *		Small utilities, Linux timer handling.
- *
- *		Written by Tim Alpaerts, Tim_Alpaerts@toyota-motor-europe.com
- *
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- *
- *	Changes
- *		Alan Cox	:	Chainsawed into Linux form.
- *					Added llc_ function name prefixes.
- *					Fixed bug in stop/start timer.
- *					Added llc_cancel_timers for closing
- *						down an llc
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/netdevice.h>
-#include <linux/skbuff.h>
-#include <linux/proc_fs.h>
-#include <linux/stat.h>
-#include <net/llc_frame.h>
-#include <net/llc.h>
-
-int llc_decode_frametype(frameptr fr)
-{
-	if (IS_UFRAME(fr)) 
-	{      /* unnumbered cmd/rsp */
-		switch(fr->u_mm.mm & 0x3B)
-		{
-			case 0x1B:
-			    return(SABME_CMD);
-			    break;
-			case 0x10:
-			    return(DISC_CMD);
-			    break;
-			case 0x18:
-			    return(UA_RSP);
-			    break;
-			case 0x03:
-			    return(DM_RSP);
-			    break;
-			case 0x21:
-			    return(FRMR_RSP);
-			    break;
-			case 0x00:
-			    return(UI_CMD);
-			    break;
-			case 0x2B:
-		 	    if (IS_RSP(fr)) 
-		 	    	return(XID_RSP);
-			    else
-			    	return(XID_CMD);
-			    break;
-			case 0x38:
-		    	    if (IS_RSP(fr))
-		    	    	return(TEST_RSP);
-			    else
-				return(TEST_CMD);
-			    break;
-			default:
-			    return(BAD_FRAME);
-		}
-	}
-	else if (IS_SFRAME(fr))
-	{  /* supervisory cmd/rsp */
-		switch(fr->s_hdr.ss)
-		{
-			case 0x00:
-			    if (IS_RSP(fr)) 
-			    	return(RR_RSP);
-			    else
-			    	return(RR_CMD);
-			    break;
-			case 0x02:
-			    if (IS_RSP(fr))
-			    	return(REJ_RSP);
-			    else
-			    	return(REJ_CMD);
-			    break;
-			case 0x01:
-			    if (IS_RSP(fr))
-			    	return(RNR_RSP);
-			    else
-			    	return(RNR_CMD);
-			    break;
-			default:
-			    return(BAD_FRAME);
-		}
-	}
-	else
-	{			  /* information xfer */
-		if (IS_RSP(fr)) 
-			return(I_RSP);
-		else	
-			return(I_CMD);
-	}
-}
-
-
-/*
- *	Validate_seq_nos will check N(S) and N(R) to see if they are
- *	invalid or unexpected.
- *	"unexpected" is explained on p44 Send State Variable.
- *	The return value is:
- *		4 * invalid N(R) +
- *		2 * invalid N(S) +
- *		1 * unexpected N(S)
- */
-
-int llc_validate_seq_nos(llcptr lp, frameptr fr)
-{
-	int res;
-     
-	/*
-	 *	A U-frame is always good 
-	 */
-
-	if (IS_UFRAME(fr)) 
-		return(0);	
-
-	/*
-	 *	For S- and I-frames check N(R): 
-	 */
-
-	if (fr->i_hdr.nr == lp->vs) 
-	{    	/* if N(R) = V(S)  */
-        	res = 0;                        /* N(R) is good */
-	}
-	else
-	{				/* lp->k = transmit window size */
-    		if (lp->vs >= lp->k) 
-    		{	/* if window not wrapped around 127 */
-			if ((fr->i_hdr.nr < lp->vs) &&
-				(fr->i_hdr.nr > (lp->vs - lp->k)))
-				res = 0;
-			else 
-				res = 4;		/* N(R) invalid */
-		}
-		else
-		{	/* window wraps around 127 */
-			if ((fr->i_hdr.nr < lp->vs) ||
-				(fr->i_hdr.nr > (128 + lp->vs - lp->k))) 
-				res = 0;
-			else
-				res = 4;		/* N(R) invalid */
-		}
-	}
-
-	/*
-	 *	For an I-frame, must check N(S) also:  
-	 */
-
-	if (IS_IFRAME(fr)) 
-	{
-    		if (fr->i_hdr.ns == lp->vr) 
-    			return res;   /* N(S) good */
-		if (lp->vr >= lp->rw) 
-		{
-			/* if receive window not wrapped */
-
-			if ((fr->i_hdr.ns < lp->vr) &&
-				(fr->i_hdr.ns > (lp->vr - lp->k)))
-				res = res +1;   	/* N(S) unexpected */
-			else  
-				res = res +2;         /* N(S) invalid */            
-		}
-		else
-		{
-			/* Window wraps around 127 */
-
-			if ((fr->i_hdr.ns < lp->vr) ||
-				(fr->i_hdr.ns > (128 + lp->vr - lp->k)))
-				res = res +1;   	/* N(S) unexpected */
-			else
-				res = res +2;         /* N(S) invalid */            
-		}
-	}					
-	return(res);
-}
-
-/* **************** timer management routines ********************* */
-
-static void llc_p_timer_expired(unsigned long ulp)
-{
-	llc_timer_expired((llcptr) ulp, P_TIMER);
-}
-
-static void llc_rej_timer_expired(unsigned long ulp)
-{
-	llc_timer_expired((llcptr) ulp, REJ_TIMER);
-}
-
-static void llc_ack_timer_expired(unsigned long ulp)
-{
-	llc_timer_expired((llcptr) ulp, ACK_TIMER);
-} 
-
-static void llc_busy_timer_expired(unsigned long ulp)
-{
-	llc_timer_expired((llcptr) ulp, BUSY_TIMER);
-}
-
-/* exp_fcn is an array holding the 4 entry points of the
-   timer expiry routines above.
-   It is required to keep start_timer() generic.
-   Thank you cdecl.
- */
-
-static void (* exp_fcn[])(unsigned long) = 
-{
-	llc_p_timer_expired,
-	llc_rej_timer_expired,
-	llc_ack_timer_expired,
-	llc_busy_timer_expired
-};   
-
-void llc_start_timer(llcptr lp, int t)
-{
-	if (lp->timer_state[t] == TIMER_IDLE)
-	{
-    		lp->tl[t].expires = jiffies + lp->timer_interval[t];
-    		lp->tl[t].data = (unsigned long) lp;
-    		lp->tl[t].function = exp_fcn[t];
-    		add_timer(&lp->tl[t]);
-    		lp->timer_state[t] = TIMER_RUNNING;
-	}
-}
-
-void llc_stop_timer(llcptr lp, int t)
-{
-	if (lp->timer_state[t] == TIMER_RUNNING)
-	{
-        	del_timer(&lp->tl[t]);
-        	lp->timer_state[t] = TIMER_IDLE;
-	}
-}
-
-void llc_cancel_timers(llcptr lp)
-{
-	llc_stop_timer(lp, P_TIMER);
-	llc_stop_timer(lp, REJ_TIMER);
-	llc_stop_timer(lp, ACK_TIMER);
-	llc_stop_timer(lp, BUSY_TIMER);
-}
-
diff -uNr linux/net/802/p8022.c linux-llc/net/802/p8022.c
--- linux/net/802/p8022.c	Thu May 21 02:55:16 1998
+++ linux-llc/net/802/p8022.c	Thu Jan  1 01:00:00 1970
@@ -1,141 +0,0 @@
-/*
- *	NET3:	Support for 802.2 demultiplexing off Ethernet (Token ring
- *		is kept separate see p8022tr.c)
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- *
- *		Demultiplex 802.2 encoded protocols. We match the entry by the
- *		SSAP/DSAP pair and then deliver to the registered datalink that
- *		matches. The control byte is ignored and handling of such items
- *		is up to the routine passed the frame.
- *
- *		Unlike the 802.3 datalink we have a list of 802.2 entries as there
- *		are multiple protocols to demux. The list is currently short (3 or
- *		4 entries at most). The current demux assumes this.
- */
-
-#include <linux/module.h>
-#include <linux/netdevice.h>
-#include <linux/skbuff.h>
-#include <net/datalink.h>
-#include <linux/mm.h>
-#include <linux/in.h>
-#include <linux/init.h>
-#include <net/p8022.h>
-
-static struct datalink_proto *p8022_list = NULL;
-
-/*
- *	We don't handle the loopback SAP stuff, the extended
- *	802.2 command set, multicast SAP identifiers and non UI
- *	frames. We have the absolute minimum needed for IPX,
- *	IP and Appletalk phase 2. See the llc_* routines for
- *	support libraries if your protocol needs these.
- */
-
-static struct datalink_proto *find_8022_client(unsigned char type)
-{
-	struct datalink_proto	*proto;
-
-	for (proto = p8022_list;
-		((proto != NULL) && (*(proto->type) != type));
-		proto = proto->next)
-		;
-
-	return proto;
-}
-
-int p8022_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
-{
-	struct datalink_proto	*proto;
-
-	proto = find_8022_client(*(skb->h.raw));
-	if (proto != NULL) 
-	{
-		skb->h.raw += 3;
-		skb->nh.raw += 3;
-		skb_pull(skb,3);
-		return proto->rcvfunc(skb, dev, pt);
-	}
-
-	skb->sk = NULL;
-	kfree_skb(skb);
-	return 0;
-}
-
-static void p8022_datalink_header(struct datalink_proto *dl,
-		struct sk_buff *skb, unsigned char *dest_node)
-{
-	struct device	*dev = skb->dev;
-	unsigned char	*rawp;
-
-	rawp = skb_push(skb,3);
-	*rawp++ = dl->type[0];
-	*rawp++ = dl->type[0];
-	*rawp = 0x03;	/* UI */
-	dev->hard_header(skb, dev, ETH_P_802_3, dest_node, NULL, skb->len);
-}
-
-static struct packet_type p8022_packet_type =
-{
-	0,	/* MUTTER ntohs(ETH_P_8022),*/
-	NULL,		/* All devices */
-	p8022_rcv,
-	NULL,
-	NULL,
-};
-
-EXPORT_SYMBOL(register_8022_client);
-EXPORT_SYMBOL(unregister_8022_client);
-
-__initfunc(void p8022_proto_init(struct net_proto *pro))
-{
-	p8022_packet_type.type=htons(ETH_P_802_2);
-	dev_add_pack(&p8022_packet_type);
-}
-
-struct datalink_proto *register_8022_client(unsigned char type, int (*rcvfunc)(struct sk_buff *, struct device *, struct packet_type *))
-{
-	struct datalink_proto	*proto;
-
-	if (find_8022_client(type) != NULL)
-		return NULL;
-
-	proto = (struct datalink_proto *) kmalloc(sizeof(*proto), GFP_ATOMIC);
-	if (proto != NULL) {
-		proto->type[0] = type;
-		proto->type_len = 1;
-		proto->rcvfunc = rcvfunc;
-		proto->header_length = 3;
-		proto->datalink_header = p8022_datalink_header;
-		proto->string_name = "802.2";
-		proto->next = p8022_list;
-		p8022_list = proto;
-	}
-
-	return proto;
-}
-
-void unregister_8022_client(unsigned char type)
-{
-	struct datalink_proto *tmp, **clients = &p8022_list;
-	unsigned long flags;
-
-	save_flags(flags);
-	cli();
-
-	while ((tmp = *clients) != NULL)
-	{
-		if (tmp->type[0] == type) {
-			*clients = tmp->next;
-			kfree_s(tmp, sizeof(struct datalink_proto));
-			break;
-		} else {
-			clients = &tmp->next;
-		}
-	}
-
-	restore_flags(flags);
-}
diff -uNr linux/net/802/p8023.c linux-llc/net/802/p8023.c
--- linux/net/802/p8023.c	Thu Jan  2 13:13:27 1997
+++ linux-llc/net/802/p8023.c	Thu Jan  1 01:00:00 1970
@@ -1,62 +0,0 @@
-/*
- *	NET3:	802.3 data link hooks used for IPX 802.3
- *
- *	This program is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU General Public License
- *	as published by the Free Software Foundation; either version
- *	2 of the License, or (at your option) any later version.
- *
- *	802.3 isn't really a protocol data link layer. Some old IPX stuff
- *	uses it however. Note that there is only one 802.3 protocol layer
- *	in the system. We don't currently support different protocols
- *	running raw 802.3 on different devices. Thankfully nobody else
- *	has done anything like the old IPX.
- */
- 
-#include <linux/netdevice.h>
-#include <linux/skbuff.h>
-#include <net/datalink.h>
-#include <linux/mm.h>
-#include <linux/in.h>
-
-/*
- *	Place an 802.3 header on a packet. The driver will do the mac
- *	addresses, we just need to give it the buffer length.
- */
- 
-static void p8023_datalink_header(struct datalink_proto *dl, 
-		struct sk_buff *skb, unsigned char *dest_node)
-{
-	struct device	*dev = skb->dev;
-	dev->hard_header(skb, dev, ETH_P_802_3, dest_node, NULL, skb->len);
-}
-
-/*
- *	Create an 802.3 client. Note there can be only one 802.3 client
- */
- 
-struct datalink_proto *make_8023_client(void)
-{
-	struct datalink_proto	*proto;
-
-	proto = (struct datalink_proto *) kmalloc(sizeof(*proto), GFP_ATOMIC);
-	if (proto != NULL) 
-	{
-		proto->type_len = 0;
-		proto->header_length = 0;
-		proto->datalink_header = p8023_datalink_header;
-		proto->string_name = "802.3";
-	}
-	return proto;
-}
-
-/*
- *	Destroy the 802.3 client.
- */
- 
-void destroy_8023_client(struct datalink_proto *dl)
-{
-	if (dl)
-		kfree_s(dl,sizeof(struct datalink_proto));
-}
-
diff -uNr linux/net/802/pseudo/Makefile linux-llc/net/802/pseudo/Makefile
--- linux/net/802/pseudo/Makefile	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/pseudo/Makefile	Thu Jan  1 01:00:00 1970
@@ -1,13 +0,0 @@
-all:	pseudocode.h actionnm.h
-
-clean:
-	touch pseudocode.h actionnm.h
-	rm pseudocode.h actionnm.h
-
-pseudocode.h: pseudocode opcd2num.sed compile.awk
-	sed -f opcd2num.sed pseudocode |  awk -f compile.awk >pseudocode.h
-
-actionnm.h: pseudocode.h actionnm.awk
-	awk -f actionnm.awk pseudocode.h>actionnm.h
-
-	
diff -uNr linux/net/802/pseudo/actionnm.awk linux-llc/net/802/pseudo/actionnm.awk
--- linux/net/802/pseudo/actionnm.awk	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/pseudo/actionnm.awk	Thu Jan  1 01:00:00 1970
@@ -1,27 +0,0 @@
-# usage: awk -f actionnm.awk pseudocode.h
-#
-BEGIN { "date" | getline
-	today = $0
-	printf("\n/* this file generated on %s  */\n", today )
-	printf("\nstatic char *action_names[] = { \n    " )
-	opl = 0
-}
-
-/^#define/ {			
-	if ( opl > 3 ) {
-	    printf("\n    ")
-	    opl = 0
-	}
-	opl = opl +1
-	t = sprintf("\"%s\"", $2 )
-	printf("%-15s ,", t )
-#	printf("%-10s", $2 )
-}
-
-END {		
-	if ( opl > 3 ) {
-	    printf("\n    ")
-	}
-	printf("\t  0\n};\n\n")
-}
-
diff -uNr linux/net/802/pseudo/actionnm.h linux-llc/net/802/pseudo/actionnm.h
--- linux/net/802/pseudo/actionnm.h	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/pseudo/actionnm.h	Thu Jan  1 01:00:00 1970
@@ -1,51 +0,0 @@
-
-/* this file generated on Thu Oct 24 11:42:37 GMT 1996  */
-
-static char *action_names[] = { 
-    "NOP"           ,"ADM1"          ,"ADM2"          ,"ADM3"          ,
-    "ADM4"          ,"ADM5"          ,"CONN2"         ,"CONN3"         ,
-    "CONN4"         ,"CONN5"         ,"RESWAIT1"      ,"RESWAIT2"      ,
-    "RESWAIT3"      ,"RESWAIT4"      ,"RESWAIT5"      ,"RESWAIT6"      ,
-    "RESWAIT7"      ,"RESWAIT8"      ,"RESCHK1"       ,"RESCHK2"       ,
-    "RESCHK3"       ,"RESCHK4"       ,"RESCHK5"       ,"RESCHK6"       ,
-    "SETUP1"        ,"SETUP2"        ,"SETUP3"        ,"SETUP4"        ,
-    "SETUP5"        ,"SETUP6"        ,"SETUP7"        ,"SETUP8"        ,
-    "RESET1"        ,"RESET2"        ,"RESET3"        ,"RESET4"        ,
-    "RESET5"        ,"RESET6"        ,"RESET7"        ,"RESET8"        ,
-    "D_CONN1"       ,"D_CONN2"       ,"D_CONN3"       ,"D_CONN4"       ,
-    "D_CONN5"       ,"D_CONN6"       ,"D_CONN7"       ,"ERR1"          ,
-    "ERR2"          ,"ERR3"          ,"ERR4"          ,"ERR5"          ,
-    "ERR6"          ,"ERR7"          ,"ERR8"          ,"SH1"           ,
-    "SH2"           ,"SH3"           ,"SH4"           ,"SH5"           ,
-    "SH6"           ,"SH7"           ,"SH8"           ,"SH9"           ,
-    "SH10"          ,"SH11"          ,"NORMAL1"       ,"NORMAL2"       ,
-    "NORMAL3"       ,"NORMAL4"       ,"NORMAL5"       ,"NORMAL6"       ,
-    "NORMAL7"       ,"NORMAL8A"      ,"NORMAL8B"      ,"NORMAL9"       ,
-    "NORMAL10"      ,"NORMAL11"      ,"NORMAL12"      ,"NORMAL13"      ,
-    "NORMAL14"      ,"NORMAL15"      ,"NORMAL16"      ,"NORMAL17"      ,
-    "NORMAL18"      ,"NORMAL19"      ,"NORMAL20"      ,"BUSY1"         ,
-    "BUSY2"         ,"BUSY3"         ,"BUSY4"         ,"BUSY5"         ,
-    "BUSY6"         ,"BUSY7"         ,"BUSY8"         ,"BUSY9"         ,
-    "BUSY10"        ,"BUSY11"        ,"BUSY12"        ,"BUSY13"        ,
-    "BUSY14"        ,"BUSY15"        ,"BUSY16"        ,"BUSY17"        ,
-    "BUSY18"        ,"BUSY19"        ,"BUSY20"        ,"BUSY21"        ,
-    "BUSY22"        ,"BUSY23"        ,"BUSY24"        ,"BUSY25"        ,
-    "BUSY26"        ,"REJECT1"       ,"REJECT2"       ,"REJECT3"       ,
-    "REJECT4"       ,"REJECT5"       ,"REJECT6"       ,"REJECT7"       ,
-    "REJECT8"       ,"REJECT9"       ,"REJECT10"      ,"REJECT11"      ,
-    "REJECT12"      ,"REJECT13"      ,"REJECT14"      ,"REJECT15"      ,
-    "REJECT16"      ,"REJECT17"      ,"REJECT18"      ,"REJECT19"      ,
-    "REJECT20"      ,"AWAIT1"        ,"AWAIT2"        ,"AWAIT3"        ,
-    "AWAIT4"        ,"AWAIT5"        ,"AWAIT6"        ,"AWAIT7"        ,
-    "AWAIT8"        ,"AWAIT9"        ,"AWAIT10"       ,"AWAIT11"       ,
-    "AWAIT12"       ,"AWAIT13"       ,"AWAIT14"       ,"AWAIT_BUSY1"   ,
-    "AWAIT_BUSY2"   ,"AWAIT_BUSY3"   ,"AWAIT_BUSY4"   ,"AWAIT_BUSY5"   ,
-    "AWAIT_BUSY6"   ,"AWAIT_BUSY7"   ,"AWAIT_BUSY8"   ,"AWAIT_BUSY9"   ,
-    "AWAIT_BUSY10"  ,"AWAIT_BUSY11"  ,"AWAIT_BUSY12"  ,"AWAIT_BUSY13"  ,
-    "AWAIT_BUSY14"  ,"AWAIT_BUSY15"  ,"AWAIT_BUSY16"  ,"AWAIT_REJECT1" ,
-    "AWAIT_REJECT2" ,"AWAIT_REJECT3" ,"AWAIT_REJECT4" ,"AWAIT_REJECT5" ,
-    "AWAIT_REJECT6" ,"AWAIT_REJECT7" ,"AWAIT_REJECT8" ,"AWAIT_REJECT9" ,
-    "AWAIT_REJECT10" ,"AWAIT_REJECT11" ,"AWAIT_REJECT12" ,"AWAIT_REJECT13" ,
-    	  0
-};
-
diff -uNr linux/net/802/pseudo/compile.awk linux-llc/net/802/pseudo/compile.awk
--- linux/net/802/pseudo/compile.awk	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/pseudo/compile.awk	Thu Jan  1 01:00:00 1970
@@ -1,57 +0,0 @@
-# usage: cat pseudocode | sed -f act2num | awk -f compile.awk
-#
-#
-BEGIN { "date" | getline
-	today = $0
-	printf("\n/* this file generated on %s  */\n", today )
-	printf("\nstatic char pseudo_code [ ] = { \n" )
-	opl = 0			# op codes on the current line
-
-	opc = 0			# opcode counter
-	fpi = 0			# fill pointer for idx array
-}
-
-/^;/ { } 			# line starting with semicolon is comment 
-
-/^[A-Z]/ {			# start of a new action 
-	emit( 0 )
-	idx[ ++fpi ] = opc
-	name[ fpi ] = $1 
-	emit( $2 )
-}
-
-/^[\t ]/ { 
-        emit( $1 )
-}
-
-END {		
-	if ( opl > 8 ) {
-	    printf("\n")
-	}
-	printf("\t  0\n};\n\n")
-	printf("static short int pseudo_code_idx [ ] ={\n")
-	opl = 0
-	emit( 0 )
-	for( ii = 1; ii <= fpi; ii++ )
-	   emit( idx[ ii ] )
-	if ( opl > 8 ) {
-	    printf("\n")
-	}
-	printf("\t  0\n};\n\n")
-
-	printf("#define %-10s \t %3d \n", "NOP", 0 )
-	for( ii = 1; ii <= fpi; ii++ )
-	    printf("#define %-10s \t %3d \n", name[ ii ], ii )
-	printf("\n")
-}
-
-function emit( opcode ){	# Niclaus Wirth
-	if ( opl > 8 ) {
-	    printf("\n")
-	    opl = 0
-	}
-	opl = opl +1
-	printf("\t%4d,", opcode )
-	opc++
-}
-
diff -uNr linux/net/802/pseudo/opcd2num.sed linux-llc/net/802/pseudo/opcd2num.sed
--- linux/net/802/pseudo/opcd2num.sed	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/pseudo/opcd2num.sed	Thu Jan  1 01:00:00 1970
@@ -1,72 +0,0 @@
-s/NOP/0/
-s/DUMMY_6/6/
-s/DUMMY_8/8/
-s/IF_F=1_CLEAR_REMOTE_BUSY/9/
-s/CLEAR_REMOTE_BUSY/1/
-s/CONNECT_CONFIRM/3/
-s/DISCONNECT_INDICATION/5/
-s/CONNECT_INDICATION/2/
-s/IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1/55/
-s/DATA_FLAG:=0/53/
-s/DATA_FLAG:=1/54/
-s/DATA_FLAG:=2/52/
-s/DATA_INDICATION/4/
-s/F_FLAG:=P/65/
-s/IF_DATA_FLAG=2_STOP_REJ_TIMER/10/
-s/OPTIONAL_SEND_RNR_XXX(X=0)/30/
-s/P_FLAG:=0/56/
-s/P_FLAG:=P/57/
-s/RE-SEND_FRMR_RSP(F=0)/14/
-s/RE-SEND_FRMR_RSP(F=P)/15/
-s/RE-SEND_I_CMD(P=1)_OR_SEND_RR/18/
-s/RE-SEND_I_CMD(P=1)/17/
-s/RE-SEND_I_RSP(F=1)/22/
-s/RE-SEND_I_XXX(X=0)_OR_SEND_RR/21/
-s/RE-SEND_I_XXX(X=0)/20/
-s/REMOTE_BUSY:=0/58/
-s/REPORT_STATUS(FRMR_RECEIVED)/66/
-s/REPORT_STATUS(FRMR_SENT)/67/
-s/REPORT_STATUS(REMOTE_BUSY)/68/
-s/REPORT_STATUS(REMOTE_NOT_BUSY)/69/
-s/RESET_CONFIRM/7/
-s/RESET_INDICATION(LOCAL)/70/
-s/RESET_INDICATION(REMOTE)/71/
-s/RETRY_COUNT:=RETRY_COUNT+1/60/
-s/RETRY_COUNT:=0/59/
-s/SEND_ACKNOWLEDGE_CMD(P=1)/32/
-s/SEND_ACKNOWLEDGE_RSP(F=1)/34/
-s/SEND_ACKNOWLEDGE_XXX(X=0)/36/
-s/SEND_DISC_CMD(P=X)/11/
-s/SEND_DM_RSP(F=X)/12/
-s/SEND_FRMR_RSP(F=X)/13/
-s/SEND_I_CMD(P=1)/16/
-s/SEND_I_XXX(X=0)/19/
-s/SEND_REJ_CMD(P=1)/23/
-s/SEND_REJ_RSP(F=1)/24/
-s/SEND_REJ_XXX(X=0)/25/
-s/SEND_RNR_CMD(F=1)/26/
-s/SEND_RNR_RSP(F=1)/27/
-s/SEND_RNR_XXX(X=0)/28/
-s/SEND_RR_CMD(P=1)/31/
-s/SEND_RR_RSP(F=1)/33/
-s/SEND_RR_XXX(X=0)/35/
-s/SEND_SABME_CMD(P=X)/37/
-s/SEND_UA_RSP(F=X)/38/
-s/SET_REMOTE_BUSY/29/
-s/START_ACK_TIMER_IF_NOT_RUNNING/44/
-s/START_ACK_TIMER/42/
-s/START_P_TIMER/41/
-s/START_REJ_TIMER/43/
-s/STOP_ACK_TIMER/45/
-s/STOP_ALL_TIMERS/48/
-s/STOP_OTHER_TIMERS/49/
-s/STOP_P_TIMER/46/
-s/STOP_REJ_TIMER/47/
-s/S_FLAG:=0/39/
-s/S_FLAG:=1/40/
-s/UPDATE_N(R)_RECEIVED/50/
-s/UPDATE_P_FLAG/51/
-s/V(R):=0/61/
-s/V(R):=V(R)+1/62/
-s/V(S):=0/63/
-s/V(S):=N(R)/64/
diff -uNr linux/net/802/pseudo/opcodes linux-llc/net/802/pseudo/opcodes
--- linux/net/802/pseudo/opcodes	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/pseudo/opcodes	Thu Jan  1 01:00:00 1970
@@ -1,72 +0,0 @@
-   0	NOP
-   1	CLEAR_REMOTE_BUSY
-   2	CONNECT_INDICATION
-   3	CONNECT_CONFIRM
-   4	DATA_INDICATION
-   5	DISCONNECT_INDICATION
-   6	DUMMY_6
-   7	RESET_CONFIRM
-   8	DUMMY_8
-   9	IF_F=1_CLEAR_REMOTE_BUSY
-  10	IF_DATA_FLAG=2_STOP_REJ_TIMER
-  11	SEND_DISC_CMD(P=X)
-  12	SEND_DM_RSP(F=X)
-  13	SEND_FRMR_RSP(F=X)
-  14	RE-SEND_FRMR_RSP(F=0)
-  15	RE-SEND_FRMR_RSP(F=P)
-  16	SEND_I_CMD(P=1)
-  17	RE-SEND_I_CMD(P=1)
-  18	RE-SEND_I_CMD(P=1)_OR_SEND_RR
-  19	SEND_I_XXX(X=0)
-  20	RE-SEND_I_XXX(X=0)
-  21	RE-SEND_I_XXX(X=0)_OR_SEND_RR
-  22	RE-SEND_I_RSP(F=1)
-  23	SEND_REJ_CMD(P=1)
-  24	SEND_REJ_RSP(F=1)
-  25	SEND_REJ_XXX(X=0)
-  26	SEND_RNR_CMD(F=1)
-  27	SEND_RNR_RSP(F=1)
-  28	SEND_RNR_XXX(X=0)
-  29	SET_REMOTE_BUSY
-  30	OPTIONAL_SEND_RNR_XXX(X=0)
-  31	SEND_RR_CMD(P=1)
-  32	SEND_ACKNOWLEDGE_CMD(P=1)
-  33	SEND_RR_RSP(F=1)
-  34	SEND_ACKNOWLEDGE_RSP(F=1)
-  35	SEND_RR_XXX(X=0)
-  36	SEND_ACKNOWLEDGE_XXX(X=0)
-  37	SEND_SABME_CMD(P=X)
-  38	SEND_UA_RSP(F=X)
-  39	S_FLAG:=0
-  40	S_FLAG:=1
-  41	START_P_TIMER
-  42	START_ACK_TIMER
-  43	START_REJ_TIMER
-  44	START_ACK_TIMER_IF_NOT_RUNNING
-  45	STOP_ACK_TIMER
-  46	STOP_P_TIMER
-  47	STOP_REJ_TIMER
-  48	STOP_ALL_TIMERS
-  49	STOP_OTHER_TIMERS
-  50	UPDATE_N(R)_RECEIVED
-  51	UPDATE_P_FLAG
-  52	DATA_FLAG:=2
-  53	DATA_FLAG:=0
-  54	DATA_FLAG:=1
-  55	IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1
-  56	P_FLAG:=0
-  57	P_FLAG:=P
-  58	REMOTE_BUSY:=0
-  59	RETRY_COUNT:=0
-  60	RETRY_COUNT:=RETRY_COUNT+1
-  61	V(R):=0
-  62	V(R):=V(R)+1
-  63	V(S):=0
-  64	V(S):=N(R)
-  65	F_FLAG:=P
-  66	REPORT_STATUS(FRMR_RECEIVED)
-  67	REPORT_STATUS(FRMR_SENT)
-  68	REPORT_STATUS(REMOTE_BUSY)
-  69	REPORT_STATUS(REMOTE_NOT_BUSY)
-  70	RESET_INDICATION(LOCAL)
-  71	RESET_INDICATION(REMOTE)
diff -uNr linux/net/802/pseudo/opcodesnm.h linux-llc/net/802/pseudo/opcodesnm.h
--- linux/net/802/pseudo/opcodesnm.h	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/pseudo/opcodesnm.h	Thu Jan  1 01:00:00 1970
@@ -1,23 +0,0 @@
-static char *opcode_names[] = {
-"NOP", "CLEAR_REMOTE_BUSY", "CONNECT_INDICATION", "CONNECT_CONFIRM", "DATA_INDICATION",
-"DISCONNECT_INDICATION", "DUMMY_6", "RESET_CONFIRM", "DUMMY_8",
-"IF_F=1_CLEAR_REMOTE_BUSY", "IF_DATA_FLAG=2_STOP_REJ_TIMER", "SEND_DISC_CMD(P=X)",
-"SEND_DM_RSP(F=X)", "SEND_FRMR_RSP(F=X)", "RE-SEND_FRMR_RSP(F=0)",
-"RE-SEND_FRMR_RSP(F=P)", "SEND_I_CMD(P=1)", "RE-SEND_I_CMD(P=1)",
-"RE-SEND_I_CMD(P=1)_OR_SEND_RR", "SEND_I_XXX(X=0)", "RE-SEND_I_XXX(X=0)",
-"RE-SEND_I_XXX(X=0)_OR_SEND_RR", "RE-SEND_I_RSP(F=1)", "SEND_REJ_CMD(P=1)",
-"SEND_REJ_RSP(F=1)", "SEND_REJ_XXX(X=0)", "SEND_RNR_CMD(F=1)", "SEND_RNR_RSP(F=1)",
-"SEND_RNR_XXX(X=0)", "SET_REMOTE_BUSY", "OPTIONAL_SEND_RNR_XXX(X=0)",
-"SEND_RR_CMD(P=1)", "SEND_ACKNOWLEDGE_CMD(P=1)", "SEND_RR_RSP(F=1)",
-"SEND_ACKNOWLEDGE_RSP(F=1)", "SEND_RR_XXX(X=0)", "SEND_ACKNOWLEDGE_XXX(X=0)",
-"SEND_SABME_CMD(P=X)", "SEND_UA_RSP(F=X)", "S_FLAG:=0", "S_FLAG:=1", "START_P_TIMER",
-"START_ACK_TIMER", "START_REJ_TIMER", "START_ACK_TIMER_IF_NOT_RUNNING",
-"STOP_ACK_TIMER", "STOP_P_TIMER", "STOP_REJ_TIMER", "STOP_ALL_TIMERS",
-"STOP_OTHER_TIMERS", "UPDATE_N(R)_RECEIVED", "UPDATE_P_FLAG", "DATA_FLAG:=2",
-"DATA_FLAG:=0", "DATA_FLAG:=1", "IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1", "P_FLAG:=0",
-"P_FLAG:=P", "REMOTE_BUSY:=0", "RETRY_COUNT:=0", "RETRY_COUNT:=RETRY_COUNT+1",
-"V(R):=0", "V(R):=V(R)+1", "V(S):=0", "V(S):=N(R)", "F_FLAG:=P",
-"REPORT_STATUS(FRMR_RECEIVED)", "REPORT_STATUS(FRMR_SENT)",
-"REPORT_STATUS(REMOTE_BUSY)", "REPORT_STATUS(REMOTE_NOT_BUSY)",
-"RESET_INDICATION(LOCAL)", "RESET_INDICATION(REMOTE)"
-};
diff -uNr linux/net/802/pseudo/pseudocode linux-llc/net/802/pseudo/pseudocode
--- linux/net/802/pseudo/pseudocode	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/pseudo/pseudocode	Thu Jan  1 01:00:00 1970
@@ -1,780 +0,0 @@
-;============================================================================
-;
-; translate this with 
-; 	cat pseudocode | sed -f act2num |  awk -f compile.awk >pseudocode.h
-;
-; actionname	pseudocode
-;
-;============================================================================
-ADM1		SEND_SABME_CMD(P=X)
-		P_FLAG:=P
-		START_ACK_TIMER
-		RETRY_COUNT:=0
-		S_FLAG:=0
-;
-; instructions in ADM2 have been changed:
-; 1. 	P_FLAG:=P is probably wrong in doc...
-; 	I think it should be F_FLAG:=P the way it is in CONN3
-; 2.	CONNECT_RESPONSE has been wired in here,
-;	CONN1 is no longer referenced
-;
-ADM2		F_FLAG:=P
-		SEND_UA_RSP(F=X)
-		V(S):=0
-		V(R):=0
-		RETRY_COUNT:=0
-		P_FLAG:=0
-		REMOTE_BUSY:=0
-		CONNECT_INDICATION
-ADM3		SEND_DM_RSP(F=X)
-ADM4		SEND_DM_RSP(F=X)
-ADM5		NOP
-;============================================================================
-;CONN1		SEND_UA_RSP(F=X)
-;		V(S):=0
-;		V(R):=0
-;		RETRY_COUNT:=0
-;		P_FLAG:=0
-;		REMOTE_BUSY:=0
-CONN2		SEND_DM_RSP(F=X)
-CONN3		F_FLAG:=P
-CONN4		DISCONNECT_INDICATION
-CONN5		NOP
-;============================================================================
-RESWAIT1	SEND_SABME_CMD(P=X)
-		P_FLAG:=P
-		START_ACK_TIMER
-		RETRY_COUNT:=0
-RESWAIT2	SEND_UA_RSP(F=X)
-		V(S):=0
-		V(R):=0
-		RETRY_COUNT:=0
-		P_FLAG:=0
-		REMOTE_BUSY:=0
-		RESET_CONFIRM
-RESWAIT3	SEND_DISC_CMD(P=X)
-		P_FLAG:=P
-		START_ACK_TIMER
-		RETRY_COUNT:=0
-RESWAIT4	SEND_DM_RSP(F=X)		
-RESWAIT5	DISCONNECT_INDICATION
-RESWAIT6	S_FLAG:=1
-		F_FLAG:=P
-RESWAIT7	SEND_DM_RSP(F=X)
-		DISCONNECT_INDICATION
-RESWAIT8	NOP
-;============================================================================
-RESCHK1		SEND_UA_RSP(F=X)
-		V(S):=0
-		V(R):=0
-		RETRY_COUNT:=0
-		P_FLAG:=0
-		REMOTE_BUSY:=0
-RESCHK2		SEND_DM_RSP(F=X)
-RESCHK3		DISCONNECT_INDICATION
-RESCHK4		F_FLAG:=P
-RESCHK5		SEND_DM_RSP(F=X)
-		DISCONNECT_INDICATION
-RESCHK6		NOP
-;============================================================================
-SETUP1		SEND_UA_RSP(F=X)
-		V(S):=0
-		V(R):=0
-		RETRY_COUNT:=0
-		S_FLAG:=1
-SETUP2		STOP_ACK_TIMER
-		V(S):=0
-		V(R):=0
-		RETRY_COUNT:=0
-		UPDATE_P_FLAG
-		CONNECT_CONFIRM
-		REMOTE_BUSY:=0
-SETUP3		P_FLAG:=0
-		CONNECT_CONFIRM
-		REMOTE_BUSY:=0
-SETUP4		SEND_DM_RSP(F=X)
-		DISCONNECT_INDICATION
-		STOP_ACK_TIMER
-SETUP5		DISCONNECT_INDICATION
-		STOP_ACK_TIMER
-SETUP6		NOP
-SETUP7		SEND_SABME_CMD(P=X)
-		P_FLAG:=P
-		START_ACK_TIMER
-		RETRY_COUNT:=RETRY_COUNT+1
-SETUP8		DISCONNECT_INDICATION
-;============================================================================
-RESET1		SEND_UA_RSP(F=X)
-		V(S):=0
-		V(R):=0
-		RETRY_COUNT:=0
-		S_FLAG:=1
-RESET2		STOP_ACK_TIMER
-		V(S):=0
-		V(R):=0
-		RETRY_COUNT:=0
-		UPDATE_P_FLAG
-		RESET_CONFIRM
-		REMOTE_BUSY:=0
-RESET3		P_FLAG:=0
-		RESET_CONFIRM
-		REMOTE_BUSY:=0
-RESET4		SEND_DM_RSP(F=X)
-		DISCONNECT_INDICATION
-		STOP_ACK_TIMER
-RESET5		DISCONNECT_INDICATION
-		STOP_ACK_TIMER
-RESET6		NOP
-RESET7		SEND_SABME_CMD(P=X)
-		P_FLAG:=P
-		START_ACK_TIMER
-		RETRY_COUNT:=RETRY_COUNT+1
-RESET8		DISCONNECT_INDICATION
-;============================================================================
-D_CONN1		SEND_DM_RSP(F=X)
-		STOP_ACK_TIMER
-D_CONN2		STOP_ACK_TIMER
-D_CONN3		SEND_UA_RSP(F=X)
-D_CONN4		STOP_ACK_TIMER
-D_CONN5		NOP
-D_CONN6		SEND_DISC_CMD(P=X)
-		P_FLAG:=P
-		START_ACK_TIMER
-		RETRY_COUNT:=RETRY_COUNT+1
-D_CONN7		NOP
-;============================================================================
-ERR1		RESET_INDICATION(REMOTE)
-		STOP_ACK_TIMER
-		F_FLAG:=P
-ERR2		SEND_UA_RSP(F=X)
-		DISCONNECT_INDICATION
-		STOP_ACK_TIMER
-ERR3		DISCONNECT_INDICATION
-		STOP_ACK_TIMER
-ERR4		RESET_INDICATION(LOCAL)
-		STOP_ACK_TIMER
-		REPORT_STATUS(FRMR_RECEIVED)
-		S_FLAG:=0
-ERR5		RE-SEND_FRMR_RSP(F=P)
-		START_ACK_TIMER
-ERR6		NOP
-ERR7		RE-SEND_FRMR_RSP(F=0)
-		START_ACK_TIMER
-		RETRY_COUNT:=RETRY_COUNT+1
-ERR8		S_FLAG:=0
-		RESET_INDICATION(LOCAL)
-;============================================================================
-; the shared actions are common to states NORMAL, BUSY, REJECT,
-; AWAIT, AWAIT_BUSY and AWAIT_REJECT.
-;============================================================================
-SH1		SEND_DISC_CMD(P=X)
-		P_FLAG:=P
-		START_ACK_TIMER
-		STOP_OTHER_TIMERS
-		RETRY_COUNT:=0
-SH2		SEND_SABME_CMD(P=X)
-		P_FLAG:=P
-		START_ACK_TIMER
-		STOP_OTHER_TIMERS
-		RETRY_COUNT:=0
-		S_FLAG:=0
-SH3		RESET_INDICATION(REMOTE)
-		F_FLAG:=P
-		STOP_ALL_TIMERS
-SH4		SEND_UA_RSP(F=X)
-		DISCONNECT_INDICATION
-		STOP_ALL_TIMERS
-SH5		STOP_ALL_TIMERS
-		RESET_INDICATION(LOCAL)
-		REPORT_STATUS(FRMR_RECEIVED)
-		S_FLAG:=0
-SH6		DISCONNECT_INDICATION
-		STOP_ALL_TIMERS
-SH7		SEND_FRMR_RSP(F=X)
-		REPORT_STATUS(FRMR_SENT)
-		START_ACK_TIMER
-		STOP_OTHER_TIMERS
-		RETRY_COUNT:=0
-SH8		SEND_FRMR_RSP(F=0)
-		REPORT_STATUS(FRMR_SENT)
-		START_ACK_TIMER
-		STOP_OTHER_TIMERS
-		RETRY_COUNT:=0
-SH9		SEND_FRMR_RSP(F=0)
-		REPORT_STATUS(FRMR_SENT)
-		START_ACK_TIMER
-		STOP_OTHER_TIMERS
-		RETRY_COUNT:=0
-SH10		SEND_FRMR_RSP(F=X)
-		REPORT_STATUS(FRMR_SENT)
-		START_ACK_TIMER
-		STOP_OTHER_TIMERS
-		RETRY_COUNT:=0
-SH11		STOP_ALL_TIMERS
-		RESET_INDICATION(LOCAL)
-		S_FLAG:=0
-;============================================================================
-NORMAL1		SEND_I_CMD(P=1)
-		START_P_TIMER
-		START_ACK_TIMER_IF_NOT_RUNNING
-;		SEND_I_XXX(X=0)
-;		START_ACK_TIMER_IF_NOT_RUNNING
-NORMAL2		SEND_I_XXX(X=0)
-		START_ACK_TIMER_IF_NOT_RUNNING
-NORMAL3		SEND_RNR_CMD(F=1)
-		START_P_TIMER
-		DATA_FLAG:=0
-;		SEND_RNR_XXX(X=0)
-;		DATA_FLAG:=0
-NORMAL4		SEND_RNR_XXX(X=0)
-		DATA_FLAG:=0
-NORMAL5		SEND_REJ_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		UPDATE_P_FLAG
-		START_REJ_TIMER
-		IF_F=1_CLEAR_REMOTE_BUSY
-;		SEND_REJ_CMD(P=1)
-;		UPDATE_N(R)_RECEIVED
-;		START_P_TIMER
-;		START_REJ_TIMER
-;		IF_F=1_CLEAR_REMOTE_BUSY
-NORMAL6		SEND_REJ_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		START_REJ_TIMER
-NORMAL7		SEND_REJ_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		START_REJ_TIMER
-;
-; the order of opcodes in NORMAL8 is changed.
-; the transition table will execute NORMAL8A for incomming pdus
-; with p/f 1, pdus with pf 0 are treated in NORMAL8B.
-;   
-NORMAL8A	V(R):=V(R)+1
-		SEND_ACKNOWLEDGE_CMD(P=1)
-		START_P_TIMER
-		UPDATE_N(R)_RECEIVED
-		IF_F=1_CLEAR_REMOTE_BUSY
-		DATA_INDICATION
-;
-NORMAL8B	V(R):=V(R)+1
-		UPDATE_P_FLAG
-		SEND_ACKNOWLEDGE_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		IF_F=1_CLEAR_REMOTE_BUSY
-		DATA_INDICATION
-;
-; the order of opcodes in NORMAL9 is changed 
-NORMAL9		V(R):=V(R)+1
-		SEND_ACKNOWLEDGE_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		DATA_INDICATION
-;
-; the order of opcodes in NORMAL10 is changed 
-NORMAL10	V(R):=V(R)+1
-		SEND_ACKNOWLEDGE_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		DATA_INDICATION
-NORMAL11	UPDATE_P_FLAG
-		UPDATE_N(R)_RECEIVED
-		CLEAR_REMOTE_BUSY
-NORMAL12	SEND_ACKNOWLEDGE_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		CLEAR_REMOTE_BUSY
-NORMAL13	UPDATE_P_FLAG
-		UPDATE_N(R)_RECEIVED
-		SET_REMOTE_BUSY
-NORMAL14	SEND_RR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		SET_REMOTE_BUSY
-NORMAL15	V(S):=N(R)
-		UPDATE_N(R)_RECEIVED
-		UPDATE_P_FLAG
-		RE-SEND_I_XXX(X=0)
-		CLEAR_REMOTE_BUSY
-;		V(S):=N(R)
-;		UPDATE_N(R)_RECEIVED
-;		START_P_TIMER
-;		RE-SEND_I_CMD(P=1)
-;		CLEAR_REMOTE_BUSY
-NORMAL16	V(S):=N(R)
-		UPDATE_N(R)_RECEIVED
-		RE-SEND_I_XXX(X=0)
-		CLEAR_REMOTE_BUSY
-NORMAL17	V(S):=N(R)
-		UPDATE_N(R)_RECEIVED
-		RE-SEND_I_RSP(F=1)
-		CLEAR_REMOTE_BUSY
-NORMAL18	SEND_RR_CMD(P=1)
-		START_P_TIMER
-NORMAL19	P_FLAG:=0
-;		SEND_RR_CMD(P=1)
-;		START_P_TIMER
-;		RETRY_COUNT:=RETRY_COUNT+1
-NORMAL20	SEND_RR_CMD(P=1)
-		START_P_TIMER
-		RETRY_COUNT:=RETRY_COUNT+1
-;============================================================================
-BUSY1		SEND_I_CMD(P=1)
-		START_P_TIMER
-		START_ACK_TIMER_IF_NOT_RUNNING
-;		SEND_I_XXX(X=0)
-;		START_ACK_TIMER_IF_NOT_RUNNING
-BUSY2		SEND_I_XXX(X=0)
-		START_ACK_TIMER_IF_NOT_RUNNING
-BUSY3		SEND_REJ_CMD(P=1)
-		START_REJ_TIMER
-		START_P_TIMER
-;		SEND_REJ_XXX(X=0)
-;		START_REJ_TIMER
-BUSY4		SEND_REJ_XXX(X=0)
-		START_REJ_TIMER
-BUSY5		SEND_RR_CMD(P=1)
-		START_P_TIMER
-		SEND_RR_XXX(X=0)
-BUSY6		SEND_RR_XXX(X=0)
-BUSY7		SEND_RR_CMD(P=1)
-		START_P_TIMER
-		SEND_RR_XXX(X=0)
-BUSY8		SEND_RR_XXX(X=0)
-BUSY9		OPTIONAL_SEND_RNR_XXX(X=0)
-		UPDATE_P_FLAG
-		UPDATE_N(R)_RECEIVED
-		IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1
-		IF_F=1_CLEAR_REMOTE_BUSY
-;		SEND_RNR_CMD(P=1)
-;		START_P_TIMER
-;		UPDATE_N(R)_RECEIVED
-;		IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1
-;		IF_F=1_CLEAR_REMOTE_BUSY
-BUSY10		OPTIONAL_SEND_RNR_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1
-BUSY11		SEND_RNR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		IF_DATA_FLAG_=0_THEN_DATA_FLAG:=1
-BUSY12		SEND_RNR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		IF_DATA_FLAG=2_STOP_REJ_TIMER
-		DATA_FLAG:=1
-;		V(R):=V(R)+1
-;		DATA_INDICATION
-;		SEND_RNR_RSP(F=1)
-;		UPDATE_N(R)_RECEIVED
-;		IF_DATA_FLAG=2_STOP_REJ_TIMER
-;		DATA_FLAG:=0
-BUSY13		OPTIONAL_SEND_RNR_XXX(X=0)
-		UPDATE_P_FLAG
-		UPDATE_N(R)_RECEIVED
-		IF_DATA_FLAG=2_STOP_REJ_TIMER
-		DATA_FLAG:=1
-		IF_F=1_CLEAR_REMOTE_BUSY
-;		SEND_RNR_CMD(F=1)
-;		START_P_TIMER
-;		UPDATE_N(R)_RECEIVED
-;		IF_DATA_FLAG=2_STOP_REJ_TIMER
-;		DATA_FLAG:=1
-;		IF_F=1_CLEAR_REMOTE_BUSY
-;		V(R):=V(R)+1
-;		DATA_INDICATION
-;		SEND_RNR_CMD(F=1)
-;		START_P_TIMER
-;		UPDATE_N(R)_RECEIVED
-;		IF_DATA_FLAG=2_STOP_REJ_TIMER
-;		DATA_FLAG:=0
-;		IF_F=1_CLEAR_REMOTE_BUSY
-;		V(R):=V(R)+1
-;		DATA_INDICATION
-;		UPDATE_P_FLAG
-;		OPTIONAL_SEND_RNR_XXX(X=0)
-;		UPDATE_N(R)_RECEIVED
-;		IF_DATA_FLAG=2_STOP_REJ_TIMER
-;		DATA_FLAG:=0
-;		IF_F=1_CLEAR_REMOTE_BUSY
-BUSY14		OPTIONAL_SEND_RNR_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		IF_DATA_FLAG=2_STOP_REJ_TIMER
-		DATA_FLAG:=1
-;		V(R):=V(R)+1
-;		DATA_INDICATION
-;		OPTIONAL_SEND_RNR_XXX(X=0)
-;		UPDATE_N(R)_RECEIVED
-;		IF_DATA_FLAG=2_STOP_REJ_TIMER
-;		DATA_FLAG:=0
-BUSY15		UPDATE_P_FLAG
-		UPDATE_N(R)_RECEIVED
-		CLEAR_REMOTE_BUSY
-BUSY16		SEND_RNR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		CLEAR_REMOTE_BUSY
-BUSY17		UPDATE_P_FLAG
-		UPDATE_N(R)_RECEIVED
-		SET_REMOTE_BUSY
-BUSY18		SEND_RNR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		SET_REMOTE_BUSY
-BUSY19		V(S):=N(R)
-		UPDATE_N(R)_RECEIVED
-		UPDATE_P_FLAG
-		RE-SEND_I_XXX(X=0)
-		CLEAR_REMOTE_BUSY
-;		V(S):=N(R)
-;		UPDATE_N(R)_RECEIVED
-;		RE-SEND_I_CMD(P=1)
-;		CLEAR_REMOTE_BUSY
-BUSY20		V(S):=N(R)
-		UPDATE_N(R)_RECEIVED
-		RE-SEND_I_XXX(X=0)
-		CLEAR_REMOTE_BUSY
-BUSY21		V(S):=N(R)
-		UPDATE_N(R)_RECEIVED
-		SEND_RNR_RSP(F=1)
-		RE-SEND_I_XXX(X=0)
-		CLEAR_REMOTE_BUSY
-BUSY22		SEND_RNR_CMD(F=1)
-		START_P_TIMER
-BUSY23		P_FLAG:=0
-;		SEND_RNR_CMD(F=1)
-;		START_P_TIMER
-;		RETRY_COUNT:=RETRY_COUNT+1
-BUSY24		SEND_RNR_CMD(F=1)
-		START_P_TIMER
-		RETRY_COUNT:=RETRY_COUNT+1
-BUSY25		DATA_FLAG:=1
-;		SEND_RNR_CMD(F=1)
-;		START_P_TIMER
-;		RETRY_COUNT:=RETRY_COUNT+1
-;		DATA_FLAG:=1
-BUSY26		DATA_FLAG:=1
-;============================================================================
-REJECT1		SEND_I_CMD(P=1)
-		START_P_TIMER
-		START_ACK_TIMER_IF_NOT_RUNNING
-;		SEND_I_XXX(X=0)
-;		START_ACK_TIMER_IF_NOT_RUNNING
-REJECT2		SEND_I_XXX(X=0)
-		START_ACK_TIMER_IF_NOT_RUNNING
-REJECT3		SEND_RNR_CMD(F=1)
-		START_P_TIMER
-		DATA_FLAG:=2
-;		SEND_RNR_XXX(X=0)
-;		DATA_FLAG:=2
-REJECT4		SEND_RNR_XXX(X=0)
-		DATA_FLAG:=2
-REJECT5		UPDATE_N(R)_RECEIVED
-		UPDATE_P_FLAG
-		IF_F=1_CLEAR_REMOTE_BUSY
-REJECT6		SEND_RR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-;
-; order of opcodes in REJECT7 is changed 
-REJECT7		V(R):=V(R)+1
-		SEND_ACKNOWLEDGE_CMD(P=1)
-		START_P_TIMER
-		UPDATE_N(R)_RECEIVED
-		IF_F=1_CLEAR_REMOTE_BUSY
-		STOP_REJ_TIMER
-		DATA_INDICATION
-;		V(R):=V(R)+1
-;		DATA_INDICATION
-;		UPDATE_P_FLAG
-;		SEND_ACKNOWLEDGE_XXX(X=0)
-;		UPDATE_N(R)_RECEIVED
-;		IF_F=1_CLEAR_REMOTE_BUSY
-;		STOP_REJ_TIMER
-;
-; order of opcodes in REJECT8 is changed 
-REJECT8		V(R):=V(R)+1
-		SEND_ACKNOWLEDGE_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		STOP_REJ_TIMER
-		DATA_INDICATION
-;
-; order of opcodes in REJECT9 is changed 
-REJECT9		V(R):=V(R)+1
-		SEND_ACKNOWLEDGE_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		STOP_REJ_TIMER
-		DATA_INDICATION
-REJECT10	UPDATE_P_FLAG
-		UPDATE_N(R)_RECEIVED
-		CLEAR_REMOTE_BUSY
-REJECT11	SEND_ACKNOWLEDGE_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		CLEAR_REMOTE_BUSY
-REJECT12	UPDATE_P_FLAG
-		UPDATE_N(R)_RECEIVED
-		SET_REMOTE_BUSY
-REJECT13	SEND_RR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		SET_REMOTE_BUSY
-REJECT14	V(S):=N(R)
-		UPDATE_N(R)_RECEIVED
-		UPDATE_P_FLAG
-		RE-SEND_I_XXX(X=0)
-		CLEAR_REMOTE_BUSY
-;		V(S):=N(R)
-;		UPDATE_N(R)_RECEIVED
-;		RE-SEND_I_CMD(P=1)
-;		START_P_TIMER
-;		CLEAR_REMOTE_BUSY
-REJECT15	V(S):=N(R)
-		UPDATE_N(R)_RECEIVED
-		RE-SEND_I_XXX(X=0)
-		CLEAR_REMOTE_BUSY
-REJECT16	V(S):=N(R)
-		UPDATE_N(R)_RECEIVED
-		RE-SEND_I_RSP(F=1)
-		CLEAR_REMOTE_BUSY
-REJECT17	SEND_RR_CMD(P=1)
-		START_P_TIMER
-REJECT18	SEND_REJ_CMD(P=1)
-		START_P_TIMER
-		START_REJ_TIMER
-		RETRY_COUNT:=RETRY_COUNT+1
-REJECT19	P_FLAG:=0
-;		SEND_RR_CMD(P=1)
-;		START_P_TIMER
-;		START_REJ_TIMER
-;		RETRY_COUNT:=RETRY_COUNT+1
-REJECT20	SEND_RR_CMD(P=1)
-		START_P_TIMER
-		START_REJ_TIMER
-		RETRY_COUNT:=RETRY_COUNT+1
-;============================================================================
-AWAIT1		SEND_RNR_XXX(X=0)
-		DATA_FLAG:=0
-AWAIT2		SEND_REJ_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		V(S):=N(R)
-		STOP_P_TIMER
-		RE-SEND_I_XXX(X=0)
-		START_REJ_TIMER
-		CLEAR_REMOTE_BUSY
-;		SEND_REJ_CMD(P=1)
-;		UPDATE_N(R)_RECEIVED
-;		V(S):=N(R)
-;		RE-SEND_I_XXX(X=0)
-;		START_P_TIMER
-;		START_REJ_TIMER
-;		CLEAR_REMOTE_BUSY
-AWAIT3		SEND_REJ_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		START_REJ_TIMER
-AWAIT4		SEND_REJ_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		START_REJ_TIMER
-;
-; order of opcode in AWAIT5 changed
-AWAIT5		V(R):=V(R)+1
-		UPDATE_N(R)_RECEIVED
-		V(S):=N(R)
-		RE-SEND_I_CMD(P=1)_OR_SEND_RR
-		START_P_TIMER
-		CLEAR_REMOTE_BUSY
-		DATA_INDICATION
-;		V(R):=V(R)+1
-;		DATA_INDICATION
-;		STOP_P_TIMER
-;		UPDATE_N(R)_RECEIVED
-;		V(S):=N(R)
-;		RE-SEND_I_XXX(X=0)_OR_SEND_RR
-;		CLEAR_REMOTE_BUSY
-;
-; order of opcode in AWAIT6 changed
-AWAIT6		V(R):=V(R)+1
-		SEND_RR_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		DATA_INDICATION
-;
-; order of opcode in AWAIT7 changed
-AWAIT7		V(R):=V(R)+1
-		SEND_RR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		DATA_INDICATION
-AWAIT8		UPDATE_N(R)_RECEIVED
-		V(S):=N(R)
-		STOP_P_TIMER
-		RE-SEND_I_XXX(X=0)
-		CLEAR_REMOTE_BUSY
-;		UPDATE_N(R)_RECEIVED
-;		V(S):=N(R)
-;		RE-SEND_I_CMD(P=1)
-;		START_P_TIMER
-;		CLEAR_REMOTE_BUSY
-AWAIT9		UPDATE_N(R)_RECEIVED
-		CLEAR_REMOTE_BUSY
-AWAIT10		SEND_RR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		CLEAR_REMOTE_BUSY
-AWAIT11		UPDATE_N(R)_RECEIVED
-		V(S):=N(R)
-		STOP_P_TIMER
-		SET_REMOTE_BUSY
-AWAIT12		UPDATE_N(R)_RECEIVED
-		SET_REMOTE_BUSY
-AWAIT13		SEND_RR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		SET_REMOTE_BUSY
-AWAIT14		SEND_RR_CMD(P=1)
-		START_P_TIMER
-		RETRY_COUNT:=RETRY_COUNT+1
-;============================================================================
-AWAIT_BUSY1	SEND_REJ_XXX(X=0)
-		START_REJ_TIMER		
-AWAIT_BUSY2	SEND_RR_XXX(X=0)
-AWAIT_BUSY3	SEND_RR_XXX(X=0)
-AWAIT_BUSY4	OPTIONAL_SEND_RNR_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		V(S):=N(R)
-		STOP_P_TIMER
-		DATA_FLAG:=1
-		CLEAR_REMOTE_BUSY
-		RE-SEND_I_XXX(X=0)
-;		SEND_RNR_CMD(F=1)
-;		UPDATE_N(R)_RECEIVED
-;		V(S):=N(R)
-;		START_P_TIMER
-;		DATA_FLAG:=1
-;		CLEAR_REMOTE_BUSY
-;		RE-SEND_I_XXX(X=0)
-AWAIT_BUSY5	OPTIONAL_SEND_RNR_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		DATA_FLAG:=1
-AWAIT_BUSY6	SEND_RNR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		DATA_FLAG:=1
-AWAIT_BUSY7	OPTIONAL_SEND_RNR_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		V(S):=N(R)
-		DATA_FLAG:=1
-		STOP_P_TIMER
-		CLEAR_REMOTE_BUSY
-		RE-SEND_I_XXX(X=0)
-;		SEND_RNR_CMD(F=1)
-;		V(R):=V(R)+1
-;		DATA_INDICATION
-;		START_P_TIMER
-;		UPDATE_N(R)_RECEIVED
-;		V(S):=N(R)
-;		DATA_FLAG:=0
-;		CLEAR_REMOTE_BUSY
-;		RE-SEND_I_XXX(X=0)
-;		OPTIONAL_SEND_RNR_XXX(X=0)
-;		V(R):=V(R)+1
-;		DATA_INDICATION
-;		STOP_P_TIMER
-;		UPDATE_N(R)_RECEIVED
-;		V(S):=N(R)
-;		DATA_FLAG:=0
-;		CLEAR_REMOTE_BUSY
-;		RE-SEND_I_XXX(X=0)
-AWAIT_BUSY8	OPTIONAL_SEND_RNR_XXX(X=0)
-		UPDATE_N(R)_RECEIVED
-		DATA_FLAG:=1
-;		OPTIONAL_SEND_RNR_XXX(X=0)
-;		V(R):=V(R)+1
-;		DATA_INDICATION
-;		UPDATE_N(R)_RECEIVED
-;		DATA_FLAG:=0
-AWAIT_BUSY9	SEND_RNR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		DATA_FLAG:=1
-;		SEND_RNR_RSP(F=1)
-;		V(R):=V(R)+1
-;		DATA_INDICATION
-;		UPDATE_N(R)_RECEIVED
-;		DATA_FLAG:=0
-AWAIT_BUSY10	UPDATE_N(R)_RECEIVED
-		V(S):=N(R)
-		STOP_P_TIMER
-		RE-SEND_I_XXX(X=0)
-		CLEAR_REMOTE_BUSY
-;		UPDATE_N(R)_RECEIVED
-;		V(S):=N(R)
-;		RE-SEND_I_CMD(P=1)
-;		START_P_TIMER
-;		CLEAR_REMOTE_BUSY
-AWAIT_BUSY11	UPDATE_N(R)_RECEIVED
-		CLEAR_REMOTE_BUSY
-AWAIT_BUSY12	SEND_RNR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		CLEAR_REMOTE_BUSY
-AWAIT_BUSY13	UPDATE_N(R)_RECEIVED
-		V(S):=N(R)
-		STOP_P_TIMER
-		SET_REMOTE_BUSY
-AWAIT_BUSY14	UPDATE_N(R)_RECEIVED
-		SET_REMOTE_BUSY
-AWAIT_BUSY15	SEND_RNR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		SET_REMOTE_BUSY
-AWAIT_BUSY16	SEND_RNR_CMD(F=1)
-		START_P_TIMER
-		RETRY_COUNT:=RETRY_COUNT+1
-;============================================================================
-AWAIT_REJECT1	SEND_RNR_XXX(X=0)
-		DATA_FLAG:=2
-AWAIT_REJECT2	UPDATE_N(R)_RECEIVED
-AWAIT_REJECT3	SEND_RR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-;
-; order of opcodes in AWAIT_REJECT4 changed
-AWAIT_REJECT4	V(R):=V(R)+1
-		UPDATE_N(R)_RECEIVED
-		V(S):=N(R)
-		RE-SEND_I_CMD(P=1)_OR_SEND_RR
-		START_P_TIMER
-		STOP_REJ_TIMER
-		CLEAR_REMOTE_BUSY
-		DATA_INDICATION
-;		V(R):=V(R)+1
-;		DATA_INDICATION
-;		STOP_P_TIMER
-;		STOP_REJ_TIMER
-;		UPDATE_N(R)_RECEIVED
-;		V(S):=N(R)
-;		RE-SEND_I_CMD(P=1)_OR_SEND_RR
-;		CLEAR_REMOTE_BUSY
-;
-; order of opcodes in AWAIT_REJECT5 changed
-AWAIT_REJECT5	V(R):=V(R)+1
-		SEND_RR_XXX(X=0)
-		STOP_REJ_TIMER
-		UPDATE_N(R)_RECEIVED
-		DATA_INDICATION
-;
-; order of opcodes in AWAIT_REJECT6 changed
-AWAIT_REJECT6	V(R):=V(R)+1
-		SEND_RR_RSP(F=1)
-		STOP_REJ_TIMER
-		UPDATE_N(R)_RECEIVED
-		DATA_INDICATION
-AWAIT_REJECT7	UPDATE_N(R)_RECEIVED
-		V(S):=N(R)
-		STOP_P_TIMER
-		RE-SEND_I_XXX(X=0)
-		CLEAR_REMOTE_BUSY
-;		UPDATE_N(R)_RECEIVED
-;		V(S):=N(R)
-;		RE-SEND_I_CMD(P=1)
-;		START_P_TIMER
-;		CLEAR_REMOTE_BUSY
-AWAIT_REJECT8	UPDATE_N(R)_RECEIVED
-		CLEAR_REMOTE_BUSY
-AWAIT_REJECT9	SEND_RR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		CLEAR_REMOTE_BUSY
-AWAIT_REJECT10	UPDATE_N(R)_RECEIVED
-		V(S):=N(R)
-		STOP_P_TIMER
-		SET_REMOTE_BUSY
-AWAIT_REJECT11	UPDATE_N(R)_RECEIVED
-		SET_REMOTE_BUSY
-AWAIT_REJECT12	SEND_RR_RSP(F=1)
-		UPDATE_N(R)_RECEIVED
-		SET_REMOTE_BUSY
-AWAIT_REJECT13	SEND_REJ_CMD(P=1)
-		START_P_TIMER
-		RETRY_COUNT:=RETRY_COUNT+1
-;============================================================================
-
diff -uNr linux/net/802/pseudo/pseudocode.h linux-llc/net/802/pseudo/pseudocode.h
--- linux/net/802/pseudo/pseudocode.h	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/pseudo/pseudocode.h	Thu Jan  1 01:00:00 1970
@@ -1,287 +0,0 @@
-
-/* this file generated on Thu Oct 24 11:42:35 GMT 1996  */
-
-static char pseudo_code [ ] = { 
-	   0,	  37,	  57,	  42,	  59,	  39,	   0,	  65,	  38,
-	  63,	  61,	  59,	  56,	  58,	   2,	   0,	  12,	   0,
-	  12,	   0,	   0,	   0,	  12,	   0,	  65,	   0,	   5,
-	   0,	   0,	   0,	  37,	  57,	  42,	  59,	   0,	  38,
-	  63,	  61,	  59,	  56,	  58,	   7,	   0,	  11,	  57,
-	  42,	  59,	   0,	  12,	   0,	   5,	   0,	  40,	  65,
-	   0,	  12,	   5,	   0,	   0,	   0,	  38,	  63,	  61,
-	  59,	  56,	  58,	   0,	  12,	   0,	   5,	   0,	  65,
-	   0,	  12,	   5,	   0,	   0,	   0,	  38,	  63,	  61,
-	  59,	  40,	   0,	  45,	  63,	  61,	  59,	  51,	   3,
-	  58,	   0,	  56,	   3,	  58,	   0,	  12,	   5,	  45,
-	   0,	   5,	  45,	   0,	   0,	   0,	  37,	  57,	  42,
-	  60,	   0,	   5,	   0,	  38,	  63,	  61,	  59,	  40,
-	   0,	  45,	  63,	  61,	  59,	  51,	   7,	  58,	   0,
-	  56,	   7,	  58,	   0,	  12,	   5,	  45,	   0,	   5,
-	  45,	   0,	   0,	   0,	  37,	  57,	  42,	  60,	   0,
-	   5,	   0,	  12,	  45,	   0,	  45,	   0,	  38,	   0,
-	  45,	   0,	   0,	   0,	  11,	  57,	  42,	  60,	   0,
-	   0,	   0,	  71,	  45,	  65,	   0,	  38,	   5,	  45,
-	   0,	   5,	  45,	   0,	  70,	  45,	  66,	  39,	   0,
-	  15,	  42,	   0,	   0,	   0,	  14,	  42,	  60,	   0,
-	  39,	  70,	   0,	  11,	  57,	  42,	  49,	  59,	   0,
-	  37,	  57,	  42,	  49,	  59,	  39,	   0,	  71,	  65,
-	  48,	   0,	  38,	   5,	  48,	   0,	  48,	  70,	  66,
-	  39,	   0,	   5,	  48,	   0,	  13,	  67,	  42,	  49,
-	  59,	   0,	   0,	  67,	  42,	  49,	  59,	   0,	   0,
-	  67,	  42,	  49,	  59,	   0,	  13,	  67,	  42,	  49,
-	  59,	   0,	  48,	  70,	  39,	   0,	  16,	  41,	  44,
-	   0,	  19,	  44,	   0,	  26,	  41,	  53,	   0,	  28,
-	  53,	   0,	  25,	  50,	  51,	  43,	   9,	   0,	  25,
-	  50,	  43,	   0,	  24,	  50,	  43,	   0,	  62,	  32,
-	  41,	  50,	   9,	   4,	   0,	  62,	  51,	  36,	  50,
-	   9,	   4,	   0,	  62,	  36,	  50,	   4,	   0,	  62,
-	  34,	  50,	   4,	   0,	  51,	  50,	   1,	   0,	  34,
-	  50,	   1,	   0,	  51,	  50,	  29,	   0,	  33,	  50,
-	  29,	   0,	  64,	  50,	  51,	  20,	   1,	   0,	  64,
-	  50,	  20,	   1,	   0,	  64,	  50,	  22,	   1,	   0,
-	  31,	  41,	   0,	  56,	   0,	  31,	  41,	  60,	   0,
-	  16,	  41,	  44,	   0,	  19,	  44,	   0,	  23,	  43,
-	  41,	   0,	  25,	  43,	   0,	  31,	  41,	  35,	   0,
-	  35,	   0,	  31,	  41,	  35,	   0,	  35,	   0,	  30,
-	  51,	  50,	  55,	   9,	   0,	  30,	  50,	  55,	   0,
-	  27,	  50,	  55,	   0,	  27,	  50,	  10,	  54,	   0,
-	  30,	  51,	  50,	  10,	  54,	   9,	   0,	  30,	  50,
-	  10,	  54,	   0,	  51,	  50,	   1,	   0,	  27,	  50,
-	   1,	   0,	  51,	  50,	  29,	   0,	  27,	  50,	  29,
-	   0,	  64,	  50,	  51,	  20,	   1,	   0,	  64,	  50,
-	  20,	   1,	   0,	  64,	  50,	  27,	  20,	   1,	   0,
-	  26,	  41,	   0,	  56,	   0,	  26,	  41,	  60,	   0,
-	  54,	   0,	  54,	   0,	  16,	  41,	  44,	   0,	  19,
-	  44,	   0,	  26,	  41,	  52,	   0,	  28,	  52,	   0,
-	  50,	  51,	   9,	   0,	  33,	  50,	   0,	  62,	  32,
-	  41,	  50,	   9,	  47,	   4,	   0,	  62,	  36,	  50,
-	  47,	   4,	   0,	  62,	  34,	  50,	  47,	   4,	   0,
-	  51,	  50,	   1,	   0,	  34,	  50,	   1,	   0,	  51,
-	  50,	  29,	   0,	  33,	  50,	  29,	   0,	  64,	  50,
-	  51,	  20,	   1,	   0,	  64,	  50,	  20,	   1,	   0,
-	  64,	  50,	  22,	   1,	   0,	  31,	  41,	   0,	  23,
-	  41,	  43,	  60,	   0,	  56,	   0,	  31,	  41,	  43,
-	  60,	   0,	  28,	  53,	   0,	  25,	  50,	  64,	  46,
-	  20,	  43,	   1,	   0,	  25,	  50,	  43,	   0,	  24,
-	  50,	  43,	   0,	  62,	  50,	  64,	  18,	  41,	   1,
-	   4,	   0,	  62,	  35,	  50,	   4,	   0,	  62,	  33,
-	  50,	   4,	   0,	  50,	  64,	  46,	  20,	   1,	   0,
-	  50,	   1,	   0,	  33,	  50,	   1,	   0,	  50,	  64,
-	  46,	  29,	   0,	  50,	  29,	   0,	  33,	  50,	  29,
-	   0,	  31,	  41,	  60,	   0,	  25,	  43,	   0,	  35,
-	   0,	  35,	   0,	  30,	  50,	  64,	  46,	  54,	   1,
-	  20,	   0,	  30,	  50,	  54,	   0,	  27,	  50,	  54,
-	   0,	  30,	  50,	  64,	  54,	  46,	   1,	  20,	   0,
-	  30,	  50,	  54,	   0,	  27,	  50,	  54,	   0,	  50,
-	  64,	  46,	  20,	   1,	   0,	  50,	   1,	   0,	  27,
-	  50,	   1,	   0,	  50,	  64,	  46,	  29,	   0,	  50,
-	  29,	   0,	  27,	  50,	  29,	   0,	  26,	  41,	  60,
-	   0,	  28,	  52,	   0,	  50,	   0,	  33,	  50,	   0,
-	  62,	  50,	  64,	  18,	  41,	  47,	   1,	   4,	   0,
-	  62,	  35,	  47,	  50,	   4,	   0,	  62,	  33,	  47,
-	  50,	   4,	   0,	  50,	  64,	  46,	  20,	   1,	   0,
-	  50,	   1,	   0,	  33,	  50,	   1,	   0,	  50,	  64,
-	  46,	  29,	   0,	  50,	  29,	   0,	  33,	  50,	  29,
-	   0,	  23,	  41,	  60,	  0
-};
-
-static short int pseudo_code_idx [ ] ={
-	   0,	   1,	   7,	  16,	  18,	  20,	  22,	  24,	  26,
-	  28,	  30,	  35,	  43,	  48,	  50,	  52,	  55,	  58,
-	  60,	  67,	  69,	  71,	  73,	  76,	  78,	  84,	  92,
-	  96,	 100,	 103,	 105,	 110,	 112,	 118,	 126,	 130,
-	 134,	 137,	 139,	 144,	 146,	 149,	 151,	 153,	 155,
-	 157,	 162,	 164,	 168,	 172,	 175,	 180,	 183,	 185,
-	 189,	 192,	 198,	 205,	 209,	 213,	 218,	 221,	 227,
-	 233,	 239,	 245,	 249,	 253,	 256,	 260,	 263,	 269,
-	 273,	 277,	 284,	 291,	 296,	 301,	 305,	 309,	 313,
-	 317,	 323,	 328,	 333,	 336,	 338,	 342,	 346,	 349,
-	 353,	 356,	 360,	 362,	 366,	 368,	 374,	 378,	 382,
-	 387,	 394,	 399,	 403,	 407,	 411,	 415,	 421,	 426,
-	 432,	 435,	 437,	 441,	 443,	 445,	 449,	 452,	 456,
-	 459,	 463,	 466,	 474,	 480,	 486,	 490,	 494,	 498,
-	 502,	 508,	 513,	 518,	 521,	 526,	 528,	 533,	 536,
-	 544,	 548,	 552,	 560,	 565,	 570,	 576,	 579,	 583,
-	 588,	 591,	 595,	 599,	 602,	 604,	 606,	 614,	 618,
-	 622,	 630,	 634,	 638,	 644,	 647,	 651,	 656,	 659,
-	 663,	 667,	 670,	 672,	 675,	 684,	 690,	 696,	 702,
-	 705,	 709,	 714,	 717,	 721,	  0
-};
-
-#define NOP        	   0 
-#define ADM1       	   1 
-#define ADM2       	   2 
-#define ADM3       	   3 
-#define ADM4       	   4 
-#define ADM5       	   5 
-#define CONN2      	   6 
-#define CONN3      	   7 
-#define CONN4      	   8 
-#define CONN5      	   9 
-#define RESWAIT1   	  10 
-#define RESWAIT2   	  11 
-#define RESWAIT3   	  12 
-#define RESWAIT4   	  13 
-#define RESWAIT5   	  14 
-#define RESWAIT6   	  15 
-#define RESWAIT7   	  16 
-#define RESWAIT8   	  17 
-#define RESCHK1    	  18 
-#define RESCHK2    	  19 
-#define RESCHK3    	  20 
-#define RESCHK4    	  21 
-#define RESCHK5    	  22 
-#define RESCHK6    	  23 
-#define SETUP1     	  24 
-#define SETUP2     	  25 
-#define SETUP3     	  26 
-#define SETUP4     	  27 
-#define SETUP5     	  28 
-#define SETUP6     	  29 
-#define SETUP7     	  30 
-#define SETUP8     	  31 
-#define RESET1     	  32 
-#define RESET2     	  33 
-#define RESET3     	  34 
-#define RESET4     	  35 
-#define RESET5     	  36 
-#define RESET6     	  37 
-#define RESET7     	  38 
-#define RESET8     	  39 
-#define D_CONN1    	  40 
-#define D_CONN2    	  41 
-#define D_CONN3    	  42 
-#define D_CONN4    	  43 
-#define D_CONN5    	  44 
-#define D_CONN6    	  45 
-#define D_CONN7    	  46 
-#define ERR1       	  47 
-#define ERR2       	  48 
-#define ERR3       	  49 
-#define ERR4       	  50 
-#define ERR5       	  51 
-#define ERR6       	  52 
-#define ERR7       	  53 
-#define ERR8       	  54 
-#define SH1        	  55 
-#define SH2        	  56 
-#define SH3        	  57 
-#define SH4        	  58 
-#define SH5        	  59 
-#define SH6        	  60 
-#define SH7        	  61 
-#define SH8        	  62 
-#define SH9        	  63 
-#define SH10       	  64 
-#define SH11       	  65 
-#define NORMAL1    	  66 
-#define NORMAL2    	  67 
-#define NORMAL3    	  68 
-#define NORMAL4    	  69 
-#define NORMAL5    	  70 
-#define NORMAL6    	  71 
-#define NORMAL7    	  72 
-#define NORMAL8A   	  73 
-#define NORMAL8B   	  74 
-#define NORMAL9    	  75 
-#define NORMAL10   	  76 
-#define NORMAL11   	  77 
-#define NORMAL12   	  78 
-#define NORMAL13   	  79 
-#define NORMAL14   	  80 
-#define NORMAL15   	  81 
-#define NORMAL16   	  82 
-#define NORMAL17   	  83 
-#define NORMAL18   	  84 
-#define NORMAL19   	  85 
-#define NORMAL20   	  86 
-#define BUSY1      	  87 
-#define BUSY2      	  88 
-#define BUSY3      	  89 
-#define BUSY4      	  90 
-#define BUSY5      	  91 
-#define BUSY6      	  92 
-#define BUSY7      	  93 
-#define BUSY8      	  94 
-#define BUSY9      	  95 
-#define BUSY10     	  96 
-#define BUSY11     	  97 
-#define BUSY12     	  98 
-#define BUSY13     	  99 
-#define BUSY14     	 100 
-#define BUSY15     	 101 
-#define BUSY16     	 102 
-#define BUSY17     	 103 
-#define BUSY18     	 104 
-#define BUSY19     	 105 
-#define BUSY20     	 106 
-#define BUSY21     	 107 
-#define BUSY22     	 108 
-#define BUSY23     	 109 
-#define BUSY24     	 110 
-#define BUSY25     	 111 
-#define BUSY26     	 112 
-#define REJECT1    	 113 
-#define REJECT2    	 114 
-#define REJECT3    	 115 
-#define REJECT4    	 116 
-#define REJECT5    	 117 
-#define REJECT6    	 118 
-#define REJECT7    	 119 
-#define REJECT8    	 120 
-#define REJECT9    	 121 
-#define REJECT10   	 122 
-#define REJECT11   	 123 
-#define REJECT12   	 124 
-#define REJECT13   	 125 
-#define REJECT14   	 126 
-#define REJECT15   	 127 
-#define REJECT16   	 128 
-#define REJECT17   	 129 
-#define REJECT18   	 130 
-#define REJECT19   	 131 
-#define REJECT20   	 132 
-#define AWAIT1     	 133 
-#define AWAIT2     	 134 
-#define AWAIT3     	 135 
-#define AWAIT4     	 136 
-#define AWAIT5     	 137 
-#define AWAIT6     	 138 
-#define AWAIT7     	 139 
-#define AWAIT8     	 140 
-#define AWAIT9     	 141 
-#define AWAIT10    	 142 
-#define AWAIT11    	 143 
-#define AWAIT12    	 144 
-#define AWAIT13    	 145 
-#define AWAIT14    	 146 
-#define AWAIT_BUSY1 	 147 
-#define AWAIT_BUSY2 	 148 
-#define AWAIT_BUSY3 	 149 
-#define AWAIT_BUSY4 	 150 
-#define AWAIT_BUSY5 	 151 
-#define AWAIT_BUSY6 	 152 
-#define AWAIT_BUSY7 	 153 
-#define AWAIT_BUSY8 	 154 
-#define AWAIT_BUSY9 	 155 
-#define AWAIT_BUSY10 	 156 
-#define AWAIT_BUSY11 	 157 
-#define AWAIT_BUSY12 	 158 
-#define AWAIT_BUSY13 	 159 
-#define AWAIT_BUSY14 	 160 
-#define AWAIT_BUSY15 	 161 
-#define AWAIT_BUSY16 	 162 
-#define AWAIT_REJECT1 	 163 
-#define AWAIT_REJECT2 	 164 
-#define AWAIT_REJECT3 	 165 
-#define AWAIT_REJECT4 	 166 
-#define AWAIT_REJECT5 	 167 
-#define AWAIT_REJECT6 	 168 
-#define AWAIT_REJECT7 	 169 
-#define AWAIT_REJECT8 	 170 
-#define AWAIT_REJECT9 	 171 
-#define AWAIT_REJECT10 	 172 
-#define AWAIT_REJECT11 	 173 
-#define AWAIT_REJECT12 	 174 
-#define AWAIT_REJECT13 	 175 
-
diff -uNr linux/net/802/psnap.c linux-llc/net/802/psnap.c
--- linux/net/802/psnap.c	Fri Jul 10 21:51:41 1998
+++ linux-llc/net/802/psnap.c	Thu Jan  1 01:00:00 1970
@@ -1,152 +0,0 @@
-/*
- *	SNAP data link layer. Derived from 802.2
- *
- *		Alan Cox <Alan.Cox@linux.org>, from the 802.2 layer by Greg Page.
- *		Merged in additions from Greg Page's psnap.c.
- *
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- */
-
-#include <linux/module.h>
-#include <linux/netdevice.h>
-#include <linux/skbuff.h>
-#include <net/datalink.h>
-#include <net/p8022.h>
-#include <net/psnap.h>
-#include <linux/mm.h>
-#include <linux/in.h>
-#include <linux/init.h>
-
-static struct datalink_proto *snap_list = NULL;
-static struct datalink_proto *snap_dl = NULL;		/* 802.2 DL for SNAP */
-
-/*
- *	Find a snap client by matching the 5 bytes.
- */
-
-static struct datalink_proto *find_snap_client(unsigned char *desc)
-{
-	struct datalink_proto	*proto;
-
-	for (proto = snap_list; proto != NULL && memcmp(proto->type, desc, 5) ; proto = proto->next);
-	return proto;
-}
-
-/*
- *	A SNAP packet has arrived
- */
-
-int snap_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
-{
-	static struct packet_type psnap_packet_type =
-	{
-		0,
-		NULL,		/* All Devices */
-		snap_rcv,
-		NULL,
-		NULL,
-	};
-
-	struct datalink_proto	*proto;
-
-	proto = find_snap_client(skb->h.raw);
-	if (proto != NULL)
-	{
-		/*
-		 *	Pass the frame on.
-		 */
-
-		skb->h.raw += 5;
-		skb->nh.raw += 5;
-		skb_pull(skb,5);
-		if (psnap_packet_type.type == 0)
-			psnap_packet_type.type=htons(ETH_P_SNAP);
-
-		return proto->rcvfunc(skb, dev, &psnap_packet_type);
-	}
-	skb->sk = NULL;
-	kfree_skb(skb);
-	return 0;
-}
-
-/*
- *	Put a SNAP header on a frame and pass to 802.2
- */
-
-static void snap_datalink_header(struct datalink_proto *dl, struct sk_buff *skb, unsigned char *dest_node)
-{
-	memcpy(skb_push(skb,5),dl->type,5);
-	snap_dl->datalink_header(snap_dl, skb, dest_node);
-}
-
-/*
- *	Set up the SNAP layer
- */
-
-EXPORT_SYMBOL(register_snap_client);
-EXPORT_SYMBOL(unregister_snap_client);
-
-__initfunc(void snap_proto_init(struct net_proto *pro))
-{
-	snap_dl=register_8022_client(0xAA, snap_rcv);
-	if(snap_dl==NULL)
-		printk("SNAP - unable to register with 802.2\n");
-}
-
-/*
- *	Register SNAP clients. We don't yet use this for IP.
- */
-
-struct datalink_proto *register_snap_client(unsigned char *desc, int (*rcvfunc)(struct sk_buff *, struct device *, struct packet_type *))
-{
-	struct datalink_proto	*proto;
-
-	if (find_snap_client(desc) != NULL)
-		return NULL;
-
-	proto = (struct datalink_proto *) kmalloc(sizeof(*proto), GFP_ATOMIC);
-	if (proto != NULL)
-	{
-		memcpy(proto->type, desc,5);
-		proto->type_len = 5;
-		proto->rcvfunc = rcvfunc;
-		proto->header_length = 5+snap_dl->header_length;
-		proto->datalink_header = snap_datalink_header;
-		proto->string_name = "SNAP";
-		proto->next = snap_list;
-		snap_list = proto;
-	}
-
-	return proto;
-}
-
-/*
- *	Unregister SNAP clients. Protocols no longer want to play with us ...
- */
-
-void unregister_snap_client(unsigned char *desc)
-{
-	struct datalink_proto **clients = &snap_list;
-	struct datalink_proto *tmp;
-	unsigned long flags;
-
-	save_flags(flags);
-	cli();
-
-	while ((tmp = *clients) != NULL)
-	{
-		if (memcmp(tmp->type,desc,5) == 0)
-		{
-			*clients = tmp->next;
-			kfree_s(tmp, sizeof(struct datalink_proto));
-			break;
-		}
-		else
-			clients = &tmp->next;
-	}
-
-	restore_flags(flags);
-}
diff -uNr linux/net/802/sysctl_net_802.c linux-llc/net/802/sysctl_net_802.c
--- linux/net/802/sysctl_net_802.c	Thu Mar 12 18:32:03 1998
+++ linux-llc/net/802/sysctl_net_802.c	Thu Jan  1 01:00:00 1970
@@ -1,28 +0,0 @@
-/* -*- linux-c -*-
- *		sysctl_net_802.c: sysctl interface to net 802 subsystem.
- *
- *		Begun April 1, 1996, Mike Shaver.
- *		Added /proc/sys/net/802 directory entry (empty =) ). [MS]
- *
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- */
-
-#include <linux/mm.h>
-#include <linux/sysctl.h>
-#include <linux/config.h>
-
-ctl_table e802_table[] = {
-	{0}
-};
-
-#ifdef CONFIG_TR
-extern int sysctl_tr_rif_timeout;
-ctl_table tr_table[] = {
-	{NET_TR_RIF_TIMEOUT, "rif_timeout", &sysctl_tr_rif_timeout, sizeof(int),
-	 0644, NULL, &proc_dointvec},
-	{0}
-};
-#endif
diff -uNr linux/net/802/tr.c linux-llc/net/802/tr.c
--- linux/net/802/tr.c	Wed Oct 27 01:53:42 1999
+++ linux-llc/net/802/tr.c	Thu Jan  1 01:00:00 1970
@@ -1,559 +0,0 @@
-/*
- * NET3:	Token ring device handling subroutines
- * 
- *		This program is free software; you can redistribute it and/or
- *		modify it under the terms of the GNU General Public License
- *		as published by the Free Software Foundation; either version
- *		2 of the License, or (at your option) any later version.
- *
- * Fixes:       3 Feb 97 Paul Norton <pnorton@cts.com> Minor routing fixes.
- *              Added rif table to /proc/net/tr_rif and rif timeout to
- *              /proc/sys/net/token-ring/rif_timeout.
- *              22 Jun 98 Paul Norton <p.norton@computer.org> Rearranged
- *              tr_header and tr_type_trans to handle passing IPX SNAP and
- *              802.2 through the correct layers. Eliminated tr_reformat.
- *        
- */
-
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <linux/config.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/socket.h>
-#include <linux/in.h>
-#include <linux/inet.h>
-#include <linux/netdevice.h>
-#include <linux/trdevice.h>
-#include <linux/skbuff.h>
-#include <linux/errno.h>
-#include <linux/timer.h>
-#include <linux/net.h>
-#include <linux/proc_fs.h>
-#include <linux/init.h>
-#include <net/arp.h>
-
-static void tr_source_route(struct sk_buff *skb, struct trh_hdr *trh, struct device *dev);
-static void tr_add_rif_info(struct trh_hdr *trh, struct device *dev);
-static void rif_check_expire(unsigned long dummy);
-
-#define TR_SR_DEBUG 0
-
-typedef struct rif_cache_s *rif_cache;
-
-/*
- *	Each RIF entry we learn is kept this way
- */
- 
-struct rif_cache_s {	
-	unsigned char addr[TR_ALEN];
-	unsigned char iface[5];
-	__u16 rcf;
-	__u16 rseg[8];
-	rif_cache next;
-	unsigned long last_used;
-	unsigned char local_ring;
-};
-
-#define RIF_TABLE_SIZE 32
-
-/*
- *	We hash the RIF cache 32 ways. We do after all have to look it
- *	up a lot.
- */
- 
-rif_cache rif_table[RIF_TABLE_SIZE]={ NULL, };
-
-static spinlock_t rif_lock = SPIN_LOCK_UNLOCKED;
-
-#define RIF_TIMEOUT 60*10*HZ
-#define RIF_CHECK_INTERVAL 60*HZ
-
-/*
- *	Garbage disposal timer.
- */
- 
-static struct timer_list rif_timer;
-
-int sysctl_tr_rif_timeout = RIF_TIMEOUT;
-
-/*
- *	Put the headers on a token ring packet. Token ring source routing
- *	makes this a little more exciting than on ethernet.
- */
- 
-int tr_header(struct sk_buff *skb, struct device *dev, unsigned short type,
-              void *daddr, void *saddr, unsigned len) 
-{
-	struct trh_hdr *trh;
-	int hdr_len;
-
-	/* 
-	 * Add the 802.2 SNAP header if IP as the IPv4 code calls  
-	 * dev->hard_header directly.
-	 */
-	if (type == ETH_P_IP || type == ETH_P_ARP)
-	{
-		struct trllc *trllc=(struct trllc *)(trh+1);
-
-		hdr_len = sizeof(struct trh_hdr) + sizeof(struct trllc);
-		trh = (struct trh_hdr *)skb_push(skb, hdr_len);
-		trllc = (struct trllc *)(trh+1);
-		trllc->dsap = trllc->ssap = EXTENDED_SAP;
-		trllc->llc = UI_CMD;
-		trllc->protid[0] = trllc->protid[1] = trllc->protid[2] = 0x00;
-		trllc->ethertype = htons(type);
-	}
-	else
-	{
-		hdr_len = sizeof(struct trh_hdr);
-		trh = (struct trh_hdr *)skb_push(skb, hdr_len);	
-	}
-
-	trh->ac=AC;
-	trh->fc=LLC_FRAME;
-
-	if(saddr)
-		memcpy(trh->saddr,saddr,dev->addr_len);
-	else
-		memcpy(trh->saddr,dev->dev_addr,dev->addr_len);
-
-	/*
-	 *	Build the destination and then source route the frame
-	 */
-	 
-	if(daddr) 
-	{
-		memcpy(trh->daddr,daddr,dev->addr_len);
-		tr_source_route(skb,trh,dev);
-		return(hdr_len);
-	}
-
-	return -hdr_len;
-}
-	
-/*
- *	A neighbour discovery of some species (eg arp) has completed. We
- *	can now send the packet.
- */
- 
-int tr_rebuild_header(struct sk_buff *skb) 
-{
-	struct trh_hdr *trh=(struct trh_hdr *)skb->data;
-	struct trllc *trllc=(struct trllc *)(skb->data+sizeof(struct trh_hdr));
-	struct device *dev = skb->dev;
-
-	/*
-	 *	FIXME: We don't yet support IPv6 over token rings
-	 */
-	 
-	if(trllc->ethertype != htons(ETH_P_IP)) {
-		printk("tr_rebuild_header: Don't know how to resolve type %04X addresses ?\n",(unsigned int)htons(trllc->ethertype));
-		return 0;
-	}
-
-#ifdef CONFIG_INET
-	if(arp_find(trh->daddr, skb)) {
-			return 1;
-	}
-	else 
-#endif	
-	{	
-		tr_source_route(skb,trh,dev); 
-		return 0;
-	}
-}
-	
-/*
- *	Some of this is a bit hackish. We intercept RIF information
- *	used for source routing. We also grab IP directly and don't feed
- *	it via SNAP.
- */
- 
-unsigned short tr_type_trans(struct sk_buff *skb, struct device *dev) 
-{
-
-	struct trh_hdr *trh=(struct trh_hdr *)skb->data;
-	struct trllc *trllc;
-	unsigned riflen=0;
-	
-	skb->mac.raw = skb->data;
-	
-       	if(trh->saddr[0] & TR_RII)
-		riflen = (ntohs(trh->rcf) & TR_RCF_LEN_MASK) >> 8;
-
-	trllc = (struct trllc *)(skb->data+sizeof(struct trh_hdr)-TR_MAXRIFLEN+riflen);
-
-	skb_pull(skb,sizeof(struct trh_hdr)-TR_MAXRIFLEN+riflen);
-
-	if(*trh->daddr & 0x80) 
-	{
-		if(!memcmp(trh->daddr,dev->broadcast,TR_ALEN)) 	
-			skb->pkt_type=PACKET_BROADCAST;
-		else
-			skb->pkt_type=PACKET_MULTICAST;
-	}
-	else if ( (trh->daddr[0] & 0x01) && (trh->daddr[1] & 0x00) && (trh->daddr[2] & 0x5E))
-	{
-		skb->pkt_type=PACKET_MULTICAST;
-	}
-	else if(dev->flags & IFF_PROMISC) 
-	{
-		if(memcmp(trh->daddr, dev->dev_addr, TR_ALEN))
-			skb->pkt_type=PACKET_OTHERHOST;
-	}
-
-	if ((skb->pkt_type != PACKET_BROADCAST) &&
-	    (skb->pkt_type != PACKET_MULTICAST))
-		tr_add_rif_info(trh,dev) ; 
-
-	/*
-	 * Strip the SNAP header from ARP packets since we don't 
-	 * pass them through to the 802.2/SNAP layers.
-	 */
-
-	if (trllc->dsap == EXTENDED_SAP &&
-	    (trllc->ethertype == ntohs(ETH_P_IP) ||
-	     trllc->ethertype == ntohs(ETH_P_ARP)))
-	{
-		skb_pull(skb, sizeof(struct trllc));
-		return trllc->ethertype;
-	}
-
-	return ntohs(ETH_P_802_2);
-}
-
-/*
- *	We try to do source routing... 
- */
-
-static void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh,struct device *dev) 
-{
-	int i, slack;
-	unsigned int hash;
-	rif_cache entry;
-	unsigned char *olddata;
-	unsigned char mcast_func_addr[] = {0xC0,0x00,0x00,0x04,0x00,0x00} ; 
-
-	unsigned long flags;
-	
-	spin_lock_irqsave(&rif_lock, flags);
-
-	/*
-	 *	Broadcasts are single route as stated in RFC 1042 
-  	 */
-
-	if ( (!memcmp(&(trh->daddr[0]),&(dev->broadcast[0]),TR_ALEN))  ||
-	     (!memcmp(&(trh->daddr[0]),&(mcast_func_addr[0]), TR_ALEN)) )
-	{
-		trh->rcf=htons((((sizeof(trh->rcf)) << 8) & TR_RCF_LEN_MASK)  
-			       | TR_RCF_FRAME2K | TR_RCF_LIMITED_BROADCAST);
-		trh->saddr[0]|=TR_RII;
-	}
-	else 
-	{
-		for(i=0,hash=0;i<TR_ALEN;hash+=trh->daddr[i++]);
-		hash&=RIF_TABLE_SIZE-1;
-		/*
-		 *	Walk the hash table and look for an entry
-		 */
-		for(entry=rif_table[hash];entry && memcmp(&(entry->addr[0]),&(trh->daddr[0]),TR_ALEN);entry=entry->next);
-
-		/*
-		 *	If we found an entry we can route the frame.
-		 */
-		if(entry) 
-		{
-#if TR_SR_DEBUG
-printk("source routing for %02X %02X %02X %02X %02X %02X\n",trh->daddr[0],
-		  trh->daddr[1],trh->daddr[2],trh->daddr[3],trh->daddr[4],trh->daddr[5]);
-#endif
-			if(!entry->local_ring && (ntohs(entry->rcf) & TR_RCF_LEN_MASK) >> 8)
-			{
-				trh->rcf=entry->rcf;
-				memcpy(&trh->rseg[0],&entry->rseg[0],8*sizeof(unsigned short));
-				trh->rcf^=htons(TR_RCF_DIR_BIT);	
-				trh->rcf&=htons(0x1fff);	/* Issam Chehab <ichehab@madge1.demon.co.uk> */
-
-				trh->saddr[0]|=TR_RII;
-#if TR_SR_DEBUG
-				printk("entry found with rcf %04x\n", entry->rcf);
-			}
-			else
-			{
-				printk("entry found but without rcf length, local=%02x\n", entry->local_ring);
-#endif
-			}
-			entry->last_used=jiffies;
-		}
-		else 
-		{
-			/*
-			 *	Without the information we simply have to shout
-			 *	on the wire. The replies should rapidly clean this
-			 *	situation up.
-			 */
-			trh->rcf=htons((((sizeof(trh->rcf)) << 8) & TR_RCF_LEN_MASK)  
-				       | TR_RCF_FRAME2K | TR_RCF_LIMITED_BROADCAST);
-			trh->saddr[0]|=TR_RII;
-#if TR_SR_DEBUG
-			printk("no entry in rif table found - broadcasting frame\n");
-#endif
-		}
-	}
-
-	/* Compress the RIF here so we don't have to do it in the driver(s) */
-	if (!(trh->saddr[0] & 0x80))
-		slack = 18;
-	else 
-		slack = 18 - ((ntohs(trh->rcf) & TR_RCF_LEN_MASK)>>8);
-	olddata = skb->data;
-	spin_unlock_irqrestore(&rif_lock, flags);
-
-	skb_pull(skb, slack);
-	memmove(skb->data, olddata, sizeof(struct trh_hdr) - slack);
-}
-
-/*
- *	We have learned some new RIF information for our source
- *	routing.
- */
- 
-static void tr_add_rif_info(struct trh_hdr *trh, struct device *dev)
-{
-	int i;
-	unsigned int hash, rii_p = 0;
-	rif_cache entry;
-	unsigned long flags;
-
-
-	spin_lock_irqsave(&rif_lock, flags);
-	
-	/*
-	 *	Firstly see if the entry exists
-	 */
-
-       	if(trh->saddr[0] & TR_RII)
-	{
-		trh->saddr[0]&=0x7f;
-		if (((ntohs(trh->rcf) & TR_RCF_LEN_MASK) >> 8) > 2)
-		{
-			rii_p = 1;
-	        }
-	}
-
-	for(i=0,hash=0;i<TR_ALEN;hash+=trh->saddr[i++]);
-	hash&=RIF_TABLE_SIZE-1;
-	for(entry=rif_table[hash];entry && memcmp(&(entry->addr[0]),&(trh->saddr[0]),TR_ALEN);entry=entry->next);
-
-	if(entry==NULL) 
-	{
-#if TR_SR_DEBUG
-printk("adding rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
-		trh->saddr[0],trh->saddr[1],trh->saddr[2],
-       		trh->saddr[3],trh->saddr[4],trh->saddr[5],
-		ntohs(trh->rcf));
-#endif
-		/*
-		 *	Allocate our new entry. A failure to allocate loses
-		 *	use the information. This is harmless.
-		 *
-		 *	FIXME: We ought to keep some kind of cache size
-		 *	limiting and adjust the timers to suit.
-		 */
-		entry=kmalloc(sizeof(struct rif_cache_s),GFP_ATOMIC);
-
-		if(!entry) 
-		{
-			printk(KERN_DEBUG "tr.c: Couldn't malloc rif cache entry !\n");
-			spin_unlock_irqrestore(&rif_lock, flags);
-			return;
-		}
-
-		memcpy(&(entry->addr[0]),&(trh->saddr[0]),TR_ALEN);
-		memcpy(&(entry->iface[0]),dev->name,5);
-		entry->next=rif_table[hash];
-		entry->last_used=jiffies;
-		rif_table[hash]=entry;
-
-		if (rii_p)
-		{
-			entry->rcf = trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK);
-			memcpy(&(entry->rseg[0]),&(trh->rseg[0]),8*sizeof(unsigned short));
-			entry->local_ring = 0;
-			trh->saddr[0]|=TR_RII; /* put the routing indicator back for tcpdump */
-		}
-		else
-		{
-			entry->local_ring = 1;
-		}
-	} 	
-	else	/* Y. Tahara added */
-	{ 
-		/*
-		 *	Update existing entries
-		 */
-		if (!entry->local_ring) 
-		    if (entry->rcf != (trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK)) &&
-			 !(trh->rcf & htons(TR_RCF_BROADCAST_MASK)))
-		    {
-#if TR_SR_DEBUG
-printk("updating rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
-		trh->saddr[0],trh->saddr[1],trh->saddr[2],
-		trh->saddr[3],trh->saddr[4],trh->saddr[5],
-		ntohs(trh->rcf));
-#endif
-			    entry->rcf = trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK);
-        		    memcpy(&(entry->rseg[0]),&(trh->rseg[0]),8*sizeof(unsigned short));
-		    }                                         
-           	entry->last_used=jiffies;               
-	}
-	spin_unlock_irqrestore(&rif_lock, flags);
-}
-
-/*
- *	Scan the cache with a timer and see what we need to throw out.
- */
-
-static void rif_check_expire(unsigned long dummy) 
-{
-	int i;
-	unsigned long now=jiffies,flags;
-
-	spin_lock_irqsave(&rif_lock, flags);
-	
-	for(i=0; i < RIF_TABLE_SIZE;i++) 
-	{
-		rif_cache entry, *pentry=rif_table+i;	
-		while((entry=*pentry)) 
-		{
-			/*
-			 *	Out it goes
-			 */
-			if((now-entry->last_used) > sysctl_tr_rif_timeout) 
-			{
-				*pentry=entry->next;
-				kfree_s(entry,sizeof(struct rif_cache_s));
-			}
-			else
-				pentry=&entry->next;
-		}
-	}
-	
-	spin_unlock_irqrestore(&rif_lock, flags);
-
-	/*
-	 *	Reset the timer
-	 */
-	 
-	del_timer(&rif_timer);
-	rif_timer.expires = jiffies + sysctl_tr_rif_timeout;
-	add_timer(&rif_timer);
-
-}
-
-/*
- *	Generate the /proc/net information for the token ring RIF
- *	routing.
- */
- 
-#ifdef CONFIG_PROC_FS
-int rif_get_info(char *buffer,char **start, off_t offset, int length, int dummy) 
-{
-	int len=0;
-	off_t begin=0;
-	off_t pos=0;
-	int size,i,j,rcf_len,segment,brdgnmb;
-	unsigned long now=jiffies;
-
-	rif_cache entry;
-
-	size=sprintf(buffer,
-		     "if     TR address       TTL   rcf   routing segments\n");
-	pos+=size;
-	len+=size;
-
-	for(i=0;i < RIF_TABLE_SIZE;i++) 
-	{
-		for(entry=rif_table[i];entry;entry=entry->next) {
-			size=sprintf(buffer+len,"%s %02X:%02X:%02X:%02X:%02X:%02X %7li ",
-				     entry->iface,entry->addr[0],entry->addr[1],entry->addr[2],entry->addr[3],entry->addr[4],entry->addr[5],
-				     sysctl_tr_rif_timeout-(now-entry->last_used));
-			len+=size;
-			pos=begin+len;
-			if (entry->local_ring)
-			        size=sprintf(buffer+len,"local\n");
-			else {
-			        size=sprintf(buffer+len,"%04X", ntohs(entry->rcf));
-				rcf_len = ((ntohs(entry->rcf) & TR_RCF_LEN_MASK)>>8)-2; 
-				if (rcf_len)
-				        rcf_len >>= 1;
-				for(j = 1; j < rcf_len; j++) {
-					if(j==1) {
-						segment=ntohs(entry->rseg[j-1])>>4;
-						len+=size;
-						pos=begin+len;
-						size=sprintf(buffer+len,"  %03X",segment);
-					};
-					segment=ntohs(entry->rseg[j])>>4;
-					brdgnmb=ntohs(entry->rseg[j-1])&0x00f;
-					len+=size;
-					pos=begin+len;
-					size=sprintf(buffer+len,"-%01X-%03X",brdgnmb,segment);
-				}
-				len+=size;
-				pos=begin+len;
-			        size=sprintf(buffer+len,"\n");
-			}
-			len+=size;
-			pos=begin+len;
-
-			if(pos<offset) 
-			{
-				len=0;
-				begin=pos;
-			}
-			if(pos>offset+length)
-				break;
-	   	}
-		if(pos>offset+length)
-			break;
-	}
-
-	*start=buffer+(offset-begin); /* Start of wanted data */
-	len-=(offset-begin);    /* Start slop */
-	if(len>length)
-		len=length;    /* Ending slop */
-	return len;
-}
-#endif
-
-/*
- *	Called during bootup.  We don't actually have to initialise
- *	too much for this.
- */
-
-#ifdef CONFIG_PROC_FS
-static struct proc_dir_entry tr_rif_proc = {
-	PROC_NET_TR_RIF, 6, "tr_rif",
-	S_IFREG | S_IRUGO, 1, 0, 0,
-	0, &proc_net_inode_operations,
-	rif_get_info
-};
-#endif
-
-__initfunc(void rif_init(struct net_proto *unused))
-{
-	rif_timer.expires  = RIF_TIMEOUT;
-	rif_timer.data     = 0L;
-	rif_timer.function = rif_check_expire;
-	init_timer(&rif_timer);
-	add_timer(&rif_timer);
-
-#ifdef CONFIG_PROC_FS
-	proc_net_register(&tr_rif_proc);
-#endif
-}
diff -uNr linux/net/802/transit/Makefile linux-llc/net/802/transit/Makefile
--- linux/net/802/transit/Makefile	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/transit/Makefile	Thu Jan  1 01:00:00 1970
@@ -1,13 +0,0 @@
-all:	pdutr.h timertr.h
-
-pdutr.h: pdutr.pre compile.awk			
-	awk -f ./compile.awk pdutr.pre > pdutr.h
-
-timertr.h: timertr.pre compile.awk
-	awk -f ./compile.awk timertr.pre > timertr.h
-
-clean:
-	touch pdutr.h timertr.h
-	rm pdutr.h timertr.h
-
-
diff -uNr linux/net/802/transit/compile.awk linux-llc/net/802/transit/compile.awk
--- linux/net/802/transit/compile.awk	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/transit/compile.awk	Thu Jan  1 01:00:00 1970
@@ -1,81 +0,0 @@
-# to run: awk -f transit.awk transit.p0
-#
-BEGIN { "date" | getline
-	enable_index = 1
-	today = $0
-	printf("\n/* this file was generated on %s  */\n", today )
-	not_firstone = 0	# flag to avoid empty entry in 1st table
-	fpe = 0			# entry tbl array fill pointer
-	fpeo = 0		# entry tbl offset list fill pointer
-	fpdef = 0 		# define list fill pointer
-}
-
-### /^;/ { }			# line starting with a semicolon is comment 
-
-/^[A-Z]/ {			# table name
-	if ( $1 == "TABLE" ) {
-	   tbl = $2		# get table name
-	   newtbl( tbl )
-	}
-	else if ( $1 == "COMPILE" ) {
-	   array_name = $2
-	   if ( $3 == "NOINDEX" ) { enable_index = 0 }
-	}
-	else {			# table entry
-	   ec = ec +1
-	   n = split( $0, fld, " " )
-	   action = fld[ n-1 ]
-	   newstate = fld[ n ]
-	   store( action, newstate )
-	   ecct = ecct +1
-	}
-}
-
-END {	store( action, newstate )
-
-	if ( enable_index ) {
-	    printf( "\n/* index name #defines: */\n\n",
-		 ec, ecct )
-
-	    for( ii = 1; ii <= fpeo; ii++ ){
-	       printf( "#define %-12s %3d\n", define[ ii ], ii -1 )
-	    }
-	}
-
-	printf( "\n\n/* size of transition table is %d bytes */\n",
-		 fpe )
-
-	if ( enable_index ) {
-	    printf( "\nstatic short int %s_offset [ ] ={", array_name )
-	    for( ii = 1; ii <= fpeo; ii++ ){
-	        if ( (ii % 10) == 1 ) printf("\n  ")
-	        printf( " %4d", entry_offset[ ii ] )
-	        if ( ii < fpeo ) printf( "," )
-	    }
-	    printf(" };\n")
-	}
-
-	printf( "\nstatic char %s_entry [ ] = {", array_name )
-	for( ii = 1; ii <= fpe; ii++ ){
-	    if ( (ii % 6) == 1 ) printf("\n  ")
-	    printf( " %-14s", entry[ ii ] )
-	    if ( ii < fpe ) printf( "," )
-	}
-	printf(" };\n")
-
-}
-
-function store(  act, ns ){
-#	printf( "%s %s\n",  act, ns )
-	entry[ ++fpe ] = act
-	entry[ ++fpe ] = ns 
-}
-
-function newtbl( tbl ){
-	   if ( not_firstone ) {
-		store( action, newstate )
-	   }
-	   not_firstone = 1
-	   entry_offset[ ++fpeo ] = fpe		# entry tbl offset list
-	   define[ ++fpdef ] = tbl	# state name to define
-}
diff -uNr linux/net/802/transit/pdutr.h linux-llc/net/802/transit/pdutr.h
--- linux/net/802/transit/pdutr.h	Mon Jan 12 22:46:27 1998
+++ linux-llc/net/802/transit/pdutr.h	Thu Jan  1 01:00:00 1970
@@ -1,309 +0,0 @@
-
-/* this file was generated on Thu Jan  8 00:21:19 GMT 1998  */
-
-/* index name #defines: */
-
-#define ADM            0
-#define CONN           1
-#define RESET_WAIT     2
-#define RESET_CHECK    3
-#define SETUP          4
-#define RESET          5
-#define D_CONN         6
-#define ERROR          7
-#define NORMAL         8
-#define BUSY           9
-#define REJECT        10
-#define AWAIT         11
-#define AWAIT_BUSY    12
-#define AWAIT_REJECT  13
-
-
-/* size of transition table is 1684 bytes */
-
-static short int pdutr_offset [ ] ={
-      0,   54,   82,  110,  138,  192,  246,  300,  328,  554,
-    780, 1006, 1232, 1458 };
-
-static char pdutr_entry [ ] = {
-   ADM5          , ADM           , ADM4          , ADM           , ADM5          , ADM           ,
-   ADM4          , ADM           , ADM5          , ADM           , ADM4          , ADM           ,
-   ADM5          , ADM           , ADM4          , ADM           , ADM3          , ADM           ,
-   ADM3          , ADM           , ADM2          , CONN          , ADM2          , CONN          ,
-   ADM5          , ADM           , ADM5          , ADM           , ADM5          , ADM           ,
-   ADM5          , ADM           , ADM5          , ADM           , ADM5          , ADM           ,
-   ADM5          , ADM           , ADM5          , ADM           , ADM5          , ADM           ,
-   ADM5          , ADM           , ADM5          , ADM           , ADM5          , ADM           ,
-   ADM5          , ADM           , ADM5          , ADM           , ADM5          , ADM           ,
-   CONN5         , CONN          , CONN5         , CONN          , CONN5         , CONN          ,
-   CONN5         , CONN          , CONN5         , CONN          , CONN3         , CONN          ,
-   CONN5         , CONN          , CONN5         , CONN          , CONN5         , CONN          ,
-   CONN5         , CONN          , CONN5         , CONN          , CONN4         , ADM           ,
-   CONN5         , CONN          , CONN5         , CONN          , RESWAIT8      , RESET_WAIT    ,
-   RESWAIT8      , RESET_WAIT    , RESWAIT8      , RESET_WAIT    , RESWAIT8      , RESET_WAIT    ,
-   RESWAIT7      , RESET_WAIT    , RESWAIT6      , RESET_WAIT    , RESWAIT8      , RESET_WAIT    ,
-   RESWAIT8      , RESET_WAIT    , RESWAIT8      , RESET_WAIT    , RESWAIT8      , RESET_WAIT    ,
-   RESWAIT8      , RESET_WAIT    , RESWAIT5      , ADM           , RESWAIT8      , RESET_WAIT    ,
-   RESWAIT8      , RESET_WAIT    , RESCHK6       , RESET_CHECK   , RESCHK6       , RESET_CHECK   ,
-   RESCHK6       , RESET_CHECK   , RESCHK6       , RESET_CHECK   , RESCHK5       , ADM           ,
-   RESCHK4       , RESET_CHECK   , RESCHK6       , RESET_CHECK   , RESCHK6       , RESET_CHECK   ,
-   RESCHK6       , RESET_CHECK   , RESCHK6       , RESET_CHECK   , RESCHK6       , RESET_CHECK   ,
-   RESCHK3       , ADM           , RESCHK6       , RESET_CHECK   , RESCHK6       , RESET_CHECK   ,
-   SETUP6        , SETUP         , SETUP6        , SETUP         , SETUP6        , SETUP         ,
-   SETUP6        , SETUP         , SETUP6        , SETUP         , SETUP6        , SETUP         ,
-   SETUP6        , SETUP         , SETUP6        , SETUP         , SETUP4        , ADM           ,
-   SETUP4        , ADM           , SETUP1        , SETUP         , SETUP1        , SETUP         ,
-   SETUP6        , SETUP         , SETUP6        , SETUP         , SETUP6        , SETUP         ,
-   SETUP6        , SETUP         , SETUP6        , SETUP         , SETUP6        , SETUP         ,
-   SETUP6        , SETUP         , SETUP6        , SETUP         , SETUP6        , SETUP         ,
-   SETUP2        , NORMAL        , SETUP5        , ADM           , SETUP5        , ADM           ,
-   SETUP6        , SETUP         , SETUP6        , SETUP         , SETUP6        , SETUP         ,
-   RESET6        , RESET         , RESET6        , RESET         , RESET6        , RESET         ,
-   RESET6        , RESET         , RESET6        , RESET         , RESET6        , RESET         ,
-   RESET6        , RESET         , RESET6        , RESET         , RESET4        , ADM           ,
-   RESET4        , ADM           , RESET1        , RESET         , RESET1        , RESET         ,
-   RESET6        , RESET         , RESET6        , RESET         , RESET6        , RESET         ,
-   RESET6        , RESET         , RESET6        , RESET         , RESET6        , RESET         ,
-   RESET6        , RESET         , RESET6        , RESET         , RESET6        , RESET         ,
-   RESET2        , NORMAL        , RESET5        , ADM           , RESET5        , ADM           ,
-   RESET6        , RESET         , RESET6        , RESET         , RESET6        , RESET         ,
-   D_CONN5       , D_CONN        , D_CONN5       , D_CONN        , D_CONN5       , D_CONN        ,
-   D_CONN5       , D_CONN        , D_CONN5       , D_CONN        , D_CONN5       , D_CONN        ,
-   D_CONN5       , D_CONN        , D_CONN5       , D_CONN        , D_CONN3       , D_CONN        ,
-   D_CONN3       , D_CONN        , D_CONN1       , ADM           , D_CONN1       , ADM           ,
-   D_CONN5       , D_CONN        , D_CONN5       , D_CONN        , D_CONN5       , D_CONN        ,
-   D_CONN5       , D_CONN        , D_CONN5       , D_CONN        , D_CONN5       , D_CONN        ,
-   D_CONN5       , D_CONN        , D_CONN5       , D_CONN        , D_CONN5       , D_CONN        ,
-   D_CONN4       , ADM           , D_CONN4       , ADM           , D_CONN5       , ADM           ,
-   D_CONN5       , D_CONN        , D_CONN5       , D_CONN        , D_CONN5       , D_CONN        ,
-   ERR5          , ERROR         , ERR5          , ERROR         , ERR5          , ERROR         ,
-   ERR5          , ERROR         , ERR2          , ADM           , ERR1          , RESET_CHECK   ,
-   ERR6          , ERROR         , ERR6          , ERROR         , ERR6          , ERROR         ,
-   ERR6          , ERROR         , ERR6          , ERROR         , ERR3          , ADM           ,
-   ERR4          , RESET_WAIT    , ERR4          , RESET_WAIT    , NORMAL8B      , NORMAL        ,
-   NORMAL9       , NORMAL        , NORMAL10      , NORMAL        , NORMAL10      , NORMAL        ,
-   NORMAL5       , REJECT        , NORMAL6       , REJECT        , NORMAL7       , REJECT        ,
-   NORMAL7       , REJECT        , NORMAL11      , NORMAL        , NORMAL11      , NORMAL        ,
-   NORMAL12      , NORMAL        , NORMAL12      , NORMAL        , NORMAL11      , NORMAL        ,
-   NORMAL11      , NORMAL        , NORMAL12      , NORMAL        , NORMAL12      , NORMAL        ,
-   NORMAL13      , NORMAL        , NORMAL13      , NORMAL        , NORMAL14      , NORMAL        ,
-   NORMAL14      , NORMAL        , NORMAL13      , NORMAL        , NORMAL13      , NORMAL        ,
-   NORMAL14      , NORMAL        , NORMAL14      , NORMAL        , NORMAL15      , NORMAL        ,
-   NORMAL16      , NORMAL        , NORMAL17      , NORMAL        , NORMAL17      , NORMAL        ,
-   NORMAL15      , NORMAL        , NORMAL16      , NORMAL        , NORMAL17      , NORMAL        ,
-   NORMAL17      , NORMAL        , SH4           , ADM           , SH4           , ADM           ,
-   SH4           , ADM           , SH4           , ADM           , SH4           , ADM           ,
-   SH4           , ADM           , SH4           , ADM           , SH4           , ADM           ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , NORMAL8B      , NORMAL        ,
-   NORMAL9       , NORMAL        , SH10          , ERROR         , NORMAL8A      , NORMAL        ,
-   NORMAL5       , REJECT        , NORMAL6       , REJECT        , SH10          , ERROR         ,
-   NORMAL5       , REJECT        , NORMAL11      , NORMAL        , NORMAL11      , NORMAL        ,
-   SH10          , ERROR         , NORMAL11      , NORMAL        , NORMAL11      , NORMAL        ,
-   NORMAL11      , NORMAL        , SH10          , ERROR         , NORMAL11      , NORMAL        ,
-   NORMAL13      , NORMAL        , NORMAL13      , NORMAL        , SH10          , ERROR         ,
-   NORMAL13      , NORMAL        , NORMAL13      , NORMAL        , NORMAL13      , NORMAL        ,
-   SH10          , ERROR         , NORMAL13      , NORMAL        , NORMAL15      , NORMAL        ,
-   NORMAL16      , NORMAL        , SH10          , ERROR         , NORMAL15      , NORMAL        ,
-   NORMAL15      , NORMAL        , NORMAL16      , NORMAL        , SH10          , ERROR         ,
-   NORMAL15      , NORMAL        , SH9           , ERROR         , SH9           , ERROR         ,
-   SH9           , ERROR         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH9           , ERROR         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH6           , ADM           , SH6           , ADM           , SH6           , ADM           ,
-   SH6           , ADM           , SH6           , ADM           , SH6           , ADM           ,
-   SH6           , ADM           , SH6           , ADM           , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , BUSY13        , BUSY          , BUSY14        , BUSY          ,
-   BUSY12        , BUSY          , BUSY12        , BUSY          , BUSY9         , BUSY          ,
-   BUSY10        , BUSY          , BUSY11        , BUSY          , BUSY11        , BUSY          ,
-   BUSY15        , BUSY          , BUSY15        , BUSY          , BUSY16        , BUSY          ,
-   BUSY16        , BUSY          , BUSY15        , BUSY          , BUSY15        , BUSY          ,
-   BUSY16        , BUSY          , BUSY16        , BUSY          , BUSY17        , BUSY          ,
-   BUSY17        , BUSY          , BUSY18        , BUSY          , BUSY18        , BUSY          ,
-   BUSY17        , BUSY          , BUSY17        , BUSY          , BUSY18        , BUSY          ,
-   BUSY18        , BUSY          , BUSY19        , BUSY          , BUSY20        , BUSY          ,
-   BUSY21        , BUSY          , BUSY21        , BUSY          , BUSY19        , BUSY          ,
-   BUSY20        , BUSY          , BUSY21        , BUSY          , BUSY21        , BUSY          ,
-   SH4           , ADM           , SH4           , ADM           , SH4           , ADM           ,
-   SH4           , ADM           , SH4           , ADM           , SH4           , ADM           ,
-   SH4           , ADM           , SH4           , ADM           , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , BUSY13        , BUSY          , BUSY14        , BUSY          ,
-   SH10          , ERROR         , BUSY13        , BUSY          , BUSY9         , BUSY          ,
-   BUSY10        , BUSY          , SH10          , ERROR         , BUSY9         , BUSY          ,
-   BUSY15        , BUSY          , BUSY15        , BUSY          , SH10          , ERROR         ,
-   BUSY15        , BUSY          , BUSY15        , BUSY          , BUSY15        , BUSY          ,
-   SH10          , ERROR         , BUSY15        , BUSY          , BUSY17        , BUSY          ,
-   BUSY17        , BUSY          , SH10          , ERROR         , BUSY17        , BUSY          ,
-   BUSY17        , BUSY          , BUSY17        , BUSY          , SH10          , ERROR         ,
-   BUSY17        , BUSY          , BUSY19        , BUSY          , BUSY20        , BUSY          ,
-   SH10          , ERROR         , BUSY19        , BUSY          , BUSY19        , BUSY          ,
-   BUSY20        , BUSY          , SH10          , ERROR         , BUSY19        , BUSY          ,
-   SH9           , ERROR         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH9           , ERROR         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH9           , ERROR         , SH9           , ERROR         , SH6           , ADM           ,
-   SH6           , ADM           , SH6           , ADM           , SH6           , ADM           ,
-   SH6           , ADM           , SH6           , ADM           , SH6           , ADM           ,
-   SH6           , ADM           , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   REJECT7       , REJECT        , REJECT8       , REJECT        , REJECT9       , REJECT        ,
-   REJECT9       , REJECT        , REJECT5       , REJECT        , REJECT5       , REJECT        ,
-   REJECT6       , REJECT        , REJECT6       , REJECT        , REJECT10      , REJECT        ,
-   REJECT10      , REJECT        , REJECT11      , REJECT        , REJECT11      , REJECT        ,
-   REJECT10      , REJECT        , REJECT10      , REJECT        , REJECT11      , REJECT        ,
-   REJECT11      , REJECT        , REJECT12      , REJECT        , REJECT12      , REJECT        ,
-   REJECT13      , REJECT        , REJECT13      , REJECT        , REJECT12      , REJECT        ,
-   REJECT12      , REJECT        , REJECT13      , REJECT        , REJECT13      , REJECT        ,
-   REJECT14      , REJECT        , REJECT15      , REJECT        , REJECT16      , REJECT        ,
-   REJECT16      , REJECT        , REJECT14      , REJECT        , REJECT15      , REJECT        ,
-   REJECT16      , REJECT        , REJECT16      , REJECT        , SH4           , ADM           ,
-   SH4           , ADM           , SH4           , ADM           , SH4           , ADM           ,
-   SH4           , ADM           , SH4           , ADM           , SH4           , ADM           ,
-   SH4           , ADM           , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   REJECT7       , REJECT        , REJECT8       , REJECT        , SH10          , ERROR         ,
-   REJECT7       , REJECT        , REJECT5       , REJECT        , REJECT5       , REJECT        ,
-   SH10          , ERROR         , REJECT5       , REJECT        , REJECT10      , REJECT        ,
-   REJECT10      , REJECT        , SH10          , ERROR         , REJECT10      , REJECT        ,
-   REJECT10      , REJECT        , REJECT10      , REJECT        , SH10          , ERROR         ,
-   REJECT10      , REJECT        , REJECT12      , REJECT        , REJECT12      , REJECT        ,
-   SH10          , ERROR         , REJECT12      , REJECT        , REJECT12      , REJECT        ,
-   REJECT12      , REJECT        , SH10          , ERROR         , REJECT12      , REJECT        ,
-   REJECT14      , REJECT        , REJECT15      , REJECT        , SH10          , ERROR         ,
-   REJECT14      , REJECT        , REJECT14      , REJECT        , REJECT15      , REJECT        ,
-   SH10          , ERROR         , REJECT14      , REJECT        , SH9           , ERROR         ,
-   SH9           , ERROR         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH9           , ERROR         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH9           , ERROR         , SH6           , ADM           , SH6           , ADM           ,
-   SH6           , ADM           , SH6           , ADM           , SH6           , ADM           ,
-   SH6           , ADM           , SH6           , ADM           , SH6           , ADM           ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , AWAIT6        , AWAIT         ,
-   AWAIT6        , AWAIT         , AWAIT7        , AWAIT         , AWAIT7        , AWAIT         ,
-   AWAIT3        , AWAIT_REJECT  , AWAIT3        , AWAIT_REJECT  , AWAIT4        , AWAIT_REJECT  ,
-   AWAIT4        , AWAIT_REJECT  , AWAIT9        , AWAIT         , AWAIT9        , AWAIT         ,
-   AWAIT10       , AWAIT         , AWAIT10       , AWAIT         , AWAIT9        , AWAIT         ,
-   AWAIT9        , AWAIT         , AWAIT10       , AWAIT         , AWAIT10       , AWAIT         ,
-   AWAIT12       , AWAIT         , AWAIT12       , AWAIT         , AWAIT13       , AWAIT         ,
-   AWAIT13       , AWAIT         , AWAIT12       , AWAIT         , AWAIT12       , AWAIT         ,
-   AWAIT13       , AWAIT         , AWAIT13       , AWAIT         , AWAIT9        , AWAIT         ,
-   AWAIT9        , AWAIT         , AWAIT10       , AWAIT         , AWAIT10       , AWAIT         ,
-   AWAIT9        , AWAIT         , AWAIT9        , AWAIT         , AWAIT10       , AWAIT         ,
-   AWAIT10       , AWAIT         , SH4           , ADM           , SH4           , ADM           ,
-   SH4           , ADM           , SH4           , ADM           , SH4           , ADM           ,
-   SH4           , ADM           , SH4           , ADM           , SH4           , ADM           ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , AWAIT6        , AWAIT         ,
-   AWAIT6        , AWAIT         , SH10          , ERROR         , AWAIT5        , NORMAL        ,
-   AWAIT3        , AWAIT_REJECT  , AWAIT3        , AWAIT_REJECT  , SH10          , ERROR         ,
-   AWAIT2        , REJECT        , AWAIT9        , AWAIT         , AWAIT9        , AWAIT         ,
-   SH10          , ERROR         , AWAIT8        , AWAIT         , AWAIT9        , AWAIT         ,
-   AWAIT9        , AWAIT         , SH10          , ERROR         , AWAIT8        , AWAIT         ,
-   AWAIT12       , AWAIT         , AWAIT12       , AWAIT         , SH10          , ERROR         ,
-   AWAIT11       , AWAIT         , AWAIT12       , AWAIT         , AWAIT12       , AWAIT         ,
-   SH10          , ERROR         , AWAIT11       , AWAIT         , AWAIT9        , AWAIT         ,
-   AWAIT9        , AWAIT         , SH10          , ERROR         , AWAIT8        , AWAIT         ,
-   AWAIT9        , AWAIT         , AWAIT9        , AWAIT         , SH10          , ERROR         ,
-   AWAIT8        , AWAIT         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH9           , ERROR         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH9           , ERROR         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH6           , ADM           , SH6           , ADM           , SH6           , ADM           ,
-   SH6           , ADM           , SH6           , ADM           , SH6           , ADM           ,
-   SH6           , ADM           , SH6           , ADM           , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , AWAIT_BUSY8   , AWAIT_BUSY    , AWAIT_BUSY8   , AWAIT_BUSY    ,
-   AWAIT_BUSY9   , AWAIT_BUSY    , AWAIT_BUSY9   , AWAIT_BUSY    , AWAIT_BUSY5   , AWAIT_BUSY    ,
-   AWAIT_BUSY5   , AWAIT_BUSY    , AWAIT_BUSY6   , AWAIT_BUSY    , AWAIT_BUSY6   , AWAIT_BUSY    ,
-   AWAIT_BUSY11  , AWAIT_BUSY    , AWAIT_BUSY11  , AWAIT_BUSY    , AWAIT_BUSY12  , AWAIT_BUSY    ,
-   AWAIT_BUSY12  , AWAIT_BUSY    , AWAIT_BUSY11  , AWAIT_BUSY    , AWAIT_BUSY11  , AWAIT_BUSY    ,
-   AWAIT_BUSY12  , AWAIT_BUSY    , AWAIT_BUSY12  , AWAIT_BUSY    , AWAIT_BUSY14  , AWAIT_BUSY    ,
-   AWAIT_BUSY14  , AWAIT_BUSY    , AWAIT_BUSY15  , AWAIT_BUSY    , AWAIT_BUSY15  , AWAIT_BUSY    ,
-   AWAIT_BUSY14  , AWAIT_BUSY    , AWAIT_BUSY14  , AWAIT_BUSY    , AWAIT_BUSY15  , AWAIT_BUSY    ,
-   AWAIT_BUSY15  , AWAIT_BUSY    , AWAIT_BUSY11  , AWAIT_BUSY    , AWAIT_BUSY11  , AWAIT_BUSY    ,
-   AWAIT_BUSY12  , AWAIT_BUSY    , AWAIT_BUSY12  , AWAIT_BUSY    , AWAIT_BUSY11  , AWAIT_BUSY    ,
-   AWAIT_BUSY11  , AWAIT_BUSY    , AWAIT_BUSY12  , AWAIT_BUSY    , AWAIT_BUSY12  , AWAIT_BUSY    ,
-   SH4           , ADM           , SH4           , ADM           , SH4           , ADM           ,
-   SH4           , ADM           , SH4           , ADM           , SH4           , ADM           ,
-   SH4           , ADM           , SH4           , ADM           , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , AWAIT_BUSY8   , AWAIT_BUSY    , AWAIT_BUSY8   , AWAIT_BUSY    ,
-   SH10          , ERROR         , AWAIT_BUSY7   , BUSY          , AWAIT_BUSY5   , AWAIT_BUSY    ,
-   AWAIT_BUSY5   , AWAIT_BUSY    , SH10          , ERROR         , AWAIT_BUSY4   , BUSY          ,
-   AWAIT_BUSY11  , AWAIT_BUSY    , AWAIT_BUSY11  , AWAIT_BUSY    , SH10          , ERROR         ,
-   AWAIT_BUSY10  , BUSY          , AWAIT_BUSY11  , AWAIT_BUSY    , AWAIT_BUSY11  , AWAIT_BUSY    ,
-   SH10          , ERROR         , AWAIT_BUSY10  , BUSY          , AWAIT_BUSY14  , AWAIT_BUSY    ,
-   AWAIT_BUSY14  , AWAIT_BUSY    , SH10          , ERROR         , AWAIT_BUSY13  , BUSY          ,
-   AWAIT_BUSY14  , AWAIT_BUSY    , AWAIT_BUSY14  , AWAIT_BUSY    , SH10          , ERROR         ,
-   AWAIT_BUSY13  , BUSY          , AWAIT_BUSY11  , AWAIT_BUSY    , AWAIT_BUSY11  , AWAIT_BUSY    ,
-   SH10          , ERROR         , AWAIT_BUSY10  , BUSY          , AWAIT_BUSY11  , AWAIT_BUSY    ,
-   AWAIT_BUSY11  , AWAIT_BUSY    , SH10          , ERROR         , AWAIT_BUSY10  , BUSY          ,
-   SH9           , ERROR         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH9           , ERROR         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH9           , ERROR         , SH9           , ERROR         , SH6           , ADM           ,
-   SH6           , ADM           , SH6           , ADM           , SH6           , ADM           ,
-   SH6           , ADM           , SH6           , ADM           , SH6           , ADM           ,
-   SH6           , ADM           , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   AWAIT_REJECT5 , AWAIT         , AWAIT_REJECT5 , AWAIT         , AWAIT_REJECT6 , AWAIT         ,
-   AWAIT_REJECT6 , AWAIT         , AWAIT_REJECT2 , AWAIT_REJECT  , AWAIT_REJECT2 , AWAIT_REJECT  ,
-   AWAIT_REJECT3 , AWAIT_REJECT  , AWAIT_REJECT3 , AWAIT_REJECT  , AWAIT_REJECT8 , AWAIT_REJECT  ,
-   AWAIT_REJECT8 , AWAIT_REJECT  , AWAIT_REJECT9 , AWAIT_REJECT  , AWAIT_REJECT9 , AWAIT_REJECT  ,
-   AWAIT_REJECT8 , AWAIT_REJECT  , AWAIT_REJECT8 , AWAIT_REJECT  , AWAIT_REJECT9 , AWAIT_REJECT  ,
-   AWAIT_REJECT9 , AWAIT_REJECT  , AWAIT_REJECT11, AWAIT_REJECT  , AWAIT_REJECT11, AWAIT_REJECT  ,
-   AWAIT_REJECT12, AWAIT_REJECT  , AWAIT_REJECT12, AWAIT_REJECT  , AWAIT_REJECT11, AWAIT_REJECT  ,
-   AWAIT_REJECT11, AWAIT_REJECT  , AWAIT_REJECT12, AWAIT_REJECT  , AWAIT_REJECT12, AWAIT_REJECT  ,
-   AWAIT_REJECT8 , AWAIT_REJECT  , AWAIT_REJECT8 , AWAIT_REJECT  , AWAIT_REJECT9 , AWAIT_REJECT  ,
-   AWAIT_REJECT9 , AWAIT_REJECT  , AWAIT_REJECT8 , AWAIT_REJECT  , AWAIT_REJECT8 , AWAIT_REJECT  ,
-   AWAIT_REJECT9 , AWAIT_REJECT  , AWAIT_REJECT9 , AWAIT_REJECT  , SH4           , ADM           ,
-   SH4           , ADM           , SH4           , ADM           , SH4           , ADM           ,
-   SH4           , ADM           , SH4           , ADM           , SH4           , ADM           ,
-   SH4           , ADM           , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   SH3           , RESET_CHECK   , SH3           , RESET_CHECK   , SH3           , RESET_CHECK   ,
-   AWAIT_REJECT5 , AWAIT         , AWAIT_REJECT5 , AWAIT         , SH10          , ERROR         ,
-   AWAIT_REJECT4 , NORMAL        , AWAIT_REJECT2 , AWAIT_REJECT  , AWAIT_REJECT2 , AWAIT_REJECT  ,
-   SH10          , ERROR         , AWAIT_REJECT4 , NORMAL        , AWAIT_REJECT8 , AWAIT_REJECT  ,
-   AWAIT_REJECT8 , AWAIT_REJECT  , SH10          , ERROR         , AWAIT_REJECT7 , REJECT        ,
-   AWAIT_REJECT8 , AWAIT_REJECT  , AWAIT_REJECT8 , AWAIT_REJECT  , SH10          , ERROR         ,
-   AWAIT_REJECT7 , REJECT        , AWAIT_REJECT11, AWAIT_REJECT  , AWAIT_REJECT11, AWAIT_REJECT  ,
-   SH10          , ERROR         , AWAIT_REJECT10, REJECT        , AWAIT_REJECT11, AWAIT_REJECT  ,
-   AWAIT_REJECT11, AWAIT_REJECT  , SH10          , ERROR         , AWAIT_REJECT10, REJECT        ,
-   AWAIT_REJECT8 , AWAIT_REJECT  , AWAIT_REJECT8 , AWAIT_REJECT  , SH10          , ERROR         ,
-   AWAIT_REJECT7 , REJECT        , AWAIT_REJECT8 , AWAIT_REJECT  , AWAIT_REJECT8 , AWAIT_REJECT  ,
-   SH10          , ERROR         , AWAIT_REJECT7 , REJECT        , SH9           , ERROR         ,
-   SH9           , ERROR         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH9           , ERROR         , SH9           , ERROR         , SH9           , ERROR         ,
-   SH9           , ERROR         , SH6           , ADM           , SH6           , ADM           ,
-   SH6           , ADM           , SH6           , ADM           , SH6           , ADM           ,
-   SH6           , ADM           , SH6           , ADM           , SH6           , ADM           ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH5           , RESET_WAIT    ,
-   SH5           , RESET_WAIT    , SH5           , RESET_WAIT    , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR         , SH7           , ERROR         ,
-   SH7           , ERROR         , SH7           , ERROR          };
diff -uNr linux/net/802/transit/pdutr.pre linux-llc/net/802/transit/pdutr.pre
--- linux/net/802/transit/pdutr.pre	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/transit/pdutr.pre	Thu Jan  1 01:00:00 1970
@@ -1,1121 +0,0 @@
-COMPILE pdutr INDEX
-;
-; Transition tables for incomming pdu events.
-; translate this thing into C with
-;  	awk -f ./compile.awk pdu.trans > pdutr.h
-;
-TABLE ADM
-;Transition table for the ADM state:
-;
-;frame type   p bit     action    newstate
-;received     in frame
-;
-I_CMD         0         ADM5      ADM
-I_CMD         1         ADM4      ADM
-RR_CMD        0         ADM5      ADM
-RR_CMD        1         ADM4      ADM
-RNR_CMD       0         ADM5      ADM
-RNR_CMD       1         ADM4      ADM
-REJ_CMD       0         ADM5      ADM
-REJ_CMD       1         ADM4      ADM
-DISC_CMD      0         ADM3      ADM
-DISC_CMD      1         ADM3      ADM
-SABME_CMD     0         ADM2      CONN  
-SABME_CMD     1         ADM2      CONN  
-I_RSP         0         ADM5      ADM
-I_RSP         1         ADM5      ADM
-RR_RSP        0         ADM5      ADM
-RR_RSP        1         ADM5      ADM
-RNR_RSP       0         ADM5      ADM
-RNR_RSP       1         ADM5      ADM
-REJ_RSP       0         ADM5      ADM
-REJ_RSP       1         ADM5      ADM
-UA_RSP        0         ADM5      ADM
-UA_RSP        1         ADM5      ADM
-DM_RSP        0         ADM5      ADM
-DM_RSP        1         ADM5      ADM
-FRMR_RSP      0         ADM5      ADM
-FRMR_RSP      1         ADM5      ADM
-;
-TABLE CONN
-;
-;Transition table for the CONN state:
-;
-;frame type   action    newstate
-;received     
-;
-I_CMD         CONN5     CONN
-RR_CMD        CONN5     CONN
-RNR_CMD       CONN5     CONN
-REJ_CMD       CONN5     CONN
-DISC_CMD      CONN5     CONN
-SABME_CMD     CONN3     CONN  
-I_RSP         CONN5     CONN
-RR_RSP        CONN5     CONN
-RNR_RSP       CONN5     CONN
-REJ_RSP       CONN5     CONN
-UA_RSP        CONN5     CONN
-DM_RSP        CONN4     ADM
-FRMR_RSP      CONN5     CONN
-;
-TABLE RESET_WAIT
-;Transition table for the RESET_WAIT
-;
-;frame type   action    newstate
-;received     
-;
-I_CMD         RESWAIT8  RESET_WAIT
-RR_CMD        RESWAIT8  RESET_WAIT
-RNR_CMD       RESWAIT8  RESET_WAIT
-REJ_CMD       RESWAIT8  RESET_WAIT
-DISC_CMD      RESWAIT7  RESET_WAIT
-SABME_CMD     RESWAIT6  RESET_WAIT
-I_RSP         RESWAIT8  RESET_WAIT
-RR_RSP        RESWAIT8  RESET_WAIT
-RNR_RSP       RESWAIT8  RESET_WAIT
-REJ_RSP       RESWAIT8  RESET_WAIT
-UA_RSP        RESWAIT8  RESET_WAIT
-DM_RSP        RESWAIT5  ADM
-FRMR_RSP      RESWAIT8  RESET_WAIT
-;
-;
-TABLE RESET_CHECK
-;Transition table for the RESET_CHECK state
-;
-;frame type   action    newstate
-;received     
-;
-I_CMD         RESCHK6  RESET_CHECK
-RR_CMD        RESCHK6  RESET_CHECK
-RNR_CMD       RESCHK6  RESET_CHECK
-REJ_CMD       RESCHK6  RESET_CHECK
-DISC_CMD      RESCHK5  ADM
-SABME_CMD     RESCHK4  RESET_CHECK
-I_RSP         RESCHK6  RESET_CHECK
-RR_RSP        RESCHK6  RESET_CHECK
-RNR_RSP       RESCHK6  RESET_CHECK
-REJ_RSP       RESCHK6  RESET_CHECK
-UA_RSP        RESCHK6  RESET_CHECK
-DM_RSP        RESCHK3  ADM
-FRMR_RSP      RESCHK6  RESET_CHECK
-;
-;
-TABLE SETUP
-;Transition table for the SETUP state
-;
-;frame type   p flag    action    newstate
-;received     = f
-;
-I_CMD         0         SETUP6      SETUP
-I_CMD         1         SETUP6      SETUP
-RR_CMD        0         SETUP6      SETUP
-RR_CMD        1         SETUP6      SETUP
-RNR_CMD       0         SETUP6      SETUP
-RNR_CMD       1         SETUP6      SETUP
-REJ_CMD       0         SETUP6      SETUP
-REJ_CMD       1         SETUP6      SETUP
-DISC_CMD      0         SETUP4      ADM
-DISC_CMD      1         SETUP4      ADM  
-SABME_CMD     0         SETUP1      SETUP 
-SABME_CMD     1         SETUP1      SETUP 
-I_RSP         0         SETUP6      SETUP
-I_RSP         1         SETUP6      SETUP
-RR_RSP        0         SETUP6      SETUP
-RR_RSP        1         SETUP6      SETUP
-RNR_RSP       0         SETUP6      SETUP
-RNR_RSP       1         SETUP6      SETUP
-REJ_RSP       0         SETUP6      SETUP
-REJ_RSP       1         SETUP6      SETUP
-UA_RSP        0         SETUP6      SETUP
-UA_RSP        1         SETUP2      NORMAL
-DM_RSP        0         SETUP5      ADM  
-DM_RSP        1         SETUP5      ADM  
-FRMR_RSP      0         SETUP6      SETUP
-FRMR_RSP      1         SETUP6      SETUP
-;
-;
-TABLE RESET
-;Transition table for the RESET state:
-;
-;frame type   p flag    action    newstate
-;received     = f
-;
-I_CMD         0         RESET6      RESET
-I_CMD         1         RESET6      RESET
-RR_CMD        0         RESET6      RESET
-RR_CMD        1         RESET6      RESET
-RNR_CMD       0         RESET6      RESET
-RNR_CMD       1         RESET6      RESET
-REJ_CMD       0         RESET6      RESET
-REJ_CMD       1         RESET6      RESET
-DISC_CMD      0         RESET4      ADM
-DISC_CMD      1         RESET4      ADM  
-SABME_CMD     0         RESET1      RESET 
-SABME_CMD     1         RESET1      RESET 
-I_RSP         0         RESET6      RESET
-I_RSP         1         RESET6      RESET
-RR_RSP        0         RESET6      RESET
-RR_RSP        1         RESET6      RESET
-RNR_RSP       0         RESET6      RESET
-RNR_RSP       1         RESET6      RESET
-REJ_RSP       0         RESET6      RESET
-REJ_RSP       1         RESET6      RESET
-UA_RSP        0         RESET6      RESET
-UA_RSP        1         RESET2      NORMAL
-DM_RSP        0         RESET5      ADM  
-DM_RSP        1         RESET5      ADM  
-FRMR_RSP      0         RESET6      RESET
-FRMR_RSP      1         RESET6      RESET
-;
-;
-TABLE D_CONN
-;Transition table for the D_CONN state:
-;
-;frame type   p bit     action    newstate
-;received     in frame  
-I_CMD         0         D_CONN5      D_CONN
-I_CMD         1         D_CONN5      D_CONN
-RR_CMD        0         D_CONN5      D_CONN
-RR_CMD        1         D_CONN5      D_CONN
-RNR_CMD       0         D_CONN5      D_CONN
-RNR_CMD       1         D_CONN5      D_CONN
-REJ_CMD       0         D_CONN5      D_CONN
-REJ_CMD       1         D_CONN5      D_CONN
-DISC_CMD      0         D_CONN3      D_CONN
-DISC_CMD      1         D_CONN3      D_CONN
-SABME_CMD     0         D_CONN1      ADM  
-SABME_CMD     1         D_CONN1      ADM    
-I_RSP         0         D_CONN5      D_CONN
-I_RSP         1         D_CONN5      D_CONN
-RR_RSP        0         D_CONN5      D_CONN
-RR_RSP        1         D_CONN5      D_CONN
-RNR_RSP       0         D_CONN5      D_CONN
-RNR_RSP       1         D_CONN5      D_CONN
-REJ_RSP       0         D_CONN5      D_CONN
-REJ_RSP       1         D_CONN5      D_CONN
-UA_RSP        0         D_CONN5      D_CONN
-UA_RSP        1         D_CONN4      ADM   
-DM_RSP        0         D_CONN4      ADM  
-DM_RSP        1         D_CONN5      ADM  
-FRMR_RSP      0         D_CONN5      D_CONN
-FRMR_RSP      1         D_CONN5      D_CONN
-;
-;
-TABLE ERROR
-;Transition table for the ERROR state:
-;
-;frame type   action    newstate
-;received     
-;
-I_CMD         ERR5      ERROR
-RR_CMD        ERR5      ERROR
-RNR_CMD       ERR5      ERROR
-REJ_CMD       ERR5      ERROR
-DISC_CMD      ERR2      ADM
-SABME_CMD     ERR1      RESET_CHECK
-I_RSP         ERR6      ERROR
-RR_RSP        ERR6      ERROR
-RNR_RSP       ERR6      ERROR
-REJ_RSP       ERR6      ERROR
-UA_RSP        ERR6      ERROR
-DM_RSP        ERR3      ADM
-FRMR_RSP      ERR4      RESET_WAIT
-;
-TABLE NORMAL
-;Transition table for the NORMAL state:
-;
-;frame type   uexpect   p bit     p_flag    
-;received     N(S)      in frame            
-;
-I_CMD          	0	0	0	NORMAL8B	NORMAL
-I_CMD          	0	0	1	NORMAL9		NORMAL
-I_CMD          	0	1	0	NORMAL10	NORMAL
-I_CMD          	0	1	1	NORMAL10	NORMAL
-I_CMD          	1	0	0	NORMAL5		REJECT
-I_CMD          	1	0	1	NORMAL6		REJECT
-I_CMD          	1	1	0	NORMAL7		REJECT
-I_CMD          	1	1	1	NORMAL7		REJECT
-RR_CMD         	0	0	0	NORMAL11	NORMAL
-RR_CMD         	0	0	1	NORMAL11	NORMAL
-RR_CMD         	0	1	0	NORMAL12	NORMAL
-RR_CMD         	0	1	1	NORMAL12	NORMAL
-RR_CMD         	1	0	0	NORMAL11	NORMAL
-RR_CMD         	1	0	1	NORMAL11	NORMAL
-RR_CMD         	1	1	0	NORMAL12	NORMAL
-RR_CMD         	1	1	1	NORMAL12	NORMAL
-RNR_CMD        	0	0	0	NORMAL13	NORMAL
-RNR_CMD        	0	0	1	NORMAL13	NORMAL
-RNR_CMD        	0	1	0	NORMAL14	NORMAL
-RNR_CMD        	0	1	1	NORMAL14	NORMAL
-RNR_CMD        	1	0	0	NORMAL13	NORMAL
-RNR_CMD        	1	0	1	NORMAL13	NORMAL
-RNR_CMD        	1	1	0	NORMAL14	NORMAL
-RNR_CMD        	1	1	1	NORMAL14	NORMAL
-REJ_CMD        	0	0	0	NORMAL15	NORMAL
-REJ_CMD        	0	0	1	NORMAL16	NORMAL
-REJ_CMD        	0	1	0	NORMAL17	NORMAL 
-REJ_CMD        	0	1	1	NORMAL17	NORMAL 
-REJ_CMD        	1	0	0	NORMAL15	NORMAL
-REJ_CMD        	1	0	1	NORMAL16	NORMAL
-REJ_CMD        	1	1	0	NORMAL17	NORMAL 
-REJ_CMD        	1	1	1	NORMAL17	NORMAL 
-DISC_CMD       	0	0	0	SH4		ADM
-DISC_CMD       	0	0	1	SH4		ADM
-DISC_CMD       	0	1	0	SH4		ADM
-DISC_CMD       	0	1	1	SH4		ADM
-DISC_CMD       	1	0	0	SH4		ADM
-DISC_CMD       	1	0	1	SH4		ADM
-DISC_CMD       	1	1	0	SH4		ADM
-DISC_CMD       	1	1	1	SH4		ADM
-SABME_CMD      	0	0	0	SH3		RESET_CHECK
-SABME_CMD      	0	0	1	SH3		RESET_CHECK
-SABME_CMD      	0	1	0	SH3		RESET_CHECK
-SABME_CMD      	0	1	1	SH3		RESET_CHECK
-SABME_CMD      	1	0	0	SH3		RESET_CHECK
-SABME_CMD      	1	0	1	SH3		RESET_CHECK
-SABME_CMD      	1	1	0	SH3		RESET_CHECK
-SABME_CMD      	1	1	1	SH3		RESET_CHECK
-I_RSP          	0	0	0	NORMAL8B	NORMAL
-I_RSP          	0	0	1	NORMAL9		NORMAL
-I_RSP          	0	1	0	SH10		ERROR
-I_RSP          	0	1	1	NORMAL8A	NORMAL
-I_RSP          	1	0	0	NORMAL5		REJECT
-I_RSP          	1	0	1	NORMAL6		REJECT
-I_RSP          	1	1	0	SH10		ERROR
-I_RSP          	1	1	1	NORMAL5		REJECT
-RR_RSP         	0	0	0	NORMAL11	NORMAL
-RR_RSP         	0	0	1	NORMAL11	NORMAL
-RR_RSP         	0	1	0	SH10		ERROR
-RR_RSP         	0	1	1	NORMAL11	NORMAL
-RR_RSP         	1	0	0	NORMAL11	NORMAL
-RR_RSP         	1	0	1	NORMAL11	NORMAL
-RR_RSP         	1	1	0	SH10		ERROR
-RR_RSP         	1	1	1	NORMAL11	NORMAL
-RNR_RSP        	0	0	0	NORMAL13	NORMAL
-RNR_RSP        	0	0	1	NORMAL13	NORMAL
-RNR_RSP        	0	1	0	SH10		ERROR
-RNR_RSP        	0	1	1	NORMAL13	NORMAL
-RNR_RSP        	1	0	0	NORMAL13	NORMAL
-RNR_RSP        	1	0	1	NORMAL13	NORMAL
-RNR_RSP        	1	1	0	SH10		ERROR
-RNR_RSP        	1	1	1	NORMAL13	NORMAL
-REJ_RSP        	0	0	0	NORMAL15	NORMAL
-REJ_RSP        	0	0	1	NORMAL16	NORMAL
-REJ_RSP        	0	1	0	SH10		ERROR
-REJ_RSP        	0	1	1	NORMAL15	NORMAL
-REJ_RSP        	1	0	0	NORMAL15	NORMAL
-REJ_RSP        	1	0	1	NORMAL16	NORMAL
-REJ_RSP        	1	1	0	SH10		ERROR
-REJ_RSP        	1	1	1	NORMAL15	NORMAL
-UA_RSP         	0	0	0	SH9		ERROR
-UA_RSP         	0	0	1	SH9		ERROR
-UA_RSP         	0	1	0	SH9		ERROR
-UA_RSP         	0	1	1	SH9		ERROR
-UA_RSP         	1	0	0	SH9		ERROR
-UA_RSP         	1	0	1	SH9		ERROR
-UA_RSP         	1	1	0	SH9		ERROR
-UA_RSP         	1	1	1	SH9		ERROR
-DM_RSP         	0	0	0	SH6		ADM
-DM_RSP         	0	0	1	SH6		ADM
-DM_RSP         	0	1	0	SH6		ADM
-DM_RSP         	0	1	1	SH6		ADM
-DM_RSP         	1	0	0	SH6		ADM
-DM_RSP         	1	0	1	SH6		ADM
-DM_RSP         	1	1	0	SH6		ADM
-DM_RSP         	1	1	1	SH6		ADM
-FRMR_RSP       	0	0	0	SH5		RESET_WAIT
-FRMR_RSP       	0	0	1	SH5		RESET_WAIT
-FRMR_RSP       	0	1	0	SH5		RESET_WAIT
-FRMR_RSP       	0	1	1	SH5		RESET_WAIT
-FRMR_RSP       	1	0	0	SH5		RESET_WAIT
-FRMR_RSP       	1	0	1	SH5		RESET_WAIT
-FRMR_RSP       	1	1	0	SH5		RESET_WAIT
-FRMR_RSP       	1	1	1	SH5		RESET_WAIT
-BAD_FRAME      	0	0	0	SH7		ERROR
-BAD_FRAME      	0	0	1	SH7		ERROR
-BAD_FRAME      	0	1	0	SH7		ERROR
-BAD_FRAME      	0	1	1	SH7		ERROR
-BAD_FRAME      	1	0	0	SH7		ERROR
-BAD_FRAME      	1	0	1	SH7		ERROR
-BAD_FRAME      	1	1	0	SH7		ERROR
-BAD_FRAME      	1	1	1	SH7		ERROR
-;
-;112 entries in table, 8 modified by tredit4 SABME_CMD x x x SH3 RESET_CHECK
-;112 entries in table, 8 modified by tredit4 DISC_CMD x x x SH4 ADM
-;112 entries in table, 8 modified by tredit4 FRMR_RSP x x x SH5 RESET_WAIT
-;112 entries in table, 8 modified by tredit4 DM_RSP x x x SH6 ADM
-;112 entries in table, 8 modified by tredit4 BAD_FRAME x x x SH7 ERROR
-;112 entries in table, 8 modified by tredit4 UA_RSP x x x SH9 ERROR
-;112 entries in table, 8 modified by tredit4 anyrsp x 1 0 SH10 ERROR
-;112 entries in table, 1 modified by tredit4 I_CMD 1 0 0 NORMAL5 REJECT
-;112 entries in table, 1 modified by tredit4 I_RSP 1 0 0 NORMAL5 REJECT
-;112 entries in table, 1 modified by tredit4 I_RSP 1 1 1 NORMAL5 REJECT
-;112 entries in table, 1 modified by tredit4 I_CMD 1 0 1 NORMAL6 REJECT
-;112 entries in table, 1 modified by tredit4 I_RSP 1 0 1 NORMAL6 REJECT
-;112 entries in table, 2 modified by tredit4 I_CMD 1 1 x NORMAL7 REJECT
-;112 entries in table, 1 modified by tredit4 I_RSP x 1 1 NORMAL8A NORMAL
-;112 entries in table, 1 modified by tredit4 I_RSP x 0 0 NORMAL8B NORMAL
-;112 entries in table, 1 modified by tredit4 I_CMD x 0 0 NORMAL8B NORMAL
-;112 entries in table, 1 modified by tredit4 I_RSP x 0 1 NORMAL9 NORMAL
-;112 entries in table, 1 modified by tredit4 I_CMD x 0 1 NORMAL9 NORMAL
-;112 entries in table, 2 modified by tredit4 I_CMD x 1 x NORMAL10 NORMAL
-;112 entries in table, 4 modified by tredit4 RR_CMD x 0 x NORMAL11 NORMAL
-;112 entries in table, 4 modified by tredit4 RR_RSP x 0 x NORMAL11 NORMAL
-;112 entries in table, 2 modified by tredit4 RR_RSP x 1 1 NORMAL11 NORMAL
-;112 entries in table, 4 modified by tredit4 RR_CMD x 1 x NORMAL12 NORMAL
-;112 entries in table, 4 modified by tredit4 RNR_CMD x 0 x NORMAL13 NORMAL
-;112 entries in table, 4 modified by tredit4 RNR_RSP x 0 x NORMAL13 NORMAL
-;112 entries in table, 2 modified by tredit4 RNR_RSP x 1 1 NORMAL13 NORMAL
-;112 entries in table, 4 modified by tredit4 RNR_CMD x 1 x NORMAL14 NORMAL
-;112 entries in table, 2 modified by tredit4 REJ_CMD x 0 0 NORMAL15 NORMAL
-;112 entries in table, 2 modified by tredit4 REJ_RSP x 1 1 NORMAL15 NORMAL
-;112 entries in table, 2 modified by tredit4 REJ_RSP x 0 0 NORMAL15 NORMAL
-;112 entries in table, 2 modified by tredit4 REJ_CMD x 0 1 NORMAL16 NORMAL
-;112 entries in table, 2 modified by tredit4 REJ_RSP x 0 1 NORMAL16 NORMAL
-;112 entries in table, 4 modified by tredit4 REJ_CMD x 1 x NORMAL17 NORMAL
-;
-TABLE BUSY
-;Transition table for the BUSY state:
-;
-;frame type   uexpect   p bit     p_flag    
-;received     N(S)      in frame            
-;
-I_CMD          	0	0	0	BUSY13	BUSY
-I_CMD          	0	0	1	BUSY14	BUSY
-I_CMD          	0	1	0	BUSY12	BUSY
-I_CMD          	0	1	1	BUSY12	BUSY
-I_CMD          	1	0	0	BUSY9	BUSY
-I_CMD          	1	0	1	BUSY10	BUSY
-I_CMD          	1	1	0	BUSY11	BUSY
-I_CMD          	1	1	1	BUSY11	BUSY
-RR_CMD         	0	0	0	BUSY15	BUSY
-RR_CMD         	0	0	1	BUSY15	BUSY
-RR_CMD         	0	1	0	BUSY16	BUSY
-RR_CMD         	0	1	1	BUSY16	BUSY
-RR_CMD         	1	0	0	BUSY15	BUSY
-RR_CMD         	1	0	1	BUSY15	BUSY
-RR_CMD         	1	1	0	BUSY16	BUSY
-RR_CMD         	1	1	1	BUSY16	BUSY
-RNR_CMD        	0	0	0	BUSY17	BUSY
-RNR_CMD        	0	0	1	BUSY17	BUSY
-RNR_CMD        	0	1	0	BUSY18	BUSY
-RNR_CMD        	0	1	1	BUSY18	BUSY
-RNR_CMD        	1	0	0	BUSY17	BUSY
-RNR_CMD        	1	0	1	BUSY17	BUSY
-RNR_CMD        	1	1	0	BUSY18	BUSY
-RNR_CMD        	1	1	1	BUSY18	BUSY
-REJ_CMD        	0	0	0	BUSY19	BUSY
-REJ_CMD        	0	0	1	BUSY20	BUSY
-REJ_CMD        	0	1	0	BUSY21	BUSY 
-REJ_CMD        	0	1	1	BUSY21	BUSY 
-REJ_CMD        	1	0	0	BUSY19	BUSY
-REJ_CMD        	1	0	1	BUSY20	BUSY
-REJ_CMD        	1	1	0	BUSY21	BUSY 
-REJ_CMD        	1	1	1	BUSY21	BUSY 
-DISC_CMD       	0	0	0	SH4	ADM
-DISC_CMD       	0	0	1	SH4	ADM
-DISC_CMD       	0	1	0	SH4	ADM
-DISC_CMD       	0	1	1	SH4	ADM
-DISC_CMD       	1	0	0	SH4	ADM
-DISC_CMD       	1	0	1	SH4	ADM
-DISC_CMD       	1	1	0	SH4	ADM
-DISC_CMD       	1	1	1	SH4	ADM
-SABME_CMD      	0	0	0	SH3	RESET_CHECK
-SABME_CMD      	0	0	1	SH3	RESET_CHECK
-SABME_CMD      	0	1	0	SH3	RESET_CHECK
-SABME_CMD      	0	1	1	SH3	RESET_CHECK
-SABME_CMD      	1	0	0	SH3	RESET_CHECK
-SABME_CMD      	1	0	1	SH3	RESET_CHECK
-SABME_CMD      	1	1	0	SH3	RESET_CHECK
-SABME_CMD      	1	1	1	SH3	RESET_CHECK
-I_RSP          	0	0	0	BUSY13	BUSY
-I_RSP          	0	0	1	BUSY14	BUSY
-I_RSP          	0	1	0	SH10	ERROR
-I_RSP          	0	1	1	BUSY13	BUSY
-I_RSP          	1	0	0	BUSY9	BUSY
-I_RSP          	1	0	1	BUSY10	BUSY
-I_RSP          	1	1	0	SH10	ERROR
-I_RSP          	1	1	1	BUSY9	BUSY
-RR_RSP         	0	0	0	BUSY15	BUSY
-RR_RSP         	0	0	1	BUSY15	BUSY
-RR_RSP         	0	1	0	SH10	ERROR
-RR_RSP         	0	1	1	BUSY15	BUSY
-RR_RSP         	1	0	0	BUSY15	BUSY
-RR_RSP         	1	0	1	BUSY15	BUSY
-RR_RSP         	1	1	0	SH10	ERROR
-RR_RSP         	1	1	1	BUSY15	BUSY
-RNR_RSP        	0	0	0	BUSY17	BUSY
-RNR_RSP        	0	0	1	BUSY17	BUSY
-RNR_RSP        	0	1	0	SH10	ERROR
-RNR_RSP        	0	1	1	BUSY17	BUSY
-RNR_RSP        	1	0	0	BUSY17	BUSY
-RNR_RSP        	1	0	1	BUSY17	BUSY
-RNR_RSP        	1	1	0	SH10	ERROR
-RNR_RSP        	1	1	1	BUSY17	BUSY
-REJ_RSP        	0	0	0	BUSY19	BUSY
-REJ_RSP        	0	0	1	BUSY20	BUSY
-REJ_RSP        	0	1	0	SH10	ERROR
-REJ_RSP        	0	1	1	BUSY19	BUSY
-REJ_RSP        	1	0	0	BUSY19	BUSY
-REJ_RSP        	1	0	1	BUSY20	BUSY
-REJ_RSP        	1	1	0	SH10	ERROR
-REJ_RSP        	1	1	1	BUSY19	BUSY
-UA_RSP         	0	0	0	SH9	ERROR
-UA_RSP         	0	0	1	SH9	ERROR
-UA_RSP         	0	1	0	SH9	ERROR
-UA_RSP         	0	1	1	SH9	ERROR
-UA_RSP         	1	0	0	SH9	ERROR
-UA_RSP         	1	0	1	SH9	ERROR
-UA_RSP         	1	1	0	SH9	ERROR
-UA_RSP         	1	1	1	SH9	ERROR
-DM_RSP         	0	0	0	SH6	ADM
-DM_RSP         	0	0	1	SH6	ADM
-DM_RSP         	0	1	0	SH6	ADM
-DM_RSP         	0	1	1	SH6	ADM
-DM_RSP         	1	0	0	SH6	ADM
-DM_RSP         	1	0	1	SH6	ADM
-DM_RSP         	1	1	0	SH6	ADM
-DM_RSP         	1	1	1	SH6	ADM
-FRMR_RSP       	0	0	0	SH5	RESET_WAIT
-FRMR_RSP       	0	0	1	SH5	RESET_WAIT
-FRMR_RSP       	0	1	0	SH5	RESET_WAIT
-FRMR_RSP       	0	1	1	SH5	RESET_WAIT
-FRMR_RSP       	1	0	0	SH5	RESET_WAIT
-FRMR_RSP       	1	0	1	SH5	RESET_WAIT
-FRMR_RSP       	1	1	0	SH5	RESET_WAIT
-FRMR_RSP       	1	1	1	SH5	RESET_WAIT
-BAD_FRAME      	0	0	0	SH7	ERROR
-BAD_FRAME      	0	0	1	SH7	ERROR
-BAD_FRAME      	0	1	0	SH7	ERROR
-BAD_FRAME      	0	1	1	SH7	ERROR
-BAD_FRAME      	1	0	0	SH7	ERROR
-BAD_FRAME      	1	0	1	SH7	ERROR
-BAD_FRAME      	1	1	0	SH7	ERROR
-BAD_FRAME      	1	1	1	SH7	ERROR
-;
-;112 entries in table, 8 modified by tredit4 SABME_CMD x x x SH3 RESET_CHECK
-;112 entries in table, 8 modified by tredit4 DISC_CMD x x x SH4 ADM
-;112 entries in table, 8 modified by tredit4 FRMR_RSP x x x SH5 RESET_WAIT
-;112 entries in table, 8 modified by tredit4 DM_RSP x x x SH6 ADM
-;112 entries in table, 8 modified by tredit4 BAD_FRAME x x x SH7 ERROR
-;112 entries in table, 8 modified by tredit4 UA_RSP x x x SH9 ERROR
-;112 entries in table, 8 modified by tredit4 anyrsp x 1 0 SH10 ERROR
-;112 entries in table, 1 modified by tredit4 I_RSP 1 0 0 BUSY9 BUSY
-;112 entries in table, 1 modified by tredit4 I_RSP 1 1 1 BUSY9 BUSY
-;112 entries in table, 1 modified by tredit4 I_CMD 1 0 0 BUSY9 BUSY
-;112 entries in table, 1 modified by tredit4 I_RSP 1 0 1 BUSY10 BUSY
-;112 entries in table, 1 modified by tredit4 I_CMD 1 0 1 BUSY10 BUSY
-;112 entries in table, 2 modified by tredit4 I_CMD 1 1 x BUSY11 BUSY
-;112 entries in table, 2 modified by tredit4 I_CMD x 1 x BUSY12 BUSY
-;112 entries in table, 1 modified by tredit4 I_RSP x 0 0 BUSY13 BUSY
-;112 entries in table, 1 modified by tredit4 I_RSP x 1 1 BUSY13 BUSY
-;112 entries in table, 1 modified by tredit4 I_CMD x 0 0 BUSY13 BUSY
-;112 entries in table, 1 modified by tredit4 I_RSP x 0 1 BUSY14 BUSY
-;112 entries in table, 1 modified by tredit4 I_CMD x 0 1 BUSY14 BUSY
-;112 entries in table, 4 modified by tredit4 RR_CMD x 0 x BUSY15 BUSY
-;112 entries in table, 4 modified by tredit4 RR_RSP x 0 x BUSY15 BUSY
-;112 entries in table, 2 modified by tredit4 RR_RSP x 1 1 BUSY15 BUSY
-;112 entries in table, 4 modified by tredit4 RR_CMD x 1 x BUSY16 BUSY
-;112 entries in table, 4 modified by tredit4 RNR_CMD x 0 x BUSY17 BUSY
-;112 entries in table, 4 modified by tredit4 RNR_RSP x 0 x BUSY17 BUSY
-;112 entries in table, 2 modified by tredit4 RNR_RSP x 1 1 BUSY17 BUSY
-;112 entries in table, 4 modified by tredit4 RNR_CMD x 1 x BUSY18 BUSY
-;112 entries in table, 2 modified by tredit4 REJ_CMD x 0 0 BUSY19 BUSY
-;112 entries in table, 2 modified by tredit4 REJ_RSP x 0 0 BUSY19 BUSY
-;112 entries in table, 2 modified by tredit4 REJ_RSP x 1 1 BUSY19 BUSY
-;112 entries in table, 2 modified by tredit4 REJ_CMD x 0 1 BUSY20 BUSY
-;112 entries in table, 2 modified by tredit4 REJ_RSP x 0 1 BUSY20 BUSY
-;112 entries in table, 4 modified by tredit4 REJ_CMD x 1 x BUSY21 BUSY
-;
-TABLE REJECT
-;Transition table for the REJECT state:
-;
-;frame type   uexpect   p bit     p_flag    
-;received     N(S)      in frame            
-;
-I_CMD          	0	0	0	REJECT7		REJECT
-I_CMD          	0	0	1	REJECT8		REJECT
-I_CMD          	0	1	0	REJECT9		REJECT
-I_CMD          	0	1	1	REJECT9		REJECT
-I_CMD          	1	0	0	REJECT5		REJECT
-I_CMD          	1	0	1	REJECT5		REJECT
-I_CMD          	1	1	0	REJECT6		REJECT
-I_CMD          	1	1	1	REJECT6		REJECT
-RR_CMD         	0	0	0	REJECT10	REJECT
-RR_CMD         	0	0	1	REJECT10	REJECT
-RR_CMD         	0	1	0	REJECT11	REJECT
-RR_CMD         	0	1	1	REJECT11	REJECT
-RR_CMD         	1	0	0	REJECT10	REJECT
-RR_CMD         	1	0	1	REJECT10	REJECT
-RR_CMD         	1	1	0	REJECT11	REJECT
-RR_CMD         	1	1	1	REJECT11	REJECT
-RNR_CMD        	0	0	0	REJECT12	REJECT
-RNR_CMD        	0	0	1	REJECT12	REJECT
-RNR_CMD        	0	1	0	REJECT13	REJECT
-RNR_CMD        	0	1	1	REJECT13	REJECT
-RNR_CMD        	1	0	0	REJECT12	REJECT
-RNR_CMD        	1	0	1	REJECT12	REJECT
-RNR_CMD        	1	1	0	REJECT13	REJECT
-RNR_CMD        	1	1	1	REJECT13	REJECT
-REJ_CMD        	0	0	0	REJECT14	REJECT
-REJ_CMD        	0	0	1	REJECT15	REJECT
-REJ_CMD        	0	1	0	REJECT16	REJECT 
-REJ_CMD        	0	1	1	REJECT16	REJECT 
-REJ_CMD        	1	0	0	REJECT14	REJECT
-REJ_CMD        	1	0	1	REJECT15	REJECT
-REJ_CMD        	1	1	0	REJECT16	REJECT 
-REJ_CMD        	1	1	1	REJECT16	REJECT 
-DISC_CMD       	0	0	0	SH4		ADM
-DISC_CMD       	0	0	1	SH4		ADM
-DISC_CMD       	0	1	0	SH4		ADM
-DISC_CMD       	0	1	1	SH4		ADM
-DISC_CMD       	1	0	0	SH4		ADM
-DISC_CMD       	1	0	1	SH4		ADM
-DISC_CMD       	1	1	0	SH4		ADM
-DISC_CMD       	1	1	1	SH4		ADM
-SABME_CMD      	0	0	0	SH3		RESET_CHECK
-SABME_CMD      	0	0	1	SH3		RESET_CHECK
-SABME_CMD      	0	1	0	SH3		RESET_CHECK
-SABME_CMD      	0	1	1	SH3		RESET_CHECK
-SABME_CMD      	1	0	0	SH3		RESET_CHECK
-SABME_CMD      	1	0	1	SH3		RESET_CHECK
-SABME_CMD      	1	1	0	SH3		RESET_CHECK
-SABME_CMD      	1	1	1	SH3		RESET_CHECK
-I_RSP          	0	0	0	REJECT7		REJECT
-I_RSP          	0	0	1	REJECT8		REJECT
-I_RSP          	0	1	0	SH10		ERROR
-I_RSP          	0	1	1	REJECT7		REJECT
-I_RSP          	1	0	0	REJECT5		REJECT
-I_RSP          	1	0	1	REJECT5		REJECT
-I_RSP          	1	1	0	SH10		ERROR
-I_RSP          	1	1	1	REJECT5		REJECT
-RR_RSP         	0	0	0	REJECT10	REJECT
-RR_RSP         	0	0	1	REJECT10	REJECT
-RR_RSP         	0	1	0	SH10		ERROR
-RR_RSP         	0	1	1	REJECT10	REJECT
-RR_RSP         	1	0	0	REJECT10	REJECT
-RR_RSP         	1	0	1	REJECT10	REJECT
-RR_RSP         	1	1	0	SH10		ERROR
-RR_RSP         	1	1	1	REJECT10	REJECT
-RNR_RSP        	0	0	0	REJECT12	REJECT
-RNR_RSP        	0	0	1	REJECT12	REJECT
-RNR_RSP        	0	1	0	SH10		ERROR
-RNR_RSP        	0	1	1	REJECT12	REJECT
-RNR_RSP        	1	0	0	REJECT12	REJECT
-RNR_RSP        	1	0	1	REJECT12	REJECT
-RNR_RSP        	1	1	0	SH10		ERROR
-RNR_RSP        	1	1	1	REJECT12	REJECT
-REJ_RSP        	0	0	0	REJECT14	REJECT
-REJ_RSP        	0	0	1	REJECT15	REJECT
-REJ_RSP        	0	1	0	SH10		ERROR
-REJ_RSP        	0	1	1	REJECT14	REJECT
-REJ_RSP        	1	0	0	REJECT14	REJECT
-REJ_RSP        	1	0	1	REJECT15	REJECT
-REJ_RSP        	1	1	0	SH10		ERROR
-REJ_RSP        	1	1	1	REJECT14	REJECT
-UA_RSP         	0	0	0	SH9		ERROR
-UA_RSP         	0	0	1	SH9		ERROR
-UA_RSP         	0	1	0	SH9		ERROR
-UA_RSP         	0	1	1	SH9		ERROR
-UA_RSP         	1	0	0	SH9		ERROR
-UA_RSP         	1	0	1	SH9		ERROR
-UA_RSP         	1	1	0	SH9		ERROR
-UA_RSP         	1	1	1	SH9		ERROR
-DM_RSP         	0	0	0	SH6		ADM
-DM_RSP         	0	0	1	SH6		ADM
-DM_RSP         	0	1	0	SH6		ADM
-DM_RSP         	0	1	1	SH6		ADM
-DM_RSP         	1	0	0	SH6		ADM
-DM_RSP         	1	0	1	SH6		ADM
-DM_RSP         	1	1	0	SH6		ADM
-DM_RSP         	1	1	1	SH6		ADM
-FRMR_RSP       	0	0	0	SH5		RESET_WAIT
-FRMR_RSP       	0	0	1	SH5		RESET_WAIT
-FRMR_RSP       	0	1	0	SH5		RESET_WAIT
-FRMR_RSP       	0	1	1	SH5		RESET_WAIT
-FRMR_RSP       	1	0	0	SH5		RESET_WAIT
-FRMR_RSP       	1	0	1	SH5		RESET_WAIT
-FRMR_RSP       	1	1	0	SH5		RESET_WAIT
-FRMR_RSP       	1	1	1	SH5		RESET_WAIT
-BAD_FRAME      	0	0	0	SH7		ERROR
-BAD_FRAME      	0	0	1	SH7		ERROR
-BAD_FRAME      	0	1	0	SH7		ERROR
-BAD_FRAME      	0	1	1	SH7		ERROR
-BAD_FRAME      	1	0	0	SH7		ERROR
-BAD_FRAME      	1	0	1	SH7		ERROR
-BAD_FRAME      	1	1	0	SH7		ERROR
-BAD_FRAME      	1	1	1	SH7		ERROR
-;
-;112 entries in table, 8 modified by tredit4 SABME_CMD x x x SH3 RESET_CHECK
-;112 entries in table, 8 modified by tredit4 DISC_CMD x x x SH4 ADM
-;112 entries in table, 8 modified by tredit4 FRMR_RSP x x x SH5 RESET_WAIT
-;112 entries in table, 8 modified by tredit4 DM_RSP x x x SH6 ADM
-;112 entries in table, 8 modified by tredit4 BAD_FRAME x x x SH7 ERROR
-;112 entries in table, 8 modified by tredit4 UA_RSP x x x SH9 ERROR
-;112 entries in table, 8 modified by tredit4 anyrsp x 1 0 SH10 ERROR
-;112 entries in table, 2 modified by tredit4 I_CMD 1 0 x REJECT5 REJECT
-;112 entries in table, 2 modified by tredit4 I_RSP 1 0 x REJECT5 REJECT
-;112 entries in table, 1 modified by tredit4 I_RSP 1 1 1 REJECT5 REJECT
-;112 entries in table, 2 modified by tredit4 I_CMD 1 1 x REJECT6 REJECT
-;112 entries in table, 1 modified by tredit4 I_RSP x 1 1 REJECT7 REJECT
-;112 entries in table, 1 modified by tredit4 I_RSP x 0 0 REJECT7 REJECT
-;112 entries in table, 1 modified by tredit4 I_CMD x 0 0 REJECT7 REJECT
-;112 entries in table, 1 modified by tredit4 I_RSP x 0 1 REJECT8 REJECT
-;112 entries in table, 1 modified by tredit4 I_CMD x 0 1 REJECT8 REJECT
-;112 entries in table, 2 modified by tredit4 I_CMD x 1 x REJECT9 REJECT
-;112 entries in table, 4 modified by tredit4 RR_CMD x 0 x REJECT10 REJECT
-;112 entries in table, 4 modified by tredit4 RR_RSP x 0 x REJECT10 REJECT
-;112 entries in table, 2 modified by tredit4 RR_RSP x 1 1 REJECT10 REJECT
-;112 entries in table, 4 modified by tredit4 RR_CMD x 1 x REJECT11 REJECT
-;112 entries in table, 4 modified by tredit4 RNR_CMD x 0 x REJECT12 REJECT
-;112 entries in table, 4 modified by tredit4 RNR_RSP x 0 x REJECT12 REJECT
-;112 entries in table, 2 modified by tredit4 RNR_RSP x 1 1 REJECT12 REJECT
-;112 entries in table, 4 modified by tredit4 RNR_CMD x 1 x REJECT13 REJECT
-;112 entries in table, 2 modified by tredit4 REJ_CMD x 0 0 REJECT14 REJECT
-;112 entries in table, 2 modified by tredit4 REJ_RSP x 0 0 REJECT14 REJECT
-;112 entries in table, 2 modified by tredit4 REJ_RSP x 1 1 REJECT14 REJECT
-;112 entries in table, 2 modified by tredit4 REJ_CMD x 0 1 REJECT15 REJECT
-;112 entries in table, 2 modified by tredit4 REJ_RSP x 0 1 REJECT15 REJECT
-;112 entries in table, 4 modified by tredit4 REJ_CMD x 1 x REJECT16 REJECT
-;
-TABLE AWAIT
-;Transition table for the AWAIT state:
-;
-;frame type   uexpect   p bit     p_flag    
-;received     N(S)      in frame            
-;
-I_CMD          	0	0	0	AWAIT6	AWAIT
-I_CMD          	0	0	1	AWAIT6	AWAIT
-I_CMD          	0	1	0	AWAIT7	AWAIT
-I_CMD          	0	1	1	AWAIT7	AWAIT
-I_CMD          	1	0	0	AWAIT3	AWAIT_REJECT
-I_CMD          	1	0	1	AWAIT3	AWAIT_REJECT
-I_CMD          	1	1	0	AWAIT4	AWAIT_REJECT
-I_CMD          	1	1	1	AWAIT4	AWAIT_REJECT
-RR_CMD         	0	0	0	AWAIT9	AWAIT
-RR_CMD         	0	0	1	AWAIT9	AWAIT
-RR_CMD         	0	1	0	AWAIT10	AWAIT
-RR_CMD         	0	1	1	AWAIT10	AWAIT
-RR_CMD         	1	0	0	AWAIT9	AWAIT
-RR_CMD         	1	0	1	AWAIT9	AWAIT
-RR_CMD         	1	1	0	AWAIT10	AWAIT
-RR_CMD         	1	1	1	AWAIT10	AWAIT
-RNR_CMD        	0	0	0	AWAIT12	AWAIT
-RNR_CMD        	0	0	1	AWAIT12	AWAIT
-RNR_CMD        	0	1	0	AWAIT13	AWAIT 
-RNR_CMD        	0	1	1	AWAIT13	AWAIT 
-RNR_CMD        	1	0	0	AWAIT12	AWAIT
-RNR_CMD        	1	0	1	AWAIT12	AWAIT
-RNR_CMD        	1	1	0	AWAIT13	AWAIT 
-RNR_CMD        	1	1	1	AWAIT13	AWAIT 
-REJ_CMD        	0	0	0	AWAIT9	AWAIT
-REJ_CMD        	0	0	1	AWAIT9	AWAIT
-REJ_CMD        	0	1	0	AWAIT10	AWAIT
-REJ_CMD        	0	1	1	AWAIT10	AWAIT
-REJ_CMD        	1	0	0	AWAIT9	AWAIT
-REJ_CMD        	1	0	1	AWAIT9	AWAIT
-REJ_CMD        	1	1	0	AWAIT10	AWAIT
-REJ_CMD        	1	1	1	AWAIT10	AWAIT
-DISC_CMD       	0	0	0	SH4	ADM
-DISC_CMD       	0	0	1	SH4	ADM
-DISC_CMD       	0	1	0	SH4	ADM
-DISC_CMD       	0	1	1	SH4	ADM
-DISC_CMD       	1	0	0	SH4	ADM
-DISC_CMD       	1	0	1	SH4	ADM
-DISC_CMD       	1	1	0	SH4	ADM
-DISC_CMD       	1	1	1	SH4	ADM
-SABME_CMD      	0	0	0	SH3	RESET_CHECK
-SABME_CMD      	0	0	1	SH3	RESET_CHECK
-SABME_CMD      	0	1	0	SH3	RESET_CHECK
-SABME_CMD      	0	1	1	SH3	RESET_CHECK
-SABME_CMD      	1	0	0	SH3	RESET_CHECK
-SABME_CMD      	1	0	1	SH3	RESET_CHECK
-SABME_CMD      	1	1	0	SH3	RESET_CHECK
-SABME_CMD      	1	1	1	SH3	RESET_CHECK
-I_RSP          	0	0	0	AWAIT6	AWAIT
-I_RSP          	0	0	1	AWAIT6	AWAIT
-I_RSP          	0	1	0	SH10	ERROR
-I_RSP          	0	1	1	AWAIT5	NORMAL
-I_RSP          	1	0	0	AWAIT3	AWAIT_REJECT
-I_RSP          	1	0	1	AWAIT3	AWAIT_REJECT
-I_RSP          	1	1	0	SH10	ERROR
-I_RSP          	1	1	1	AWAIT2	REJECT
-RR_RSP         	0	0	0	AWAIT9	AWAIT
-RR_RSP         	0	0	1	AWAIT9	AWAIT
-RR_RSP         	0	1	0	SH10	ERROR
-RR_RSP         	0	1	1	AWAIT8	AWAIT
-RR_RSP         	1	0	0	AWAIT9	AWAIT
-RR_RSP         	1	0	1	AWAIT9	AWAIT
-RR_RSP         	1	1	0	SH10	ERROR
-RR_RSP         	1	1	1	AWAIT8	AWAIT
-RNR_RSP        	0	0	0	AWAIT12	AWAIT
-RNR_RSP        	0	0	1	AWAIT12	AWAIT
-RNR_RSP        	0	1	0	SH10	ERROR
-RNR_RSP        	0	1	1	AWAIT11	AWAIT
-RNR_RSP        	1	0	0	AWAIT12	AWAIT
-RNR_RSP        	1	0	1	AWAIT12	AWAIT
-RNR_RSP        	1	1	0	SH10	ERROR
-RNR_RSP        	1	1	1	AWAIT11	AWAIT
-REJ_RSP        	0	0	0	AWAIT9	AWAIT
-REJ_RSP        	0	0	1	AWAIT9	AWAIT
-REJ_RSP        	0	1	0	SH10	ERROR
-REJ_RSP        	0	1	1	AWAIT8	AWAIT
-REJ_RSP        	1	0	0	AWAIT9	AWAIT
-REJ_RSP        	1	0	1	AWAIT9	AWAIT
-REJ_RSP        	1	1	0	SH10	ERROR
-REJ_RSP        	1	1	1	AWAIT8	AWAIT
-UA_RSP         	0	0	0	SH9	ERROR
-UA_RSP         	0	0	1	SH9	ERROR
-UA_RSP         	0	1	0	SH9	ERROR
-UA_RSP         	0	1	1	SH9	ERROR
-UA_RSP         	1	0	0	SH9	ERROR
-UA_RSP         	1	0	1	SH9	ERROR
-UA_RSP         	1	1	0	SH9	ERROR
-UA_RSP         	1	1	1	SH9	ERROR
-DM_RSP         	0	0	0	SH6	ADM
-DM_RSP         	0	0	1	SH6	ADM
-DM_RSP         	0	1	0	SH6	ADM
-DM_RSP         	0	1	1	SH6	ADM
-DM_RSP         	1	0	0	SH6	ADM
-DM_RSP         	1	0	1	SH6	ADM
-DM_RSP         	1	1	0	SH6	ADM
-DM_RSP         	1	1	1	SH6	ADM
-FRMR_RSP       	0	0	0	SH5	RESET_WAIT
-FRMR_RSP       	0	0	1	SH5	RESET_WAIT
-FRMR_RSP       	0	1	0	SH5	RESET_WAIT
-FRMR_RSP       	0	1	1	SH5	RESET_WAIT
-FRMR_RSP       	1	0	0	SH5	RESET_WAIT
-FRMR_RSP       	1	0	1	SH5	RESET_WAIT
-FRMR_RSP       	1	1	0	SH5	RESET_WAIT
-FRMR_RSP       	1	1	1	SH5	RESET_WAIT
-BAD_FRAME      	0	0	0	SH7	ERROR
-BAD_FRAME      	0	0	1	SH7	ERROR
-BAD_FRAME      	0	1	0	SH7	ERROR
-BAD_FRAME      	0	1	1	SH7	ERROR
-BAD_FRAME      	1	0	0	SH7	ERROR
-BAD_FRAME      	1	0	1	SH7	ERROR
-BAD_FRAME      	1	1	0	SH7	ERROR
-BAD_FRAME      	1	1	1	SH7	ERROR
-;
-;112 entries in table, 8 modified by tredit4 SABME_CMD x x x SH3 RESET_CHECK
-;112 entries in table, 8 modified by tredit4 DISC_CMD x x x SH4 ADM
-;112 entries in table, 8 modified by tredit4 FRMR_RSP x x x SH5 RESET_WAIT
-;112 entries in table, 8 modified by tredit4 DM_RSP x x x SH6 ADM
-;112 entries in table, 8 modified by tredit4 BAD_FRAME x x x SH7 ERROR
-;112 entries in table, 8 modified by tredit4 UA_RSP x x x SH9 ERROR
-;112 entries in table, 8 modified by tredit4 anyrsp x 1 0 SH10 ERROR
-;112 entries in table, 1 modified by tredit4 I_RSP 1 1 x AWAIT2 REJECT
-;112 entries in table, 2 modified by tredit4 I_CMD 1 0 x AWAIT3 AWAIT_REJECT
-;112 entries in table, 2 modified by tredit4 I_RSP 1 0 x AWAIT3 AWAIT_REJECT
-;112 entries in table, 2 modified by tredit4 I_CMD 1 1 x AWAIT4 AWAIT_REJECT
-;112 entries in table, 1 modified by tredit4 I_RSP x 1 x AWAIT5 NORMAL
-;112 entries in table, 2 modified by tredit4 I_RSP x 0 x AWAIT6 AWAIT
-;112 entries in table, 2 modified by tredit4 I_CMD x 0 x AWAIT6 AWAIT
-;112 entries in table, 2 modified by tredit4 I_CMD x 1 x AWAIT7 AWAIT
-;112 entries in table, 2 modified by tredit4 RR_RSP x 1 x AWAIT8 AWAIT
-;112 entries in table, 2 modified by tredit4 REJ_RSP x 1 x AWAIT8 AWAIT
-;112 entries in table, 4 modified by tredit4 RR_CMD x 0 x AWAIT9 AWAIT
-;112 entries in table, 4 modified by tredit4 RR_RSP x 0 x AWAIT9 AWAIT
-;112 entries in table, 4 modified by tredit4 REJ_CMD x 0 x AWAIT9 AWAIT
-;112 entries in table, 4 modified by tredit4 REJ_RSP x 0 x AWAIT9 AWAIT
-;112 entries in table, 4 modified by tredit4 RR_CMD x 1 x AWAIT10 AWAIT
-;112 entries in table, 4 modified by tredit4 REJ_CMD x 1 x AWAIT10 AWAIT
-;112 entries in table, 2 modified by tredit4 RNR_RSP x 1 x AWAIT11 AWAIT
-;112 entries in table, 4 modified by tredit4 RNR_CMD x 0 x AWAIT12 AWAIT
-;112 entries in table, 4 modified by tredit4 RNR_RSP x 0 x AWAIT12 AWAIT
-;112 entries in table, 4 modified by tredit4 RNR_CMD x 1 x AWAIT13 AWAIT
-;
-TABLE AWAIT_BUSY
-;Transition table for the AWAIT_BUSY state:
-;
-;frame type   uexpect   p bit     p_flag    
-;received     N(S)      in frame            
-;
-I_CMD          	0	0	0	AWAIT_BUSY8	AWAIT_BUSY
-I_CMD          	0	0	1	AWAIT_BUSY8	AWAIT_BUSY
-I_CMD          	0	1	0	AWAIT_BUSY9	AWAIT_BUSY
-I_CMD          	0	1	1	AWAIT_BUSY9	AWAIT_BUSY
-I_CMD          	1	0	0	AWAIT_BUSY5	AWAIT_BUSY
-I_CMD          	1	0	1	AWAIT_BUSY5	AWAIT_BUSY
-I_CMD          	1	1	0	AWAIT_BUSY6	AWAIT_BUSY
-I_CMD          	1	1	1	AWAIT_BUSY6	AWAIT_BUSY
-RR_CMD         	0	0	0	AWAIT_BUSY11	AWAIT_BUSY
-RR_CMD         	0	0	1	AWAIT_BUSY11	AWAIT_BUSY
-RR_CMD         	0	1	0	AWAIT_BUSY12	AWAIT_BUSY
-RR_CMD         	0	1	1	AWAIT_BUSY12	AWAIT_BUSY
-RR_CMD         	1	0	0	AWAIT_BUSY11	AWAIT_BUSY
-RR_CMD         	1	0	1	AWAIT_BUSY11	AWAIT_BUSY
-RR_CMD         	1	1	0	AWAIT_BUSY12	AWAIT_BUSY
-RR_CMD         	1	1	1	AWAIT_BUSY12	AWAIT_BUSY
-RNR_CMD        	0	0	0	AWAIT_BUSY14	AWAIT_BUSY
-RNR_CMD        	0	0	1	AWAIT_BUSY14	AWAIT_BUSY
-RNR_CMD        	0	1	0	AWAIT_BUSY15	AWAIT_BUSY 
-RNR_CMD        	0	1	1	AWAIT_BUSY15	AWAIT_BUSY 
-RNR_CMD        	1	0	0	AWAIT_BUSY14	AWAIT_BUSY
-RNR_CMD        	1	0	1	AWAIT_BUSY14	AWAIT_BUSY
-RNR_CMD        	1	1	0	AWAIT_BUSY15	AWAIT_BUSY 
-RNR_CMD        	1	1	1	AWAIT_BUSY15	AWAIT_BUSY 
-REJ_CMD        	0	0	0	AWAIT_BUSY11	AWAIT_BUSY
-REJ_CMD        	0	0	1	AWAIT_BUSY11	AWAIT_BUSY
-REJ_CMD        	0	1	0	AWAIT_BUSY12	AWAIT_BUSY
-REJ_CMD        	0	1	1	AWAIT_BUSY12	AWAIT_BUSY
-REJ_CMD        	1	0	0	AWAIT_BUSY11	AWAIT_BUSY
-REJ_CMD        	1	0	1	AWAIT_BUSY11	AWAIT_BUSY
-REJ_CMD        	1	1	0	AWAIT_BUSY12	AWAIT_BUSY
-REJ_CMD        	1	1	1	AWAIT_BUSY12	AWAIT_BUSY
-DISC_CMD       	0	0	0	SH4		ADM
-DISC_CMD       	0	0	1	SH4		ADM
-DISC_CMD       	0	1	0	SH4		ADM
-DISC_CMD       	0	1	1	SH4		ADM
-DISC_CMD       	1	0	0	SH4		ADM
-DISC_CMD       	1	0	1	SH4		ADM
-DISC_CMD       	1	1	0	SH4		ADM
-DISC_CMD       	1	1	1	SH4		ADM
-SABME_CMD      	0	0	0	SH3		RESET_CHECK
-SABME_CMD      	0	0	1	SH3		RESET_CHECK
-SABME_CMD      	0	1	0	SH3		RESET_CHECK
-SABME_CMD      	0	1	1	SH3		RESET_CHECK
-SABME_CMD      	1	0	0	SH3		RESET_CHECK
-SABME_CMD      	1	0	1	SH3		RESET_CHECK
-SABME_CMD      	1	1	0	SH3		RESET_CHECK
-SABME_CMD      	1	1	1	SH3		RESET_CHECK
-I_RSP          	0	0	0	AWAIT_BUSY8	AWAIT_BUSY
-I_RSP          	0	0	1	AWAIT_BUSY8	AWAIT_BUSY
-I_RSP          	0	1	0	SH10		ERROR
-I_RSP          	0	1	1	AWAIT_BUSY7	BUSY
-I_RSP          	1	0	0	AWAIT_BUSY5	AWAIT_BUSY
-I_RSP          	1	0	1	AWAIT_BUSY5	AWAIT_BUSY
-I_RSP          	1	1	0	SH10		ERROR
-I_RSP          	1	1	1	AWAIT_BUSY4	BUSY
-RR_RSP         	0	0	0	AWAIT_BUSY11	AWAIT_BUSY
-RR_RSP         	0	0	1	AWAIT_BUSY11	AWAIT_BUSY
-RR_RSP         	0	1	0	SH10		ERROR
-RR_RSP         	0	1	1	AWAIT_BUSY10	BUSY
-RR_RSP         	1	0	0	AWAIT_BUSY11	AWAIT_BUSY
-RR_RSP         	1	0	1	AWAIT_BUSY11	AWAIT_BUSY
-RR_RSP         	1	1	0	SH10		ERROR
-RR_RSP         	1	1	1	AWAIT_BUSY10	BUSY
-RNR_RSP        	0	0	0	AWAIT_BUSY14	AWAIT_BUSY
-RNR_RSP        	0	0	1	AWAIT_BUSY14	AWAIT_BUSY
-RNR_RSP        	0	1	0	SH10		ERROR
-RNR_RSP        	0	1	1	AWAIT_BUSY13	BUSY
-RNR_RSP        	1	0	0	AWAIT_BUSY14	AWAIT_BUSY
-RNR_RSP        	1	0	1	AWAIT_BUSY14	AWAIT_BUSY
-RNR_RSP        	1	1	0	SH10		ERROR
-RNR_RSP        	1	1	1	AWAIT_BUSY13	BUSY
-REJ_RSP        	0	0	0	AWAIT_BUSY11	AWAIT_BUSY
-REJ_RSP        	0	0	1	AWAIT_BUSY11	AWAIT_BUSY
-REJ_RSP        	0	1	0	SH10		ERROR
-REJ_RSP        	0	1	1	AWAIT_BUSY10	BUSY
-REJ_RSP        	1	0	0	AWAIT_BUSY11	AWAIT_BUSY
-REJ_RSP        	1	0	1	AWAIT_BUSY11	AWAIT_BUSY
-REJ_RSP        	1	1	0	SH10		ERROR
-REJ_RSP        	1	1	1	AWAIT_BUSY10	BUSY
-UA_RSP         	0	0	0	SH9		ERROR
-UA_RSP         	0	0	1	SH9		ERROR
-UA_RSP         	0	1	0	SH9		ERROR
-UA_RSP         	0	1	1	SH9		ERROR
-UA_RSP         	1	0	0	SH9		ERROR
-UA_RSP         	1	0	1	SH9		ERROR
-UA_RSP         	1	1	0	SH9		ERROR
-UA_RSP         	1	1	1	SH9		ERROR
-DM_RSP         	0	0	0	SH6		ADM
-DM_RSP         	0	0	1	SH6		ADM
-DM_RSP         	0	1	0	SH6		ADM
-DM_RSP         	0	1	1	SH6		ADM
-DM_RSP         	1	0	0	SH6		ADM
-DM_RSP         	1	0	1	SH6		ADM
-DM_RSP         	1	1	0	SH6		ADM
-DM_RSP         	1	1	1	SH6		ADM
-FRMR_RSP       	0	0	0	SH5		RESET_WAIT
-FRMR_RSP       	0	0	1	SH5		RESET_WAIT
-FRMR_RSP       	0	1	0	SH5		RESET_WAIT
-FRMR_RSP       	0	1	1	SH5		RESET_WAIT
-FRMR_RSP       	1	0	0	SH5		RESET_WAIT
-FRMR_RSP       	1	0	1	SH5		RESET_WAIT
-FRMR_RSP       	1	1	0	SH5		RESET_WAIT
-FRMR_RSP       	1	1	1	SH5		RESET_WAIT
-BAD_FRAME      	0	0	0	SH7		ERROR
-BAD_FRAME      	0	0	1	SH7		ERROR
-BAD_FRAME      	0	1	0	SH7		ERROR
-BAD_FRAME      	0	1	1	SH7		ERROR
-BAD_FRAME      	1	0	0	SH7		ERROR
-BAD_FRAME      	1	0	1	SH7		ERROR
-BAD_FRAME      	1	1	0	SH7		ERROR
-BAD_FRAME      	1	1	1	SH7		ERROR
-;
-;112 entries in table, 8 modified by tredit4 SABME_CMD x x x SH3 RESET_CHECK
-;112 entries in table, 8 modified by tredit4 DISC_CMD x x x SH4 ADM
-;112 entries in table, 8 modified by tredit4 FRMR_RSP x x x SH5 RESET_WAIT
-;112 entries in table, 8 modified by tredit4 DM_RSP x x x SH6 ADM
-;112 entries in table, 8 modified by tredit4 BAD_FRAME x x x SH7 ERROR
-;112 entries in table, 8 modified by tredit4 UA_RSP x x x SH9 ERROR
-;112 entries in table, 8 modified by tredit4 anyrsp x 1 0 SH10 ERROR
-;112 entries in table, 1 modified by tredit4 I_RSP 1 1 x AWAIT_BUSY4 BUSY
-;112 entries in table, 2 modified by tredit4 I_CMD 1 0 x AWAIT_BUSY5 AWAIT_BUSY
-;112 entries in table, 2 modified by tredit4 I_RSP 1 0 x AWAIT_BUSY5 AWAIT_BUSY
-;112 entries in table, 2 modified by tredit4 I_CMD 1 1 x AWAIT_BUSY6 AWAIT_BUSY
-;112 entries in table, 1 modified by tredit4 I_RSP x 1 x AWAIT_BUSY7 BUSY
-;112 entries in table, 2 modified by tredit4 I_RSP x 0 x AWAIT_BUSY8 AWAIT_BUSY
-;112 entries in table, 2 modified by tredit4 I_CMD x 0 x AWAIT_BUSY8 AWAIT_BUSY
-;112 entries in table, 2 modified by tredit4 I_CMD x 1 x AWAIT_BUSY9 AWAIT_BUSY
-;112 entries in table, 2 modified by tredit4 RR_RSP x 1 x AWAIT_BUSY10 BUSY
-;112 entries in table, 2 modified by tredit4 REJ_RSP x 1 x AWAIT_BUSY10 BUSY
-;112 entries in table, 4 modified by tredit4 RR_CMD x 0 x AWAIT_BUSY11 AWAIT_BUSY
-;112 entries in table, 4 modified by tredit4 RR_RSP x 0 x AWAIT_BUSY11 AWAIT_BUSY
-;112 entries in table, 4 modified by tredit4 REJ_CMD x 0 x AWAIT_BUSY11 AWAIT_BUSY
-;112 entries in table, 4 modified by tredit4 REJ_RSP x 0 x AWAIT_BUSY11 AWAIT_BUSY
-;112 entries in table, 4 modified by tredit4 RR_CMD x 1 x AWAIT_BUSY12 AWAIT_BUSY
-;112 entries in table, 4 modified by tredit4 REJ_CMD x 1 x AWAIT_BUSY12 AWAIT_BUSY
-;112 entries in table, 2 modified by tredit4 RNR_RSP x 1 x AWAIT_BUSY13 BUSY
-;112 entries in table, 4 modified by tredit4 RNR_CMD x 0 x AWAIT_BUSY14 AWAIT_BUSY
-;112 entries in table, 4 modified by tredit4 RNR_RSP x 0 x AWAIT_BUSY14 AWAIT_BUSY
-;112 entries in table, 4 modified by tredit4 RNR_CMD x 1 x AWAIT_BUSY15 AWAIT_BUSY
-;
-TABLE AWAIT_REJECT
-;Transition table for the AWAIT_REJECT state:
-;
-;frame type   uexpect   p bit     p_flag    
-;received     N(S)      in frame            
-;
-I_CMD          	0	0	0	AWAIT_REJECT5	AWAIT
-I_CMD          	0	0	1	AWAIT_REJECT5	AWAIT
-I_CMD          	0	1	0	AWAIT_REJECT6	AWAIT
-I_CMD          	0	1	1	AWAIT_REJECT6	AWAIT
-I_CMD          	1	0	0	AWAIT_REJECT2	AWAIT_REJECT
-I_CMD          	1	0	1	AWAIT_REJECT2	AWAIT_REJECT
-I_CMD          	1	1	0	AWAIT_REJECT3	AWAIT_REJECT
-I_CMD          	1	1	1	AWAIT_REJECT3	AWAIT_REJECT
-RR_CMD         	0	0	0	AWAIT_REJECT8	AWAIT_REJECT
-RR_CMD         	0	0	1	AWAIT_REJECT8	AWAIT_REJECT
-RR_CMD         	0	1	0	AWAIT_REJECT9	AWAIT_REJECT
-RR_CMD         	0	1	1	AWAIT_REJECT9	AWAIT_REJECT
-RR_CMD         	1	0	0	AWAIT_REJECT8	AWAIT_REJECT
-RR_CMD         	1	0	1	AWAIT_REJECT8	AWAIT_REJECT
-RR_CMD         	1	1	0	AWAIT_REJECT9	AWAIT_REJECT
-RR_CMD         	1	1	1	AWAIT_REJECT9	AWAIT_REJECT
-RNR_CMD        	0	0	0	AWAIT_REJECT11	AWAIT_REJECT
-RNR_CMD        	0	0	1	AWAIT_REJECT11	AWAIT_REJECT
-RNR_CMD        	0	1	0	AWAIT_REJECT12	AWAIT_REJECT
-RNR_CMD        	0	1	1	AWAIT_REJECT12	AWAIT_REJECT
-RNR_CMD        	1	0	0	AWAIT_REJECT11	AWAIT_REJECT
-RNR_CMD        	1	0	1	AWAIT_REJECT11	AWAIT_REJECT
-RNR_CMD        	1	1	0	AWAIT_REJECT12	AWAIT_REJECT
-RNR_CMD        	1	1	1	AWAIT_REJECT12	AWAIT_REJECT
-REJ_CMD        	0	0	0	AWAIT_REJECT8	AWAIT_REJECT
-REJ_CMD        	0	0	1	AWAIT_REJECT8	AWAIT_REJECT
-REJ_CMD        	0	1	0	AWAIT_REJECT9	AWAIT_REJECT
-REJ_CMD        	0	1	1	AWAIT_REJECT9	AWAIT_REJECT
-REJ_CMD        	1	0	0	AWAIT_REJECT8	AWAIT_REJECT
-REJ_CMD        	1	0	1	AWAIT_REJECT8	AWAIT_REJECT
-REJ_CMD        	1	1	0	AWAIT_REJECT9	AWAIT_REJECT
-REJ_CMD        	1	1	1	AWAIT_REJECT9	AWAIT_REJECT
-DISC_CMD       	0	0	0	SH4	ADM
-DISC_CMD       	0	0	1	SH4	ADM
-DISC_CMD       	0	1	0	SH4	ADM
-DISC_CMD       	0	1	1	SH4	ADM
-DISC_CMD       	1	0	0	SH4	ADM
-DISC_CMD       	1	0	1	SH4	ADM
-DISC_CMD       	1	1	0	SH4	ADM
-DISC_CMD       	1	1	1	SH4	ADM
-SABME_CMD      	0	0	0	SH3	RESET_CHECK
-SABME_CMD      	0	0	1	SH3	RESET_CHECK
-SABME_CMD      	0	1	0	SH3	RESET_CHECK
-SABME_CMD      	0	1	1	SH3	RESET_CHECK
-SABME_CMD      	1	0	0	SH3	RESET_CHECK
-SABME_CMD      	1	0	1	SH3	RESET_CHECK
-SABME_CMD      	1	1	0	SH3	RESET_CHECK
-SABME_CMD      	1	1	1	SH3	RESET_CHECK
-I_RSP          	0	0	0	AWAIT_REJECT5	AWAIT
-I_RSP          	0	0	1	AWAIT_REJECT5	AWAIT
-I_RSP          	0	1	0	SH10	ERROR
-I_RSP          	0	1	1	AWAIT_REJECT4	NORMAL
-I_RSP          	1	0	0	AWAIT_REJECT2	AWAIT_REJECT
-I_RSP          	1	0	1	AWAIT_REJECT2	AWAIT_REJECT
-I_RSP          	1	1	0	SH10	ERROR
-I_RSP          	1	1	1	AWAIT_REJECT4	NORMAL
-RR_RSP         	0	0	0	AWAIT_REJECT8	AWAIT_REJECT
-RR_RSP         	0	0	1	AWAIT_REJECT8	AWAIT_REJECT
-RR_RSP         	0	1	0	SH10	ERROR
-RR_RSP         	0	1	1	AWAIT_REJECT7	REJECT
-RR_RSP         	1	0	0	AWAIT_REJECT8	AWAIT_REJECT
-RR_RSP         	1	0	1	AWAIT_REJECT8	AWAIT_REJECT
-RR_RSP         	1	1	0	SH10	ERROR
-RR_RSP         	1	1	1	AWAIT_REJECT7	REJECT
-RNR_RSP        	0	0	0	AWAIT_REJECT11	AWAIT_REJECT
-RNR_RSP        	0	0	1	AWAIT_REJECT11	AWAIT_REJECT
-RNR_RSP        	0	1	0	SH10	ERROR
-RNR_RSP        	0	1	1	AWAIT_REJECT10	REJECT
-RNR_RSP        	1	0	0	AWAIT_REJECT11	AWAIT_REJECT
-RNR_RSP        	1	0	1	AWAIT_REJECT11	AWAIT_REJECT
-RNR_RSP        	1	1	0	SH10	ERROR
-RNR_RSP        	1	1	1	AWAIT_REJECT10	REJECT
-REJ_RSP        	0	0	0	AWAIT_REJECT8	AWAIT_REJECT
-REJ_RSP        	0	0	1	AWAIT_REJECT8	AWAIT_REJECT
-REJ_RSP        	0	1	0	SH10	ERROR
-REJ_RSP        	0	1	1	AWAIT_REJECT7	REJECT
-REJ_RSP        	1	0	0	AWAIT_REJECT8	AWAIT_REJECT
-REJ_RSP        	1	0	1	AWAIT_REJECT8	AWAIT_REJECT
-REJ_RSP        	1	1	0	SH10	ERROR
-REJ_RSP        	1	1	1	AWAIT_REJECT7	REJECT
-UA_RSP         	0	0	0	SH9	ERROR
-UA_RSP         	0	0	1	SH9	ERROR
-UA_RSP         	0	1	0	SH9	ERROR
-UA_RSP         	0	1	1	SH9	ERROR
-UA_RSP         	1	0	0	SH9	ERROR
-UA_RSP         	1	0	1	SH9	ERROR
-UA_RSP         	1	1	0	SH9	ERROR
-UA_RSP         	1	1	1	SH9	ERROR
-DM_RSP         	0	0	0	SH6	ADM
-DM_RSP         	0	0	1	SH6	ADM
-DM_RSP         	0	1	0	SH6	ADM
-DM_RSP         	0	1	1	SH6	ADM
-DM_RSP         	1	0	0	SH6	ADM
-DM_RSP         	1	0	1	SH6	ADM
-DM_RSP         	1	1	0	SH6	ADM
-DM_RSP         	1	1	1	SH6	ADM
-FRMR_RSP       	0	0	0	SH5	RESET_WAIT
-FRMR_RSP       	0	0	1	SH5	RESET_WAIT
-FRMR_RSP       	0	1	0	SH5	RESET_WAIT
-FRMR_RSP       	0	1	1	SH5	RESET_WAIT
-FRMR_RSP       	1	0	0	SH5	RESET_WAIT
-FRMR_RSP       	1	0	1	SH5	RESET_WAIT
-FRMR_RSP       	1	1	0	SH5	RESET_WAIT
-FRMR_RSP       	1	1	1	SH5	RESET_WAIT
-BAD_FRAME      	0	0	0	SH7	ERROR
-BAD_FRAME      	0	0	1	SH7	ERROR
-BAD_FRAME      	0	1	0	SH7	ERROR
-BAD_FRAME      	0	1	1	SH7	ERROR
-BAD_FRAME      	1	0	0	SH7	ERROR
-BAD_FRAME      	1	0	1	SH7	ERROR
-BAD_FRAME      	1	1	0	SH7	ERROR
-BAD_FRAME      	1	1	1	SH7	ERROR
-;
-;112 entries in table, 8 modified by tredit4 SABME_CMD x x x SH3 RESET_CHECK
-;112 entries in table, 8 modified by tredit4 DISC_CMD x x x SH4 ADM
-;112 entries in table, 8 modified by tredit4 FRMR_RSP x x x SH5 RESET_WAIT
-;112 entries in table, 8 modified by tredit4 DM_RSP x x x SH6 ADM
-;112 entries in table, 8 modified by tredit4 BAD_FRAME x x x SH7 ERROR
-;112 entries in table, 8 modified by tredit4 UA_RSP x x x SH9 ERROR
-;112 entries in table, 8 modified by tredit4 anyrsp x 1 0 SH10 ERROR
-;112 entries in table, 2 modified by tredit4 I_CMD 1 0 x AWAIT_REJECT2 AWAIT_REJECT
-;112 entries in table, 2 modified by tredit4 I_RSP 1 0 x AWAIT_REJECT2 AWAIT_REJECT
-;112 entries in table, 2 modified by tredit4 I_CMD 1 1 x AWAIT_REJECT3 AWAIT_REJECT
-;112 entries in table, 2 modified by tredit4 I_RSP x 1 x AWAIT_REJECT4 NORMAL
-;112 entries in table, 2 modified by tredit4 I_RSP x 0 x AWAIT_REJECT5 AWAIT
-;112 entries in table, 2 modified by tredit4 I_CMD x 0 x AWAIT_REJECT5 AWAIT
-;112 entries in table, 2 modified by tredit4 I_CMD x 1 x AWAIT_REJECT6 AWAIT
-;112 entries in table, 2 modified by tredit4 RR_RSP x 1 x AWAIT_REJECT7 REJECT
-;112 entries in table, 2 modified by tredit4 REJ_RSP x 1 x AWAIT_REJECT7 REJECT
-;112 entries in table, 0 modified by tredit4 I_RSP 1 1 x AWAIT_REJECT7 REJECT
-;112 entries in table, 4 modified by tredit4 RR_CMD x 0 x AWAIT_REJECT8 AWAIT_REJECT
-;112 entries in table, 4 modified by tredit4 RR_RSP x 0 x AWAIT_REJECT8 AWAIT_REJECT
-;112 entries in table, 4 modified by tredit4 REJ_CMD x 0 x AWAIT_REJECT8 AWAIT_REJECT
-;112 entries in table, 4 modified by tredit4 REJ_RSP x 0 x AWAIT_REJECT8 AWAIT_REJECT
-;112 entries in table, 4 modified by tredit4 RR_CMD x 1 x AWAIT_REJECT9 AWAIT_REJECT
-;112 entries in table, 4 modified by tredit4 REJ_CMD x 1 x AWAIT_REJECT9 AWAIT_REJECT
-;112 entries in table, 2 modified by tredit4 RNR_RSP x 1 x AWAIT_REJECT10 REJECT
-;112 entries in table, 4 modified by tredit4 RNR_CMD x 0 x AWAIT_REJECT11 AWAIT_REJECT
-;112 entries in table, 4 modified by tredit4 RNR_RSP x 0 x AWAIT_REJECT11 AWAIT_REJECT
-;112 entries in table, 4 modified by tredit4 RNR_CMD x 1 x AWAIT_REJECT12 AWAIT_REJECT
-;112 entries in table, 0 modified by tredit4 RNR_CMD x 1 x AWAIT_REJECT15 AWAIT_BUSY
diff -uNr linux/net/802/transit/timertr.h linux-llc/net/802/transit/timertr.h
--- linux/net/802/transit/timertr.h	Mon Jan 12 22:46:27 1998
+++ linux-llc/net/802/transit/timertr.h	Thu Jan  1 01:00:00 1970
@@ -1,157 +0,0 @@
-
-/* this file was generated on Thu Jan  8 00:21:21 GMT 1998  */
-
-
-/* size of transition table is 898 bytes */
-
-static char timertr_entry [ ] = {
-   NOP           , ADM           , NOP           , ADM           , NOP           , ADM           ,
-   NOP           , ADM           , NOP           , ADM           , NOP           , ADM           ,
-   NOP           , ADM           , NOP           , ADM           , NOP           , ADM           ,
-   NOP           , ADM           , NOP           , ADM           , NOP           , ADM           ,
-   NOP           , ADM           , NOP           , ADM           , NOP           , ADM           ,
-   NOP           , ADM           , NOP           , ADM           , NOP           , ADM           ,
-   NOP           , ADM           , NOP           , ADM           , NOP           , ADM           ,
-   NOP           , ADM           , NOP           , ADM           , NOP           , ADM           ,
-   NOP           , ADM           , NOP           , ADM           , NOP           , ADM           ,
-   NOP           , ADM           , NOP           , ADM           , NOP           , ADM           ,
-   NOP           , ADM           , NOP           , ADM           , NOP           , CONN          ,
-   NOP           , CONN          , NOP           , CONN          , NOP           , CONN          ,
-   NOP           , CONN          , NOP           , CONN          , NOP           , CONN          ,
-   NOP           , CONN          , NOP           , CONN          , NOP           , CONN          ,
-   NOP           , CONN          , NOP           , CONN          , NOP           , CONN          ,
-   NOP           , CONN          , NOP           , CONN          , NOP           , CONN          ,
-   NOP           , CONN          , NOP           , CONN          , NOP           , CONN          ,
-   NOP           , CONN          , NOP           , CONN          , NOP           , CONN          ,
-   NOP           , CONN          , NOP           , CONN          , NOP           , CONN          ,
-   NOP           , CONN          , NOP           , CONN          , NOP           , CONN          ,
-   NOP           , CONN          , NOP           , CONN          , NOP           , CONN          ,
-   NOP           , CONN          , NOP           , RESET_WAIT    , NOP           , RESET_WAIT    ,
-   NOP           , RESET_WAIT    , NOP           , RESET_WAIT    , NOP           , RESET_WAIT    ,
-   NOP           , RESET_WAIT    , NOP           , RESET_WAIT    , NOP           , RESET_WAIT    ,
-   NOP           , RESET_WAIT    , NOP           , RESET_WAIT    , NOP           , RESET_WAIT    ,
-   NOP           , RESET_WAIT    , NOP           , RESET_WAIT    , NOP           , RESET_WAIT    ,
-   NOP           , RESET_WAIT    , NOP           , RESET_WAIT    , NOP           , RESET_WAIT    ,
-   NOP           , RESET_WAIT    , NOP           , RESET_WAIT    , NOP           , RESET_WAIT    ,
-   NOP           , RESET_WAIT    , NOP           , RESET_WAIT    , NOP           , RESET_WAIT    ,
-   NOP           , RESET_WAIT    , NOP           , RESET_WAIT    , NOP           , RESET_WAIT    ,
-   NOP           , RESET_WAIT    , NOP           , RESET_WAIT    , NOP           , RESET_WAIT    ,
-   NOP           , RESET_WAIT    , NOP           , RESET_WAIT    , NOP           , RESET_WAIT    ,
-   NOP           , RESET_CHECK   , NOP           , RESET_CHECK   , NOP           , RESET_CHECK   ,
-   NOP           , RESET_CHECK   , NOP           , RESET_CHECK   , NOP           , RESET_CHECK   ,
-   NOP           , RESET_CHECK   , NOP           , RESET_CHECK   , NOP           , RESET_CHECK   ,
-   NOP           , RESET_CHECK   , NOP           , RESET_CHECK   , NOP           , RESET_CHECK   ,
-   NOP           , RESET_CHECK   , NOP           , RESET_CHECK   , NOP           , RESET_CHECK   ,
-   NOP           , RESET_CHECK   , NOP           , RESET_CHECK   , NOP           , RESET_CHECK   ,
-   NOP           , RESET_CHECK   , NOP           , RESET_CHECK   , NOP           , RESET_CHECK   ,
-   NOP           , RESET_CHECK   , NOP           , RESET_CHECK   , NOP           , RESET_CHECK   ,
-   NOP           , RESET_CHECK   , NOP           , RESET_CHECK   , NOP           , RESET_CHECK   ,
-   NOP           , RESET_CHECK   , NOP           , RESET_CHECK   , NOP           , RESET_CHECK   ,
-   NOP           , RESET_CHECK   , NOP           , RESET_CHECK   , SETUP7        , SETUP         ,
-   SETUP7        , SETUP         , SETUP3        , NORMAL        , SETUP3        , NORMAL        ,
-   SETUP8        , ADM           , SETUP8        , ADM           , SETUP3        , NORMAL        ,
-   SETUP3        , NORMAL        , NOP           , SETUP         , NOP           , SETUP         ,
-   NOP           , SETUP         , NOP           , SETUP         , NOP           , SETUP         ,
-   NOP           , SETUP         , NOP           , SETUP         , NOP           , SETUP         ,
-   NOP           , SETUP         , NOP           , SETUP         , NOP           , SETUP         ,
-   NOP           , SETUP         , NOP           , SETUP         , NOP           , SETUP         ,
-   NOP           , SETUP         , NOP           , SETUP         , NOP           , SETUP         ,
-   NOP           , SETUP         , NOP           , SETUP         , NOP           , SETUP         ,
-   NOP           , SETUP         , NOP           , SETUP         , NOP           , SETUP         ,
-   NOP           , SETUP         , RESET7        , RESET         , RESET7        , RESET         ,
-   RESET3        , NORMAL        , RESET3        , NORMAL        , RESET8        , ADM           ,
-   RESET8        , ADM           , RESET3        , NORMAL        , RESET3        , NORMAL        ,
-   NOP           , RESET         , NOP           , RESET         , NOP           , RESET         ,
-   NOP           , RESET         , NOP           , RESET         , NOP           , RESET         ,
-   NOP           , RESET         , NOP           , RESET         , NOP           , RESET         ,
-   NOP           , RESET         , NOP           , RESET         , NOP           , RESET         ,
-   NOP           , RESET         , NOP           , RESET         , NOP           , RESET         ,
-   NOP           , RESET         , NOP           , RESET         , NOP           , RESET         ,
-   NOP           , RESET         , NOP           , RESET         , NOP           , RESET         ,
-   NOP           , RESET         , NOP           , RESET         , NOP           , RESET         ,
-   D_CONN6       , D_CONN        , D_CONN6       , D_CONN        , D_CONN6       , D_CONN        ,
-   D_CONN6       , D_CONN        , D_CONN7       , ADM           , D_CONN7       , ADM           ,
-   D_CONN7       , ADM           , D_CONN7       , ADM           , NOP           , D_CONN        ,
-   NOP           , D_CONN        , NOP           , D_CONN        , NOP           , D_CONN        ,
-   NOP           , D_CONN        , NOP           , D_CONN        , NOP           , D_CONN        ,
-   NOP           , D_CONN        , NOP           , D_CONN        , NOP           , D_CONN        ,
-   NOP           , D_CONN        , NOP           , D_CONN        , NOP           , D_CONN        ,
-   NOP           , D_CONN        , NOP           , D_CONN        , NOP           , D_CONN        ,
-   NOP           , D_CONN        , NOP           , D_CONN        , NOP           , D_CONN        ,
-   NOP           , D_CONN        , NOP           , D_CONN        , NOP           , D_CONN        ,
-   NOP           , D_CONN        , NOP           , D_CONN        , ERR7          , ERROR         ,
-   ERR7          , ERROR         , ERR7          , ERROR         , ERR7          , ERROR         ,
-   ERR8          , RESET_WAIT    , ERR8          , RESET_WAIT    , ERR8          , RESET_WAIT    ,
-   ERR8          , RESET_WAIT    , NOP           , ERROR         , NOP           , ERROR         ,
-   NOP           , ERROR         , NOP           , ERROR         , NOP           , ERROR         ,
-   NOP           , ERROR         , NOP           , ERROR         , NOP           , ERROR         ,
-   NOP           , ERROR         , NOP           , ERROR         , NOP           , ERROR         ,
-   NOP           , ERROR         , NOP           , ERROR         , NOP           , ERROR         ,
-   NOP           , ERROR         , NOP           , ERROR         , NOP           , ERROR         ,
-   NOP           , ERROR         , NOP           , ERROR         , NOP           , ERROR         ,
-   NOP           , ERROR         , NOP           , ERROR         , NOP           , ERROR         ,
-   NOP           , ERROR         , NORMAL20      , AWAIT         , NOP           , NORMAL        ,
-   NORMAL20      , AWAIT         , NOP           , NORMAL        , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   NORMAL19      , NORMAL        , NORMAL19      , NORMAL        , NORMAL19      , NORMAL        ,
-   NORMAL19      , NORMAL        , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , NOP           , NORMAL        ,
-   NOP           , NORMAL        , NOP           , NORMAL        , NOP           , NORMAL        ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , NORMAL20      , AWAIT         , NOP           , NORMAL        ,
-   NORMAL20      , AWAIT         , NOP           , NORMAL        , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   BUSY24        , AWAIT_BUSY    , NOP           , BUSY          , BUSY24        , AWAIT_BUSY    ,
-   NOP           , BUSY          , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , BUSY23        , BUSY          ,
-   BUSY23        , BUSY          , BUSY23        , BUSY          , BUSY23        , BUSY          ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , BUSY25        , BUSY          , BUSY26        , BUSY          ,
-   BUSY25        , BUSY          , BUSY26        , BUSY          , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   NOP           , BUSY          , NOP           , BUSY          , NOP           , BUSY          ,
-   NOP           , BUSY          , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , NOP           , REJECT        ,
-   NOP           , REJECT        , NOP           , REJECT        , NOP           , REJECT        ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , NOP           , REJECT        , NOP           , REJECT        ,
-   NOP           , REJECT        , NOP           , REJECT        , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   NOP           , REJECT        , NOP           , REJECT        , NOP           , REJECT        ,
-   NOP           , REJECT        , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , NOP           , REJECT        ,
-   NOP           , REJECT        , NOP           , REJECT        , NOP           , REJECT        ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , NOP           , AWAIT         , NOP           , AWAIT         ,
-   NOP           , AWAIT         , NOP           , AWAIT         , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   NOP           , AWAIT         , NOP           , AWAIT         , NOP           , AWAIT         ,
-   NOP           , AWAIT         , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , NOP           , AWAIT         ,
-   NOP           , AWAIT         , NOP           , AWAIT         , NOP           , AWAIT         ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , NOP           , AWAIT         , NOP           , AWAIT         ,
-   NOP           , AWAIT         , NOP           , AWAIT         , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   NOP           , AWAIT_BUSY    , NOP           , AWAIT_BUSY    , NOP           , AWAIT_BUSY    ,
-   NOP           , AWAIT_BUSY    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , NOP           , AWAIT_BUSY    ,
-   NOP           , AWAIT_BUSY    , NOP           , AWAIT_BUSY    , NOP           , AWAIT_BUSY    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , NOP           , AWAIT_BUSY    , NOP           , AWAIT_BUSY    ,
-   NOP           , AWAIT_BUSY    , NOP           , AWAIT_BUSY    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   NOP           , AWAIT_BUSY    , NOP           , AWAIT_BUSY    , NOP           , AWAIT_BUSY    ,
-   NOP           , AWAIT_BUSY    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , NOP           , AWAIT_REJECT  ,
-   NOP           , AWAIT_REJECT  , NOP           , AWAIT_REJECT  , NOP           , AWAIT_REJECT  ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , NOP           , AWAIT_REJECT  , NOP           , AWAIT_REJECT  ,
-   NOP           , AWAIT_REJECT  , NOP           , AWAIT_REJECT  , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   NOP           , AWAIT_REJECT  , NOP           , AWAIT_REJECT  , NOP           , AWAIT_REJECT  ,
-   NOP           , AWAIT_REJECT  , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , NOP           , AWAIT_REJECT  ,
-   NOP           , AWAIT_REJECT  , NOP           , AWAIT_REJECT  , NOP           , AWAIT_REJECT  ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT    , SH11          , RESET_WAIT    ,
-   SH11          , RESET_WAIT    , SH11          , RESET_WAIT     };
diff -uNr linux/net/802/transit/timertr.pre linux-llc/net/802/transit/timertr.pre
--- linux/net/802/transit/timertr.pre	Thu Dec 12 14:54:22 1996
+++ linux-llc/net/802/transit/timertr.pre	Thu Jan  1 01:00:00 1970
@@ -1,527 +0,0 @@
-COMPILE timertr NOINDEX 
-TABLE XXX
-;
-;Transition table for expiring timers:
-;
-;llc state 	timer   	retry_c	s_flag 	p_flag	action	newstate
-;		expired    	>= N2  
-;				
-ADM		ACK_TIMER	0	0      	0	NOP	ADM	
-ADM		ACK_TIMER	0	0      	1	NOP	ADM
-ADM		ACK_TIMER	0	1      	0	NOP	ADM
-ADM		ACK_TIMER	0	1      	1	NOP	ADM
-ADM		ACK_TIMER	1	0      	0	NOP	ADM
-ADM		ACK_TIMER	1	0      	1	NOP	ADM
-ADM		ACK_TIMER	1	1       0	NOP	ADM
-ADM		ACK_TIMER	1	1	1	NOP	ADM
-;;
-ADM		P_TIMER		0	0	0	NOP	ADM
-ADM		P_TIMER		0	0	1	NOP	ADM
-ADM		P_TIMER		0	1	0	NOP	ADM
-ADM		P_TIMER		0	1	1	NOP	ADM
-ADM		P_TIMER		1	0	0	NOP	ADM
-ADM		P_TIMER		1	0	1	NOP	ADM
-ADM		P_TIMER		1	1	0	NOP	ADM
-ADM		P_TIMER		1	1	1	NOP	ADM
-;;			
-ADM		REJ_TIMER 	0	0	0	NOP	ADM
-ADM		REJ_TIMER 	0	0	1	NOP	ADM
-ADM		REJ_TIMER 	0	1	0	NOP	ADM
-ADM		REJ_TIMER 	0	1	1	NOP	ADM
-ADM		REJ_TIMER 	1	0	0	NOP	ADM
-ADM		REJ_TIMER 	1	0	1	NOP	ADM
-ADM		REJ_TIMER 	1	1	0	NOP	ADM
-ADM		REJ_TIMER 	1	1	1	NOP	ADM
-;;			
-ADM		BUSY_TIMER 	0	0	0	NOP	ADM
-ADM		BUSY_TIMER 	0	0	1	NOP	ADM
-ADM		BUSY_TIMER 	0	1	0	NOP	ADM
-ADM		BUSY_TIMER 	0	1	1	NOP	ADM
-ADM		BUSY_TIMER 	1	0	0	NOP	ADM
-ADM		BUSY_TIMER 	1	0	1	NOP	ADM
-ADM		BUSY_TIMER 	1	1	0	NOP	ADM
-ADM		BUSY_TIMER 	1	1	1	NOP	ADM
-;;
-;;
-CONN		ACK_TIMER	0	0      	0	NOP	CONN	
-CONN		ACK_TIMER	0	0      	1	NOP	CONN
-CONN		ACK_TIMER	0	1      	0	NOP	CONN
-CONN		ACK_TIMER	0	1      	1	NOP	CONN
-CONN		ACK_TIMER	1	0      	0	NOP	CONN
-CONN		ACK_TIMER	1	0      	1	NOP	CONN
-CONN		ACK_TIMER	1	1       0	NOP	CONN
-CONN		ACK_TIMER	1	1	1	NOP	CONN
-;;
-CONN		P_TIMER		0	0	0	NOP	CONN
-CONN		P_TIMER		0	0	1	NOP	CONN
-CONN		P_TIMER		0	1	0	NOP	CONN
-CONN		P_TIMER		0	1	1	NOP	CONN
-CONN		P_TIMER		1	0	0	NOP	CONN
-CONN		P_TIMER		1	0	1	NOP	CONN
-CONN		P_TIMER		1	1	0	NOP	CONN
-CONN		P_TIMER		1	1	1	NOP	CONN
-;;			
-CONN		REJ_TIMER 	0	0	0	NOP	CONN
-CONN		REJ_TIMER 	0	0	1	NOP	CONN
-CONN		REJ_TIMER 	0	1	0	NOP	CONN
-CONN		REJ_TIMER 	0	1	1	NOP	CONN
-CONN		REJ_TIMER 	1	0	0	NOP	CONN
-CONN		REJ_TIMER 	1	0	1	NOP	CONN
-CONN		REJ_TIMER 	1	1	0	NOP	CONN
-CONN		REJ_TIMER 	1	1	1	NOP	CONN
-;;			
-CONN		BUSY_TIMER 	0	0	0	NOP	CONN
-CONN		BUSY_TIMER 	0	0	1	NOP	CONN
-CONN		BUSY_TIMER 	0	1	0	NOP	CONN
-CONN		BUSY_TIMER 	0	1	1	NOP	CONN
-CONN		BUSY_TIMER 	1	0	0	NOP	CONN
-CONN		BUSY_TIMER 	1	0	1	NOP	CONN
-CONN		BUSY_TIMER 	1	1	0	NOP	CONN
-CONN		BUSY_TIMER 	1	1	1	NOP	CONN
-;;
-;;
-RESET_WAIT	ACK_TIMER	0	0      	0	NOP	RESET_WAIT	
-RESET_WAIT	ACK_TIMER	0	0      	1	NOP	RESET_WAIT
-RESET_WAIT	ACK_TIMER	0	1      	0	NOP	RESET_WAIT
-RESET_WAIT	ACK_TIMER	0	1      	1	NOP	RESET_WAIT
-RESET_WAIT	ACK_TIMER	1	0      	0	NOP	RESET_WAIT
-RESET_WAIT	ACK_TIMER	1	0      	1	NOP	RESET_WAIT
-RESET_WAIT	ACK_TIMER	1	1       0	NOP	RESET_WAIT
-RESET_WAIT	ACK_TIMER	1	1	1	NOP	RESET_WAIT
-;;
-RESET_WAIT	P_TIMER		0	0	0	NOP	RESET_WAIT
-RESET_WAIT	P_TIMER		0	0	1	NOP	RESET_WAIT
-RESET_WAIT	P_TIMER		0	1	0	NOP	RESET_WAIT
-RESET_WAIT	P_TIMER		0	1	1	NOP	RESET_WAIT
-RESET_WAIT	P_TIMER		1	0	0	NOP	RESET_WAIT
-RESET_WAIT	P_TIMER		1	0	1	NOP	RESET_WAIT
-RESET_WAIT	P_TIMER		1	1	0	NOP	RESET_WAIT
-RESET_WAIT	P_TIMER		1	1	1	NOP	RESET_WAIT
-;;			
-RESET_WAIT	REJ_TIMER 	0	0	0	NOP	RESET_WAIT
-RESET_WAIT	REJ_TIMER 	0	0	1	NOP	RESET_WAIT
-RESET_WAIT	REJ_TIMER 	0	1	0	NOP	RESET_WAIT
-RESET_WAIT	REJ_TIMER 	0	1	1	NOP	RESET_WAIT
-RESET_WAIT	REJ_TIMER 	1	0	0	NOP	RESET_WAIT
-RESET_WAIT	REJ_TIMER 	1	0	1	NOP	RESET_WAIT
-RESET_WAIT	REJ_TIMER 	1	1	0	NOP	RESET_WAIT
-RESET_WAIT	REJ_TIMER 	1	1	1	NOP	RESET_WAIT
-;;			
-RESET_WAIT	BUSY_TIMER 	0	0	0	NOP	RESET_WAIT
-RESET_WAIT	BUSY_TIMER 	0	0	1	NOP	RESET_WAIT
-RESET_WAIT	BUSY_TIMER 	0	1	0	NOP	RESET_WAIT
-RESET_WAIT	BUSY_TIMER 	0	1	1	NOP	RESET_WAIT
-RESET_WAIT	BUSY_TIMER 	1	0	0	NOP	RESET_WAIT
-RESET_WAIT	BUSY_TIMER 	1	0	1	NOP	RESET_WAIT
-RESET_WAIT	BUSY_TIMER 	1	1	0	NOP	RESET_WAIT
-RESET_WAIT	BUSY_TIMER 	1	1	1	NOP	RESET_WAIT
-;;
-;;
-RESET_CHECK	ACK_TIMER	0	0      	0	NOP	RESET_CHECK	
-RESET_CHECK	ACK_TIMER	0	0      	1	NOP	RESET_CHECK
-RESET_CHECK	ACK_TIMER	0	1      	0	NOP	RESET_CHECK
-RESET_CHECK	ACK_TIMER	0	1      	1	NOP	RESET_CHECK
-RESET_CHECK	ACK_TIMER	1	0      	0	NOP	RESET_CHECK
-RESET_CHECK	ACK_TIMER	1	0      	1	NOP	RESET_CHECK
-RESET_CHECK	ACK_TIMER	1	1       0	NOP	RESET_CHECK
-RESET_CHECK	ACK_TIMER	1	1	1	NOP	RESET_CHECK
-;;
-RESET_CHECK	P_TIMER		0	0	0	NOP	RESET_CHECK
-RESET_CHECK	P_TIMER		0	0	1	NOP	RESET_CHECK
-RESET_CHECK	P_TIMER		0	1	0	NOP	RESET_CHECK
-RESET_CHECK	P_TIMER		0	1	1	NOP	RESET_CHECK
-RESET_CHECK	P_TIMER		1	0	0	NOP	RESET_CHECK
-RESET_CHECK	P_TIMER		1	0	1	NOP	RESET_CHECK
-RESET_CHECK	P_TIMER		1	1	0	NOP	RESET_CHECK
-RESET_CHECK	P_TIMER		1	1	1	NOP	RESET_CHECK
-;;			
-RESET_CHECK	REJ_TIMER 	0	0	0	NOP	RESET_CHECK
-RESET_CHECK	REJ_TIMER 	0	0	1	NOP	RESET_CHECK
-RESET_CHECK	REJ_TIMER 	0	1	0	NOP	RESET_CHECK
-RESET_CHECK	REJ_TIMER 	0	1	1	NOP	RESET_CHECK
-RESET_CHECK	REJ_TIMER 	1	0	0	NOP	RESET_CHECK
-RESET_CHECK	REJ_TIMER 	1	0	1	NOP	RESET_CHECK
-RESET_CHECK	REJ_TIMER 	1	1	0	NOP	RESET_CHECK
-RESET_CHECK	REJ_TIMER 	1	1	1	NOP	RESET_CHECK
-;;			
-RESET_CHECK	BUSY_TIMER 	0	0	0	NOP	RESET_CHECK
-RESET_CHECK	BUSY_TIMER 	0	0	1	NOP	RESET_CHECK
-RESET_CHECK	BUSY_TIMER 	0	1	0	NOP	RESET_CHECK
-RESET_CHECK	BUSY_TIMER 	0	1	1	NOP	RESET_CHECK
-RESET_CHECK	BUSY_TIMER 	1	0	0	NOP	RESET_CHECK
-RESET_CHECK	BUSY_TIMER 	1	0	1	NOP	RESET_CHECK
-RESET_CHECK	BUSY_TIMER 	1	1	0	NOP	RESET_CHECK
-RESET_CHECK	BUSY_TIMER 	1	1	1	NOP	RESET_CHECK
-;;
-;;
-;;
-SETUP		ACK_TIMER	0	0      	0	SETUP7  SETUP	
-SETUP		ACK_TIMER	0	0      	1	SETUP7  SETUP
-SETUP		ACK_TIMER	0	1      	0	SETUP3  NORMAL
-SETUP		ACK_TIMER	0	1      	1	SETUP3  NORMAL
-SETUP		ACK_TIMER	1	0      	0	SETUP8  ADM
-SETUP		ACK_TIMER	1	0      	1	SETUP8  ADM
-SETUP		ACK_TIMER	1	1       0	SETUP3  NORMAL
-SETUP		ACK_TIMER	1	1	1	SETUP3  NORMAL
-;;
-SETUP		P_TIMER		0	0	0	NOP	SETUP
-SETUP		P_TIMER		0	0	1	NOP	SETUP
-SETUP		P_TIMER		0	1	0	NOP	SETUP
-SETUP		P_TIMER		0	1	1	NOP	SETUP
-SETUP		P_TIMER		1	0	0	NOP	SETUP
-SETUP		P_TIMER		1	0	1	NOP	SETUP
-SETUP		P_TIMER		1	1	0	NOP	SETUP
-SETUP		P_TIMER		1	1	1	NOP	SETUP
-;;			
-SETUP		REJ_TIMER 	0	0	0	NOP	SETUP
-SETUP		REJ_TIMER 	0	0	1	NOP	SETUP
-SETUP		REJ_TIMER 	0	1	0	NOP	SETUP
-SETUP		REJ_TIMER 	0	1	1	NOP	SETUP
-SETUP		REJ_TIMER 	1	0	0	NOP	SETUP
-SETUP		REJ_TIMER 	1	0	1	NOP	SETUP
-SETUP		REJ_TIMER 	1	1	0	NOP	SETUP
-SETUP		REJ_TIMER 	1	1	1	NOP	SETUP
-;;			
-SETUP		BUSY_TIMER 	0	0	0	NOP	SETUP
-SETUP		BUSY_TIMER 	0	0	1	NOP	SETUP
-SETUP		BUSY_TIMER 	0	1	0	NOP	SETUP
-SETUP		BUSY_TIMER 	0	1	1	NOP	SETUP
-SETUP		BUSY_TIMER 	1	0	0	NOP	SETUP
-SETUP		BUSY_TIMER 	1	0	1	NOP	SETUP
-SETUP		BUSY_TIMER 	1	1	0	NOP	SETUP
-SETUP		BUSY_TIMER 	1	1	1	NOP	SETUP
-;;
-;;
-;;
-RESET		ACK_TIMER	0	0      	0	RESET7  RESET	
-RESET		ACK_TIMER	0	0      	1	RESET7  RESET
-RESET		ACK_TIMER	0	1      	0	RESET3  NORMAL
-RESET		ACK_TIMER	0	1      	1	RESET3  NORMAL
-RESET		ACK_TIMER	1	0      	0	RESET8  ADM
-RESET		ACK_TIMER	1	0      	1	RESET8  ADM
-RESET		ACK_TIMER	1	1       0	RESET3  NORMAL
-RESET		ACK_TIMER	1	1	1	RESET3  NORMAL
-;;
-RESET		P_TIMER		0	0	0	NOP	RESET
-RESET		P_TIMER		0	0	1	NOP	RESET
-RESET		P_TIMER		0	1	0	NOP	RESET
-RESET		P_TIMER		0	1	1	NOP	RESET
-RESET		P_TIMER		1	0	0	NOP	RESET
-RESET		P_TIMER		1	0	1	NOP	RESET
-RESET		P_TIMER		1	1	0	NOP	RESET
-RESET		P_TIMER		1	1	1	NOP	RESET
-;;			
-RESET		REJ_TIMER 	0	0	0	NOP	RESET
-RESET		REJ_TIMER 	0	0	1	NOP	RESET
-RESET		REJ_TIMER 	0	1	0	NOP	RESET
-RESET		REJ_TIMER 	0	1	1	NOP	RESET
-RESET		REJ_TIMER 	1	0	0	NOP	RESET
-RESET		REJ_TIMER 	1	0	1	NOP	RESET
-RESET		REJ_TIMER 	1	1	0	NOP	RESET
-RESET		REJ_TIMER 	1	1	1	NOP	RESET
-;;			
-RESET		BUSY_TIMER 	0	0	0	NOP	RESET
-RESET		BUSY_TIMER 	0	0	1	NOP	RESET
-RESET		BUSY_TIMER 	0	1	0	NOP	RESET
-RESET		BUSY_TIMER 	0	1	1	NOP	RESET
-RESET		BUSY_TIMER 	1	0	0	NOP	RESET
-RESET		BUSY_TIMER 	1	0	1	NOP	RESET
-RESET		BUSY_TIMER 	1	1	0	NOP	RESET
-RESET		BUSY_TIMER 	1	1	1	NOP	RESET
-;;
-;;
-D_CONN		ACK_TIMER	0	0      	0	D_CONN6 D_CONN	
-D_CONN		ACK_TIMER	0	0      	1	D_CONN6 D_CONN
-D_CONN		ACK_TIMER	0	1      	0	D_CONN6 D_CONN
-D_CONN		ACK_TIMER	0	1      	1	D_CONN6 D_CONN
-D_CONN		ACK_TIMER	1	0      	0	D_CONN7 ADM
-D_CONN		ACK_TIMER	1	0      	1	D_CONN7 ADM
-D_CONN		ACK_TIMER	1	1       0	D_CONN7 ADM
-D_CONN		ACK_TIMER	1	1	1	D_CONN7 ADM
-;;
-D_CONN		P_TIMER		0	0	0	NOP	D_CONN
-D_CONN		P_TIMER		0	0	1	NOP	D_CONN
-D_CONN		P_TIMER		0	1	0	NOP	D_CONN
-D_CONN		P_TIMER		0	1	1	NOP	D_CONN
-D_CONN		P_TIMER		1	0	0	NOP	D_CONN
-D_CONN		P_TIMER		1	0	1	NOP	D_CONN
-D_CONN		P_TIMER		1	1	0	NOP	D_CONN
-D_CONN		P_TIMER		1	1	1	NOP	D_CONN
-;;			
-D_CONN		REJ_TIMER 	0	0	0	NOP	D_CONN
-D_CONN		REJ_TIMER 	0	0	1	NOP	D_CONN
-D_CONN		REJ_TIMER 	0	1	0	NOP	D_CONN
-D_CONN		REJ_TIMER 	0	1	1	NOP	D_CONN
-D_CONN		REJ_TIMER 	1	0	0	NOP	D_CONN
-D_CONN		REJ_TIMER 	1	0	1	NOP	D_CONN
-D_CONN		REJ_TIMER 	1	1	0	NOP	D_CONN
-D_CONN		REJ_TIMER 	1	1	1	NOP	D_CONN
-;;			
-D_CONN		BUSY_TIMER 	0	0	0	NOP	D_CONN
-D_CONN		BUSY_TIMER 	0	0	1	NOP	D_CONN
-D_CONN		BUSY_TIMER 	0	1	0	NOP	D_CONN
-D_CONN		BUSY_TIMER 	0	1	1	NOP	D_CONN
-D_CONN		BUSY_TIMER 	1	0	0	NOP	D_CONN
-D_CONN		BUSY_TIMER 	1	0	1	NOP	D_CONN
-D_CONN		BUSY_TIMER 	1	1	0	NOP	D_CONN
-D_CONN		BUSY_TIMER 	1	1	1	NOP	D_CONN
-;;
-;;
-ERROR		ACK_TIMER	0	0      	0	ERR7    ERROR	
-ERROR		ACK_TIMER	0	0      	1	ERR7    ERROR
-ERROR		ACK_TIMER	0	1      	0	ERR7    ERROR
-ERROR		ACK_TIMER	0	1      	1	ERR7    ERROR
-ERROR		ACK_TIMER	1	0      	0	ERR8    RESET_WAIT
-ERROR		ACK_TIMER	1	0      	1	ERR8    RESET_WAIT
-ERROR		ACK_TIMER	1	1       0       ERR8    RESET_WAIT
-ERROR		ACK_TIMER	1	1	1	ERR8    RESET_WAIT
-;;
-ERROR		P_TIMER		0	0	0	NOP	ERROR
-ERROR		P_TIMER		0	0	1	NOP	ERROR
-ERROR		P_TIMER		0	1	0	NOP	ERROR
-ERROR		P_TIMER		0	1	1	NOP	ERROR
-ERROR		P_TIMER		1	0	0	NOP	ERROR
-ERROR		P_TIMER		1	0	1	NOP	ERROR
-ERROR		P_TIMER		1	1	0	NOP	ERROR
-ERROR		P_TIMER		1	1	1	NOP	ERROR
-;;			
-ERROR		REJ_TIMER 	0	0	0	NOP	ERROR
-ERROR		REJ_TIMER 	0	0	1	NOP	ERROR
-ERROR		REJ_TIMER 	0	1	0	NOP	ERROR
-ERROR		REJ_TIMER 	0	1	1	NOP	ERROR
-ERROR		REJ_TIMER 	1	0	0	NOP	ERROR
-ERROR		REJ_TIMER 	1	0	1	NOP	ERROR
-ERROR		REJ_TIMER 	1	1	0	NOP	ERROR
-ERROR		REJ_TIMER 	1	1	1	NOP	ERROR
-;;			
-ERROR		BUSY_TIMER 	0	0	0	NOP	ERROR
-ERROR		BUSY_TIMER 	0	0	1	NOP	ERROR
-ERROR		BUSY_TIMER 	0	1	0	NOP	ERROR
-ERROR		BUSY_TIMER 	0	1	1	NOP	ERROR
-ERROR		BUSY_TIMER 	1	0	0	NOP	ERROR
-ERROR		BUSY_TIMER 	1	0	1	NOP	ERROR
-ERROR		BUSY_TIMER 	1	1	0	NOP	ERROR
-ERROR		BUSY_TIMER 	1	1	1	NOP	ERROR
-;;
-;;
-NORMAL		ACK_TIMER	0	0      	0	NORMAL20 AWAIT	
-NORMAL		ACK_TIMER	0	0      	1	NOP	NORMAL
-NORMAL		ACK_TIMER	0	1      	0	NORMAL20 AWAIT
-NORMAL		ACK_TIMER	0	1      	1	NOP	NORMAL
-NORMAL		ACK_TIMER	1	0      	0	SH11    RESET_WAIT
-NORMAL		ACK_TIMER	1	0      	1	SH11    RESET_WAIT
-NORMAL		ACK_TIMER	1	1       0	SH11    RESET_WAIT
-NORMAL		ACK_TIMER	1	1	1	SH11    RESET_WAIT
-;;
-NORMAL		P_TIMER		0	0	0	NORMAL19 NORMAL
-NORMAL		P_TIMER		0	0	1	NORMAL19 NORMAL
-NORMAL		P_TIMER		0	1	0	NORMAL19 NORMAL
-NORMAL		P_TIMER		0	1	1	NORMAL19 NORMAL
-NORMAL		P_TIMER		1	0	0	SH11    RESET_WAIT
-NORMAL		P_TIMER		1	0	1	SH11    RESET_WAIT
-NORMAL		P_TIMER		1	1	0	SH11    RESET_WAIT
-NORMAL		P_TIMER		1	1	1	SH11    RESET_WAIT
-;;			
-NORMAL		REJ_TIMER 	0	0	0	NOP	NORMAL
-NORMAL		REJ_TIMER 	0	0	1	NOP	NORMAL
-NORMAL		REJ_TIMER 	0	1	0	NOP	NORMAL
-NORMAL		REJ_TIMER 	0	1	1	NOP	NORMAL
-NORMAL		REJ_TIMER 	1	0	0	SH11    RESET_WAIT
-NORMAL		REJ_TIMER 	1	0	1	SH11    RESET_WAIT
-NORMAL		REJ_TIMER 	1	1	0	SH11    RESET_WAIT
-NORMAL		REJ_TIMER 	1	1	1	SH11    RESET_WAIT
-;;			
-NORMAL		BUSY_TIMER 	0	0	0	NORMAL20 AWAIT
-NORMAL		BUSY_TIMER 	0	0	1	NOP	NORMAL
-NORMAL		BUSY_TIMER 	0	1	0	NORMAL20 AWAIT
-NORMAL		BUSY_TIMER 	0	1	1	NOP	NORMAL
-NORMAL		BUSY_TIMER 	1	0	0	SH11    RESET_WAIT
-NORMAL		BUSY_TIMER 	1	0	1	SH11    RESET_WAIT
-NORMAL		BUSY_TIMER 	1	1	0	SH11    RESET_WAIT
-NORMAL		BUSY_TIMER 	1	1	1	SH11    RESET_WAIT
-;;
-;;
-BUSY		ACK_TIMER	0	0      	0	BUSY24  AWAIT_BUSY
-BUSY		ACK_TIMER	0	0      	1	NOP	BUSY
-BUSY		ACK_TIMER	0	1      	0	BUSY24  AWAIT_BUSY
-BUSY		ACK_TIMER	0	1      	1	NOP	BUSY
-BUSY		ACK_TIMER	1	0      	0	SH11    RESET_WAIT	
-BUSY		ACK_TIMER	1	0      	1	SH11    RESET_WAIT
-BUSY		ACK_TIMER	1	1       0	SH11    RESET_WAIT
-BUSY		ACK_TIMER	1	1	1	SH11    RESET_WAIT
-;;
-BUSY		P_TIMER		0	0	0	BUSY23  BUSY
-BUSY		P_TIMER		0	0	1	BUSY23  BUSY
-BUSY		P_TIMER		0	1	0	BUSY23  BUSY
-BUSY		P_TIMER		0	1	1	BUSY23  BUSY
-BUSY		P_TIMER		1	0	0	SH11    RESET_WAIT
-BUSY		P_TIMER		1	0	1	SH11    RESET_WAIT
-BUSY		P_TIMER		1	1	0	SH11    RESET_WAIT
-BUSY		P_TIMER		1	1	1	SH11    RESET_WAIT
-;;			
-BUSY		REJ_TIMER 	0	0	0	BUSY25  BUSY
-BUSY		REJ_TIMER 	0	0	1	BUSY26  BUSY
-BUSY		REJ_TIMER 	0	1	0	BUSY25  BUSY
-BUSY		REJ_TIMER 	0	1	1	BUSY26  BUSY
-BUSY		REJ_TIMER 	1	0	0	SH11    RESET_WAIT
-BUSY		REJ_TIMER 	1	0	1	SH11    RESET_WAIT
-BUSY		REJ_TIMER 	1	1	0	SH11    RESET_WAIT
-BUSY		REJ_TIMER 	1	1	1	SH11    RESET_WAIT
-;;			
-BUSY		BUSY_TIMER 	0	0	0	NOP	BUSY
-BUSY		BUSY_TIMER 	0	0	1	NOP	BUSY
-BUSY		BUSY_TIMER 	0	1	0	NOP	BUSY
-BUSY		BUSY_TIMER 	0	1	1	NOP	BUSY
-BUSY		BUSY_TIMER 	1	0	0	SH11    RESET_WAIT
-BUSY		BUSY_TIMER 	1	0	1	SH11    RESET_WAIT
-BUSY		BUSY_TIMER 	1	1	0	SH11    RESET_WAIT
-BUSY		BUSY_TIMER 	1	1	1	SH11    RESET_WAIT
-;;
-;;
-REJECT		ACK_TIMER	0	0      	0	NOP	REJECT	
-REJECT		ACK_TIMER	0	0      	1	NOP	REJECT
-REJECT		ACK_TIMER	0	1      	0	NOP	REJECT
-REJECT		ACK_TIMER	0	1      	1	NOP	REJECT
-REJECT		ACK_TIMER	1	0      	0	SH11    RESET_WAIT
-REJECT		ACK_TIMER	1	0      	1	SH11    RESET_WAIT
-REJECT		ACK_TIMER	1	1       0	SH11    RESET_WAIT
-REJECT		ACK_TIMER	1	1	1	SH11    RESET_WAIT
-;;
-REJECT		P_TIMER		0	0	0	NOP	REJECT
-REJECT		P_TIMER		0	0	1	NOP	REJECT
-REJECT		P_TIMER		0	1	0	NOP	REJECT
-REJECT		P_TIMER		0	1	1	NOP	REJECT
-REJECT		P_TIMER		1	0	0	SH11    RESET_WAIT
-REJECT		P_TIMER		1	0	1	SH11    RESET_WAIT
-REJECT		P_TIMER		1	1	0	SH11    RESET_WAIT
-REJECT		P_TIMER		1	1	1	SH11    RESET_WAIT
-;;			
-REJECT		REJ_TIMER 	0	0	0	NOP	REJECT
-REJECT		REJ_TIMER 	0	0	1	NOP	REJECT
-REJECT		REJ_TIMER 	0	1	0	NOP	REJECT
-REJECT		REJ_TIMER 	0	1	1	NOP	REJECT
-REJECT		REJ_TIMER 	1	0	0	SH11    RESET_WAIT
-REJECT		REJ_TIMER 	1	0	1	SH11    RESET_WAIT
-REJECT		REJ_TIMER 	1	1	0	SH11    RESET_WAIT
-REJECT		REJ_TIMER 	1	1	1	SH11    RESET_WAIT
-;;			
-REJECT		BUSY_TIMER 	0	0	0	NOP	REJECT
-REJECT		BUSY_TIMER 	0	0	1	NOP	REJECT
-REJECT		BUSY_TIMER 	0	1	0	NOP	REJECT
-REJECT		BUSY_TIMER 	0	1	1	NOP	REJECT
-REJECT		BUSY_TIMER 	1	0	0	SH11    RESET_WAIT
-REJECT		BUSY_TIMER 	1	0	1	SH11    RESET_WAIT
-REJECT		BUSY_TIMER 	1	1	0	SH11    RESET_WAIT
-REJECT		BUSY_TIMER 	1	1	1	SH11    RESET_WAIT
-;;
-;;
-AWAIT		ACK_TIMER	0	0      	0	NOP	AWAIT	
-AWAIT		ACK_TIMER	0	0      	1	NOP	AWAIT
-AWAIT		ACK_TIMER	0	1      	0	NOP	AWAIT
-AWAIT		ACK_TIMER	0	1      	1	NOP	AWAIT
-AWAIT		ACK_TIMER	1	0      	0	SH11    RESET_WAIT
-AWAIT		ACK_TIMER	1	0      	1	SH11    RESET_WAIT
-AWAIT		ACK_TIMER	1	1       0	SH11    RESET_WAIT
-AWAIT		ACK_TIMER	1	1	1	SH11    RESET_WAIT
-;;
-AWAIT		P_TIMER		0	0	0	NOP	AWAIT
-AWAIT		P_TIMER		0	0	1	NOP	AWAIT
-AWAIT		P_TIMER		0	1	0	NOP	AWAIT
-AWAIT		P_TIMER		0	1	1	NOP	AWAIT
-AWAIT		P_TIMER		1	0	0	SH11    RESET_WAIT
-AWAIT		P_TIMER		1	0	1	SH11    RESET_WAIT
-AWAIT		P_TIMER		1	1	0	SH11    RESET_WAIT
-AWAIT		P_TIMER		1	1	1	SH11    RESET_WAIT
-;;			
-AWAIT		REJ_TIMER 	0	0	0	NOP	AWAIT
-AWAIT		REJ_TIMER 	0	0	1	NOP	AWAIT
-AWAIT		REJ_TIMER 	0	1	0	NOP	AWAIT
-AWAIT		REJ_TIMER 	0	1	1	NOP	AWAIT
-AWAIT		REJ_TIMER 	1	0	0	SH11    RESET_WAIT
-AWAIT		REJ_TIMER 	1	0	1	SH11    RESET_WAIT
-AWAIT		REJ_TIMER 	1	1	0	SH11    RESET_WAIT
-AWAIT		REJ_TIMER 	1	1	1	SH11    RESET_WAIT
-;;			
-AWAIT		BUSY_TIMER 	0	0	0	NOP	AWAIT
-AWAIT		BUSY_TIMER 	0	0	1	NOP	AWAIT
-AWAIT		BUSY_TIMER 	0	1	0	NOP	AWAIT
-AWAIT		BUSY_TIMER 	0	1	1	NOP	AWAIT
-AWAIT		BUSY_TIMER 	1	0	0	SH11    RESET_WAIT
-AWAIT		BUSY_TIMER 	1	0	1	SH11    RESET_WAIT
-AWAIT		BUSY_TIMER 	1	1	0	SH11    RESET_WAIT
-AWAIT		BUSY_TIMER 	1	1	1	SH11    RESET_WAIT
-;;
-;;
-AWAIT_BUSY	ACK_TIMER	0	0      	0	NOP	AWAIT_BUSY	
-AWAIT_BUSY	ACK_TIMER	0	0      	1	NOP	AWAIT_BUSY
-AWAIT_BUSY	ACK_TIMER	0	1      	0	NOP	AWAIT_BUSY
-AWAIT_BUSY	ACK_TIMER	0	1      	1	NOP	AWAIT_BUSY
-AWAIT_BUSY	ACK_TIMER	1	0      	0	SH11    RESET_WAIT
-AWAIT_BUSY	ACK_TIMER	1	0      	1	SH11    RESET_WAIT
-AWAIT_BUSY	ACK_TIMER	1	1       0	SH11    RESET_WAIT
-AWAIT_BUSY	ACK_TIMER	1	1	1	SH11    RESET_WAIT
-;;
-AWAIT_BUSY	P_TIMER		0	0	0	NOP	AWAIT_BUSY
-AWAIT_BUSY	P_TIMER		0	0	1	NOP	AWAIT_BUSY
-AWAIT_BUSY	P_TIMER		0	1	0	NOP	AWAIT_BUSY
-AWAIT_BUSY	P_TIMER		0	1	1	NOP	AWAIT_BUSY
-AWAIT_BUSY	P_TIMER		1	0	0	SH11    RESET_WAIT
-AWAIT_BUSY	P_TIMER		1	0	1	SH11    RESET_WAIT
-AWAIT_BUSY	P_TIMER		1	1	0	SH11    RESET_WAIT
-AWAIT_BUSY	P_TIMER		1	1	1	SH11    RESET_WAIT
-;;			
-AWAIT_BUSY	REJ_TIMER 	0	0	0	NOP	AWAIT_BUSY
-AWAIT_BUSY	REJ_TIMER 	0	0	1	NOP	AWAIT_BUSY
-AWAIT_BUSY	REJ_TIMER 	0	1	0	NOP	AWAIT_BUSY
-AWAIT_BUSY	REJ_TIMER 	0	1	1	NOP	AWAIT_BUSY
-AWAIT_BUSY	REJ_TIMER 	1	0	0	SH11    RESET_WAIT
-AWAIT_BUSY	REJ_TIMER 	1	0	1	SH11    RESET_WAIT
-AWAIT_BUSY	REJ_TIMER 	1	1	0	SH11    RESET_WAIT
-AWAIT_BUSY	REJ_TIMER 	1	1	1	SH11    RESET_WAIT
-;;			
-AWAIT_BUSY	BUSY_TIMER 	0	0	0	NOP	AWAIT_BUSY
-AWAIT_BUSY	BUSY_TIMER 	0	0	1	NOP	AWAIT_BUSY
-AWAIT_BUSY	BUSY_TIMER 	0	1	0	NOP	AWAIT_BUSY
-AWAIT_BUSY	BUSY_TIMER 	0	1	1	NOP	AWAIT_BUSY
-AWAIT_BUSY	BUSY_TIMER 	1	0	0	SH11    RESET_WAIT
-AWAIT_BUSY	BUSY_TIMER 	1	0	1	SH11    RESET_WAIT
-AWAIT_BUSY	BUSY_TIMER 	1	1	0	SH11    RESET_WAIT
-AWAIT_BUSY	BUSY_TIMER 	1	1	1	SH11    RESET_WAIT
-;;
-;;
-AWAIT_REJECT	ACK_TIMER	0	0      	0	NOP	AWAIT_REJECT	
-AWAIT_REJECT	ACK_TIMER	0	0      	1	NOP	AWAIT_REJECT
-AWAIT_REJECT	ACK_TIMER	0	1      	0	NOP	AWAIT_REJECT
-AWAIT_REJECT	ACK_TIMER	0	1      	1	NOP	AWAIT_REJECT
-AWAIT_REJECT	ACK_TIMER	1	0      	0	SH11    RESET_WAIT
-AWAIT_REJECT	ACK_TIMER	1	0      	1	SH11    RESET_WAIT
-AWAIT_REJECT	ACK_TIMER	1	1       0	SH11    RESET_WAIT
-AWAIT_REJECT	ACK_TIMER	1	1	1	SH11    RESET_WAIT
-;;							
-AWAIT_REJECT	P_TIMER		0	0	0	NOP	AWAIT_REJECT
-AWAIT_REJECT	P_TIMER		0	0	1	NOP	AWAIT_REJECT
-AWAIT_REJECT	P_TIMER		0	1	0	NOP	AWAIT_REJECT
-AWAIT_REJECT	P_TIMER		0	1	1	NOP	AWAIT_REJECT
-AWAIT_REJECT	P_TIMER		1	0	0	SH11    RESET_WAIT
-AWAIT_REJECT	P_TIMER		1	0	1	SH11    RESET_WAIT
-AWAIT_REJECT	P_TIMER		1	1	0	SH11    RESET_WAIT
-AWAIT_REJECT	P_TIMER		1	1	1	SH11    RESET_WAIT
-;;			
-AWAIT_REJECT	REJ_TIMER 	0	0	0	NOP	AWAIT_REJECT
-AWAIT_REJECT	REJ_TIMER 	0	0	1	NOP	AWAIT_REJECT
-AWAIT_REJECT	REJ_TIMER 	0	1	0	NOP	AWAIT_REJECT
-AWAIT_REJECT	REJ_TIMER 	0	1	1	NOP	AWAIT_REJECT
-AWAIT_REJECT	REJ_TIMER 	1	0	0	SH11    RESET_WAIT
-AWAIT_REJECT	REJ_TIMER 	1	0	1	SH11    RESET_WAIT
-AWAIT_REJECT	REJ_TIMER 	1	1	0	SH11    RESET_WAIT
-AWAIT_REJECT	REJ_TIMER 	1	1	1	SH11    RESET_WAIT
-;;			
-AWAIT_REJECT	BUSY_TIMER 	0	0	0	NOP	AWAIT_REJECT
-AWAIT_REJECT	BUSY_TIMER 	0	0	1	NOP	AWAIT_REJECT
-AWAIT_REJECT	BUSY_TIMER 	0	1	0	NOP	AWAIT_REJECT
-AWAIT_REJECT	BUSY_TIMER 	0	1	1	NOP	AWAIT_REJECT
-AWAIT_REJECT	BUSY_TIMER 	1	0	0	SH11    RESET_WAIT
-AWAIT_REJECT	BUSY_TIMER 	1	0	1	SH11    RESET_WAIT
-AWAIT_REJECT	BUSY_TIMER 	1	1	0	SH11    RESET_WAIT
-AWAIT_REJECT	BUSY_TIMER 	1	1	1	SH11    RESET_WAIT
-;;
diff -uNr linux/net/Config.in linux-llc/net/Config.in
--- linux/net/Config.in	Tue Jan  4 18:12:26 2000
+++ linux-llc/net/Config.in	Mon Sep 25 07:06:58 2000
@@ -3,12 +3,17 @@
 #
 mainmenu_option next_comment
 comment 'Networking options'
+
 tristate 'Packet socket' CONFIG_PACKET
 bool 'Kernel/User netlink socket' CONFIG_NETLINK
 if [ "$CONFIG_NETLINK" = "y" ]; then
   bool 'Routing messages' CONFIG_RTNETLINK
   tristate 'Netlink device emulation' CONFIG_NETLINK_DEV
 fi
+tristate 'ANSI/IEEE 802.2 Data link layer protocol' CONFIG_LLC
+if [ "$CONFIG_LLC" != "n" ]; then
+  dep_tristate '  ANSI/IEEE 802.2 Data link layer User Interface SAPs' CONFIG_LLC_UI
+fi
 bool 'Network firewalls' CONFIG_FIREWALL
 bool 'Socket Filtering'  CONFIG_FILTER
 tristate 'Unix domain sockets' CONFIG_UNIX
@@ -42,7 +47,7 @@
   if [ "$CONFIG_BRIDGE" != "n" ]; then
 	int '  Maximum number of bridged interfaces' CONFIG_BRIDGE_NUM_PORTS 8
   fi
-  bool '802.2 LLC (EXPERIMENTAL)' CONFIG_LLC
+#  bool '802.2 LLC (EXPERIMENTAL)' CONFIG_LLC
 #  if [ "$CONFIG_LLC" = "y" ]; then
 #   bool 'Netbeui (EXPERIMENTAL)' CONFIG_NETBEUI
 #  fi
diff -uNr linux/net/README linux-llc/net/README
--- linux/net/README	Tue Apr 13 00:18:27 1999
+++ linux-llc/net/README	Mon Sep 25 07:00:38 2000
@@ -3,8 +3,6 @@
 
 Code Section		Bug Report Contact
 -------------------+-------------------------------------------
-802 [other	]	alan@lxorguk.ukuu.org.uk	
-    [token ring	]	p.norton@computer.org
 appletalk		Jay.Schulist@spacs.k12.wi.us
 ax25			g4klx@g4klx.demon.co.uk
 core			alan@lxorguk.ukuu.org.uk
@@ -14,6 +12,7 @@
 ipv6			davem@caip.rutgers.edu,Eric.Schenk@dna.lth.se
 ipx/spx			Jay.Schulist@spacs.k12.wi.us
 lapb			g4klx@g4klx.demon.co.uk
+llc                     jschlst@turbolinux.com
 netrom			g4klx@g4klx.demon.co.uk
 rose			g4klx@g4klx.demon.co.uk
 wanrouter		gene@compuserve.com, jaspreet@sangoma and dm@sangoma.com
diff -uNr linux/net/appletalk/ddp.c linux-llc/net/appletalk/ddp.c
--- linux/net/appletalk/ddp.c	Wed Jun  7 22:26:44 2000
+++ linux-llc/net/appletalk/ddp.c	Mon Sep 25 06:47:46 2000
@@ -73,7 +73,7 @@
 #include <linux/skbuff.h>
 #include <linux/termios.h>	/* For TIOCOUTQ/INQ */
 #include <net/datalink.h>
-#include <net/p8022.h>
+#include <linux/llc.h>
 #include <net/psnap.h>
 #include <net/sock.h>
 #include <linux/ip.h>
diff -uNr linux/net/ipx/af_ipx.c linux-llc/net/ipx/af_ipx.c
--- linux/net/ipx/af_ipx.c	Wed Jun  7 22:26:44 2000
+++ linux-llc/net/ipx/af_ipx.c	Mon Sep 25 06:47:46 2000
@@ -92,7 +92,8 @@
 #include <linux/mm.h>
 #include <linux/termios.h>	/* For TIOCOUTQ/INQ */
 #include <linux/interrupt.h>
-#include <net/p8022.h>
+#include <net/llc.h>
+#include <linux/llc.h>
 #include <net/psnap.h>
 #include <linux/proc_fs.h>
 #include <linux/stat.h>
@@ -2452,7 +2453,7 @@
 	ipx_8023_packet_type.type = htons(ETH_P_802_3);
 	dev_add_pack(&ipx_8023_packet_type);
 
-	if((p8022_datalink = register_8022_client(ipx_8022_type,ipx_rcv)) == NULL)
+	if((p8022_datalink = register_8022_client(ipx_8022_type,ipx_rcv,NULL)) == NULL)
 		printk(KERN_CRIT "IPX: Unable to register with 802.2\n");
 
 	if((pSNAP_datalink = register_snap_client(ipx_snap_id,ipx_rcv)) == NULL)
diff -uNr linux/net/llc/Makefile linux-llc/net/llc/Makefile
--- linux/net/llc/Makefile	Thu Jan  1 01:00:00 1970
+++ linux-llc/net/llc/Makefile	Mon Sep 25 07:09:47 2000
@@ -0,0 +1,33 @@
+#
+# Makefile for the Linux 802.x protocol layers.
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := llc.o
+M_OBJS   := 
+OX_OBJS  := dl_llc.o
+
+ifeq ($(CONFIG_LLC),m)
+  M_OBJS += $(O_TARGET)
+endif
+
+ifeq ($(CONFIG_SYSCTL),y)
+O_OBJS += sysctl_net_llc.o
+endif
+
+ifeq ($(CONFIG_LLC_UI),y)
+OX_OBJS += af_llc.o
+else
+  ifeq ($(CONFIG_LLC_UI),m)
+  MX_OBJS += af_llc.o
+  endif
+endif
+
+include $(TOPDIR)/Rules.make
+
+tar:
+		tar -cvf /dev/f1 .
diff -uNr linux/net/llc/sysctl_net_llc.c linux-llc/net/llc/sysctl_net_llc.c
--- linux/net/llc/sysctl_net_llc.c	Thu Jan  1 01:00:00 1970
+++ linux-llc/net/llc/sysctl_net_llc.c	Mon Sep 25 06:47:46 2000
@@ -0,0 +1,79 @@
+/* -*- linux-c -*-
+ *	sysctl_net_llc.c: sysctl interface to net 802 subsystem.
+ * 
+ *	Begun April 1, 1996, Mike Shaver.
+ *	Added /proc/sys/net/llc directory entry (empty =) ). [MS]
+ *
+ *	This program is free software; you can redistribute it and/or
+ *	modify it under the terms of the GNU General Public License
+ *	as published by the Free Software Foundation; either version
+ *	2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/mm.h>
+#include <linux/sysctl.h>
+#include <linux/config.h>
+
+extern int sysctl_max_retry;
+extern int sysctl_max_size;
+extern int sysctl_max_window;
+extern int sysctl_ack_timer_expire;
+extern int sysctl_p_timer_expire;
+extern int sysctl_rej_timer_expire;
+extern int sysctl_busy_timer_expire;
+extern int llc_debug;
+
+#ifdef CONFIG_SYSCTL
+static ctl_table llc_table[] = {
+        {NET_LLC_MAX_RETRY, "llc-max-retransmission",
+        &sysctl_max_retry, sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
+        {NET_LLC_MAX_SIZE, "llc-max-pdu-size",
+        &sysctl_max_size, sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
+        {NET_LLC_MAX_WINDOW, "llc-max-window-size",
+        &sysctl_max_window, sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
+        {NET_LLC_ACK_TIMER_EXPIRE, "llc-ack-timer-expire",
+        &sysctl_ack_timer_expire, sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
+        {NET_LLC_P_TIMER_EXPIRE, "llc-p-timer-expire",
+        &sysctl_p_timer_expire, sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
+        {NET_LLC_REJ_TIMER_EXPIRE, "llc-reject-timer-expire",
+        &sysctl_rej_timer_expire, sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
+        {NET_LLC_BUSY_TIMER_EXPIRE, "llc-busy-timer-expire",
+        &sysctl_busy_timer_expire, sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
+	{NET_LLC_DEBUG, "debug-level",
+	&llc_debug, sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
+        {0}
+};
+
+static ctl_table llc_dir_table[] = {
+	{NET_LLC, "llc", NULL, 0, 0555, llc_table},
+        {0}
+};
+
+static ctl_table llc_root_table[] = {
+        {CTL_NET, "net", NULL, 0, 0555, llc_dir_table},
+        {0}
+};
+
+static struct ctl_table_header *llc_table_header;
+
+void llc_register_sysctl(void)
+{
+        llc_table_header = register_sysctl_table(llc_root_table, 1);
+}
+
+void llc_unregister_sysctl(void)
+{
+        unregister_sysctl_table(llc_table_header);
+}
+
+#else
+
+void llc_register_sysctl(void)
+{
+}
+
+void llc_unregister_sysctl(void)
+{
+}
+
+#endif /* CONFIG_SYSCTL */
diff -uNr linux/net/netsyms.c linux-llc/net/netsyms.c
--- linux/net/netsyms.c	Wed Jun  7 22:26:44 2000
+++ linux-llc/net/netsyms.c	Mon Sep 25 07:01:51 2000
@@ -88,9 +88,7 @@
 
 #ifdef CONFIG_IPX_MODULE
 extern struct datalink_proto   *make_EII_client(void);
-extern struct datalink_proto   *make_8023_client(void);
 extern void destroy_EII_client(struct datalink_proto *);
-extern void destroy_8023_client(struct datalink_proto *);
 #endif
 
 #ifdef CONFIG_ATALK_MODULE
@@ -210,8 +208,6 @@
 EXPORT_SYMBOL(csum_partial);
 
 #ifdef CONFIG_IPX_MODULE
-EXPORT_SYMBOL(make_8023_client);
-EXPORT_SYMBOL(destroy_8023_client);
 EXPORT_SYMBOL(make_EII_client);
 EXPORT_SYMBOL(destroy_EII_client);
 #endif
@@ -352,7 +348,6 @@
 EXPORT_SYMBOL(xrlim_allow);
 
 EXPORT_SYMBOL(tcp_write_xmit);
-EXPORT_SYMBOL(dev_loopback_xmit);
 EXPORT_SYMBOL(tcp_regs);
 
 #ifdef CONFIG_SYSCTL
@@ -465,6 +460,8 @@
 EXPORT_SYMBOL(ether_setup);
 EXPORT_SYMBOL(dev_new_index);
 EXPORT_SYMBOL(dev_get_by_index);
+EXPORT_SYMBOL(dev_getbyhwaddr);
+EXPORT_SYMBOL(dev_loopback_xmit);
 EXPORT_SYMBOL(eth_type_trans);
 EXPORT_SYMBOL(init_etherdev);
 EXPORT_SYMBOL(dev_set_allmulti);
@@ -523,6 +520,12 @@
 EXPORT_SYMBOL(ltalk_setup);
 #endif
 
+#if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)
+extern struct datalink_proto *make_8023_client(void);
+extern void destroy_8023_client(struct datalink_proto *dl);
+EXPORT_SYMBOL(make_8023_client);
+EXPORT_SYMBOL(destroy_8023_client);
+#endif
 
 /* Packet scheduler modules want these. */
 EXPORT_SYMBOL(qdisc_destroy);
diff -uNr linux/net/protocols.c linux-llc/net/protocols.c
--- linux/net/protocols.c	Thu Dec 17 17:03:57 1998
+++ linux-llc/net/protocols.c	Mon Sep 25 07:03:57 2000
@@ -66,22 +66,19 @@
 #endif
 
 #if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE)
-#define NEED_802
 #include <net/atalkcall.h>
 #endif
 
 #if defined(CONFIG_NETBEUI)
-#define NEED_LLC
 #include <net/netbeuicall.h>
 #endif
 
-#if defined(CONFIG_LLC)
-#define NEED_LLC
+#if defined(CONFIG_LLC) || defined(CONFIG_LLC_MODULE)
+#include <net/llccall.h>
 #endif
 
-#include <net/psnapcall.h>
-
 #ifdef CONFIG_TR
+#include <net/trcall.h>
 #include <linux/netdevice.h>
 #include <linux/trdevice.h>
 extern void rif_init(struct net_proto *);
@@ -92,10 +89,6 @@
 #include <net/llccall.h>
 #endif
 
-#ifdef NEED_802
-#include <net/p8022call.h>
-#endif
-
 /*
  *	Protocol Table
  */
@@ -113,17 +106,12 @@
   { "UNIX",	unix_proto_init	},			/* Unix domain socket family 	*/
 #endif
 
-#ifdef NEED_802
-  { "802.2",	p8022_proto_init },			/* 802.2 demultiplexor		*/
-  { "SNAP",	snap_proto_init },			/* SNAP demultiplexor		*/
-#endif
-
 #ifdef CONFIG_TR
   { "RIF",	rif_init },				/* RIF for Token ring		*/
 #endif  
 
-#ifdef NEED_LLC
-  { "802.2LLC", llc_init },				/* 802.2 LLC */
+#ifdef CONFIG_LLC
+  { "LLC", llc_proto_init },				/* 802.2 LLC */
 #endif  
 
 #ifdef CONFIG_AX25  
diff -uNr linux/net/sysctl_net.c linux-llc/net/sysctl_net.c
--- linux/net/sysctl_net.c	Sun Nov 30 22:00:40 1997
+++ linux-llc/net/sysctl_net.c	Mon Sep 25 06:47:46 2000
@@ -31,7 +31,7 @@
 #endif
 
 #ifdef CONFIG_NET
-extern ctl_table ether_table[], e802_table[];
+extern ctl_table ether_table[];
 #endif
 
 #ifdef CONFIG_BRIDGE
@@ -52,7 +52,6 @@
         {NET_UNIX,   "unix",      NULL, 0, 0555, unix_table},
 #endif
 #ifdef CONFIG_NET
-	{NET_802,    "802",       NULL, 0, 0555, e802_table},
 	{NET_ETHER,  "ethernet",  NULL, 0, 0555, ether_table},
 #endif
 #ifdef CONFIG_INET
diff -uNr linux/net/sysctl_net.c linux-llc/net/sysctl_net.c
--- linux/net/Makefile	Mon Mar 22 19:18:17 1999
+++ linux-llc/net/Makefile	Mon Sep 25 07:54:32 2000
@@ -8,15 +8,12 @@
 # Note 2! The CFLAGS definition is now in the main makefile...
 
 MOD_SUB_DIRS := ipv4
-ALL_SUB_DIRS := 802 ax25 bridge core ethernet ipv4 ipv6 ipx unix appletalk \
+ALL_SUB_DIRS := llc ax25 bridge core ethernet ipv4 ipv6 ipx unix appletalk \
 		netrom rose lapb x25 wanrouter netlink sched packet sunrpc \
 		econet irda #decnet
 SUB_DIRS     := core ethernet sched
 MOD_LIST_NAME := NET_MISC_MODULES
 
-ifeq ($(CONFIG_NET),y)
-SUB_DIRS += 802
-endif
 
 ifeq ($(CONFIG_INET),y)
 SUB_DIRS += ipv4
@@ -42,6 +39,19 @@
 SUB_DIRS += netlink
   ifeq ($(CONFIG_NETLINK_DEV),m)
     MOD_SUB_DIRS += netlink
+  endif
+endif
+
+ifeq ($(CONFIG_DEVLINK),y)
+SUB_DIRS += devlink
+endif
+
+ifeq ($(CONFIG_LLC),y)
+SUB_DIRS += llc
+MOD_SUB_DIRS += llc
+else
+  ifeq ($(CONFIG_LLC),m)
+    MOD_SUB_DIRS += llc
   endif
 endif
 
diff -uNr linux/net/llc/af_llc.c linux-llc/net/llc/af_llc.c
--- linux/net/llc/af_llc.c	Tue May  5 21:32:27 1998
+++ linux-llc/net/llc/af_llc.c	Tue Sep 26 01:35:13 2000
@@ -0,0 +1,1026 @@
+/* IEEE 802.2 LLC Class 1 and Class 2 user-space LLC interface.
+ * - Supports SOCK_DGRAM, and SOCK_STREAM.
+ *
+ * Author:
+ * Jay Schulist <jschlst@turbolinux.com>
+ *
+ * Sources:
+ * - ANSI/IEEE Std 802.2-1989.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ * None of the authors or maintainers or their employers admit
+ * liability nor provide warranty for any of this software.
+ * This material is provided "as is" and at no charge.
+ */
+
+#include <linux/config.h>
+#if defined(CONFIG_LLC_UI) || defined(CONFIG_LLC_UI_MODULE)
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <net/datalink.h>
+#include <net/sock.h>
+#include <asm/byteorder.h>
+#include <asm/uaccess.h>
+#include <linux/uio.h>
+#include <linux/unistd.h>
+#include <linux/mm.h>
+#include <linux/socket.h>
+#include <linux/sockios.h>
+#include <linux/in.h>
+#include <net/sock.h>
+#include <linux/proc_fs.h>
+#include <linux/skbuff.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+
+#include <net/llc.h>
+#include <linux/llc.h>
+
+#include <linux/rtnetlink.h>
+#include <linux/if_arp.h>
+
+#include <linux/ctype.h>        /* For hexdump() */
+
+#ifndef LLC_UI_DEBUG
+#define LLC_UI_DEBUG 0 
+#endif
+#ifdef MODULE
+MODULE_PARM(llc_ui_debug, "i");
+#endif
+
+static unsigned int llc_ui_debug = LLC_UI_DEBUG;
+
+
+static struct sock *llc_ui_socket_list = NULL;
+static struct proto_ops llc_ui_ops;
+
+int llc_ui_rcv_msg(int rsp, struct sk_buff *skb);
+int llc_ui_rcv(struct sk_buff *skb, struct device *dev,
+        struct packet_type *pt);
+static int llc_ui_disconnect(struct sock *sk);
+static int llc_ui_shutdown(struct socket *sock, int how);
+
+static int hexdump(unsigned char *pkt_data, int pkt_len)
+{
+        int i;
+
+        while(pkt_len>0)
+        {
+                printk("  ");   /* Leading spaces. */
+
+                /* Print the HEX representation. */
+                for(i=0; i<8; ++i)
+                {
+                        if(pkt_len - (long)i>0)
+                                printk("%2.2X ", pkt_data[i] & 0xFF);
+                        else
+                                printk("  ");
+                }
+
+                printk(":");
+
+                for(i=8; i<16; ++i)
+                {
+                        if(pkt_len - (long)i>0)
+                                printk("%2.2X ", pkt_data[i]&0xFF);
+                        else
+                                printk("  ");
+                }
+
+                /* Print the ASCII representation. */
+                printk("  ");
+
+                for(i=0; i<16; ++i)
+                {
+                        if(pkt_len - (long)i>0)
+                        {
+                                if(isprint(pkt_data[i]))
+                                        printk("%c", pkt_data[i]);
+                                else
+                                        printk(".");
+                        }
+                }
+
+                printk("\n");
+                pkt_len -= 16;
+                pkt_data += 16;
+        }
+
+        printk("\n");
+
+        return (0);
+}
+
+static int llc_ui_sock_init(struct sock *sk)
+{
+        return (0);
+}
+
+static int llc_ui_create(struct socket *sock, int protocol)
+{
+        struct sock *sk;
+
+	if(llc_ui_debug > 5)
+        	printk("llc_ui_create\n");
+
+        sk = sk_alloc(PF_LLC, GFP_KERNEL, 1);
+        if(sk == NULL)
+                return (-ENOMEM);
+
+        switch(sock->type)
+        {
+                case (SOCK_STREAM):
+                case (SOCK_DGRAM):
+                        sock->ops = &llc_ui_ops;
+                        break;
+
+                default:
+                        sk_free(sk);
+                        return (-ESOCKTNOSUPPORT);
+        }
+
+        sock_init_data(sock, sk);
+        llc_ui_sock_init(sk);
+        sk->destruct    = NULL;
+        sk->zapped      = 1;
+        sk->no_check    = 1;
+        sk->sap         = 0;
+        sk->llc_proto   = NULL;
+
+#ifdef MODULE
+        MOD_INC_USE_COUNT;
+#endif
+
+        return (0);
+}
+
+static int llc_ui_destroy_socket(struct sock *sk)
+{
+	if(llc_ui_debug > 5)
+        	printk("llc_ui_destroy_socket %p\n", sk);
+
+        if(sk->llc_proto != NULL)
+        {
+                struct datalink_proto *dl = sk->llc_proto;
+                struct llc_pinfo *llc = dl->ll_pinfo.llc;
+
+		llc_ui_disconnect(sk);
+                unregister_8022_client(llc->ssap);
+        }
+
+        sklist_destroy_socket(&llc_ui_socket_list, sk);
+
+#ifdef MODULE
+        MOD_DEC_USE_COUNT;
+#endif
+
+        return (0);
+}
+
+inline void llc_ui_insert_socket(struct sock *sk)
+{
+	if(llc_ui_debug > 5)
+		printk("llc_ui_insert_socket\n");
+
+        sklist_insert_socket(&llc_ui_socket_list, sk);
+
+        return;
+}
+
+static int llc_ui_release(struct socket *sock,struct socket *peersock)
+{
+        struct sock *sk = sock->sk;
+
+	if(llc_ui_debug > 5)
+		printk("llc_ui_release %p\n", sk);
+
+        if(sk == NULL)
+                return (0);
+
+        if(!sk->dead)
+                sk->state_change(sk);
+
+        sk->dead = 1;
+        sock->sk = NULL;
+        llc_ui_destroy_socket(sk);
+
+        return (0);
+}
+
+static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr,int addr_len)
+{
+        struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
+        struct datalink_proto *dl;
+        struct sock *sk;
+
+        sk = sock->sk;
+        if(sk->zapped == 0)
+                return (-EINVAL);
+        if(addr_len != sizeof(struct sockaddr_llc))
+                return (-EINVAL);
+        if(addr->sllc_family != AF_LLC)
+                return (-EAFNOSUPPORT);
+
+        dl = register_8022_client(addr->sllc_ssap, llc_ui_rcv, llc_ui_rcv_msg);
+	if(dl == NULL)
+		return (-EAGAIN);
+	sk->sap 	= addr->sllc_ssap;
+        sk->llc_proto 	= dl;
+        dl->sock 	= sk;
+
+        llc_ui_insert_socket(sk);
+        sk->zapped = 0;
+
+        return (0);
+}
+
+/* Establish a connection to a host on the network. */
+static int llc_ui_connect(struct socket *sock, struct sockaddr *uaddr,
+        int addr_len, int flags)
+{
+        struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
+        struct sock *sk = sock->sk;
+        struct datalink_proto *dl = sk->llc_proto;
+        struct sk_buff *skb;
+        struct device *dev;
+
+        if(llc_ui_debug > 3)
+                printk("llc_ui_connect %p\n", sk);
+
+        if(addr_len != sizeof(*addr))
+                return (-EINVAL);
+        if(addr->sllc_family != AF_LLC)
+                return (-EAFNOSUPPORT);
+
+        sock->state     = SS_CONNECTING;
+        sk->state       = TCP_SYN_SENT;
+	llc_ui_insert_socket(sk);
+
+        rtnl_lock();
+        dev = dev_getbyhwaddr(ARPHRD_ETHER, addr->sllc_smac);
+        rtnl_unlock();
+        if(dev == NULL)
+                return (-ENETUNREACH);
+
+	llc_connect(dl, dev, addr->sllc_dmac, addr->sllc_dsap, 0);
+
+        cli();
+        do {
+                skb = skb_dequeue(&sk->receive_queue);
+                if(skb == NULL)
+                {
+                        if(flags & O_NONBLOCK)
+                        {
+                                sti();
+                                return (-EWOULDBLOCK);
+                        }
+                        interruptible_sleep_on(sk->sleep);
+                        if(signal_pending(current))
+                        {
+                                sti();
+                                return (-ERESTARTSYS);
+                        }
+                }
+        } while (skb == NULL);
+
+        sock->state     = SS_CONNECTED;
+        sk->state       = TCP_ESTABLISHED;
+        kfree_skb(skb);
+        sti();
+
+        return (0);
+}
+
+static int llc_ui_listen(struct socket *sock, int backlog)
+{
+        struct sock *sk = sock->sk;
+
+        if(llc_ui_debug > 3)
+                printk("llc_ui_listen\n");
+
+        if(sock->state != SS_UNCONNECTED)
+                return (-EINVAL);
+        if(sk->type != SOCK_STREAM && sk->type != SOCK_SEQPACKET)
+                return (-EOPNOTSUPP);
+        if(sk->zapped != 0)
+                return (-EAGAIN);
+
+        if((unsigned) backlog == 0)     /* BSDism */
+                backlog = 1;
+        if((unsigned) backlog > SOMAXCONN)
+                backlog = SOMAXCONN;
+        sk->max_ack_backlog = backlog;
+        if(sk->state != TCP_LISTEN)
+        {
+                sk->ack_backlog = 0;
+                sk->state = TCP_LISTEN;
+        }
+        sk->socket->flags |= SO_ACCEPTCON;
+
+        return (0);
+}
+
+/* Allow a client to accept a connect. */
+static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags)
+{
+        struct sock *sk, *newsk;
+        struct sk_buff *skb;
+	struct datalink_proto *dl;
+	struct llc_pinfo *llc;
+        llchdr *llc_hdr;
+        struct ethhdr *eth_hdr;
+        int err;
+
+        if(llc_ui_debug > 3)
+                printk("llc_ui_accept %p\n", sock->sk);
+
+        if(sock->sk == NULL)
+                return (-EINVAL);
+        sk = sock->sk;
+
+        err = llc_ui_create(newsock, sk->protocol);
+        if(err)
+                return (err);
+        if((sock->state != SS_UNCONNECTED) || !(sock->flags & SO_ACCEPTCON))
+                return (-EINVAL);
+        if(sk->type != SOCK_SEQPACKET && sk->type != SOCK_STREAM)
+                return (-EOPNOTSUPP);
+        if(sk->state != TCP_LISTEN)
+                return (-EINVAL);
+
+        cli();
+        do {
+                skb = skb_dequeue(&sk->receive_queue);
+                if(skb == NULL)
+                {
+                        if(flags & O_NONBLOCK)
+                        {
+                                sti();
+                                return (-EWOULDBLOCK);
+                        }
+                        interruptible_sleep_on(sk->sleep);
+                        if(signal_pending(current))
+                        {
+                                sti();
+                                return (-ERESTARTSYS);
+                        }
+                }
+        } while (skb == NULL);
+	sti();
+
+	/* Now attach up the new socket.
+	 *
+	 * XXX: A bit hackish here yet,
+	 * LLC can only have one listener per SAP and we don't want
+	 * to truely queue connections as Unix sockets would like us
+	 * to. Instead we create a new socket with all valid data for the
+	 * new connection and set the old socket as blank and it has no
+	 * more revalance to us in the LLC layer. It is simply tossed when
+	 * the socket is disconnected. 
+	 */
+        newsk           = newsock->sk;
+	newsock->sk     = newsk;
+	llc_ui_insert_socket(newsk);
+        newsk->pair     = NULL;
+        newsk->sap      = sk->sap;
+        newsk->llc_proto= sk->llc_proto;
+	newsk->socket	= sock;		/* Link Parent sock to new sock. */
+	sk->sap		= 0;
+        sk->llc_proto   = NULL;
+	sk->socket	= sock;		/* Ensure parent is linked to itself */
+        newsk->state    = TCP_ESTABLISHED;
+        newsock->state  = SS_CONNECTED;
+        sk->ack_backlog--;
+
+	/* Ack the Connect with a UA RSP. */
+	dl      = newsk->llc_proto;
+	dl->sock= newsk;
+        llc     = dl->ll_pinfo.llc;
+	eth_hdr = (struct ethhdr *)skb->mac.raw;
+        llc_hdr = (llchdr *)skb->h.raw;
+        llc->dsap = llc_hdr->ssap;
+	memcpy(llc->dmac, eth_hdr->h_source, 6);
+
+	/* Ack the connect. */
+	llc_connect(dl, skb->dev, eth_hdr->h_source, llc_hdr->ssap, 1);
+	skb->sk = NULL;
+        kfree_skb(skb);
+
+        return (0);
+}
+
+static struct sock *llc_ui_find_socket(int type)
+{
+	struct sock *s;
+
+        for(s = llc_ui_socket_list; s != NULL; s = s->next)
+        {
+		if(s->sap == type)
+			break;
+	}
+
+	return (s);
+}
+
+int llc_ui_rcv_msg(int rsp, struct sk_buff *skb)
+{
+        llchdr *llc_hdr;
+	struct sock *sk;
+        struct datalink_proto *dl;
+        struct llc_pinfo *llc;
+
+	if(llc_ui_debug > 5)
+        	printk("llc_ui_rcv_msg\n");
+
+	llc_hdr = (llchdr *)skb->h.raw;
+        sk = llc_ui_find_socket(llc_hdr->dsap);
+        if(sk == NULL)
+        {
+		skb->sk = NULL;
+                kfree_skb(skb);
+                return (0);
+        }
+
+	dl = sk->llc_proto;
+        llc = dl->ll_pinfo.llc;
+	skb->sk = sk;
+
+        switch(rsp)
+        {
+		case (LLC_STATE_REMOTE_RESET_INDICATION):
+			llc_reset(dl, skb->dev, llc->dmac, llc->dsap, 1);
+			break;
+
+                /* Set Asynchronous Balanced Mode Extended command. */
+                case (LLC_STATE_RECEIVE_SABME_CMD):
+                        skb_queue_tail(&sk->receive_queue, skb);
+                        wake_up_interruptible(dl->sock->sleep);
+                        break;
+
+		/* Tear down this socket and toss it, move LLC/SAP data back
+		 * to original socket so that we can accept another connection
+		 * on it. Better ways to do this are always accepted. JJS.
+		 */
+		case (LLC_STATE_RECEIVE_DISC_CMD):
+		{
+			struct socket *oldsock = sk->socket;
+			struct sock *oldsk = oldsock->sk;
+			oldsk->sap      = sk->sap;
+        		oldsk->llc_proto= sk->llc_proto;
+			sk->sap = 0;
+			sk->llc_proto = NULL;
+			dl = oldsk->llc_proto;
+        		dl->sock = oldsk;
+
+			/* Kill closed socket */
+			sk->shutdown = RCV_SHUTDOWN;
+			if(!sk->dead)
+                		sk->state_change(sk);
+        		sk->dead = 1;
+			/* Wake up any sleepers on this socket. */
+			wake_up_interruptible(sk->sleep);
+
+			skb->sk = NULL;
+			kfree_skb(skb);
+			break;
+		}
+
+                case (LLC_STATE_RECEIVE_UA_RSP):
+                        skb_queue_tail(&sk->receive_queue, skb);
+                        wake_up_interruptible(dl->sock->sleep);
+                        break;
+
+		/* Events this layer doesn't care about, get toss'd */
+		default:
+			skb->sk = NULL;
+                	kfree_skb(skb);
+                	return (-1);
+        }
+
+        return (0);
+}
+
+int llc_ui_rcv(struct sk_buff *skb, struct device *dev,
+        struct packet_type *pt)
+{
+        llchdr *llc_hdr = (llchdr *)skb->h.raw;
+	struct sock *sk;
+
+	if(llc_ui_debug > 5)
+	{	
+		printk("llc_ui_rcv\n");
+		hexdump(skb->data, skb->len);
+        }
+
+        //skb_push(skb,LLC_TYPE1_SIZE);
+
+        if(skb->len < sizeof(llchdr))
+        {
+                kfree_skb(skb);
+                return (0);
+        }
+
+	sk = llc_ui_find_socket(llc_hdr->dsap);
+        if(sk == NULL)
+        {
+                kfree_skb(skb);
+                return (0);
+        }
+
+        skb->sk = sk;
+	skb->dev = dev;
+	skb_queue_tail(&sk->receive_queue, skb);
+        wake_up_interruptible(sk->sleep);
+
+	return (0);
+}
+
+static int llc_ui_recvmsg(struct socket *sock, struct msghdr *msg, int size,
+        int flags, struct scm_cookie *scm)
+{
+        struct sock *sk = sock->sk;
+	struct sockaddr_llc *uaddr = (struct sockaddr_llc *)msg->msg_name;
+	llchdr *llc_hdr;
+        struct sk_buff *skb;
+        int copied = 0, err = 0, pdu_type;
+	__u8 offset;
+
+        if(llc_ui_debug > 3)
+                printk("llc_ui_recvmsg %p\n", sk);
+
+	skb = skb_recv_datagram(sk, (flags & ~MSG_DONTWAIT),
+                                (flags & MSG_DONTWAIT), &err);
+        if (skb == NULL)
+                return err;
+
+	llc_hdr = (llchdr *)skb->h.raw;
+        pdu_type = llc_decode_pdu(llc_hdr);
+        if(pdu_type == LLC_TEST_RSP || pdu_type == LLC_UI_CMD)
+	{
+		offset = LLC_TYPE1_SIZE;
+                copied = skb->len - LLC_TYPE1_SIZE;
+	}
+        else
+	{
+		offset = LLC_TYPE2_SIZE;
+                copied = skb->len - LLC_TYPE2_SIZE;
+	}
+
+        if(copied > size)
+        {
+                copied = size;
+                msg->msg_flags |= MSG_TRUNC;
+        }
+
+	err = skb_copy_datagram_iovec(skb, offset, 
+		msg->msg_iov, copied);
+
+	if(!err)
+	{
+		if(uaddr)
+		{
+			uaddr->sllc_family      = AF_LLC;
+                	uaddr->sllc_dsap        = llc_hdr->dsap;
+                	uaddr->sllc_ssap        = llc_hdr->ssap;
+		}
+		msg->msg_namelen = sizeof(*uaddr);
+	}
+
+	skb_free_datagram(sk, skb);     /* Free the datagram. */
+
+        return err ? err : copied;
+}
+
+/* Grab data from the user and toss it onto the wire. */
+static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, int len,
+        struct scm_cookie *scm)
+{
+        struct sockaddr_llc *addr = (struct sockaddr_llc *)msg->msg_name;
+        int flags = msg->msg_flags;
+        struct sock *sk = sock->sk;
+	struct datalink_proto *dl = sk->llc_proto;
+        struct device *dev;
+        struct sk_buff *skb;
+        int err, size;
+
+        if(llc_ui_debug > 3)
+                printk("llc_ui_sendmsg: processing data.\n");
+
+        if(flags & ~MSG_DONTWAIT)
+                return (-EINVAL);
+        if(!addr)
+                return (-EINVAL);
+        if(!msg->msg_namelen)
+                return (-EINVAL);
+        if(msg->msg_namelen < sizeof(struct sockaddr_llc))
+                return (-EINVAL);
+        if(addr->sllc_family != AF_LLC)
+                return (-EINVAL);
+
+        rtnl_lock();
+        dev = dev_getbyhwaddr(ARPHRD_ETHER, addr->sllc_smac);
+        rtnl_unlock();
+        if(dev == NULL)
+                return (-ENETUNREACH);
+
+	if(!addr->sllc_test && sk->type == SOCK_STREAM)
+        	size = dl->header_length + 1;
+	else
+		size = dl->header_length;
+        size += dev->hard_header_len + len;
+
+        skb = sock_alloc_send_skb(sk, size, 0, flags&MSG_DONTWAIT, &err);
+        if(skb == NULL)
+                return (err);
+
+	if(addr->sllc_test)
+	{
+		skb->llc_cmd = LLC_STATE_TEST_REQUEST;
+		skb_reserve(skb, dl->header_length);
+	}
+	else
+	{
+		if(sk->type == SOCK_STREAM)
+		{
+			skb->llc_cmd = LLC_STATE_DATA_REQUEST;
+			skb_reserve(skb, dl->header_length + 1);
+		}
+		else
+		{
+			skb->llc_cmd = LLC_STATE_UNITDATA_REQUEST;
+			skb_reserve(skb, dl->header_length);
+		}
+	}
+
+	skb->sk  = sk;
+        skb->dev = dev;
+	skb_reserve(skb, dev->hard_header_len);
+	dl->datalink_header(dl, skb, &addr->sllc_dsap);
+        err = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len);
+        dev->hard_header(skb, dev, ETH_P_802_3, addr->sllc_dmac, NULL,skb->len);
+        if(err)
+        {
+                kfree_skb(skb);
+                return (-EFAULT);
+        }
+
+        llc_queue_xmit(skb);
+
+        return (len);
+}
+
+static int llc_ui_shutdown(struct socket *sock, int how)
+{
+	struct sock *sk = sock->sk;
+
+	return (llc_ui_disconnect(sk));
+}
+
+static int llc_ui_disconnect(struct sock *sk)
+{
+        struct datalink_proto *dl = sk->llc_proto;
+        struct llc_pinfo *llc = dl->ll_pinfo.llc;
+	struct device *dev;
+	struct sk_buff *skb;
+
+	if(llc_ui_debug > 5)
+		printk("llc_ui_disconnect %p\n", sk);
+
+	rtnl_lock();
+        dev = dev_getbyhwaddr(ARPHRD_ETHER, llc->dmac);
+        rtnl_unlock();
+        if(dev == NULL)
+               	return (-ENETUNREACH);
+
+	llc_disconnect(dl, dev, llc->dmac, llc->dsap, 0);
+        cli();
+        do {
+               	skb = skb_dequeue(&sk->receive_queue);
+                if(skb == NULL)
+                {
+                       	interruptible_sleep_on(sk->sleep);
+                        if(signal_pending(current))
+                        {
+                              	sti();
+                                return (-ERESTARTSYS);
+                        }
+		}
+	} while (skb == NULL);
+
+        /* Received disconnect indication, socket shutdown. */
+        skb->sk = NULL;
+        kfree_skb(skb);
+        return (0);
+}
+
+static int llc_ui_ioctl(struct socket *sock, unsigned int cmd,unsigned long arg)
+{
+        struct sock *sk = sock->sk;
+        struct datalink_proto *dl = sk->llc_proto;
+        struct llc_pinfo *llc = dl->ll_pinfo.llc;
+        int val;
+
+	if(dl == NULL)
+		return (-EINVAL);
+
+        if(copy_from_user(&val, &arg, sizeof(int)))
+                return (-EFAULT);
+
+        switch(cmd)
+        {
+                case (LLC_IOCTL_RETRY):
+                        if(val > LLC_MAX_RETRY)
+                                return (-EINVAL);
+                        llc->max_retry = val;
+                        break;
+
+                case (LLC_IOCTL_SIZE):
+                        if(val > LLC_MAX_SIZE)
+                                return (-EINVAL);
+                        llc->max_size = val;
+                        break;
+
+                case (LLC_IOCTL_WINDOW):
+                        if(val > LLC_MAX_WINDOW)
+                                return (-EINVAL);
+                        llc->max_window = val;
+                        break;
+
+                case (LLC_IOCTL_ACK_TIMER_EXPIRE):
+                        if(val > LLC_MAX_ACK_TIMER_EXPIRE)
+                                return (-EINVAL);
+                        llc->ack_expire = val;
+                        break;
+
+                case (LLC_IOCTL_P_TIMER_EXPIRE):
+                        if(val > LLC_MAX_P_TIMER_EXPIRE)
+                                return (-EINVAL);
+                        llc->p_expire = val;
+                        break;
+
+                case (LLC_IOCTL_REJ_TIMER_EXPIRE):
+                        if(val > LLC_MAX_REJ_TIMER_EXPIRE)
+                                return (-EINVAL);
+                        llc->rej_expire = val;
+                        break;
+
+                case (LLC_IOCTL_BUSY_TIMER_EXPIRE):
+                        if(val > LLC_MAX_BUSY_TIMER_EXPIRE)
+                                return (-EINVAL);
+                        llc->busy_expire = val;
+                        break;
+
+                default:
+                        return (-EOPNOTSUPP);
+        }
+
+        return (0);
+}
+
+static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
+        int *uaddr_len, int peer)
+{
+	struct sockaddr_llc from;
+	struct sock *sk = sock->sk;
+	struct llc_pinfo *llc = sk->llc_proto->ll_pinfo.llc;
+
+	if(llc_ui_debug > 5)
+		printk("llc_ui_getname\n");
+
+        *uaddr_len = sizeof(struct sockaddr_llc);
+	from.sllc_family 	= AF_LLC;
+	from.sllc_ssap 		= llc->ssap;
+	from.sllc_dsap		= llc->dsap;
+	memcpy(from.sllc_dmac, llc->dmac, 14);
+        memcpy(uaddr, &from, sizeof(from));
+
+        return (0);
+}
+
+static int llc_ui_setsockopt(struct socket *sock, int level, int optname, 
+	char *optval, int optlen)
+{
+        struct datalink_proto *dl;
+        struct sock *sk;
+        int err, opt;
+
+        sk = sock->sk;
+
+        if(optlen != sizeof(int))
+                return (-EINVAL);
+
+        err = get_user(opt, (unsigned int *)optval);
+        if(err)
+                return (err);
+
+        dl = sk->llc_proto;
+        if(dl == NULL && optname != LLC_REG_SAP_CLIENT)
+                return (-EAGAIN);
+
+        switch(level)
+        {
+                case (SOL_LLC):
+                        switch(optname)
+                        {
+                                /* Register a LLC UI SAP client with LLC. */
+                                case (LLC_REG_SAP_CLIENT):
+                                        sk->sap = opt;
+                                        dl = register_8022_client(sk->sap,
+                                                llc_ui_rcv, llc_ui_rcv_msg);
+					if(dl == NULL)
+						return (-EAGAIN);
+                                        sk->llc_proto = dl;
+                                        dl->sock = sk;
+                                        break;
+
+                                case (LLC_QUE_MSG):
+                                        break;
+
+                                case (LLC_IOCTL_RETRY):
+                                        if(opt > LLC_MAX_RETRY)
+                                                return (-EINVAL);
+                                        dl->ll_pinfo.llc->max_retry = opt;
+                                        break;
+
+                                case (LLC_IOCTL_SIZE):
+                                        if(opt > LLC_MAX_SIZE)
+                                                return (-EINVAL);
+                                        dl->ll_pinfo.llc->max_size = opt;
+                                        break;
+
+                                case (LLC_IOCTL_WINDOW):
+                                        if(opt > LLC_MAX_WINDOW)
+                                                return (-EINVAL);
+                                        dl->ll_pinfo.llc->max_window = opt;
+                                        break;
+
+                                case (LLC_IOCTL_ACK_TIMER_EXPIRE):
+                                        if(opt > LLC_MAX_ACK_TIMER_EXPIRE)
+                                                return (-EINVAL);
+                                        dl->ll_pinfo.llc->ack_expire = opt;
+                                        break;
+
+                                case (LLC_IOCTL_P_TIMER_EXPIRE):
+                                        if(opt > LLC_MAX_P_TIMER_EXPIRE)
+                                                return (-EINVAL);
+                                        dl->ll_pinfo.llc->p_expire = opt;
+                                        break;
+
+                                case (LLC_IOCTL_REJ_TIMER_EXPIRE):
+                                        if(opt > LLC_MAX_REJ_TIMER_EXPIRE)
+                                                return (-EINVAL);
+                                        dl->ll_pinfo.llc->rej_expire = opt;
+                                        break;
+
+                                case (LLC_IOCTL_BUSY_TIMER_EXPIRE):
+                                        if(opt > LLC_MAX_BUSY_TIMER_EXPIRE)
+                                                return (-EINVAL);
+                                        dl->ll_pinfo.llc->busy_expire = opt;
+                                        break;
+
+                                default:
+                                        return (-ENOPROTOOPT);
+                        }
+                        break;
+
+                default:
+                        return (-ENOPROTOOPT);
+        }
+
+        return (0);
+}
+
+static int llc_ui_getsockopt(struct socket *sock, int level, int optname,
+        char *optval, int *optlen)
+{
+        struct sock *sk;
+        struct datalink_proto *dl;
+        struct llc_pinfo *llc;
+        int val = 0;
+        int len;
+
+        if(llc_ui_debug > 3)
+                printk("llc_ui_getsockopt\n");
+
+        sk = sock->sk;
+        if(sk->llc_proto == NULL)
+        {
+                printk("Need to register sap first\n");
+                return (-1);
+        }
+
+        dl = sk->llc_proto;
+        llc = dl->ll_pinfo.llc;
+
+        if(llc == NULL)
+                return (-EINVAL);
+
+        switch(level)
+        {
+                case (SOL_LLC):
+                        switch(optname)
+                        {
+                                case (LLC_IOCTL_SSAP):
+                                        val = llc->ssap;
+                                        break;
+
+                                case (LLC_IOCTL_RETRY):
+                                        val = llc->max_retry;
+                                        break;
+
+                                case (LLC_IOCTL_SIZE):
+                                        val = llc->max_size;
+                                        break;
+
+                                case (LLC_IOCTL_WINDOW):
+                                        val = llc->max_window;
+                                        break;
+
+                                case (LLC_IOCTL_ACK_TIMER_EXPIRE):
+                                        val = llc->ack_expire;
+                                        break;
+
+                                case (LLC_IOCTL_P_TIMER_EXPIRE):
+                                        val = llc->p_expire;
+                                        break;
+
+                                case (LLC_IOCTL_REJ_TIMER_EXPIRE):
+                                        val = llc->rej_expire;
+                                        break;
+
+                                case (LLC_IOCTL_BUSY_TIMER_EXPIRE):
+                                        val = llc->busy_expire;
+                                        break;
+                        }
+                        break;
+
+                default:
+                        return (-ENOPROTOOPT);
+        }
+
+        if(get_user(len, optlen))
+                return (-EFAULT);
+
+        len = min(len, sizeof(int));
+        if(put_user(len, optlen))
+                return (-EFAULT);
+
+        if(copy_to_user(optval, &val, len))
+                return (-EFAULT);
+
+        return (0);
+}
+
+static struct net_proto_family llc_ui_family_ops =
+{
+        PF_LLC,
+        llc_ui_create
+};
+
+static struct proto_ops llc_ui_ops =
+{
+        PF_LLC,
+        sock_no_dup,
+        llc_ui_release,
+        llc_ui_bind,
+        llc_ui_connect,
+        sock_no_socketpair,
+        llc_ui_accept,
+        llc_ui_getname,
+        datagram_poll,
+        llc_ui_ioctl,
+        llc_ui_listen,
+        llc_ui_shutdown,
+        llc_ui_setsockopt,
+        llc_ui_getsockopt,
+        sock_no_fcntl,
+        llc_ui_sendmsg,
+        llc_ui_recvmsg,
+};
+
+void llc_ui_proto_init(struct net_proto *proto)
+{
+	(void)sock_register(&llc_ui_family_ops);
+
+	printk(KERN_INFO "ANSI/IEEE 802.2 User Interface SAPs for LLC v0.12\n");
+}
+
+#ifdef MODULE
+int init_module(void)
+{
+        llc_ui_proto_init(NULL);
+
+        return (0);
+}
+
+/* LLC *can not* be unloaded until each client has been unregistered. */
+void cleanup_module(void)
+{
+	sock_unregister(PF_LLC);
+}
+#endif /* MODULE */
+#endif /* CONFIG_LLC_UI || CONFIG_LLC_UI_MODULE */
diff -uNr linux/net/llc/dl_llc.c linux-llc/net/llc/dl_llc.c
--- linux/net/llc/dl_llc.c	Tue May  5 21:32:27 1998
+++ linux-llc/net/llc/dl_llc.c	Mon Sep 25 16:19:08 2000
@@ -0,0 +1,3286 @@
+/* IEEE 802.2 LLC Class 1 and Class 2 implementation for Linux.
+ *
+ * Author:
+ * Jay Schulist <jschlst@turbolinux.com>
+ *
+ * Sources:
+ * - ANSI/IEEE Std 802.2-1989.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ * None of the authors or maintainers or their employers admit
+ * liability nor provide warranty for any of this software.
+ * This material is provided "as is" and at no charge.
+ *
+ * ToDo:
+ * - Enable linux to do duplicate address checking upon bringing
+ *   an interface to the IFF_UP state.
+ */
+
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <net/datalink.h>
+#include <net/sock.h>
+#include <asm/byteorder.h>
+#include <asm/uaccess.h>
+#include <linux/uio.h>
+#include <linux/unistd.h>
+#include <linux/mm.h>
+#include <linux/socket.h>
+#include <linux/sockios.h>
+#include <linux/in.h>
+#include <net/sock.h>
+#include <linux/proc_fs.h>
+#include <linux/skbuff.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+
+#include <net/llc.h>
+#include <linux/llc.h>
+
+#include <linux/rtnetlink.h>
+#include <linux/notifier.h>
+#include <linux/if_arp.h>
+
+#include <linux/ctype.h>        /* For hexdump() */
+
+#ifdef CONFIG_SYSCTL
+extern inline void llc_register_sysctl(void);
+extern inline void llc_unregister_sysctl(void);
+#endif /* CONFIG_SYSCTL */
+
+int sysctl_max_retry            = LLC_RETRY;
+int sysctl_max_size             = LLC_SIZE;
+int sysctl_max_window           = LLC_WINDOW;
+int sysctl_ack_timer_expire     = LLC_ACK_TIMER_EXPIRE;
+int sysctl_p_timer_expire       = LLC_P_TIMER_EXPIRE;
+int sysctl_rej_timer_expire     = LLC_REJ_TIMER_EXPIRE;
+int sysctl_busy_timer_expire    = LLC_BUSY_TIMER_EXPIRE;
+int llc_debug			= 0;
+
+#ifdef MODULE
+MODULE_PARM(llc_debug, "i");
+#endif
+
+static struct llc_sc_info *llc_sc_list = NULL;
+
+static struct llc_pinfo *llc_sc = NULL;
+static struct datalink_proto *llc_client_list 	= NULL;
+
+static int llc_strip_8022(struct sk_buff *skb, int size);
+int llc_rcv(struct sk_buff *skb, struct device *dev,struct packet_type *pt);
+static int llc_demux_pdu(int action, struct sk_buff *skb,
+        struct datalink_proto *proto);
+static int llc_process_pdu_type2(struct sk_buff *skb,
+        struct datalink_proto *proto, struct device *dev,
+        struct packet_type *pt);
+static void llc_datalink_header(struct datalink_proto *dl,
+        struct sk_buff *skb, unsigned char *dsap);
+static int llc_build_pdu(struct sk_buff *skb, struct llc_pinfo *llc, 
+	unsigned char dsap);
+static int llc_start_ack_timer(struct llc_pinfo *llc);
+static int llc_stop_ack_timer(struct llc_pinfo *llc);
+static void llc_ack_expire(unsigned long data);
+static int llc_start_p_timer(struct llc_pinfo *llc);
+static int llc_stop_p_timer(struct llc_pinfo *llc);
+static void llc_p_expire(unsigned long data);
+static int llc_start_rej_timer(struct llc_pinfo *llc);
+static int llc_stop_rej_timer(struct llc_pinfo *llc);
+static void llc_rej_expire(unsigned long data);
+static int llc_start_busy_timer(struct llc_pinfo *llc);
+static int llc_stop_busy_timer(struct llc_pinfo *llc);
+static void llc_busy_expire(unsigned long data);
+static int llc_init(struct llc_pinfo *llc);
+static int llc_purge_queues(struct llc_pinfo *llc);
+static int llc_destroy_client(struct llc_pinfo *llc);
+static struct datalink_proto *llc_find_client(__u8 type);
+void llc_proto_init(struct net_proto *proto);
+static int llc_process_pdu_type1_sc(struct sk_buff *skb,
+        struct datalink_proto *proto, struct device *dev,
+        struct packet_type *pt);
+static int llc_process_pdu_type1_sap(struct sk_buff *skb,
+        struct datalink_proto *proto, struct device *dev,
+        struct packet_type *pt);
+int llc_queue_rsp(int rsp, struct sk_buff *skb, struct datalink_proto *proto);
+static int llc_update_nr(struct llc_pinfo *llc, struct sk_buff *skb);
+int llc_decode_pdu(llchdr *llc);
+static int llc_stop_all_timers(struct llc_pinfo *llc);
+static void llc_update_pf(struct llc_pinfo *llc, struct sk_buff *skb,int fflag);
+
+static int hexdump(unsigned char *pkt_data, int pkt_len)
+{
+        int i;
+
+        while(pkt_len>0)
+        {
+                printk("  ");   /* Leading spaces. */
+
+                /* Print the HEX representation. */
+                for(i=0; i<8; ++i)
+                {
+                        if(pkt_len - (long)i>0)
+                                printk("%2.2X ", pkt_data[i] & 0xFF);
+                        else
+                                printk("  ");
+                }
+
+                printk(":");
+
+                for(i=8; i<16; ++i)
+                {
+                        if(pkt_len - (long)i>0)
+                                printk("%2.2X ", pkt_data[i]&0xFF);
+                        else
+                                printk("  ");
+                }
+
+                /* Print the ASCII representation. */
+                printk("  ");
+
+                for(i=0; i<16; ++i)
+                {
+                        if(pkt_len - (long)i>0)
+                        {
+                                if(isprint(pkt_data[i]))
+                                        printk("%c", pkt_data[i]);
+                                else
+                                        printk(".");
+                        }
+                }
+
+                printk("\n");
+                pkt_len -= 16;
+                pkt_data += 16;
+        }
+
+        printk("\n");
+
+        return (0);
+}
+
+int llc_data(__u8 ssap, __u8 dsap, __u8 *dmac,
+	struct sk_buff *skb, struct device *dev)
+{
+	struct datalink_proto *dl = llc_find_client(dsap);
+	struct llc_pinfo *llc = dl->ll_pinfo.llc;
+
+	printk("WE ARE BUILDING A DATA REQ\n");
+        llc->build = LLC_STATE_SEND_I_CMD;
+	llc->dsap = dsap;
+        llc_build_pdu(skb, llc, dsap);
+        llc->state2 = LLC_STATE_NORMAL;
+
+	dev->hard_header(skb, dev, ETH_P_802_3, dmac, NULL, skb->len);
+        llc_queue_xmit(skb);
+        return (0);
+}
+
+int llc_test(__u8 ssap, __u8 dsap, __u8 *dmac,
+	struct sk_buff *skb, struct device *dev)
+{
+	struct datalink_proto *dl = llc_find_client(dsap);
+        struct llc_pinfo *llc = dl->ll_pinfo.llc;
+
+	printk("Sending LLC TEST from from %02X to %02X\n", ssap, dsap);
+
+	llc->build 	= LLC_STATE_SEND_TEST_C;
+	llc->dsap	= dsap;
+	llc_build_pdu(skb, llc, dsap);
+	llc->state2	= LLC_STATE_NORMAL;
+
+	dev->hard_header(skb, dev, ETH_P_802_3, dmac, NULL, skb->len);
+	hexdump(skb->data, skb->len);
+	llc_queue_xmit(skb);
+	return (0);	
+}
+
+int llc_connect(struct datalink_proto *dl, struct device *dev,
+	__u8 *dmac, __u8 dsap, int rsp)
+{
+	struct llc_pinfo *llc = dl->ll_pinfo.llc;
+	struct sk_buff *skb;
+	llchdr *llc_hdr;
+	int size;
+
+	size = dl->header_length + 1;
+        size += dev->hard_header_len;
+
+        skb = alloc_skb(size, GFP_KERNEL);
+        if(skb == NULL)
+                return (-ENOMEM);
+        skb->dev = dev;
+        skb_reserve(skb, dl->header_length + 1);
+        skb_reserve(skb, dev->hard_header_len);
+
+	if(rsp)
+	{
+		if(llc->state2 != LLC_STATE_CONN)
+		{
+			kfree_skb(skb);
+			return (-EINVAL);
+		}
+
+		llc->build = LLC_STATE_SEND_UA_RSP;
+		llc_build_pdu(skb, llc, 0);
+		llc_hdr = (llchdr *)skb->data;
+		llc_hdr->ctrl.uctrl.pf = llc->p_flag;
+		llc->seq.vs = 0;
+		llc->seq.vr = 0;
+		llc->retry_count = 0;
+		llc->p_flag = 0;
+		llc->remote_busy = 0;
+		llc->state2 = LLC_STATE_NORMAL;
+	}
+	else
+	{
+		if(llc->state2 != LLC_STATE_ADM)
+		{
+			kfree_skb(skb);
+			return (-EINVAL);
+		}
+
+		llc->build = LLC_STATE_SEND_SABME_CMD;
+                llc_build_pdu(skb, llc, 0);
+                llc_start_ack_timer(llc);
+                llc->retry_count = 0;
+                llc->s_flag = 0;
+                llc->state2 = LLC_STATE_SETUP;
+	}
+
+
+	dev->hard_header(skb, dev, ETH_P_802_3, dmac, NULL, skb->len);
+        llc_queue_xmit(skb);
+	return (0);
+}
+
+int llc_reset(struct datalink_proto *dl, struct device *dev,
+        __u8 *dmac, __u8 dsap, int rsp)
+{
+	struct llc_pinfo *llc = dl->ll_pinfo.llc;
+        struct sk_buff *skb;
+        llchdr *llc_hdr;
+        int size;
+
+        size = dl->header_length + 1;
+        size += dev->hard_header_len;
+
+        skb = alloc_skb(size, GFP_KERNEL);
+        if(skb == NULL)
+                return (-ENOMEM);
+        skb->dev = dev;
+        skb_reserve(skb, dl->header_length + 1);
+        skb_reserve(skb, dev->hard_header_len);
+
+        if(rsp)
+        {
+		if(llc->state2 != LLC_STATE_RESET_CHECK)
+		{
+			kfree_skb(skb);
+			return (-EINVAL);
+		}
+
+		llc->build = LLC_STATE_SEND_UA_RSP;
+		llc_build_pdu(skb, llc, 0);
+		llc_hdr = (llchdr *)skb->data;
+		llc_hdr->ctrl.sctrl.pf = llc->f_flag;
+		llc->seq.vs = 0;
+		llc->seq.vr = 0;
+		llc->retry_count = 0;
+                llc->p_flag = 0;
+                llc->remote_busy = 0;
+                llc->state2 = LLC_STATE_NORMAL;
+	}
+	else
+	{
+		if(llc->state2 != LLC_STATE_NORMAL
+                        || llc->state2 != LLC_STATE_BUSY
+                        || llc->state2 != LLC_STATE_REJECT
+                        || llc->state2 != LLC_STATE_AWAIT
+                        || llc->state2 != LLC_STATE_AWAIT_BUSY
+                        || llc->state2 != LLC_STATE_AWAIT_REJECT
+			|| llc->state2 != LLC_STATE_RESET_WAIT)
+		{
+			kfree_skb(skb);
+			return (-EINVAL);
+		}
+
+		if(llc->state2 == LLC_STATE_RESET_WAIT)
+		{
+			if(!llc->s_flag)
+                        {
+                        	llc->build = LLC_STATE_SEND_SABME_CMD;
+                                llc_build_pdu(skb, llc, 0);
+                                llc_hdr = (llchdr *)skb->data;
+                                llc_update_pf(llc, skb, 0);
+                                llc_start_ack_timer(llc);
+                                llc->retry_count = 0;
+                                llc->state2 = LLC_STATE_RESET;
+                        }
+			else
+			{
+				kfree_skb(skb);
+				return (-EINVAL);
+			}
+		}
+		else
+		{
+			llc->build = LLC_STATE_SEND_SABME_CMD;
+                        llc_build_pdu(skb, llc, 0);
+                        llc_hdr = (llchdr *)skb->data;
+                        llc_update_pf(llc, skb, 0);
+                        llc_start_ack_timer(llc);
+                        llc_stop_p_timer(llc);
+                        llc_stop_busy_timer(llc);
+                        llc_stop_rej_timer(llc);
+                        llc->retry_count = 0;
+                        llc->s_flag = 0;
+                        llc->state2 = LLC_STATE_RESET;
+		}
+	}
+
+	dev->hard_header(skb, dev, ETH_P_802_3, dmac, NULL, skb->len);
+        llc_queue_xmit(skb);
+        return (0);
+}
+
+int llc_disconnect(struct datalink_proto *dl, struct device *dev,
+	__u8 *dmac, __u8 dsap, int rsp)
+{
+	struct llc_pinfo *llc = dl->ll_pinfo.llc;
+        struct sk_buff *skb;
+        llchdr *llc_hdr;
+        int size;
+
+        size = dl->header_length + 1;
+        size += dev->hard_header_len;
+
+        skb = alloc_skb(size, GFP_KERNEL);
+        if(skb == NULL)
+                return (-ENOMEM);
+        skb->dev = dev;
+        skb_reserve(skb, dl->header_length + 1);
+        skb_reserve(skb, dev->hard_header_len);
+
+        if(llc->state2 != LLC_STATE_NORMAL 
+		|| llc->state2 != LLC_STATE_BUSY
+                || llc->state2 != LLC_STATE_REJECT
+                || llc->state2 != LLC_STATE_AWAIT
+                || llc->state2 != LLC_STATE_AWAIT_BUSY
+                || llc->state2 != LLC_STATE_AWAIT_REJECT
+		|| llc->state2 != LLC_STATE_CONN
+		|| llc->state2 != LLC_STATE_RESET_WAIT
+		|| llc->state2 != LLC_STATE_RESET_CHECK
+		|| rsp)
+	{
+		kfree_skb(skb);
+		return (-EINVAL);
+	}
+
+	if(llc->state2 == LLC_STATE_CONN || llc->state2 == LLC_STATE_RESET_CHECK
+		|| (llc->state2 == LLC_STATE_RESET_WAIT && llc->s_flag))
+	{
+		llc->build = LLC_STATE_SEND_DM_RSP;
+                llc_build_pdu(skb, llc, 0);
+		llc_hdr = (llchdr *)skb->data;
+		llc_hdr->ctrl.sctrl.pf = llc->f_flag;
+		llc->state2 = LLC_STATE_ADM;
+	}
+	else
+	{
+		llc->build = LLC_STATE_SEND_DISC_CMD;
+		llc_build_pdu(skb, llc, 0);
+		llc_update_pf(llc, skb, 0);
+		llc_start_ack_timer(llc);
+		llc->retry_count = 0;
+		llc->state2 = LLC_STATE_D_CONN;
+	}
+
+	dev->hard_header(skb, dev, ETH_P_802_3, dmac, NULL, skb->len);
+        llc_queue_xmit(skb);
+        return (0);
+}
+
+/* Remove the 802.2 header of "size" length. */
+static int llc_strip_8022(struct sk_buff *skb, int size)
+{
+        skb->h.raw      += size;
+        skb->nh.raw     += size;
+        skb_pull(skb, size);
+
+        return (0);
+}
+
+/* LLC layer receive function: Here all 802.2 packets come in. */
+int llc_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
+{
+        struct datalink_proto *proto;
+        llchdr *llc_hdr = (llchdr *)skb->h.raw;
+	int pdu_action;
+
+	if(llc_debug > 10)
+	{
+                printk("llc_rcv\n");
+		hexdump(skb->data, skb->len);
+	}
+
+        /* If the requested client is not registered no sense in any further
+         * processing, we just toss the skb. Null DSAP is handled by the
+	 * Station Component.
+         */
+        proto = llc_find_client(llc_hdr->dsap);
+        if(proto == NULL)
+        {
+		skb->sk = NULL;
+		kfree_skb(skb);
+		return (0);
+        }
+
+	if(llc_debug > 5)
+	{
+		printk("Client found for LLC datagram %02X\n", llc_hdr->dsap);
+		hexdump(skb->h.raw, skb->len);
+	}
+
+        /* Discover what the command or response PDU is holding. */
+        if((pdu_action = llc_decode_pdu(llc_hdr)) < 0)
+	{
+		skb->sk = NULL;
+		kfree_skb(skb);
+		return (0);
+	}
+
+        skb->dev = dev;         /* Relink just to be safe. */
+        skb->pt  = pt;		/* Attach pt here. */
+
+	/* Proceed to processing the received pdu. */
+        return(llc_demux_pdu(pdu_action, skb, proto));
+}
+
+int llc_decode_pdu(llchdr *llc)
+{
+        llc_bits *bits = &llc->ctrl.bits;
+
+        /* Unnumbered command/response. Pdu_type = 11. */
+        if(bits->f1 && bits->f2)
+        {
+                switch(bits->f3 & 0x3B)
+                {
+                        case (0x00):
+                                return (LLC_UI_CMD);
+
+                        case (0x03):
+                                return (LLC_DM_RSP);
+
+                        case (0x10):
+                                return (LLC_DISC_CMD);
+
+                        case (0x18):
+                                return (LLC_UA_RSP);
+
+                        case (0x1B):
+                                return (LLC_SABME_CMD);
+
+                        case (0x21):
+                                return (LLC_FRMR_RSP);
+
+                        case (0x2B):
+                                if(llc->ssap & LLC_PDU_RSP)
+                                        return (LLC_XID_RSP);
+                                else
+                                        return (LLC_XID_CMD);
+
+                        case (0x38):
+                                if(llc->ssap & LLC_PDU_RSP)
+                                        return (LLC_TEST_RSP);
+                                else
+                                        return (LLC_TEST_CMD);
+
+                        default:
+                                        return (-1);
+                }
+        }
+
+        /* Supervisory command/response. Pdu_type = 10. */
+        if(bits->f1 && !bits->f2)
+        {
+                switch(bits->f3 & 0x3B)
+                {
+                        case (0x00):
+                                if(llc->ssap & LLC_PDU_RSP)
+                                        return (LLC_RR_RSP);
+                                else
+                                        return (LLC_RR_CMD);
+
+                        case (0x01):
+                                if(llc->ssap & LLC_PDU_RSP)
+                                        return (LLC_RNR_RSP);
+                                else
+                                        return (LLC_RNR_CMD);
+
+                        case (0x02):
+                                if(llc->ssap & LLC_PDU_RSP)
+                                        return (LLC_REJ_RSP);
+                                else
+                                        return (LLC_REJ_CMD);
+
+                        default:
+                                return (-1);
+                }
+        }
+
+        /* Information transfer command/response. Pdu_type = 0. */
+        if(!bits->f1)
+        {
+                if(llc->ssap & LLC_PDU_RSP)
+                        return (LLC_I_RSP);
+                else
+                        return (LLC_I_CMD);
+        }
+
+        /* Catch all, should never get here. */
+        return (-1);
+}
+
+/* Demux the PDU and continue processing on it. 
+ *
+ * This is where all the work is done.
+ */
+static int llc_demux_pdu(int event, struct sk_buff *skb,
+	struct datalink_proto *proto)
+{
+	llchdr *llc_hdr = (llchdr *)skb->h.raw;
+	struct llc_pinfo *llc = proto->ll_pinfo.llc;
+	struct device *dev = skb->dev;
+	struct packet_type *pt = skb->pt;
+
+        if(llc_debug > 10)
+                printk("llc_demux_pdu\n");
+
+        /* Preform the needed operations to complete the command or response. */
+	switch(event)
+        {
+		/* LLC Class One PDUs */
+                case (LLC_UI_CMD):
+			llc->event = LLC_STATE_RECEIVE_UI;
+                        llc_process_pdu_type1_sap(skb, proto, dev, pt);
+                        break;
+
+                case (LLC_XID_CMD):
+			if(!llc_hdr->dsap)
+			{
+                                llc->event = LLC_STATE_RECEIVE_NULL_DSAP_XID_C;
+				llc_process_pdu_type1_sc(skb, proto, dev, pt);
+			}
+                        else
+			{
+                                llc->event = LLC_STATE_RECEIVE_XID_C;
+                        	llc_process_pdu_type1_sap(skb, proto, dev, pt);
+			}
+                        break;
+
+                case (LLC_XID_RSP):
+			llc->event = LLC_STATE_RECEIVE_XID_R;
+                        llc_process_pdu_type1_sap(skb, proto, dev, pt);
+                        break;
+
+                case (LLC_TEST_CMD):
+			if(!llc_hdr->dsap)
+			{
+                                llc->event = LLC_STATE_RECEIVE_NULL_DSAP_TEST_C;
+				llc_process_pdu_type1_sc(skb, proto, dev, pt);
+			}
+                        else
+			{
+                                llc->event = LLC_STATE_RECEIVE_TEST_C;
+                        	llc_process_pdu_type1_sap(skb, proto, dev, pt);
+			}
+                        break;
+
+                case (LLC_TEST_RSP):
+			llc->event = LLC_STATE_RECEIVE_TEST_R;
+                        llc_process_pdu_type1_sap(skb, proto, dev, pt);
+                        break;
+
+		/* 
+		 * LLC Class Two PDUs 
+		 */
+		/* Unnumbered Acknowledgement response. */
+		case (LLC_UA_RSP):      /* Type 2. */
+                        llc->event = LLC_STATE_RECEIVE_UA_RSP;
+                        llc_process_pdu_type2(skb, proto, dev, pt);
+                        break;
+
+		/* Disconnect command. */
+		case (LLC_DISC_CMD):    /* Type 2. */
+			llc->event = LLC_STATE_RECEIVE_DISC_CMD;
+                        llc_process_pdu_type2(skb, proto, dev, pt);
+                        break;
+
+		/* Disconnected Mode response. */
+                case (LLC_DM_RSP):      /* Type 2. */
+                        llc->event = LLC_STATE_RECEIVE_DM_RSP;
+                        llc_process_pdu_type2(skb, proto, dev, pt);
+                        break;
+
+		/* Set Asynchronous Balanced Mode Extended command. */
+	        case (LLC_SABME_CMD):   /* Type 2. */
+                        llc->event = LLC_STATE_RECEIVE_SABME_CMD;
+                        llc_process_pdu_type2(skb, proto, dev, pt);
+                        break;
+
+		/* Frame Reject response. (Connection reset request) */
+                case (LLC_FRMR_RSP):    /* Type 2. */
+                        llc->event = LLC_STATE_RECEIVE_FRMR_RSP;
+                        llc_process_pdu_type2(skb, proto, dev, pt);
+                        break;
+
+		/* Receive Ready command/response. */
+                case (LLC_RR_CMD):      /* Type 2. */
+/* Good */      case (LLC_RR_RSP):      /* Type 2. */
+                        llc->event = LLC_STATE_RECEIVE_RR_CMD;
+                        llc_process_pdu_type2(skb, proto, dev, pt);
+                        break;
+
+		/* Receive Not Ready command. */
+                case (LLC_RNR_CMD):     /* Type 2. */
+                        llc->event = LLC_STATE_RECEIVE_RNR_CMD;
+                        llc_process_pdu_type2(skb, proto, dev, pt);
+                        break;
+
+		/* Receive Not Ready response. */
+                case (LLC_RNR_RSP):     /* Type 2. */
+                        llc->event = LLC_STATE_RECEIVE_RNR_RSP;
+                        llc_process_pdu_type2(skb, proto, dev, pt);
+                        break;
+
+		/* Reject command. */
+                case (LLC_REJ_CMD):     /* Type 2. */
+                        llc->event = LLC_STATE_RECEIVE_REJ_CMD;
+                        llc_process_pdu_type2(skb, proto, dev, pt);
+                        break;
+
+		/* Reject response. */
+                case (LLC_REJ_RSP):     /* Type 2. */
+                        llc->event = LLC_STATE_RECEIVE_REJ_RSP;
+                        llc_process_pdu_type2(skb, proto, dev, pt);
+                        break;
+
+		/* Information command. */
+/* Good */      case (LLC_I_CMD):       /* Type 2. */
+                        llc->event = LLC_STATE_RECEIVE_I_CMD;
+                        llc_process_pdu_type2(skb, proto, dev, pt);
+                        break;
+
+		/* Information response. */
+                case (LLC_I_RSP):       /* Type 2. */
+                        llc->event = LLC_STATE_RECEIVE_I_RSP;
+                        llc_process_pdu_type2(skb, proto, dev, pt);
+                        break;
+
+                default:
+                        skb->sk = NULL;
+                        kfree_skb(skb);
+                        break;
+        }
+
+        return (0);
+}
+
+static int llc_process_pdu_type1_sc(struct sk_buff *skb,
+        struct datalink_proto *proto, struct device *dev,
+        struct packet_type *pt)
+{
+        struct llc_pinfo *llc = proto->ll_pinfo.llc;
+
+        if(llc_debug > 10)
+                printk("llc_process_pdu_type1_sc\n");
+
+        switch(llc->state)
+        {
+                case (LLC_STATE_DOWN):
+                        skb->sk = NULL;
+                        kfree_skb(skb);
+                        return (0);
+
+                case (LLC_STATE_UP):
+                        switch(llc->event)
+                        {
+                                case (LLC_STATE_RECEIVE_NULL_DSAP_XID_C):
+					llc->build = LLC_STATE_SEND_XID_R;
+					llc_build_pdu(skb, llc, 0);
+					llc_queue_xmit(skb);
+                                        llc->state = LLC_STATE_UP;
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_NULL_DSAP_TEST_C):
+                                        llc->build = LLC_STATE_SEND_NULL_DSAP_TEST_R;
+                                        llc_build_pdu(skb, llc, 0);
+                                        llc_queue_xmit(skb);
+                                        llc->state = LLC_STATE_UP;
+                                        break;
+
+                                default:
+                                        skb->sk = NULL;
+                                        kfree_skb(skb);
+                                        return (-EINVAL);
+                        }
+                        break;
+
+		/* Not supporting at the moment */
+                case (LLC_STATE_DUPLICATE_ADDRESS_CHK):
+                        switch(llc->event)
+                        {
+                                case (LLC_STATE_RECEIVE_NULL_DSAP_XID_R):
+                                        if(!llc->xid_r_count)
+                                        {
+                                                llc->xid_r_count++;
+                                                llc->state = LLC_STATE_DUPLICATE_ADDRESS_CHK;
+                                                kfree_skb(skb);
+                                                break;
+                                        }
+                                        else    /* llc->xid_r_count == 1. */
+                                        {
+                                                llc->state = LLC_STATE_DOWN;
+                                                kfree_skb(skb);
+                                                break;
+                                        }
+
+                                case (LLC_STATE_RECEIVE_NULL_DSAP_XID_C):
+/*
+                                        new_skb = llc_create_skb(LLC_TYPE1_SIZE
+                                                + LLC_XID_SIZE, llc);
+                                        llc_build_ctrl(LLC_XID_RSP, llchdr2);
+                                        llchdr2->dsap = llchdr1->ssap;
+                                        llchdr2->ssap = llc->ssap & LLC_PDU_RSP;                                        kfree_skb(skb);
+                                        llc_queue_xmit(new_skb);
+*/
+                                        llc->state = LLC_STATE_DUPLICATE_ADDRESS_CHK;
+                                        break;
+
+                                case (LLC_STATE_ACK_TIMER_EXPIRED):
+                                        if(llc->retry_count < llc->max_retry)
+                                        {
+/*
+                                                new_skb = llc_create_skb(LLC_TYPE1_SIZE + LLC_XID_SIZE, llc);
+                                                llc_build_ctrl(LLC_XID_CMD,
+                                                        llchdr2);
+                                                llchdr2->dsap = 0;
+                                                llchdr2->ssap = llc->ssap;
+                                                kfree_skb(skb);
+                                                llc_queue_xmit(new_skb);
+                                                llc->retry_count++;
+                                                llc->xid_r_count = 0;
+*/
+                                                llc->state = LLC_STATE_DUPLICATE_ADDRESS_CHK;
+                                                break;
+                                        }
+                                        else    /* llc->retry_count == max. */
+                                        {
+                                                kfree_skb(skb);
+                                                llc->state = LLC_STATE_UP;
+                                                break;
+                                        }
+
+                                default:
+					skb->sk = NULL;
+                                        kfree_skb(skb);
+                                        return (-EINVAL);
+                        }
+                        break;
+
+                default:
+			skb->sk = NULL;
+			kfree_skb(skb);
+                        return (-EINVAL);
+        }
+
+        return (0);
+}
+
+/* LLC SAP Components. All processing is defered to the
+ * receiver. This is processing just for specific SAPs.
+ * Any NULL dsaps go to the SC. We just set the proper
+ * state and cmd/rsp indications.
+ */
+static int llc_process_pdu_type1_sap(struct sk_buff *skb,
+        struct datalink_proto *proto, struct device *dev,
+        struct packet_type *pt)
+{
+        struct llc_pinfo *llc = proto->ll_pinfo.llc;
+
+        if(llc_debug > 10)
+                printk("llc_process_pdu_type1_sap\n");
+
+        switch(llc->state)
+        {
+                case (LLC_STATE_INACTIVE):
+                        skb->sk = NULL;
+                        kfree_skb(skb);
+                        return (0);
+
+                case (LLC_STATE_ACTIVE):
+                        switch(llc->event)
+                        {
+                                case (LLC_STATE_RECEIVE_UI):
+                                        //llc_strip_8022(skb, LLC_TYPE1_SIZE);
+                                        proto->rcvfunc(skb, dev, pt);
+                                        llc->state = LLC_STATE_ACTIVE;
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_XID_C):
+					skb->llc_cmd = LLC_R_XID_C_INDICATION;
+					proto->rcvfunc(skb, dev, pt);
+                                        llc->state = LLC_STATE_ACTIVE;
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_XID_R):
+					skb->llc_cmd = LLC_R_XID_R_INDICATION;
+					proto->rcvfunc(skb, dev, pt);
+					llc->state = LLC_STATE_ACTIVE;
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_TEST_C):
+					skb->llc_cmd = LLC_R_TEST_C_INDICATION;
+					proto->rcvfunc(skb, dev, pt);
+                                        llc->state = LLC_STATE_ACTIVE;
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_TEST_R):
+					skb->llc_cmd = LLC_R_TEST_R_INDICATION;
+                                        proto->rcvfunc(skb, dev, pt);
+                                        llc->state = LLC_STATE_ACTIVE;
+                                        break;
+
+                                default:
+					skb->sk = NULL;
+					kfree_skb(skb);
+					return (-EINVAL);
+                        }
+                        break;
+
+                default:
+			skb->sk = NULL;
+			kfree_skb(skb);
+                        return (-EINVAL);
+        }
+
+        return (0);
+}
+
+/* Send RR Response */
+static int llc_send_rr_rsp(struct sk_buff *skb, struct device *dev,
+	struct datalink_proto *dl, __u8 dsap, __u8 pf)
+{
+	struct llc_pinfo *llc = dl->ll_pinfo.llc;
+        struct ethhdr *eth_hdr = skb->mac.ethernet;
+        llchdr *llc_hdr;
+        struct sk_buff *newskb;
+        int size;
+
+        size = dl->header_length + 1;
+        size += dev->hard_header_len;
+        newskb = alloc_skb(size, GFP_ATOMIC);
+        if(newskb == NULL)
+        	return (-ENOMEM);
+        newskb->sk      = NULL;
+        newskb->dev     = skb->dev;
+        newskb->llc_cmd = LLC_STATE_SEND_RR_RESPONSE;
+        skb_reserve(newskb, dl->header_length + 1);
+        skb_reserve(newskb, dev->hard_header_len);
+
+	/* Add RR header */
+        llc->build = LLC_STATE_SEND_RR_RSP;
+        llc_build_pdu(newskb, llc, 0);
+        llc_hdr = (llchdr *)newskb->data;
+        llc_hdr->ctrl.sctrl.pf = pf;
+        llc_hdr->dsap = dsap;
+
+        dev->hard_header(newskb, newskb->dev, ETH_P_802_3,
+                eth_hdr->h_source, NULL, newskb->len);
+
+        llc_queue_xmit(newskb);
+
+	return (0);
+}
+
+/* Send REJ Response */
+static int llc_send_rej_rsp(struct sk_buff *skb, struct device *dev,
+        struct datalink_proto *dl, __u8 dsap, __u8 pf)
+{
+        struct llc_pinfo *llc = dl->ll_pinfo.llc;
+        struct ethhdr *eth_hdr = skb->mac.ethernet;
+        llchdr *llc_hdr;
+        struct sk_buff *newskb;
+        int size;
+
+        size = dl->header_length + 1;
+        size += dev->hard_header_len;
+        newskb = alloc_skb(size, GFP_ATOMIC);
+        if(newskb == NULL)
+                return (-ENOMEM);
+        newskb->sk      = NULL;
+        newskb->dev     = skb->dev;
+        newskb->llc_cmd = LLC_STATE_SEND_RR_RESPONSE;
+        skb_reserve(newskb, dl->header_length + 1);
+        skb_reserve(newskb, dev->hard_header_len);
+
+        /* Add RR header */
+        llc->build = LLC_STATE_SEND_REJ_RSP;
+        llc_build_pdu(newskb, llc, 0);
+        llc_hdr = (llchdr *)newskb->data;
+        llc_hdr->ctrl.sctrl.pf = pf;
+        llc_hdr->dsap = dsap;
+
+        dev->hard_header(newskb, newskb->dev, ETH_P_802_3,
+                eth_hdr->h_source, NULL, newskb->len);
+
+        llc_queue_xmit(newskb);
+
+        return (0);
+}
+
+/* Send DM Response */
+static int llc_send_dm_rsp(struct sk_buff *skb, struct device *dev,
+        struct datalink_proto *dl, __u8 dsap, __u8 pf)
+{
+	struct llc_pinfo *llc = dl->ll_pinfo.llc;
+        struct ethhdr *eth_hdr = skb->mac.ethernet;
+	llchdr *llc_hdr;
+        struct sk_buff *newskb;
+        int size;
+
+        size = dl->header_length + 1;
+        size += dev->hard_header_len;
+        newskb = alloc_skb(size, GFP_ATOMIC);
+        if(newskb == NULL)
+                return (-ENOMEM);
+        newskb->sk      = NULL;
+        newskb->dev     = skb->dev;
+        skb_reserve(newskb, dl->header_length + 1);
+        skb_reserve(newskb, dev->hard_header_len);
+
+	/* Add DM header */
+	llc->build = LLC_STATE_SEND_DM_RSP;
+        llc_build_pdu(newskb, llc, 0);
+        llc_hdr = (llchdr *)newskb->data;
+        llc_hdr->ctrl.sctrl.pf = pf;
+        llc_hdr->dsap = dsap;
+
+	dev->hard_header(newskb, newskb->dev, ETH_P_802_3,
+                eth_hdr->h_source, NULL, newskb->len);
+        llc_queue_xmit(newskb);
+
+        return (0);
+}
+
+/* Send RNR Response */
+static int llc_send_rnr_rsp(struct sk_buff *skb, struct device *dev,
+        struct datalink_proto *dl, __u8 dsap, __u8 pf)
+{
+        struct llc_pinfo *llc = dl->ll_pinfo.llc;
+        struct ethhdr *eth_hdr = skb->mac.ethernet;
+        llchdr *llc_hdr;
+        struct sk_buff *newskb;
+        int size;
+
+        size = dl->header_length + 1;
+        size += dev->hard_header_len;
+        newskb = alloc_skb(size, GFP_ATOMIC);
+        if(newskb == NULL)
+                return (-ENOMEM);
+        newskb->sk      = NULL;
+        newskb->dev     = skb->dev;
+        skb_reserve(newskb, dl->header_length + 1);
+        skb_reserve(newskb, dev->hard_header_len);
+
+        /* Add DM header */
+        llc->build = LLC_STATE_SEND_RNR_RSP;
+        llc_build_pdu(newskb, llc, 0);
+        llc_hdr = (llchdr *)newskb->data;
+	llc_hdr->ctrl.sctrl.pf = pf;
+        llc_hdr->dsap = dsap;
+
+        dev->hard_header(newskb, newskb->dev, ETH_P_802_3,
+                eth_hdr->h_source, NULL, newskb->len);
+        llc_queue_xmit(newskb);
+
+        return (0);
+}
+
+/* Send UA Rsp */
+static int llc_send_ua_rsp(struct sk_buff *skb, struct device *dev,
+        struct datalink_proto *dl, __u8 dsap, __u8 pf)
+{
+	struct llc_pinfo *llc = dl->ll_pinfo.llc;
+        struct ethhdr *eth_hdr = skb->mac.ethernet;
+	llchdr *llc_hdr;
+        struct sk_buff *newskb;
+        int size;
+
+        size = dl->header_length + 1;
+        size += dev->hard_header_len;
+        newskb = alloc_skb(size, GFP_ATOMIC);
+        if(newskb == NULL)
+                return (-ENOMEM);
+        newskb->sk      = NULL;
+        newskb->dev     = skb->dev;
+        newskb->llc_cmd = LLC_STATE_SEND_UA_RESPONSE;
+        skb_reserve(newskb, dl->header_length + 1);
+        skb_reserve(newskb, dev->hard_header_len);
+
+	/* Add UA header */
+        llc->build = LLC_STATE_SEND_UA_RSP;
+        llc_build_pdu(newskb, llc, 0);
+        llc_hdr = (llchdr *)newskb->data;
+        llc_hdr->ctrl.uctrl.pf = pf;
+        llc_hdr->dsap = dsap;
+
+        dev->hard_header(newskb, newskb->dev, ETH_P_802_3,
+                eth_hdr->h_source, NULL, newskb->len);
+        llc_queue_xmit(newskb);
+
+        return (0);
+}
+
+/* Return 0 if sequence is ok.
+ * Return Positive if sequence is bad.
+ */
+static int llc_chk_seq(struct llc_pinfo *llc, struct sk_buff *skb)
+{
+	llchdr *llc_hdr = (llchdr *)skb->h.raw;
+
+	/* Old llc_hdr->ctrl.ictrl.ns != llc->seq.vr */
+	return (llc->seq.vr - llc_hdr->ctrl.ictrl.ns);
+}
+
+static void llc_update_pf(struct llc_pinfo *llc, struct sk_buff *skb, int fflag)
+{
+	llchdr *llc_hdr = (llchdr *)skb->h.raw;
+
+	if(fflag)
+		llc->f_flag = llc_hdr->ctrl.sctrl.pf;
+	else
+		llc->p_flag = llc_hdr->ctrl.sctrl.pf;
+}
+
+/* Process all the received 802.2 Class Two frames */
+static int llc_process_pdu_type2(struct sk_buff *skb,
+        struct datalink_proto *proto, struct device *dev,
+        struct packet_type *pt)
+{
+	struct llc_pinfo *llc = proto->ll_pinfo.llc;
+	llchdr *llc_hdr = (llchdr *)skb->h.raw;
+	int event = llc->event;
+
+	if(llc_debug > 3)
+                printk("llc_process_pdu_type2\n");
+
+	/* Good Don't Touch */
+	if(llc->state2 == LLC_STATE_NORMAL || llc->state2 == LLC_STATE_BUSY
+		|| llc->state2 == LLC_STATE_AWAIT 
+		|| llc->state2 == LLC_STATE_AWAIT_BUSY
+		|| llc->state2 == LLC_STATE_AWAIT_REJECT)
+	{
+		switch(event)
+                {
+                	case (LLC_STATE_RECEIVE_SABME_CMD):
+				llc_update_pf(llc, skb, 1);
+                        	llc_queue_rsp(LLC_STATE_REMOTE_RESET_INDICATION,
+					skb, proto);
+				llc_stop_all_timers(llc);
+				llc->state2 = LLC_STATE_NORMAL;
+              //                  llc->state2 = LLC_STATE_RESET_CHECK;
+                                goto pdu_done;
+
+			/* Good/Perfect/Tested */
+                        case (LLC_STATE_RECEIVE_DISC_CMD):
+				llc_stop_all_timers(llc);
+                                llc_send_ua_rsp(skb, dev, proto, llc->dsap,
+					llc_hdr->ctrl.sctrl.pf);
+                                llc_queue_rsp(event, skb, proto);
+				llc->state2 = LLC_STATE_ADM;
+                                goto pdu_done;
+
+                        case (LLC_STATE_RECEIVE_FRMR_RSP):
+				llc_stop_all_timers(llc);
+                                llc_queue_rsp(LLC_STATE_LOCAL_RESET_INDICATION, 
+					skb, proto);
+                                llc->s_flag = 0;
+                                llc->state2 = LLC_STATE_RESET_WAIT;
+                                goto pdu_done;
+
+                        case (LLC_STATE_RECEIVE_DM_RSP):
+                                llc_queue_rsp(event, skb, proto);
+				llc_stop_all_timers(llc);
+                                llc->state2 = LLC_STATE_ADM;
+                                goto pdu_done;
+        	}
+	}
+
+	switch(llc->state2)
+        {
+		/* Good Don't Touch */
+		case (LLC_STATE_NORMAL):
+			switch(event)
+                        {
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_RR_CMD):
+					printk("LLC_STATE_RECEIVE_RR_CMD\n");
+					if(llc_hdr->ctrl.sctrl.pf)
+						llc_send_rr_rsp(skb,dev,proto,
+							llc_hdr->ssap, 1);
+					else
+						llc->p_flag = 0;
+					llc_update_nr(llc, skb);
+					llc->remote_busy = 0;
+					skb->sk = NULL;
+                                        kfree_skb(skb);
+					llc->state2 = LLC_STATE_NORMAL;
+					break;	
+
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_RR_RSP):
+					if(!llc_hdr->ctrl.sctrl.pf
+						|| (llc_hdr->ctrl.sctrl.pf
+						&& llc->p_flag))
+					{
+						llc->p_flag = 0;
+						llc_update_nr(llc, skb);
+						llc->remote_busy = 0;
+                                                break;
+					}
+					break;
+
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_RNR_CMD):
+                                        if(llc_hdr->ctrl.sctrl.pf)
+                                        {
+						llc_send_rr_rsp(skb,dev,proto,
+							llc->dsap, 1);
+						llc_update_nr(llc, skb);
+						llc->remote_busy = 1;
+						skb->sk = NULL;
+						kfree_skb(skb);
+						llc->state2 = LLC_STATE_NORMAL;
+						break;
+					}
+					else
+					{
+						llc_update_pf(llc, skb, 0);
+						llc_update_nr(llc, skb);
+						llc->remote_busy = 1;
+                                                skb->sk = NULL;
+                                                kfree_skb(skb);
+                                                llc->state2 = LLC_STATE_NORMAL;
+                                                break;
+					}
+					break;
+
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_RNR_RSP):
+                                        if(!llc_hdr->ctrl.sctrl.pf
+                                                || (llc_hdr->ctrl.sctrl.pf
+                                                && llc->p_flag))
+                                        {
+						llc_update_pf(llc, skb, 0);
+						llc_update_nr(llc, skb);
+						llc->remote_busy = 1;
+                                                skb->sk = NULL;
+                                                kfree_skb(skb);
+                                                llc->state2 = LLC_STATE_NORMAL;
+                                                break;
+					}
+					break;
+
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_REJ_CMD):
+					llc->seq.vs = llc_hdr->ctrl.sctrl.nr;
+					llc_update_nr(llc, skb);
+					if(!llc_hdr->ctrl.sctrl.pf
+						&& !llc->p_flag)
+						llc_update_pf(llc, skb, 0);
+					if(llc_hdr->ctrl.sctrl.pf)
+					{
+						/* Resend I RSP PDU */
+					}
+					else
+					{
+						/*
+						 * Set Tx Queue Flag and start
+						 * retransmitting at vs.
+						 */
+					}
+					llc->remote_busy = 0;
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_NORMAL;	
+					break;
+
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_REJ_RSP):
+					llc_update_nr(llc, skb);
+					llc_update_pf(llc, skb, 0);
+
+					/*
+					 * Set Tx Queue Flag and start
+                                         * retransmitting at vs.
+                                         */
+
+					llc->remote_busy = 0;
+                                        skb->sk = NULL;
+                                        kfree_skb(skb);
+                                        llc->state2 = LLC_STATE_NORMAL;
+					break;
+
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_I_RSP):
+				case (LLC_STATE_RECEIVE_I_CMD):
+				{
+					int rsp_pdu = (event
+						== LLC_STATE_RECEIVE_I_RSP);
+
+					printk("LLC GOT AN I PACKET\n");
+
+					llc_update_nr(llc, skb);
+					proto->rcvfunc(skb, dev, pt);
+                                        llc->state2 = LLC_STATE_NORMAL;
+
+#ifdef NOT
+					if(llc_chk_seq(llc, skb))
+					{
+						if(llc_hdr->ctrl.ictrl.pf
+							&& !rsp_pdu)
+						{
+							llc_send_rej_rsp(skb,
+								dev,proto,
+								llc->dsap,1);
+						}
+						else
+						{
+							llc_send_rej_rsp(skb,
+								dev, proto,
+								llc->dsap, 1);
+						}
+						llc_update_nr(llc, skb);
+						llc_start_rej_timer(llc);
+						if(!llc->p_flag || (rsp_pdu
+							&& llc->p_flag
+							&& llc_hdr->ctrl.ictrl.pf))
+							llc_update_pf(llc, skb, 0);
+                                                skb->sk = NULL;
+                                                kfree_skb(skb);
+						llc->state2 = LLC_STATE_REJECT;
+						break;
+					}
+
+					llc->seq.vr++;
+					if(llc_hdr->ctrl.ictrl.pf && !rsp_pdu)
+						llc_send_rr_rsp(skb,dev,proto,
+							llc->dsap, 1);
+					else
+					{
+						if(!rsp_pdu & !llc->p_flag)
+						{
+							llc_send_rr_rsp(skb,dev,
+								proto,llc->dsap,
+								1);
+							llc_start_p_timer(llc);
+						}
+						else
+						{
+							/* Send Ack any way
+							 * possible.
+							 */
+							llc_send_rr_rsp(skb,dev,
+								proto,llc->dsap,
+								1);
+						}
+					}
+					llc_update_nr(llc, skb);
+					proto->rcvfunc(skb, dev, pt);
+					llc->state2 = LLC_STATE_NORMAL;
+#endif
+					break;
+				}
+
+				/* Good Don't Touch */
+#ifdef NOT
+				case (LLC_STATE_RECEIVE_RR_RSP):
+				case (LLC_STATE_RECEIVE_RR_CMD):
+					llc_update_nr(llc, skb);
+					llc->retry_count = 0;
+					llc_stop_ack_timer(llc);
+
+					/* Dequeue pkts on ReTx queue. 
+					 * Restart ack timer if unack'd pkts
+					 * exist.
+					 */
+					skb->sk = NULL;
+					kfree_skb(skb);
+					break;
+#endif
+			}
+                        break;
+
+		case (LLC_STATE_AWAIT):
+			switch(event)
+			{
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_I_RSP):
+                                        if(llc_chk_seq(llc, skb))
+                                        {
+						llc_send_rej_rsp(skb,dev,proto,
+							llc->dsap, 0);
+						llc_update_nr(llc, skb);
+						llc_start_rej_timer(llc);
+						if(llc_hdr->ctrl.ictrl.pf)
+						{
+							llc->seq.vs = llc_hdr->ctrl.ictrl.nr;
+							llc_stop_p_timer(llc);
+
+							/* Resend I PDUs
+							 * Any way possible.
+							 */
+							llc->remote_busy = 0;
+							llc->state2 = LLC_STATE_REJECT;
+						}
+						else
+							llc->state2 = LLC_STATE_AWAIT_REJECT;
+						skb->sk = NULL;
+						kfree_skb(skb);
+						break;
+					}
+
+					llc->seq.vr++;
+                                        if(llc_hdr->ctrl.ictrl.pf)
+                                        {
+						llc->seq.vs 
+							=llc_hdr->ctrl.ictrl.nr;
+						/*
+						 * Resend I CMD or send RR
+						 */
+						llc_start_p_timer(llc);
+						llc->remote_busy = 0;
+						llc->state2 = LLC_STATE_NORMAL;
+					}
+					else
+					{
+						llc_send_rr_rsp(skb,dev,proto,
+							llc->dsap, 0);
+						llc->state2 = LLC_STATE_AWAIT;
+					}
+					proto->rcvfunc(skb, dev, pt);
+					break;
+
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_I_CMD):
+                                        if(llc_chk_seq(llc, skb))
+                                        {
+						llc_send_rej_rsp(skb,dev,proto,
+							llc->dsap, 
+							llc_hdr->ctrl.ictrl.pf);
+						llc_update_nr(llc, skb);
+                                                llc_start_rej_timer(llc);
+                                                skb->sk = NULL;
+                                                kfree_skb(skb);
+                                                llc->state2=LLC_STATE_AWAIT_REJECT;
+                                                break;
+					}
+
+					llc->seq.vr++;
+					proto->rcvfunc(skb, dev, pt);
+					if(llc_hdr->ctrl.ictrl.pf)
+					{
+						llc_send_rr_rsp(skb,dev,proto,
+							llc->dsap, 1);
+					}
+					else
+					{
+						llc_send_rr_rsp(skb,dev,proto,
+							llc->dsap, 0);
+					}
+					llc->state2 = LLC_STATE_AWAIT;
+					break;
+
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_RR_RSP):
+				case (LLC_STATE_RECEIVE_REJ_RSP):
+					llc->seq.vr = llc_hdr->ctrl.sctrl.nr;
+					llc->remote_busy = 0;
+
+					if(llc_hdr->ctrl.sctrl.pf)
+					{
+						llc->seq.vs
+							=llc_hdr->ctrl.sctrl.nr;
+						llc_stop_p_timer(llc);
+						/*
+						 * Resend I PDUs any way pos.
+						 */
+						llc->state2 = LLC_STATE_NORMAL;
+					}
+					else
+						llc->state2 = LLC_STATE_AWAIT;
+
+					skb->sk = NULL;
+					kfree_skb(skb);
+					break;
+
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_RR_CMD):
+				case (LLC_STATE_RECEIVE_REJ_CMD):
+					llc->seq.vr = llc_hdr->ctrl.sctrl.nr;
+					llc->remote_busy = 0;
+					if(llc_hdr->ctrl.sctrl.pf)
+					{
+						llc_send_rr_rsp(skb,dev,proto,
+							llc->dsap, 1);
+					}
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_AWAIT;
+					break;
+
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_RNR_RSP):
+					if(llc_hdr->ctrl.sctrl.pf)
+					{
+						llc->seq.vs
+							=llc_hdr->ctrl.sctrl.nr;
+						llc_stop_p_timer(llc);
+						llc->state2 = LLC_STATE_NORMAL;
+					}
+					else
+						llc->state2 = LLC_STATE_AWAIT;
+
+					llc->remote_busy = 1;
+					skb->sk = NULL;
+					kfree_skb(skb);
+					break;
+
+				/* Good Don't Touch */
+				case (LLC_STATE_RECEIVE_RNR_CMD):
+                                        if(llc_hdr->ctrl.sctrl.pf)
+                                        {
+						llc_send_rr_rsp(skb,dev,proto,
+							llc->dsap, 1);
+					}
+
+					llc->state2 = LLC_STATE_AWAIT;
+					llc->remote_busy = 1;
+                                        skb->sk = NULL;
+                                        kfree_skb(skb);
+					break;
+
+				default:
+					skb->sk = NULL;
+					kfree_skb(skb);
+					break;
+			}
+			break;
+
+		case (LLC_STATE_AWAIT_BUSY):
+			switch(event)
+			{
+				case (LLC_STATE_RECEIVE_I_RSP):
+                                        if(llc_chk_seq(llc, skb))
+                                        {
+					}
+
+					break;
+
+				case (LLC_STATE_RECEIVE_I_CMD):
+                                        if(llc_chk_seq(llc, skb))
+                                        {
+					}
+
+					break;
+
+				case (LLC_STATE_RECEIVE_RR_RSP):
+					break;
+
+				case (LLC_STATE_RECEIVE_RR_CMD):
+					break;
+
+				case (LLC_STATE_RECEIVE_REJ_RSP):
+					break;
+
+				case (LLC_STATE_RECEIVE_REJ_CMD):
+					break;
+
+				case (LLC_STATE_RECEIVE_RNR_RSP):
+					break;
+
+				case (LLC_STATE_RECEIVE_RNR_CMD):
+					break;
+			}
+			break;
+
+		case (LLC_STATE_AWAIT_REJECT):
+			switch(event)
+                        {
+                                case (LLC_STATE_RECEIVE_I_RSP):
+                                        if(llc_chk_seq(llc, skb))
+                                        {
+					}
+
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_I_CMD):
+                                        if(llc_chk_seq(llc, skb))
+                                        {
+					}
+
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_RR_RSP):
+                                case (LLC_STATE_RECEIVE_RR_CMD):
+                                case (LLC_STATE_RECEIVE_REJ_RSP):
+                                case (LLC_STATE_RECEIVE_REJ_CMD):
+				{
+                                        int rsp_pdu = ((event == LLC_STATE_RECEIVE_REJ_RSP) || (event == LLC_STATE_RECEIVE_RR_RSP));
+					if(llc_hdr->ctrl.sctrl.pf)
+					{
+						if(!rsp_pdu)
+						{
+							llc_send_rnr_rsp(skb,
+								dev,proto,
+								llc->dsap,llc_hdr->ctrl.sctrl.pf);
+							llc->state2 = LLC_STATE_AWAIT_BUSY;
+						}
+						else
+						{
+							llc->seq.vs=llc_hdr->ctrl.sctrl.nr;
+							llc_stop_p_timer(llc);
+
+							/*
+							 * Resend I Pdus
+							 * Anyway possible.
+							 */
+							llc->state2 = LLC_STATE_BUSY;
+						}
+					}
+					else
+						llc->state2 = LLC_STATE_AWAIT_BUSY;
+
+					llc->seq.vr = llc_hdr->ctrl.sctrl.nr;
+					llc->remote_busy = 0;
+					skb->sk = NULL;
+					kfree_skb(skb);
+                                        break;
+				}
+
+                                case (LLC_STATE_RECEIVE_RNR_RSP):
+                                case (LLC_STATE_RECEIVE_RNR_CMD):
+				{
+					int rsp_pdu = (event == LLC_STATE_RECEIVE_RNR_RSP);
+
+					if(!rsp_pdu)
+					{
+						if(llc_hdr->ctrl.sctrl.pf)
+						{
+							llc_send_rnr_rsp(skb,dev,proto, llc->dsap, llc_hdr->ctrl.sctrl.pf);
+						}
+						llc->state2 = LLC_STATE_AWAIT_BUSY;
+					}
+					else
+					{
+						if(llc_hdr->ctrl.ictrl.pf)
+                                                {
+							llc->seq.vs=llc_hdr->ctrl.sctrl.nr;
+							llc_stop_p_timer(llc);
+							llc->state2 = LLC_STATE_BUSY;
+						}
+						else
+							llc->state2 = LLC_STATE_AWAIT_BUSY;
+					}			
+
+					llc->seq.vr = llc_hdr->ctrl.sctrl.nr;
+					llc->remote_busy = 1;
+					skb->sk = NULL;
+					kfree_skb(skb);
+					break;
+				}
+			}
+			break;
+
+		case (LLC_STATE_BUSY):
+			switch(event)
+                        {
+                                case (LLC_STATE_RECEIVE_I_RSP):
+                                        if(llc_chk_seq(llc, skb))
+                                        {
+					}
+
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_I_CMD):
+				{
+                                        if(llc_chk_seq(llc, skb))
+                                        {
+					}
+
+                                        break;
+				}
+
+                                case (LLC_STATE_RECEIVE_RR_RSP):
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_RR_CMD):
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_REJ_RSP):
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_REJ_CMD):
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_RNR_RSP):
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_RNR_CMD):
+					break;
+			}
+			break;
+
+		/* Good Don't Touch */
+		case (LLC_STATE_REJECT):
+			switch(event)
+                        {
+                                case (LLC_STATE_RECEIVE_I_RSP):
+                                        if(llc_chk_seq(llc, skb))
+                                        {
+						llc_update_nr(llc, skb);
+						llc_update_pf(llc, skb, 0);
+						if(llc->p_flag)
+							llc->remote_busy = 0;
+
+						skb->sk = NULL;
+						kfree_skb(skb);
+						llc->state2 = LLC_STATE_REJECT;
+						break;
+					}
+			
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_I_CMD):
+                                        if(llc_chk_seq(llc, skb))
+                                        {
+						if(llc_hdr->ctrl.ictrl.pf)
+						{
+							llc_send_rr_rsp(skb,dev,
+								proto,llc->dsap,
+								1);
+						}
+						else
+							llc_update_pf(llc, skb, 0);
+						llc_update_nr(llc, skb);
+						skb->sk = NULL;
+						kfree_skb(skb);
+						llc->state2 = LLC_STATE_REJECT;
+						break;
+					}
+
+					llc->seq.vr++;
+					/* Shit */
+					if(llc_hdr->ctrl.ictrl.pf)
+					{
+						llc_send_rr_rsp(skb,dev,proto,
+							llc->dsap, 1);
+					}
+					else
+					{
+						if(!llc->p_flag)
+						{
+							llc_start_p_timer(llc);
+//							llc_send_rr_cmd(skb,
+//								dev,proto);
+						}
+
+					}
+					llc_update_nr(llc, skb);
+					proto->rcvfunc(skb, dev, pt);
+					llc_stop_rej_timer(llc);
+					llc->state2 = LLC_STATE_NORMAL;
+                                        break;
+
+				/* Good Dont' Touch */
+                                case (LLC_STATE_RECEIVE_RR_RSP):
+					llc_update_pf(llc, skb, 0);
+                                        llc->remote_busy = 0;
+                                        skb->sk = NULL;
+                                        kfree_skb(skb);
+                                        llc->state2 = LLC_STATE_REJECT;
+                                        break;
+
+				/* Good Don't Touch */
+                                case (LLC_STATE_RECEIVE_RR_CMD):
+                                        if(llc_hdr->ctrl.sctrl.pf)
+					{
+						llc_send_rr_rsp(skb,dev,proto,
+							llc->dsap, 1);
+					}
+					else
+						llc_update_pf(llc, skb, 0);
+					llc_update_nr(llc, skb);
+					llc->remote_busy = 0;
+                                        skb->sk = NULL;
+                                        kfree_skb(skb);
+                                        llc->state2 = LLC_STATE_REJECT;
+                                        break;
+
+                                case (LLC_STATE_RECEIVE_REJ_RSP):
+					llc->seq.vs = llc_hdr->ctrl.sctrl.nr;
+					if(!llc->p_flag 
+						&& !llc_hdr->ctrl.sctrl.pf)
+						llc->p_flag
+							=llc_hdr->ctrl.sctrl.pf;
+					/*
+					 * Resend I Pdu XXX
+					 */
+
+					llc->remote_busy = 0;
+					llc->state2 = LLC_STATE_REJECT;
+                                        break;
+
+				/* Good Don't Touch */
+                                case (LLC_STATE_RECEIVE_REJ_CMD):
+					llc->seq.vs = llc_hdr->ctrl.sctrl.nr;
+					llc_update_nr(llc, skb);
+					if(llc_hdr->ctrl.sctrl.pf)
+					{
+						/* resend I Rsp PDU */
+					}
+					else
+					{
+						if(!llc_hdr->ctrl.sctrl.pf
+							&& !llc->p_flag)
+							llc_update_pf(llc, skb, 0);
+						/* Resend I XXX Pdu */
+					}
+
+					llc->remote_busy = 0;
+					llc->state2 = LLC_STATE_REJECT;
+                                        break;
+
+				/* Good Don't Touch */
+                                case (LLC_STATE_RECEIVE_RNR_RSP):
+					llc_update_pf(llc, skb, 0);
+					llc_update_nr(llc, skb);
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_REJECT;
+                                        break;
+
+				/* Good Don't Touch */
+                                case (LLC_STATE_RECEIVE_RNR_CMD):
+					if(llc_hdr->ctrl.sctrl.pf)
+						llc_update_pf(llc, skb, 0);
+					else
+						llc_send_rr_rsp(skb,dev,proto,
+							llc->dsap,1);
+					llc_update_nr(llc, skb);
+					llc->remote_busy = 1;
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_REJECT;
+					break;
+			}
+			break;
+
+		/* Good Don't Touch */
+		case (LLC_STATE_RESET_CHECK):
+			switch(event)
+			{
+				case (LLC_STATE_RECEIVE_DM_RSP):
+					llc_queue_rsp(event, skb, proto);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				case (LLC_STATE_RECEIVE_SABME_CMD):
+					llc_update_pf(llc, skb, 1);
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_RESET_CHECK;
+					break;
+
+				case (LLC_STATE_RECEIVE_DISC_CMD):
+					llc_send_dm_rsp(skb,dev,proto,llc->dsap,
+						llc_hdr->ctrl.sctrl.pf);
+					llc_queue_rsp(event, skb, proto);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				default:
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_RESET_CHECK;
+					break;
+			}
+			break;
+
+		/* Good Don't Touch */
+		case (LLC_STATE_RESET_WAIT):
+			switch(event)
+			{
+				case (LLC_STATE_RECEIVE_DM_RSP):
+					llc_queue_rsp(event, skb, proto);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				case (LLC_STATE_RECEIVE_SABME_CMD):
+					llc->s_flag = 1;
+					llc_update_pf(llc, skb, 1);
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_RESET_WAIT;
+					break;
+
+				case (LLC_STATE_RECEIVE_DISC_CMD):
+					llc_send_dm_rsp(skb,dev,proto,llc->dsap,
+						llc_hdr->ctrl.sctrl.pf);
+					llc_queue_rsp(event, skb, proto);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				default:
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_RESET_WAIT;
+					break;
+			}
+			break;
+
+		/* Good Don't Touch */
+		case (LLC_STATE_ERROR):
+			switch(event)
+			{
+				case (LLC_STATE_RECEIVE_SABME_CMD):
+					llc_queue_rsp(LLC_STATE_REMOTE_RESET_INDICATION, skb, proto);
+					llc_stop_ack_timer(llc);
+					llc->state2 = LLC_STATE_RESET_CHECK;
+					break;
+
+				case (LLC_STATE_RECEIVE_DISC_CMD):
+					llc_send_ua_rsp(skb,dev,proto,llc->dsap,
+						llc_hdr->ctrl.sctrl.pf);
+					llc_queue_rsp(event, skb, proto);
+					llc_stop_ack_timer(llc);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				case (LLC_STATE_RECEIVE_DM_RSP):
+					llc_queue_rsp(event, skb, proto);
+					llc_stop_ack_timer(llc);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				case (LLC_STATE_RECEIVE_FRMR_RSP):
+					llc_queue_rsp(LLC_STATE_LOCAL_RESET_INDICATION, skb, proto);
+					llc_stop_ack_timer(llc);
+					llc->s_flag = 0;
+					llc->state2 = LLC_STATE_RESET_WAIT;
+					break;
+
+				default:
+					if(!(llc_hdr->ssap & LLC_PDU_RSP))
+					{
+						/* Resend FRMR RSP */
+						llc_start_ack_timer(llc);
+					}
+
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_ERROR;
+					break;
+			}
+			break;
+
+		/* Good Don't Touch */
+		case (LLC_STATE_D_CONN):
+			switch(event)
+			{
+				case (LLC_STATE_RECEIVE_SABME_CMD):
+                                        llc_send_dm_rsp(skb,dev,proto,llc->dsap,                                                llc_hdr->ctrl.sctrl.pf);
+					llc_stop_ack_timer(llc);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				case (LLC_STATE_RECEIVE_UA_RSP):
+					llc_stop_ack_timer(llc);
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				case (LLC_STATE_RECEIVE_DISC_CMD):
+					llc_send_ua_rsp(skb,dev,proto,llc->dsap,
+						llc_hdr->ctrl.sctrl.pf);
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_D_CONN;
+					break;
+
+				case (LLC_STATE_RECEIVE_DM_RSP):
+					llc_stop_ack_timer(llc);
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				default:
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_D_CONN;
+					break;
+			}
+			break;
+
+		/* Good Don't Touch */
+		case (LLC_STATE_SETUP):
+			switch(event)
+			{
+				case (LLC_STATE_RECEIVE_SABME_CMD):
+					llc->seq.vs = 0;
+					llc->seq.vr = 0;
+					llc->retry_count = 0;
+					llc_send_ua_rsp(skb,dev,proto,llc->dsap,
+						llc_hdr->ctrl.sctrl.pf);
+					llc->s_flag = 1;
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_SETUP;
+					break;
+
+				case (LLC_STATE_RECEIVE_UA_RSP):
+					llc_stop_ack_timer(llc);
+					llc->seq.vs = 0;
+					llc->seq.vr = 0;
+					llc->retry_count = 0;
+					llc->remote_busy = 0;
+					llc_update_pf(llc, skb, 0);
+					llc_queue_rsp(event, skb, proto);
+					llc->state2 = LLC_STATE_NORMAL;
+					break;
+
+				case (LLC_STATE_RECEIVE_DISC_CMD):
+                                        llc_send_dm_rsp(skb,dev,proto,llc->dsap,                                                llc_hdr->ctrl.sctrl.pf);
+					llc_queue_rsp(event, skb, proto);
+                                        llc_stop_ack_timer(llc);
+                                        llc->state2 = LLC_STATE_ADM;
+                                        break;
+
+				case (LLC_STATE_RECEIVE_DM_RSP):
+					llc_queue_rsp(event, skb, proto);
+					llc_stop_ack_timer(llc);
+                                        llc->state2 = LLC_STATE_ADM;
+					break;
+
+				default:
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_SETUP;
+					break;
+			}
+			break;
+
+		/* Good Don't Touch */
+                case (LLC_STATE_ADM):
+                        switch(event)
+                        {
+                                case (LLC_STATE_RECEIVE_SABME_CMD):
+					llc_update_pf(llc, skb, 0);
+					llc_queue_rsp(event, skb, proto);
+				//	llc->state2 = LLC_STATE_CONN;
+					llc->state2 = LLC_STATE_NORMAL;
+					break;
+
+				/* Perfect/Tested/Good */
+				case (LLC_STATE_RECEIVE_DISC_CMD):
+                                        llc_send_dm_rsp(skb,dev,proto,
+						llc_hdr->ssap,
+                                                llc_hdr->ctrl.sctrl.pf);
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				default:
+					if(!(llc_hdr->ssap & LLC_PDU_RSP)
+						&& llc_hdr->ctrl.sctrl.pf)
+					{
+                                        	llc_send_dm_rsp(skb,dev,proto,
+							llc_hdr->ssap,
+	                                                llc_hdr->ctrl.sctrl.pf);
+					}
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+                        }
+                        break;
+
+		/* Good Don't Touch */
+		case (LLC_STATE_RESET):
+			switch(event)
+			{
+				case (LLC_STATE_RECEIVE_SABME_CMD):
+					llc->seq.vs = 0;
+					llc->seq.vr = 0;
+					llc->retry_count = 0;
+					llc->s_flag = 1;
+					llc_send_ua_rsp(skb,dev,proto,llc->dsap,
+						llc_hdr->ctrl.sctrl.pf);
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_RESET;
+					break;
+
+				case (LLC_STATE_RECEIVE_UA_RSP):
+					llc_stop_ack_timer(llc);
+					llc->seq.vs = 0;
+					llc->seq.vr = 0;
+					llc->retry_count = 0;
+					llc->remote_busy = 0;
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_NORMAL;
+					break;
+
+				case (LLC_STATE_RECEIVE_DISC_CMD):
+                                        llc_send_dm_rsp(skb,dev,proto,llc->dsap,                                                llc_hdr->ctrl.sctrl.pf);
+					llc_queue_rsp(event, skb, proto);
+					llc_stop_ack_timer(llc);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				case (LLC_STATE_RECEIVE_DM_RSP):
+					llc_queue_rsp(event, skb, proto);
+					llc_stop_ack_timer(llc);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				default:
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_RESET;
+			}
+			break;
+
+		/* Good Don't Touch */
+		case (LLC_STATE_CONN):
+			switch(event)
+                        {
+				case (LLC_STATE_RECEIVE_DM_RSP):
+					llc_queue_rsp(event, skb, proto);
+					llc->state2 = LLC_STATE_ADM;
+					break;
+
+				case (LLC_STATE_RECEIVE_SABME_CMD):
+					llc_update_pf(llc, skb, 1);
+					/* Fall through */
+
+				default:
+					skb->sk = NULL;
+					kfree_skb(skb);
+					llc->state2 = LLC_STATE_CONN;
+					break;
+			}
+			break;
+
+		default:
+                        return (-EINVAL);
+        }
+
+pdu_done:
+	return (0);
+}
+
+/*
+ * LLC protocol layer transmit functions.
+ */
+
+/* Update the retransmit queue. Check to see if the packet acks any of our
+ * queued packets. Window aware.
+ */
+static int llc_update_nr(struct llc_pinfo *llc, struct sk_buff *skb)
+{
+	llchdr *llc_hdr = (llchdr *)skb->h.raw;
+	struct sk_buff *qskb;
+
+	if(llc_debug > 3)
+		printk("llc_update_nr\n");
+
+	while((qskb = skb_dequeue(&llc->retx_queue)) != NULL)
+	{
+		llchdr *qllc_hdr = (llchdr *)qskb->data;
+		if(qllc_hdr->ctrl.ictrl.nr < llc_hdr->ctrl.ictrl.nr)
+		{
+			qskb->sk = NULL;
+			kfree_skb(qskb);
+		}
+		else
+		{
+			skb_queue_head(&llc->retx_queue, qskb);
+			break;
+		}
+	}
+
+	llc->seq.vr = llc_hdr->ctrl.ictrl.nr;
+	llc->retry_count = 0;
+
+	if(qskb == NULL)
+		llc_stop_ack_timer(llc);
+	else
+		llc_start_ack_timer(llc);
+
+	return (0);
+}
+
+static int llc_build_pdu(struct sk_buff *skb, struct llc_pinfo *llc,
+	unsigned char dsap)
+{
+	llchdr *llc_hdr;
+
+	if(llc_debug > 3)
+		printk("llc_build_pdu()\n");
+
+	/* Decide which PDU to build. */
+	switch(llc->build)
+	{
+		case (LLC_STATE_SEND_XID_C):
+		{
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+                        llc_hdr->dsap   = llc->dsap;
+                        llc_hdr->ssap   = llc->ssap;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_XID_CMD;
+			break;
+		}
+
+		case (LLC_STATE_SEND_XID_R):
+		{
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+                        llc_hdr->dsap   = llc->dsap;
+                        llc_hdr->ssap   = llc->ssap + LLC_PDU_RSP;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_XID_RSP;
+			break;
+		}
+
+		/* Build a Unnumbered Information Packet for Tx. */
+		case (LLC_STATE_SEND_UI):
+		{
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE1_SIZE);
+                        llc_hdr->dsap   = llc->ssap;
+                        llc_hdr->ssap   = llc->ssap;
+                        llc_hdr->ctrl.ctrl = LLC_CTRL_UI_CMD;
+			break;
+		}
+
+		/* Send a LLC Test command. */
+		case (LLC_STATE_SEND_TEST_C):
+		{
+			llc_hdr = (llchdr *)skb_push(skb,LLC_TYPE1_SIZE);
+			llc_hdr->dsap 	= dsap;
+                        llc_hdr->ssap 	= llc->ssap;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_TEST_CMD;
+			break;
+		}
+
+		case (LLC_STATE_SEND_NULL_DSAP_TEST_R):
+		{
+			struct ethhdr *eth_hdr = skb->mac.ethernet;
+			char dest[6], dsap;
+			memcpy(&dest, eth_hdr->h_source, 6);
+			llc_hdr = (llchdr *)skb->data;
+			dsap = llc_hdr->ssap;
+			memset(skb->data, 0, 3);
+			llc_hdr->dsap	= dsap;
+			llc_hdr->ssap	= dsap + LLC_PDU_RSP;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_TEST_RSP;
+			skb->dev->hard_header(skb, skb->dev, ETH_P_802_3,
+                		dest, NULL, skb->len);
+			break;
+		}
+
+		/* Generic procedures to build an LLC Test response. */
+		case (LLC_STATE_SEND_TEST_R):
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE1_SIZE);
+			llc_hdr->dsap 	= llc_hdr->ssap;
+                        llc_hdr->ssap 	= llc->ssap + LLC_PDU_RSP;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_TEST_RSP;
+			break;
+
+		/* Good */
+		case (LLC_STATE_SEND_DISC_CMD):
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+			llc_hdr->dsap = llc->dsap;
+			llc_hdr->ssap = llc->ssap;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_DISC_CMD;
+			break;
+
+		/* Good */
+		case (LLC_STATE_SEND_DM_RSP):
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+			llc_hdr->dsap = llc->dsap;
+                        llc_hdr->ssap = llc->ssap + LLC_PDU_RSP;
+                        llc_hdr->ctrl.ctrl = LLC_CTRL_DM_RSP;
+			break;
+
+		case (LLC_STATE_SEND_FRMR_RSP):
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+			llc_hdr->dsap = llc->dsap;
+                        llc_hdr->ssap = llc->ssap + LLC_PDU_RSP;
+                        llc_hdr->ctrl.ctrl = LLC_CTRL_FRMR_RSP;
+			break;
+
+		/* Good */
+		case (LLC_STATE_SEND_I_CMD):
+			llc_hdr = (llchdr *)skb_push(skb, LLC_TYPE2_SIZE);
+                        llc_hdr->dsap = llc->dsap;
+                        llc_hdr->ssap = llc->ssap;
+                        llc_hdr->ctrl.ctrl = LLC_CTRL_I_CMD;
+			llc_hdr->ctrl.ictrl.ns = llc->seq.vs;
+			llc_hdr->ctrl.ictrl.nr = llc->seq.vr;
+			llc->seq.vs++;
+			break;
+
+		case (LLC_STATE_SEND_I_RSP):
+			llc_hdr = (llchdr *)skb_push(skb, LLC_TYPE2_SIZE);
+                        llc_hdr->dsap = llc->dsap;
+                        llc_hdr->ssap = llc->ssap & LLC_PDU_RSP;
+                        llc_hdr->ctrl.ctrl = LLC_CTRL_I_RSP;
+			break;
+
+		case (LLC_STATE_SEND_REJ_CMD):
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+                        llc_hdr->dsap = llc->dsap;
+                        llc_hdr->ssap = llc->ssap;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_REJ_CMD;
+			break;
+
+		case (LLC_STATE_SEND_REJ_RSP):
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+                        llc_hdr->dsap = llc->dsap;
+                        llc_hdr->ssap = llc->ssap + LLC_PDU_RSP;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_REJ_RSP;
+			break;
+
+		case (LLC_STATE_SEND_RNR_CMD):
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+                        llc_hdr->dsap = llc->dsap;
+                        llc_hdr->ssap = llc->ssap;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_RNR_CMD;
+			break;
+
+		case (LLC_STATE_SEND_RNR_RSP):
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+                        llc_hdr->dsap = llc->dsap;
+                        llc_hdr->ssap = llc->ssap + LLC_PDU_RSP;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_RNR_RSP;
+			break;
+
+		case (LLC_STATE_SEND_RR_CMD):
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+                        llc_hdr->dsap = llc->dsap;
+                        llc_hdr->ssap = llc->ssap;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_RR_CMD;
+			llc_hdr->ctrl.ictrl.ns = llc->seq.vs;
+			llc_hdr->ctrl.ictrl.nr = llc->seq.vr;
+			break;
+
+		/* Good */
+		case (LLC_STATE_SEND_RR_RSP):
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+                        llc_hdr->dsap = llc->dsap;
+                        llc_hdr->ssap = llc->ssap + LLC_PDU_RSP;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_RR_RSP;
+                        llc_hdr->ctrl.sctrl.nr = llc->seq.vr;
+			break;
+
+		/* Good */
+		case (LLC_STATE_SEND_SABME_CMD):
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+                        llc_hdr->dsap = llc->dsap;
+                        llc_hdr->ssap = llc->ssap;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_SABME_CMD;
+			break;
+
+		/* Good */
+		case (LLC_STATE_SEND_UA_RSP):
+			llc_hdr = (llchdr *)skb_put(skb,LLC_TYPE2_SIZE);
+                        llc_hdr->dsap = llc->dsap;
+                        llc_hdr->ssap = llc->ssap + LLC_PDU_RSP;
+			llc_hdr->ctrl.ctrl = LLC_CTRL_UA_RSP;
+			break;
+	}
+
+	return (0);
+}
+
+/* The end of the LLC transmission path.
+ * Ideally, any protocol that uses LLC will queue to this
+ * transmission path and let us handle the device queue passing.
+ *
+ * skb->dev must contain a valid device to xmit on.
+ * dev->hard_header must already be applied if needed.
+ */
+int llc_queue_xmit(struct sk_buff *skb)
+{
+	struct device *dev = skb->dev;
+	struct llc_pinfo *llc = NULL;
+	struct sk_buff *skb2;
+
+	if(llc_debug > 10)
+	{
+		printk("llc_queue_xmit\n");
+		hexdump(skb->data, skb->len);
+	}
+
+#ifdef NOT
+	/* Check to see if we are currently retransmitting data or
+	 * if we have reached the window limit without receiving an ack,
+	 * then lets queue the data to the transmit queue.
+	 *
+	 * Note: Probably should only queue if Class 2 and I PDU.
+	 */
+	if(llc->retransmitting 
+		|| (skb_queue_len(&llc->retx_queue) >= llc->max_window))
+	{
+		skb_queue_tail(&llc->tx_queue, skb);
+		llc->tx_queue_depth++;
+		return (0);
+	}
+
+	/* It looks like we are actually going to Tx the data on the
+	 * wire so lets queue a copy in the ReTx queue, for use later.
+	 *
+	 * Note: Probably should only queue if Class 2 and I PDU.
+	 */
+        skb2 = skb_clone(skb, GFP_ATOMIC);
+        if(skb2 == NULL)
+                return (-ENOBUFS);
+        skb_queue_tail(&llc->retx_queue, skb2);
+        llc->retx_queue_depth++;
+#endif
+
+	/* Check to see if we need to loopback the packet. */
+        if(!memcmp(skb->data, dev->dev_addr, dev->addr_len))
+        {
+		skb_orphan(skb);
+		skb->mac.raw	= skb->data;
+		skb->h.raw	= skb->data + dev->hard_header_len;
+		skb_pull(skb, dev->hard_header_len);
+		llc_rcv(skb, dev, NULL);
+        }
+        else
+                dev_queue_xmit(skb);
+
+        return (0);
+}
+
+/* We have been called to throw a header on a existing sk_buff. The
+ * skb most likely already has data on it, so we just put the right
+ * LLC header on and toss it onward.
+ */
+void llc_datalink_header(struct datalink_proto *dl,
+        struct sk_buff *skb, unsigned char *dsap)
+{
+	struct llc_pinfo *llc = dl->ll_pinfo.llc;
+
+	if(llc_debug > 3)
+		printk("llc_datalink_header\n");
+
+        switch(skb->llc_cmd)
+        {
+                /* Type 1 commands/actions. No need to test the state
+		 * on class one commands as the only way to get here
+		 * is if the sap is already in an active state.
+		 */
+/* Good */	case (LLC_STATE_UNITDATA_REQUEST):
+			llc->build = LLC_STATE_SEND_UI;
+                        llc_build_pdu(skb, llc, *dsap);
+                        llc->state = LLC_STATE_ACTIVE;
+                        break;
+
+/* Good */	case (LLC_STATE_XID_REQUEST):
+			llc->build = LLC_STATE_SEND_XID_C;
+                        llc_build_pdu(skb, llc, *dsap);
+                        llc->state = LLC_STATE_ACTIVE;
+			break;
+
+/* Good */	case (LLC_STATE_TEST_REQUEST):
+			llc->build = LLC_STATE_SEND_TEST_C;
+                        llc_build_pdu(skb, llc, *dsap);
+			llc->state = LLC_STATE_ACTIVE;
+			break;
+
+                /* Type 2 commands/actions. */
+/* Good */	case (LLC_STATE_DATA_REQUEST):
+			if(llc->state2 == LLC_STATE_NORMAL)
+			{
+				printk("WE ARE BUILDING A DATA REQ\n");
+				llc->build = LLC_STATE_SEND_I_CMD;
+                                llc_build_pdu(skb, llc, *dsap);
+                               // if(!llc->p_flag)
+	                       //         llc_start_p_timer(llc);
+                               // llc_start_ack_timer(llc);
+                                llc->state2 = LLC_STATE_NORMAL;
+				break;
+			}
+
+			if(llc->state2 == LLC_STATE_REJECT)
+			{
+				if(!llc->p_flag)
+                                {
+                                	llc->build=LLC_STATE_SEND_I_CMD;                                                llc_build_pdu(skb, llc, *dsap);
+                                        llc_start_p_timer(llc);
+				}
+				else
+				{
+                                        llc->build=LLC_STATE_SEND_I_CMD;                                                llc_build_pdu(skb, llc, *dsap);
+				}
+                                llc_start_ack_timer(llc);
+                                llc->state2 = LLC_STATE_REJECT;
+				break;
+			}
+			break;
+
+		/* By default we put a LLC UI CMD header on the skb,
+		 * if no command is specified. This allows for backwards
+		 * compatability for networking layers which haven't been
+		 * updated yet or use the old (pre 01/01/00) linux llc specs.
+		 */
+                default:
+			llc->build = LLC_STATE_SEND_UI;
+                        llc_build_pdu(skb, llc, *dsap);
+                        llc->state = LLC_STATE_ACTIVE;
+                        break;
+        }
+
+	return;
+}
+
+/* 
+ * LLC protocol layer timer operations.
+ */
+static int llc_start_ack_timer(struct llc_pinfo *llc)
+{
+        del_timer(&llc->ack_timer);
+        llc->ack_timer.expires = jiffies + sysctl_ack_timer_expire;
+        add_timer(&llc->ack_timer);
+
+        return (0);
+}
+
+static int llc_stop_ack_timer(struct llc_pinfo *llc)
+{
+        del_timer(&llc->ack_timer);
+
+        return (0);
+}
+
+static void llc_ack_expire(unsigned long data)
+{
+        struct llc_pinfo *llc = (struct llc_pinfo *)data;
+	struct sk_buff *skb;
+
+	printk("llc_ack_expire\n");
+
+        llc->event = LLC_STATE_ACK_TIMER_EXPIRED;
+
+	switch(llc->state)
+	{
+		case (LLC_STATE_SETUP):
+		case (LLC_STATE_RESET):
+			if(llc->s_flag)
+			{
+                        	llc->p_flag = 0;
+                                llc->remote_busy = 0;
+				llc->state = LLC_STATE_NORMAL;
+				break;
+			}
+
+			if(llc->retry_count < llc->max_retry && !llc->s_flag)
+			{
+				skb = alloc_skb(4, GFP_ATOMIC);
+				llc->build = LLC_STATE_SEND_SABME_CMD;
+				llc_build_pdu(skb, llc, 0);
+				llc_start_ack_timer(llc);
+				llc->retry_count ++;
+				llc_queue_xmit(skb);
+				break;
+			}
+
+			if(llc->retry_count >= llc->max_retry && !llc->s_flag)
+			{
+				llc->state = LLC_STATE_ADM;
+				break;
+			}
+
+		case (LLC_STATE_D_CONN):
+			if(llc->retry_count < llc->max_retry)
+			{
+				skb = alloc_skb(4, GFP_ATOMIC);
+				llc->build = LLC_STATE_SEND_DISC_CMD;
+				llc_build_pdu(skb, llc, 0);
+				llc_start_ack_timer(llc);
+				llc->retry_count++;
+				llc_queue_xmit(skb);
+				llc->state = LLC_STATE_D_CONN;
+			}
+			else
+				llc->state = LLC_STATE_ADM;
+			break;
+
+		case (LLC_STATE_ERROR):
+			if(llc->retry_count < llc->max_retry)
+			{
+				// llc_resend_frmr();
+				llc_start_ack_timer(llc);
+				llc->retry_count++;
+				llc->state = LLC_STATE_ERROR;
+			}
+			else
+			{
+				llc->s_flag = 0;
+				llc->state = LLC_STATE_RESET_WAIT;
+			}
+			break;
+
+		case (LLC_STATE_NORMAL):
+		case (LLC_STATE_BUSY):
+		case (LLC_STATE_REJECT):
+			if(llc->retry_count < llc->max_retry && !llc->s_flag)
+			{
+				skb = alloc_skb(4, GFP_ATOMIC);
+				llc->build = LLC_STATE_SEND_RR_CMD;
+				llc_build_pdu(skb, llc, 0);
+				llc_start_p_timer(llc);
+				llc->retry_count++;
+				llc_queue_xmit(skb);
+
+				if(llc->state == LLC_STATE_NORMAL)
+					llc->state = LLC_STATE_AWAIT;
+				if(llc->state == LLC_STATE_BUSY)
+					llc->state = LLC_STATE_AWAIT_BUSY;
+				if(llc->state == LLC_STATE_REJECT)
+					llc->state = LLC_STATE_AWAIT_REJECT;
+			}
+			break;
+	}
+
+        return;
+}
+
+static int llc_start_p_timer(struct llc_pinfo *llc)
+{
+        del_timer(&llc->p_timer);
+        llc->p_timer.expires = jiffies + sysctl_p_timer_expire;
+        add_timer(&llc->p_timer);
+
+        return (0);
+}
+
+static int llc_stop_p_timer(struct llc_pinfo *llc)
+{
+        del_timer(&llc->p_timer);
+
+        return (0);
+}
+
+static void llc_p_expire(unsigned long data)
+{
+        struct llc_pinfo *llc = (struct llc_pinfo *)data;
+	struct sk_buff *skb;
+
+        llc->event = LLC_STATE_P_TIMER_EXPIRED;
+
+	if(llc->state != LLC_STATE_NORMAL 
+		|| llc->state != LLC_STATE_BUSY
+		|| llc->state != LLC_STATE_REJECT 
+		|| llc->state != LLC_STATE_AWAIT
+		|| llc->state != LLC_STATE_AWAIT_BUSY
+		|| (llc->state != LLC_STATE_AWAIT_REJECT
+		&& llc->retry_count > llc->max_retry))
+	{
+		return;
+	}
+
+	skb = alloc_skb(4, GFP_ATOMIC);
+	llc->build = LLC_STATE_SEND_RR_CMD;
+	llc_build_pdu(skb, llc, 0);
+	llc_start_p_timer(llc);
+        llc->retry_count++;
+	llc_queue_xmit(skb);
+
+	if(llc->state == LLC_STATE_BUSY)
+	{
+		llc->state = LLC_STATE_AWAIT_BUSY;
+		return;
+	}
+
+	if(llc->state == LLC_STATE_NORMAL)
+	{
+		llc->state = LLC_STATE_AWAIT;
+		return;
+	}
+
+	if(llc->state == LLC_STATE_REJECT)
+	{
+		llc_start_rej_timer(llc);
+		llc->state = LLC_STATE_AWAIT_REJECT;
+		return;
+	}
+
+        return;
+}
+
+static int llc_start_rej_timer(struct llc_pinfo *llc)
+{
+        del_timer(&llc->rej_timer);
+        llc->rej_timer.expires = jiffies + sysctl_rej_timer_expire;
+        add_timer(&llc->rej_timer);
+
+        return (0);
+}
+
+static int llc_stop_rej_timer(struct llc_pinfo *llc)
+{
+        del_timer(&llc->rej_timer);
+
+        return (0);
+}
+
+static void llc_rej_expire(unsigned long data)
+{
+        struct llc_pinfo *llc = (struct llc_pinfo *)data;
+	struct sk_buff *skb;
+
+        llc->event = LLC_STATE_REJ_TIMER_EXPIRED;
+
+	switch(llc->state)
+	{
+		case (LLC_STATE_BUSY):
+			if(!llc->p_flag && llc->retry_count < llc->max_retry)
+			{
+				skb = alloc_skb(4, GFP_ATOMIC);
+				llc->build = LLC_STATE_SEND_RNR_CMD;
+				llc_build_pdu(skb, llc, 0);
+				llc_start_p_timer(llc);
+				llc->retry_count++;
+                                llc->data_flag = 1;
+				llc_queue_xmit(skb);
+				llc->state = LLC_STATE_AWAIT_BUSY;
+				break;
+			}
+
+			if(llc->p_flag && llc->retry_count < llc->max_retry)
+			{
+				llc->data_flag = 1;
+				llc->state = LLC_STATE_BUSY;
+				break;
+			}
+
+			break;
+
+		case (LLC_STATE_REJECT):
+			if(!llc->p_flag && llc->retry_count < llc->max_retry)
+			{
+				skb = alloc_skb(4, GFP_ATOMIC);
+				llc->build = LLC_STATE_SEND_REJ_CMD;
+				llc_build_pdu(skb, llc, 0);
+				llc_start_p_timer(llc);
+                                llc_start_rej_timer(llc);
+                                llc->retry_count++;
+				llc_queue_xmit(skb);
+				llc->state = LLC_STATE_REJECT;
+				break;
+			}
+			break;
+	}
+
+        return;
+}
+
+static int llc_start_busy_timer(struct llc_pinfo *llc)
+{
+        del_timer(&llc->busy_timer);
+        llc->busy_timer.expires = jiffies + sysctl_busy_timer_expire;
+        add_timer(&llc->busy_timer);
+
+        return (0);
+}
+
+static int llc_stop_busy_timer(struct llc_pinfo *llc)
+{
+        del_timer(&llc->busy_timer);
+
+        return (0);
+}
+
+static void llc_busy_expire(unsigned long data)
+{
+        struct llc_pinfo *llc = (struct llc_pinfo *)data;
+	struct sk_buff *skb;
+
+        llc->event = LLC_STATE_BUSY_TIMER_EXPIRED;
+
+	if(llc->state != LLC_STATE_NORMAL
+		|| llc->state != LLC_STATE_BUSY
+		|| (llc->state != LLC_STATE_REJECT
+//		&& llc->pflag != 0)
+		&& llc->retry_count > llc->max_retry))
+	{
+		return;
+	}
+
+	skb = alloc_skb(4, GFP_ATOMIC);
+	llc->build = LLC_STATE_SEND_RR_CMD;
+	llc_build_pdu(skb, llc, 0);
+	llc_start_p_timer(llc);
+	llc->retry_count++;
+	llc_queue_xmit(skb);
+
+	if(llc->state == LLC_STATE_NORMAL)
+		llc->state = LLC_STATE_AWAIT;
+
+	if(llc->state == LLC_STATE_BUSY)
+		llc->state = LLC_STATE_AWAIT_BUSY;
+
+	if(llc->state == LLC_STATE_REJECT)
+	{
+		llc->state = LLC_STATE_AWAIT_REJECT;
+		llc_start_rej_timer(llc);
+		return;
+	}
+	
+        return;
+}
+
+static int llc_stop_all_timers(struct llc_pinfo *llc)
+{
+	llc_stop_ack_timer(llc);
+        llc_stop_p_timer(llc);
+        llc_stop_rej_timer(llc);
+        llc_stop_busy_timer(llc);
+
+	return (0);
+}
+
+/* We send directly to the receiver.. we are still in the rx bh so we will
+ * should not steal anybodys time too much.
+ */
+int llc_queue_rsp(int rsp, struct sk_buff *skb, struct datalink_proto *proto)
+{
+	struct llc_pinfo *llc = proto->ll_pinfo.llc;
+
+	if(llc_debug > 3)
+                printk("llc_queue_rsp: adding rsp to train\n");
+
+	if(skb != NULL)
+                skb = skb_unshare(skb, GFP_ATOMIC);
+
+	llc->rcvfunc(rsp, skb);
+
+	return (0);
+}
+
+/* LLC SAP (Station Access Point) initilization. 
+ * - SAPs start in an INACTIVE state and default to LLC Class 1 conformance.
+ */
+static int llc_init(struct llc_pinfo *llc)
+{
+	llc->class		= LLC_SAP_CLASS_1;
+        llc->event              = 0;
+        llc->state              = LLC_STATE_INACTIVE;
+	llc->state2		= LLC_STATE_ADM;
+	llc->build		= 0;
+	llc->build_pf		= 0;
+
+	llc->dsap		= 0;
+	llc->ssap		= 0;
+
+        llc->s_flag             = 0;
+        llc->p_flag             = 0;
+        llc->f_flag             = 0;
+        llc->data_flag          = 0;
+        llc->remote_busy        = 0;
+
+        llc->seq.vs             = 0;
+        llc->seq.vr             = 0;
+
+        llc->retry_count        = 0;
+	llc->window_count	= 0;
+	llc->xid_r_count	= 0;
+
+        llc->max_retry          = sysctl_max_retry;
+        llc->max_size           = sysctl_max_size;
+        llc->max_window         = sysctl_max_window;
+
+	memset(&llc->ack_timer, 0, sizeof(struct timer_list));
+        llc->ack_timer.function         = llc_ack_expire;
+        llc->ack_timer.data             = (unsigned long)llc;
+        llc->ack_expire                 = sysctl_ack_timer_expire;
+	memset(&llc->p_timer, 0, sizeof(struct timer_list));
+        llc->p_timer.function           = llc_p_expire;
+        llc->p_timer.data               = (unsigned long)&llc;
+        llc->p_expire                   = sysctl_p_timer_expire;
+	memset(&llc->rej_timer, 0, sizeof(struct timer_list));
+        llc->rej_timer.function         = llc_rej_expire;
+        llc->rej_timer.data             = (unsigned long)&llc;
+        llc->rej_expire                 = sysctl_rej_timer_expire;
+	memset(&llc->busy_timer, 0, sizeof(struct timer_list));
+        llc->busy_timer.function        = llc_busy_expire;
+        llc->busy_timer.data            = (unsigned long)&llc;
+        llc->busy_expire                = sysctl_busy_timer_expire;
+
+        skb_queue_head_init(&llc->rx_queue);
+        skb_queue_head_init(&llc->tx_queue);
+        skb_queue_head_init(&llc->retx_queue);
+
+        return (0);
+}
+
+static int llc_purge_queues(struct llc_pinfo *llc)
+{
+	struct sk_buff *skb;
+
+	while((skb = skb_dequeue(&llc->rx_queue)) != NULL)
+                kfree_skb(skb);
+        while((skb = skb_dequeue(&llc->tx_queue)) != NULL)
+                kfree_skb(skb);
+        while((skb = skb_dequeue(&llc->retx_queue)) != NULL)
+                kfree_skb(skb);
+
+	return (0);
+}
+
+/* Destroy a LLC client's data structure. */
+static int llc_destroy_client(struct llc_pinfo *llc)
+{
+	llc_purge_queues(llc);
+	llc_stop_all_timers(llc);
+        kfree_s(llc, sizeof(struct llc_pinfo));
+
+        return (0);
+}
+
+static struct llc_sc_info *llc_find_sc(struct device *dev)
+{
+	struct llc_sc_info *sc;
+
+	for(sc = llc_sc_list; sc != NULL; sc = sc->next)
+        {
+                if(sc->dev->ifindex == dev->ifindex)
+                        return (sc);
+        }
+
+        return (NULL);
+}
+
+static struct datalink_proto *llc_find_client(__u8 type)
+{
+        struct datalink_proto *proto;
+
+        for(proto = llc_client_list; proto != NULL; proto = proto->next)
+        {
+                if(proto->ll_pinfo.llc->ssap == type)
+                        return (proto);
+        }
+
+        return (NULL);
+}
+
+/* Activate a SAP. (SAP_ACTIVATION_REQUEST)
+ * - SAPs are registered with every SC we have. I know this is
+ *   stupid, but the spec describes only how to handle 1 MAC, so lets
+ *   assume the user really wants to be on all MACs. JJS
+ */
+struct datalink_proto *register_8022_client(unsigned char type, 
+	int (*rcvfunc)(struct sk_buff*,struct device*,struct packet_type*),
+	int (*msgrcvfunc)(int rsp, struct sk_buff *))
+{
+        struct datalink_proto *proto;
+        struct llc_pinfo *llc;
+
+	if(llc_debug > 5)
+		printk("register_8022_client\n");
+
+	proto = llc_find_client(type);
+        if(proto != NULL)
+                return (NULL);
+        llc = (struct llc_pinfo *)kmalloc(sizeof(*llc), GFP_ATOMIC);
+        if(llc == NULL)
+                return (NULL);
+        proto = (struct datalink_proto *)kmalloc(sizeof(*proto), GFP_ATOMIC);
+        if(proto != NULL)
+        {
+                proto->ll_pinfo.llc = llc;
+                llc_init(llc);
+		proto->type[0] 		= type;		/* XXX */
+                proto->type_len 	= 1;		/* XXX */
+                llc->ssap               = type;
+		llc->dl			= proto;
+		llc->rcvfunc 		= msgrcvfunc;
+                proto->rcvfunc          = rcvfunc;
+		proto->header_length 	= 3;	/* We default to 3. */
+                proto->datalink_header  = llc_datalink_header;
+                proto->string_name      = "802.2";
+
+                /* Add client to each SC sap list. */
+/*
+		for(sc = llc_sc_list; sc != NULL; sc = sc->next)
+		{
+			struct datalink_proto *dl_list = sc->llc_sap_list;
+                	proto->next    = dl_list;
+                	dl_list        = proto->next;
+		}
+*/
+		proto->next		= llc_client_list;
+		llc_client_list		= proto;
+
+        }
+
+	llc->state = LLC_STATE_ACTIVE;
+        MOD_INC_USE_COUNT;
+
+        return (proto);
+}
+
+/* Deactivate a SAP. (SAP_DEACTIVATION_REQUEST).
+ */
+void unregister_8022_client(unsigned char type)
+{
+        struct datalink_proto **clients = &llc_client_list;
+        struct datalink_proto *tmp;
+        struct llc_pinfo *llc;
+        unsigned long flags;
+
+        save_flags(flags);
+        cli();
+
+        while((tmp = *clients) != NULL)
+        {
+                llc = tmp->ll_pinfo.llc;
+                if(llc->ssap == type)
+                {
+                        *clients = tmp->next;
+                        llc_destroy_client(llc);
+                        kfree_s(tmp, sizeof(struct datalink_proto));
+			MOD_DEC_USE_COUNT;
+                        break;
+                }
+                else
+                        clients = &tmp->next;
+        }
+
+        restore_flags(flags);
+
+        return;
+}
+
+static struct packet_type p8022_packet_type =
+{
+        0,              /* Mutter.. ntohs(ETH_P_802_2). */
+        NULL,           /* NULL = All devices. */
+        llc_rcv,        /* Top level receive function. */
+        NULL,
+        NULL,
+};
+
+#ifdef CONFIG_PROC_FS
+static int llc_get_info_sc(char *buffer, char **start,
+        off_t offset, int length)
+{
+        off_t begin = 0;
+        int len = 0;
+
+        /* Output the LLC data for the /proc filesystem. */
+/*
+	len += sprintf(buffer, " ", ");
+
+	for(p = llc_sc_list; p != NULL; p = p->next)
+	{
+
+
+	}
+*/
+        /* The data in question runs from begin to begin+len */
+        *start = buffer + (offset - begin);     /* Start of wanted data */
+        len -= (offset - begin);   /* Remove unwanted header data from length */        if(len > length)
+                len = length;      /* Remove unwanted tail data from length */
+        if(len < 0)
+                len = 0;
+
+        return (len);
+}
+
+static int llc_get_info_sap(char *buffer, char **start, 
+	int offset, int length)
+{
+	struct datalink_proto *p;
+	off_t pos = 0, begin = 0;
+        int len = 0;
+
+	/* Output the LLC data for the /proc filesystem. */
+        len += sprintf(buffer, "%-5s%-5s%-6s%-6s%-6s%-7s%-9s%-8s%-8s%-10s\n", 
+		"dsap", "ssap", "class", "event", "state", "state2", "rmt_busy",
+		"rty_cnt", "win_cnt", "xid_r_cnt");
+
+	for(p = llc_client_list; p != NULL; p = p->next)
+	{
+		struct llc_pinfo *llc = p->ll_pinfo.llc;
+
+		len += sprintf(buffer + len, "%02X   %02X   %02X    %02X"
+			"    %02X    %02X     %-8d %-7d %-7d %-9d\n",
+			llc->dsap, llc->ssap, llc->class, llc->event, 
+			llc->state, llc->state2, llc->remote_busy, llc->retry_count,
+			llc->window_count, llc->xid_r_count);
+
+                /* Are we still dumping unwanted data then discard the record */                pos = begin + len;
+                if(pos < offset)
+                {
+                        len = 0;        /* Keep dumping into the buffer start */                        begin = pos;
+                }
+                if(pos > offset + length)       /* We have dumped enough */
+                        break;
+        }
+
+        /* The data in question runs from begin to begin+len */
+        *start = buffer + (offset - begin);     /* Start of wanted data */
+        len -= (offset - begin);   /* Remove unwanted header data from length */        if(len > length)
+                len = length;      /* Remove unwanted tail data from length */
+        if(len < 0)
+                len = 0;
+
+        return (len);
+}
+#endif /* CONFIG_PROC_FS */
+
+static int llc_create_station_component(struct device *dev)
+{
+	struct llc_sc_info *sc;
+
+	/* IEEE 802.2 only supports Ethernet, TokenRing and FDDI. */
+        if(dev->type != ARPHRD_ETHER || dev->type != ARPHRD_IEEE802
+                || dev->type != ARPHRD_FDDI)
+        {
+                return (0);
+        }
+
+	sc = llc_find_sc(dev);
+	if(sc != NULL)
+		return (-EEXIST);
+
+	sc = (struct llc_sc_info *)kmalloc(sizeof(struct llc_sc_info),
+		GFP_ATOMIC);
+	if(sc == NULL)
+		return (-ENOMEM);
+
+	/* Initialize the SC */
+	sc->dev 	 = dev;
+	sc->llc_sap_list = NULL;
+	sc->state	 = LLC_STATE_DOWN;
+	sc->next 	 = llc_sc_list;
+	llc_sc_list 	 = sc->next;
+
+	return (0);
+}
+
+static int llc_destroy_station_component(struct device *dev)
+{
+	struct llc_sc_info **sc_clients = &llc_sc_list;
+        struct llc_sc_info *sc_tmp;
+	struct datalink_proto *sap_tmp;
+        unsigned long flags;
+
+        save_flags(flags);
+        cli();
+
+        while((sc_tmp = *sc_clients) != NULL)
+        {
+                if(sc_tmp->dev->ifindex == dev->ifindex)
+                {
+			/* Destroy All SAPs connected to this SC. */
+                        *sc_clients = sc_tmp->next;
+			for(sap_tmp = sc_tmp->llc_sap_list; sap_tmp != NULL; sap_tmp = sap_tmp->next)
+			{
+				struct llc_pinfo *llc = sap_tmp->ll_pinfo.llc;
+                        	llc_destroy_client(llc);
+				kfree_s(sap_tmp, sizeof(struct datalink_proto));
+			}
+
+                        kfree_s(sc_tmp, sizeof(struct llc_sc_info));
+                        break;
+                }
+                else
+                        sc_clients = &sc_tmp->next;
+        }
+
+        restore_flags(flags);
+
+	return (0);
+}
+
+static int llc_sc_state(struct device *dev, int state)
+{
+	struct llc_sc_info *sc;
+
+	sc = llc_find_sc(dev);
+	if(sc == NULL)
+		return (-ENOENT);
+
+	sc->state = state;
+
+	return (0);
+}
+
+int llc_netdev_event(struct notifier_block *self, unsigned long event, 
+	void *data)
+{
+	struct device *dev = (struct device *)data;
+
+	/* IEEE 802.2 only supports Ethernet, TokenRing and FDDI. */
+	if(dev->type != ARPHRD_ETHER || dev->type != ARPHRD_IEEE802
+		|| dev->type != ARPHRD_FDDI)
+	{
+		return (NOTIFY_DONE);
+	}
+
+	if(event == NETDEV_REGISTER)
+	{
+		llc_create_station_component(dev);
+		llc_sc_state(dev, LLC_STATE_DOWN);
+	}
+	if(event == NETDEV_UNREGISTER)
+		llc_destroy_station_component(dev);
+	if(event == NETDEV_UP)
+		llc_sc_state(dev, LLC_STATE_UP);
+	if(event == NETDEV_DOWN)
+		llc_sc_state(dev, LLC_STATE_DOWN);
+
+	return (NOTIFY_DONE);
+}
+
+struct notifier_block nb_llc =
+{
+	llc_netdev_event,
+	NULL,
+	0
+};
+
+/* LLC protocol initialization. */
+void llc_proto_init(struct net_proto *proto)
+{
+	struct llc_pinfo *llc;
+	struct datalink_proto *dl;
+	struct device *dev;
+
+        /* Receive all 802.2 packets on any device. */
+        p8022_packet_type.type = htons(ETH_P_802_2);
+        dev_add_pack(&p8022_packet_type);
+
+	/* Create LLC station component */
+	llc = (struct llc_pinfo *)kmalloc(sizeof(*llc), GFP_ATOMIC);
+        dl = (struct datalink_proto *)kmalloc(sizeof(*dl), GFP_ATOMIC);
+        dl->ll_pinfo.llc 	= llc;
+        llc_init(llc);
+        dl->type[0]          	= 0x00;         /* XXX */
+        dl->type_len         	= 1;            /* XXX */
+        llc->ssap               = 0x00;
+        llc->dl                 = dl;
+        llc->rcvfunc            = NULL;
+        dl->rcvfunc          	= llc_rcv;
+        dl->header_length    	= 3;    	/* We default to 3. */
+        dl->datalink_header  	= llc_datalink_header;
+        dl->string_name      	= "802.2";
+	dl->next             	= llc_client_list;
+        llc_client_list         = dl;
+        llc->state = LLC_STATE_UP;
+
+	/* Scan all the existing interfaces for IEEE 802.2
+	 * compatible devices, add the device to our list if it
+	 * is available for llc transfers.
+	 */
+	rtnl_lock();
+	for(dev = dev_base; dev != NULL; dev = dev->next)
+	{
+		/* llc_create_station_component will toss the device
+		 * if it is not an 802.2 MAC device.
+		 */
+		if(dev->flags & IFF_UP)
+		{
+			llc_create_station_component(dev);
+			llc_sc_state(dev, LLC_STATE_UP);
+		}
+	}
+	rtnl_unlock();
+
+	/* Attach a device notifier so we can watch for devices
+	 * going up and down.
+	 */
+	register_netdevice_notifier(&nb_llc);
+
+#ifdef CONFIG_PROC_FS
+        create_proc_entry("llc_sap", 0, proc_net)->get_info=llc_get_info_sap;
+#endif /* CONFIG_PROC_FS */
+
+#ifdef CONFIG_SYSCTL
+        llc_register_sysctl();
+#endif /* CONFIG_SYSCTL */
+
+        printk(KERN_INFO "ANSI/IEEE 802.2 v0.12 for Linux NET4.0\n");
+
+        return;
+}
+
+EXPORT_SYMBOL(register_8022_client);
+EXPORT_SYMBOL(unregister_8022_client);
+EXPORT_SYMBOL(llc_queue_xmit);
+EXPORT_SYMBOL(llc_decode_pdu);
+EXPORT_SYMBOL(llc_connect);
+EXPORT_SYMBOL(llc_disconnect);
+EXPORT_SYMBOL(llc_reset);
+EXPORT_SYMBOL(llc_data);
+EXPORT_SYMBOL(llc_test);
+
+#ifdef MODULE
+int init_module(void)
+{
+        llc_proto_init(NULL);
+
+        return (0);
+}
+
+/* LLC *can not* be unloaded until each client has been unregistered. 
+ * Though LLC *can* be unloaded with station components still existing.
+ */
+void cleanup_module(void)
+{
+	struct llc_sc_info *sc;
+
+	/* Remove out notifier from the netdevice layer. */
+	unregister_netdevice_notifier(&nb_llc);
+
+	/* Destroy all the station components (SC),
+	 * SAP clients are already disconnected and freed. 
+	 */
+	for(sc = llc_sc_list; sc != NULL; sc = sc->next)
+		kfree_s(sc, sizeof(struct llc_sc_info));
+
+        /* Remove the dev latch for 802.2 packets. */
+        dev_remove_pack(&p8022_packet_type);
+
+#ifdef CONFIG_PROC_FS
+        remove_proc_entry("llc_sap", proc_net);
+#endif /* CONFIG_PROC_FS */
+
+#ifdef CONFIG_SYSCTL
+        llc_unregister_sysctl();
+#endif /* CONFIG_SYSCTL */
+
+        return;
+}
+#endif /* MODULE */
