## Automatically generated incremental diff
## From:   linux-2.2.2-pre5
## To:     linux-2.2.2
## Robot:  $Id: make-incremental-diff,v 1.5 2001/12/01 08:32:36 hpa Exp $

diff -urN linux-2.2.2-pre5/Documentation/Configure.help linux/Documentation/Configure.help
--- linux-2.2.2-pre5/Documentation/Configure.help	Mon Dec  3 18:31:53 2001
+++ linux/Documentation/Configure.help	Mon Dec  3 18:32:19 2001
@@ -85,11 +85,11 @@
   a system with only one CPU, like most personal computers, say N. If
   you have a system with more than one CPU, say Y.
 
-  If you say Y here, the kernel will run on single and multiprocessor
+  If you say N here, the kernel will run on single and multiprocessor
   machines, but will use only one CPU of a multiprocessor machine. If
   you say Y here, the kernel will run on many, but not all,
   singleprocessor machines. On a singleprocessor machine, the kernel
-  will run faster if you say Y here.
+  will run faster if you say N here.
 
   Note that if you say Y here and choose architecture "586" or
   "Pentium" under "Processor family", the kernel will not work on 486
diff -urN linux-2.2.2-pre5/arch/alpha/kernel/osf_sys.c linux/arch/alpha/kernel/osf_sys.c
--- linux-2.2.2-pre5/arch/alpha/kernel/osf_sys.c	Wed Jan 20 16:07:26 1999
+++ linux/arch/alpha/kernel/osf_sys.c	Mon Dec  3 18:32:19 2001
@@ -317,8 +317,8 @@
 	struct super_block * sb = inode->i_sb;
 	int error;
 
-	error = -ENOSYS;
-	if (sb->s_op->statfs) {
+	error = -ENODEV;
+	if (sb && sb->s_op && sb->s_op->statfs) {
 		set_fs(KERNEL_DS);
 		error = sb->s_op->statfs(sb, &linux_stat, sizeof(linux_stat));
 		set_fs(USER_DS);
diff -urN linux-2.2.2-pre5/arch/alpha/kernel/proto.h linux/arch/alpha/kernel/proto.h
--- linux-2.2.2-pre5/arch/alpha/kernel/proto.h	Mon Dec  3 18:31:53 2001
+++ linux/arch/alpha/kernel/proto.h	Mon Dec  3 18:32:19 2001
@@ -165,7 +165,7 @@
 extern void SMC93x_Init(void);
 
 /* smc37c669.c */
-extern void SMC669_Init(void);
+extern void SMC669_Init(int);
 
 /* es1888.c */
 extern void es1888_init(void);
diff -urN linux-2.2.2-pre5/arch/alpha/kernel/smc37c669.c linux/arch/alpha/kernel/smc37c669.c
--- linux-2.2.2-pre5/arch/alpha/kernel/smc37c669.c	Wed Nov 25 14:52:22 1998
+++ linux/arch/alpha/kernel/smc37c669.c	Mon Dec  3 18:32:19 2001
@@ -862,7 +862,7 @@
 */
 
 SMC37c669_CONFIG_REGS *SMC37c669_detect( 
-    void 
+    int
 );
 
 unsigned int SMC37c669_enable_device( 
@@ -1015,6 +1015,29 @@
     };
 
 /*
+** The following definition is for the MONET (XP1000) IRQ 
+** translation table.
+*/
+static SMC37c669_IRQ_TRANSLATION_ENTRY SMC37c669_monet_irq_table[]
+__initdata = 
+    { 
+	{ SMC37c669_DEVICE_IRQ_A, -1 }, 
+	{ SMC37c669_DEVICE_IRQ_B, -1 }, 
+	{ SMC37c669_DEVICE_IRQ_C, 6 }, 
+	{ SMC37c669_DEVICE_IRQ_D, 7 }, 
+	{ SMC37c669_DEVICE_IRQ_E, 4 }, 
+	{ SMC37c669_DEVICE_IRQ_F, 3 }, 
+	{ SMC37c669_DEVICE_IRQ_H, -1 }, 
+	{ -1, -1 } /* End of table */
+    };
+
+static SMC37c669_IRQ_TRANSLATION_ENTRY *SMC37c669_irq_tables[] __initdata =
+    {
+	SMC37c669_default_irq_table,
+	SMC37c669_monet_irq_table
+    }; 
+
+/*
 ** DRQ Translation Table
 **
 ** The DRQ translation table is a list of SMC37c669 device and
@@ -1163,7 +1186,7 @@
 **
 **--
 */
-SMC37c669_CONFIG_REGS * __init SMC37c669_detect( void )
+SMC37c669_CONFIG_REGS * __init SMC37c669_detect( int index )
 {
     int i;
     SMC37c669_DEVICE_ID_REGISTER id;
@@ -1196,7 +1219,7 @@
 /*
 ** Initialize the IRQ and DRQ translation tables.
 */
-    	    SMC37c669_irq_table = SMC37c669_default_irq_table;
+    	    SMC37c669_irq_table = SMC37c669_irq_tables[ index ];
 	    SMC37c669_drq_table = SMC37c669_default_drq_table;
 /*
 ** erfix
@@ -2516,13 +2539,13 @@
  *      None
  *
  */
-void __init SMC669_Init ( void )
+void __init SMC669_Init ( int index )
 {
     SMC37c669_CONFIG_REGS *SMC_base;
     unsigned long flags;
 
     __save_and_cli(flags);
-    if ( ( SMC_base = SMC37c669_detect( ) ) != NULL ) {
+    if ( ( SMC_base = SMC37c669_detect( index ) ) != NULL ) {
 #if SMC_DEBUG
 	SMC37c669_config_mode( TRUE );
 	SMC37c669_dump_registers( );
diff -urN linux-2.2.2-pre5/arch/alpha/kernel/sys_dp264.c linux/arch/alpha/kernel/sys_dp264.c
--- linux-2.2.2-pre5/arch/alpha/kernel/sys_dp264.c	Sun Jan 10 09:59:59 1999
+++ linux/arch/alpha/kernel/sys_dp264.c	Mon Dec  3 18:32:19 2001
@@ -316,7 +316,7 @@
 {
 	layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
 	common_pci_fixup(dp264_map_irq, common_swizzle);
-	SMC669_Init();
+	SMC669_Init(0);
 }
 
 static void __init
@@ -325,7 +325,7 @@
 	layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
 	common_pci_fixup(monet_map_irq, monet_swizzle);
 	/* es1888_init(); */ /* later? */
-	SMC669_Init();
+	SMC669_Init(1);
 }
 
 static void __init
@@ -333,7 +333,7 @@
 {
 	layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
 	common_pci_fixup(webbrick_map_irq, common_swizzle);
-	SMC669_Init();
+	SMC669_Init(0);
 }
 
 
diff -urN linux-2.2.2-pre5/arch/alpha/kernel/sys_miata.c linux/arch/alpha/kernel/sys_miata.c
--- linux-2.2.2-pre5/arch/alpha/kernel/sys_miata.c	Wed Nov 25 14:52:22 1998
+++ linux/arch/alpha/kernel/sys_miata.c	Mon Dec  3 18:32:19 2001
@@ -267,7 +267,7 @@
 {
 	layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
 	common_pci_fixup(miata_map_irq, miata_swizzle);
-	SMC669_Init(); /* it might be a GL (fails harmlessly if not) */
+	SMC669_Init(0); /* it might be a GL (fails harmlessly if not) */
 	es1888_init();
 }
 
diff -urN linux-2.2.2-pre5/arch/alpha/kernel/sys_sx164.c linux/arch/alpha/kernel/sys_sx164.c
--- linux-2.2.2-pre5/arch/alpha/kernel/sys_sx164.c	Mon Oct 12 11:40:12 1998
+++ linux/arch/alpha/kernel/sys_sx164.c	Mon Dec  3 18:32:19 2001
@@ -183,7 +183,7 @@
 {
 	layout_all_busses(DEFAULT_IO_BASE, DEFAULT_MEM_BASE);
 	common_pci_fixup(sx164_map_irq, common_swizzle);
-	SMC669_Init();
+	SMC669_Init(0);
 }
 
 
diff -urN linux-2.2.2-pre5/drivers/misc/parport_ieee1284.c linux/drivers/misc/parport_ieee1284.c
--- linux-2.2.2-pre5/drivers/misc/parport_ieee1284.c	Wed Jan 20 13:29:18 1999
+++ linux/drivers/misc/parport_ieee1284.c	Mon Dec  3 18:32:19 2001
@@ -52,7 +52,7 @@
 		& ~1 ) & ~2);
 	udelay(1);
 	parport_write_data(port, mode);
-	udelay(1);
+	udelay(400);
 	/* nSelectIn high, nAutoFd low */
 	parport_write_control(port, (parport_read_control(port) & ~8) | 2);
 	if (parport_wait_peripheral(port, 0x78, 0x38)) {
diff -urN linux-2.2.2-pre5/drivers/net/Space.c linux/drivers/net/Space.c
--- linux-2.2.2-pre5/drivers/net/Space.c	Fri Jan 15 14:36:21 1999
+++ linux/drivers/net/Space.c	Mon Dec  3 18:32:19 2001
@@ -518,7 +518,7 @@
 	&& dfx_probe(dev)
 #endif
 #ifdef CONFIG_APFDDI
-	&& apfddi_init(dev);
+	&& apfddi_init(dev)
 #endif
 	&& 1 ) {
 	    return 1;	/* -ENODEV or -EAGAIN would be more accurate. */
diff -urN linux-2.2.2-pre5/drivers/net/hostess_sv11.c linux/drivers/net/hostess_sv11.c
--- linux-2.2.2-pre5/drivers/net/hostess_sv11.c	Fri Nov 13 10:29:44 1998
+++ linux/drivers/net/hostess_sv11.c	Mon Dec  3 18:32:19 2001
@@ -416,10 +416,8 @@
 
 int init_module(void)
 {
-	printk(KERN_INFO "SV-11 Z85230 Synchronous Driver v 0.01.\n");
+	printk(KERN_INFO "SV-11 Z85230 Synchronous Driver v 0.02.\n");
 	printk(KERN_INFO "(c) Copyright 1998, Building Number Three Ltd.\n");	
-	if(dma)
-		printk(KERN_WARNING "DMA mode probably wont work right now.\n");
 	if((sv11_unit=sv11_init(io,irq))==NULL)
 		return -ENODEV;
 	return 0;
diff -urN linux-2.2.2-pre5/drivers/net/ppp.c linux/drivers/net/ppp.c
--- linux-2.2.2-pre5/drivers/net/ppp.c	Thu Jan 14 22:56:06 1999
+++ linux/drivers/net/ppp.c	Mon Dec  3 18:32:19 2001
@@ -2062,7 +2062,11 @@
 			       "ppp: error in VJ decompression\n");
 		return 0;
 	}
-	skb_put(skb, new_count + PPP_HDRLEN - skb->len);
+	new_count += PPP_HDRLEN;
+	if (new_count > skb->len)
+		skb_put(skb, new_count - skb->len);
+	else
+		skb_trim(skb, new_count);
 	return rcv_proto_ip(ppp, skb);
 }
 
diff -urN linux-2.2.2-pre5/drivers/net/syncppp.c linux/drivers/net/syncppp.c
--- linux-2.2.2-pre5/drivers/net/syncppp.c	Mon Dec  3 18:31:53 2001
+++ linux/drivers/net/syncppp.c	Mon Dec  3 18:32:19 2001
@@ -51,7 +51,7 @@
 #include <asm/byteorder.h>
 #include "syncppp.h"
 
-#define MAXALIVECNT     3               /* max. alive packets */
+#define MAXALIVECNT     6               /* max. alive packets */
 
 #define PPP_ALLSTATIONS 0xff            /* All-Stations broadcast address */
 #define PPP_UI          0x03            /* Unnumbered Information */
diff -urN linux-2.2.2-pre5/drivers/scsi/qlogicfas.c linux/drivers/scsi/qlogicfas.c
--- linux-2.2.2-pre5/drivers/scsi/qlogicfas.c	Sat Apr 11 11:13:25 1998
+++ linux/drivers/scsi/qlogicfas.c	Mon Dec  3 18:32:19 2001
@@ -5,8 +5,8 @@
    these silly disclaimers.
 
    Copyright 1994, Tom Zerucha.   
-   zerucha@shell.portal.com
-
+   tz@execpc.com
+   
    Additional Code, and much appreciated help by
    Michael A. Griffith
    grif@cs.ucr.edu
diff -urN linux-2.2.2-pre5/fs/autofs/root.c linux/fs/autofs/root.c
--- linux-2.2.2-pre5/fs/autofs/root.c	Mon Jan 11 15:03:30 1999
+++ linux/fs/autofs/root.c	Mon Dec  3 18:32:19 2001
@@ -209,7 +209,7 @@
 	NULL,			/* d_compare */
 };
 
-static int autofs_root_lookup(struct inode *dir, struct dentry * dentry)
+static int autofs_root_lookup(struct inode *dir, struct dentry *dentry)
 {
 	struct autofs_sb_info *sbi;
 	int oz_mode;
@@ -220,6 +220,9 @@
 	if (!S_ISDIR(dir->i_mode))
 		return -ENOTDIR;
 
+	if (dentry->d_name.len > NAME_MAX)
+		return -ENOENT;	/* File name too long to exist */
+
 	sbi = autofs_sbi(dir->i_sb);
 
 	oz_mode = autofs_oz_mode(sbi);
@@ -280,6 +283,9 @@
 	if ( !autofs_oz_mode(sbi) )
 		return -EPERM;
 
+	if ( dentry->d_name.len > NAME_MAX )
+		return -ENAMETOOLONG;
+
 	if ( autofs_hash_lookup(dh, &dentry->d_name) )
 		return -EEXIST;
 
@@ -400,6 +406,9 @@
 
 	if ( !autofs_oz_mode(sbi) )
 		return -EPERM;
+
+	if ( dentry->d_name.len > NAME_MAX )
+		return -ENAMETOOLONG;
 
 	ent = autofs_hash_lookup(dh, &dentry->d_name);
 	if ( ent )
diff -urN linux-2.2.2-pre5/fs/autofs/waitq.c linux/fs/autofs/waitq.c
--- linux-2.2.2-pre5/fs/autofs/waitq.c	Mon Jan 11 15:03:30 1999
+++ linux/fs/autofs/waitq.c	Mon Dec  3 18:32:19 2001
@@ -99,13 +99,17 @@
 		autofs_catatonic_mode(sbi);
 }
 
-int autofs_wait(struct autofs_sb_info *sbi, struct qstr * name)
+int autofs_wait(struct autofs_sb_info *sbi, struct qstr *name)
 {
 	struct autofs_wait_queue *wq;
 	int status;
 
 	/* In catatonic mode, we don't wait for nobody */
 	if ( sbi->catatonic )
+		return -ENOENT;
+	
+	/* We shouldn't be able to get here, but just in case */
+	if ( name->len > NAME_MAX )
 		return -ENOENT;
 
 	for ( wq = sbi->queues ; wq ; wq = wq->next ) {
diff -urN linux-2.2.2-pre5/fs/inode.c linux/fs/inode.c
--- linux-2.2.2-pre5/fs/inode.c	Mon Dec  3 18:31:53 2001
+++ linux/fs/inode.c	Mon Dec  3 18:32:19 2001
@@ -385,6 +385,7 @@
 	goal -= inodes_stat.nr_free_inodes;
 	if (goal > 0) {
 		spin_unlock(&inode_lock);
+		select_dcache(goal, 0);
 		prune_dcache(goal);
 		spin_lock(&inode_lock);
 		sync_all_inodes();
diff -urN linux-2.2.2-pre5/fs/open.c linux/fs/open.c
--- linux-2.2.2-pre5/fs/open.c	Tue Dec 29 11:40:35 1998
+++ linux/fs/open.c	Mon Dec  3 18:32:19 2001
@@ -22,10 +22,11 @@
 	error = PTR_ERR(dentry);
 	if (!IS_ERR(dentry)) {
 		struct inode * inode = dentry->d_inode;
+		struct super_block * sb = inode->i_sb;
 
-		error = -ENOSYS;
-		if (inode->i_sb->s_op->statfs)
-			error = inode->i_sb->s_op->statfs(inode->i_sb, buf, sizeof(struct statfs));
+		error = -ENODEV;
+		if (sb && sb->s_op && sb->s_op->statfs)
+			error = sb->s_op->statfs(sb, buf, sizeof(struct statfs));
 
 		dput(dentry);
 	}
@@ -52,10 +53,8 @@
 	if (!(inode = dentry->d_inode))
 		goto out_putf;
 	error = -ENODEV;
-	if (!(sb = inode->i_sb))
-		goto out_putf;
-	error = -ENOSYS;
-	if (sb->s_op->statfs)
+	sb = inode->i_sb;
+	if (sb && sb->s_op && sb->s_op->statfs)
 		error = sb->s_op->statfs(sb, buf, sizeof(struct statfs));
 out_putf:
 	fput(file);
diff -urN linux-2.2.2-pre5/include/linux/videodev.h linux/include/linux/videodev.h
--- linux-2.2.2-pre5/include/linux/videodev.h	Sun Jan 24 22:05:07 1999
+++ linux/include/linux/videodev.h	Mon Dec  3 18:32:19 2001
@@ -273,6 +273,8 @@
 #define VID_HARDWARE_PLANB	16	/* PowerMac motherboard video-in */
 #define VID_HARDWARE_BROADWAY	17	/* Broadway project */
 #define VID_HARDWARE_GEMTEK	18
+#define VID_HARDWARE_TYPHOON	19
+#define VID_HARDWARE_VINO	20	/* Reserved for SGI Indy Vino */
 
 /*
  *	Initialiser list
diff -urN linux-2.2.2-pre5/kernel/sched.c linux/kernel/sched.c
--- linux-2.2.2-pre5/kernel/sched.c	Mon Dec  3 18:31:53 2001
+++ linux/kernel/sched.c	Mon Dec  3 18:32:19 2001
@@ -464,8 +464,17 @@
 	unsigned long flags;
 
 	spin_lock_irqsave(&timerlist_lock, flags);
+	if (timer->prev)
+		goto bug;
 	internal_add_timer(timer);
+out:
 	spin_unlock_irqrestore(&timerlist_lock, flags);
+	return;
+
+bug:
+	printk("bug: kernel timer added twice at %p.\n",
+			__builtin_return_address(0));
+	goto out;
 }
 
 static inline int detach_timer(struct timer_list *timer)
diff -urN linux-2.2.2-pre5/net/ipv4/af_inet.c linux/net/ipv4/af_inet.c
--- linux-2.2.2-pre5/net/ipv4/af_inet.c	Mon Jan  4 15:31:35 1999
+++ linux/net/ipv4/af_inet.c	Mon Dec  3 18:32:19 2001
@@ -5,7 +5,7 @@
  *
  *		PF_INET protocol family socket handler.
  *
- * Version:	$Id: af_inet.c,v 1.82 1999/01/04 20:36:44 davem Exp $
+ * Version:	$Id: af_inet.c,v 1.83 1999/02/22 13:54:18 davem Exp $
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -828,6 +828,8 @@
 	sk->shutdown |= how;
 	if (sk->prot->shutdown)
 		sk->prot->shutdown(sk, how);
+	/* Wake up anyone sleeping in poll. */
+	sk->state_change(sk);
 	return(0);
 }
 
diff -urN linux-2.2.2-pre5/net/ipv4/icmp.c linux/net/ipv4/icmp.c
--- linux-2.2.2-pre5/net/ipv4/icmp.c	Mon Jan  4 15:31:35 1999
+++ linux/net/ipv4/icmp.c	Mon Dec  3 18:32:19 2001
@@ -402,6 +402,10 @@
 	if (type == ICMP_DEST_UNREACH && code == ICMP_FRAG_NEEDED)
 		return 1;
 
+	/* No rate limit on loopback */
+	if (dst->dev && (dst->dev->flags&IFF_LOOPBACK))
+ 		return 1;
+
 	return xrlim_allow(dst, *(icmp_pointers[type].timeout));
 }
 
diff -urN linux-2.2.2-pre5/net/ipv4/tcp.c linux/net/ipv4/tcp.c
--- linux-2.2.2-pre5/net/ipv4/tcp.c	Sun Jan 17 10:00:00 1999
+++ linux/net/ipv4/tcp.c	Mon Dec  3 18:32:19 2001
@@ -5,7 +5,7 @@
  *
  *		Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:	$Id: tcp.c,v 1.134 1999/01/09 08:50:09 davem Exp $
+ * Version:	$Id: tcp.c,v 1.135 1999/02/22 13:54:21 davem Exp $
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -1393,9 +1393,6 @@
 	if ((1 << sk->state) &
 	    (TCPF_ESTABLISHED|TCPF_SYN_SENT|TCPF_SYN_RECV|TCPF_CLOSE_WAIT)) {
 		lock_sock(sk);
-
-		/* Flag that the sender has shutdown. */
-		sk->shutdown |= SEND_SHUTDOWN;
 
 		/* Clear out any half completed packets.  FIN if needed. */
 		if (tcp_close_state(sk,0))
diff -urN linux-2.2.2-pre5/net/ipv4/tcp_input.c linux/net/ipv4/tcp_input.c
--- linux-2.2.2-pre5/net/ipv4/tcp_input.c	Mon Dec  3 18:31:53 2001
+++ linux/net/ipv4/tcp_input.c	Mon Dec  3 18:32:19 2001
@@ -5,7 +5,7 @@
  *
  *		Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:	$Id: tcp_input.c,v 1.155 1999/01/26 05:33:50 davem Exp $
+ * Version:	$Id: tcp_input.c,v 1.156 1999/02/22 13:54:13 davem Exp $
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -130,11 +130,15 @@
 {
 	tp->delayed_acks++; 
 
-	/* Tiny-grams with PSH set make us ACK quickly.
-	 * Note: This also clears the "quick ack mode" bit.
+	/* Tiny-grams with PSH set artifically deflate our
+	 * ato measurement, but with a lower bound.
 	 */
-	if(th->psh && (skb->len < (tp->mss_cache >> 1)))
-		tp->ato = HZ/50;
+	if(th->psh && (skb->len < (tp->mss_cache >> 1))) {
+		/* Preserve the quickack state. */
+		if((tp->ato & 0x7fffffff) > HZ/50)
+			tp->ato = ((tp->ato & 0x80000000) |
+				   (HZ/50));
+	}
 } 
 
 /* Called to compute a smoothed rtt estimate. The data fed to this
diff -urN linux-2.2.2-pre5/net/ipv4/tcp_output.c linux/net/ipv4/tcp_output.c
--- linux-2.2.2-pre5/net/ipv4/tcp_output.c	Mon Dec  3 18:31:53 2001
+++ linux/net/ipv4/tcp_output.c	Mon Dec  3 18:32:21 2001
@@ -5,7 +5,7 @@
  *
  *		Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:	$Id: tcp_output.c,v 1.101 1999/01/20 07:20:14 davem Exp $
+ * Version:	$Id: tcp_output.c,v 1.102 1999/02/22 13:54:26 davem Exp $
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
diff -urN linux-2.2.2-pre5/net/ipv4/timer.c linux/net/ipv4/timer.c
--- linux-2.2.2-pre5/net/ipv4/timer.c	Mon Dec  3 18:31:53 2001
+++ linux/net/ipv4/timer.c	Mon Dec  3 18:32:21 2001
@@ -5,7 +5,7 @@
  *
  *		TIMER - implementation of software timers for IP.
  *
- * Version:	$Id: timer.c,v 1.14 1998/11/07 11:55:43 davem Exp $
+ * Version:	$Id: timer.c,v 1.15 1999/02/22 13:54:29 davem Exp $
  *
  * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
  *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
diff -urN linux-2.2.2-pre5/net/ipx/af_ipx.c linux/net/ipx/af_ipx.c
--- linux-2.2.2-pre5/net/ipx/af_ipx.c	Sun Jan 17 18:25:48 1999
+++ linux/net/ipx/af_ipx.c	Mon Dec  3 18:32:21 2001
@@ -766,11 +766,10 @@
 
 		i = 0;
 
-		/* Dump packet if too many hops or already seen this net */
-		if(ipx->ipx_tctrl < 8)
-			for( ; i < ipx->ipx_tctrl; i++)
-				if(*l++ == intrfc->if_netnum)
-					break;
+		/* Dump packet if already seen this net */
+		for( ; i < ipx->ipx_tctrl; i++)
+			if(*l++ == intrfc->if_netnum)
+				break;
 
 		if(i == ipx->ipx_tctrl) 
 		{ 
@@ -779,6 +778,10 @@
 			/* xmit on all other interfaces... */
 			for(ifcs = ipx_interfaces; ifcs != NULL; ifcs = ifcs->if_next) 
 			{
+				/* Except unconfigured interfaces */
+				if(ifcs->if_netnum == 0)
+					continue;
+					
 				/* That aren't in the list */
 				l = (__u32 *) c;
 				for(i = 0; i <= ipx->ipx_tctrl; i++)
@@ -2074,18 +2077,16 @@
 	
 	/* Too small? */
 	if(ntohs(ipx->ipx_pktsize) < sizeof(struct ipxhdr))
-	{
-		kfree_skb(skb);
-		return (0);
-	}
-	
+		goto drop;
+		
+	/* Not ours */	
+        if (skb->pkt_type == PACKET_OTHERHOST)
+        	goto drop;
+                        
 	if(ipx->ipx_checksum != IPX_NO_CHECKSUM) 
 	{
 		if(ipx_set_checksum(ipx, ntohs(ipx->ipx_pktsize)) != ipx->ipx_checksum)
-		{
-			kfree_skb(skb);
-			return (0);
-		}
+			goto drop;
 	}
 
 	/* Determine what local ipx endpoint this is */
@@ -2099,13 +2100,14 @@
 		}
 
 		if(intrfc == NULL)	/* Not one of ours */
-		{
-			kfree_skb(skb);
-			return (0);
-		}
+			goto drop;
 	}
 
 	return (ipxitf_rcv(intrfc, skb));
+	
+drop:
+	kfree_skb(skb);
+	return (0);
 }
 
 static int ipx_sendmsg(struct socket *sock, struct msghdr *msg, int len,
@@ -2133,8 +2135,11 @@
 			uaddr.sipx_port = 0;
 			uaddr.sipx_network = 0L;
 #ifdef CONFIG_IPX_INTERN
-			memcpy(uaddr.sipx_node, sk->protinfo.af_ipx.intrfc
-				->if_node, IPX_NODE_LEN);
+			if(sk->protinfo.af_ipx.intrfc)
+				memcpy(uaddr.sipx_node, sk->protinfo.af_ipx.intrfc
+						->if_node,IPX_NODE_LEN);
+			else
+				return -ENETDOWN;               /* Someone zonked the iface */
 #endif
 			ret = ipx_bind(sock, (struct sockaddr *)&uaddr,
 					sizeof(struct sockaddr_ipx));
