[1043] in linux-net channel archive

home help back first fref pref prev next nref lref last post

Patches Part 1

daemon@ATHENA.MIT.EDU (Alan Cox)
Mon Sep 4 22:30:48 1995

Date: Mon, 4 Sep 1995 10:47:04 +0100
From: Alan Cox <alan@cymru.net>
To: linux-net@vger.rutgers.edu, torvalds@cs.Helsinki.FI

*
*	Mixed small fixes.
*	
*	The 0 length fragment/Solaris NFS bug
*	Full BSD (arbitary length write) semantics on AF_UNIX stream
*	The IGMP include diff I forgot to include last time
*	AF_UNIX performance improvments
*	Netrom sendmsg/recvmsg
*	Improved iovec handling - now leaves iovec so further calls
*	copy further data. Need to add memcpy_offset_fromiovec for
*	AF_INET still.
*
*
*	Linus what is the state on
*
*	1.	Paul Gortmakers 8390 copy and checksum
*	2.	His cleaned up timeout handling for net devices
*	3.	sysctl() - I really need sysctl soon
*
*	Other net channel people
*
*	Tom May:	Is there a final insw_and_checksum conclusion/code ?
*	
*
*	Please ACK the receipt of this, just so I know no mail
*	is getting dropped.
*

--// Brought to you via the worlds first SMP linux machine --------------------
-//_______ inux/SMP - sponsored by Caldera Inc http://www.caldera.com==========
/________/=====================================================================
------Alan Cox <alan@cymru.net>, Custom Linux development +44 1792 297292------


--- include/linux/igmp.h.old	Tue Jun  6 09:22:11 1995
+++ include/linux/igmp.h	Fri Sep  1 22:44:36 1995
@@ -4,6 +4,8 @@
  *	Authors:
  *		Alan Cox <Alan.Cox@linux.org>	
  *
+ *	Extended to talk the BSD extended IGMP protocol of mrouted 3.6
+ *
  *
  *	This program is free software; you can redistribute it and/or
  *	modify it under the terms of the GNU General Public License
@@ -24,30 +26,37 @@
  
 struct igmphdr
 {
-	unsigned char type;
-	unsigned char unused;
-	unsigned short csum;
-	unsigned long group;
+	__u8 type;
+	__u8 code;		/* For newer IGMP */
+	__u16 csum;
+	__u32 group;
 };
 
+#define IGMP_HOST_MEMBERSHIP_QUERY	0x11	/* From RFC1112 */
+#define IGMP_HOST_MEMBERSHIP_REPORT	0x12	/* Ditto */
+#define IGMP_DVMRP			0x13	/* DVMRP routing */
+#define IGMP_PIM			0x14	/* PIM routing */
+#define IGMP_HOST_NEW_MEMBERSHIP_REPORT	0x16	/* New version of 0x11 */
+#define IGMP_HOST_LEAVE_MESSAGE		0x17	/* An extra BSD seems to send */
+
+#define IGMP_MTRACE_RESP		0x1e
+#define IGMP_MTRACE			0x1f
+
 /*
- *	Header in host convenient format
+ *	Use the BSD names for these for compatibility
  */
 
-struct igmp_header
-{
-	unsigned char type;
-	unsigned char unused;
-	unsigned short csum;
-	unsigned long group;
-};
+#define IGMP_DELAYING_MEMBER		0x01
+#define IGMP_IDLE_MEMBER		0x02
+#define IGMP_LAZY_MEMBER		0x03
+#define IGMP_SLEEPING_MEMBER		0x04
+#define IGMP_AWAKENING_MEMBER		0x05
+
+#define IGMP_OLD_ROUTER			0x00
+#define IGMP_NEW_ROUTER			0x01
 
 
-#define IGMP_HOST_MEMBERSHIP_QUERY	0x11	/* From RFC1112 */
-#define IGMP_HOST_MEMBERSHIP_REPORT	0x12	/* Ditto */
-#define IGMP_HOST_LEAVE_MESSAGE		0x17	/* An extra BSD seems to send */
 
-				/* 224.0.0.1 */
 #define IGMP_ALL_HOSTS		htonl(0xE0000001L)
 
 /*
--- include/net/sock.h.old	Sat Sep  2 14:21:49 1995
+++ include/net/sock.h	Sat Sep  2 14:22:07 1995
@@ -352,6 +352,7 @@
 						int *optlen);
 extern struct sk_buff 		*sock_alloc_send_skb(struct sock *skb,
 						     unsigned long size,
+						     unsigned long fallback,
 						     int noblock,
 						     int *errcode);
 
--- net/unix/af_unix.c.old	Sat Sep  2 14:15:24 1995
+++ net/unix/af_unix.c	Sat Sep  2 23:36:19 1995
@@ -473,7 +473,7 @@
 		 *	Now ready to connect
 		 */
 	 
-		skb=sock_alloc_send_skb(sk, 0, 0, &err); /* Marker object */
+		skb=sock_alloc_send_skb(sk, 0, 0, 0, &err); /* Marker object */
 		if(skb==NULL)
 			return err;
 		skb->sk=sk;				/* So they know it is us */
@@ -658,6 +658,8 @@
 	struct sockaddr_un *sun=msg->msg_name;
 	int err,size;
 	struct sk_buff *skb;
+	int limit=0;
+	int sent=0;
 
 	if(sk->err)
 	{
@@ -687,62 +689,91 @@
 			return -ENOTCONN;
 	}
 
-	/*
-	 *	Optimisation for the fact that under 0.01% of X messages typically
-	 *	need breaking up.
-	 */
 
-	if(len>(sk->sndbuf-sizeof(struct sk_buff))/2)	/* Keep two messages in the pipe so it schedules better */
+	while(sent < len)
 	{
-		if(sock->type==SOCK_DGRAM)
-			return -EMSGSIZE;
-		len=(sk->sndbuf-sizeof(struct sk_buff))/2;
+		/*
+		 *	Optimisation for the fact that under 0.01% of X messages typically
+		 *	need breaking up.
+		 */
+		 
+		size=len-sent;
+
+		if(size>(sk->sndbuf-sizeof(struct sk_buff))/2)	/* Keep two messages in the pipe so it schedules better */
+		{
+			if(sock->type==SOCK_DGRAM)
+				return -EMSGSIZE;
+			size=(sk->sndbuf-sizeof(struct sk_buff))/2;
+		}
 		/*
 		 *	Keep to page sized kmalloc()'s as various people
 		 *	have suggested. Big mallocs stress the vm too
 		 *	much.
 		 */
-		if(len > 4000 && sock->type!=SOCK_DGRAM)
-			len = 4000;
-	}
-	 
-	size=/*protocol_size(&proto_unix)+*/len;
-	skb=sock_alloc_send_skb(sk,size,nonblock, &err);
-	if(skb==NULL)
-		return err;
-/*	protocol_adjust(skb,&proto_unix);*/
-	skb->sk=sk;
-	skb->free=1;
-	memcpy_fromiovec(skb_put(skb,len),msg->msg_iov, len);
 
-	cli();
-	if(sun==NULL)
-	{
-		other=sk->protinfo.af_unix.other;
-		if(sock->type==SOCK_DGRAM && other->dead)
+		if(size > 4000 && sock->type!=SOCK_DGRAM)
+			limit = 4000;	/* Fall back to 4K if we can't grab a big buffer this instant */
+		else
+			limit = 0;	/* Otherwise just grab and wait */
+
+		/*
+		 *	Grab a buffer
+		 */
+		 
+		skb=sock_alloc_send_skb(sk,size,limit,nonblock, &err);
+		
+		if(skb==NULL)
 		{
-			other->protinfo.af_unix.locks--;
-			sk->protinfo.af_unix.other=NULL;
-			sock->state=SS_UNCONNECTED;
-			sti();
-			return -ECONNRESET;
+			if(sent)
+			{
+				sk->err=-err;
+				return sent;
+			}
+			return err;
 		}
-	}
-	else
-	{
-		unix_mkname(sun, msg->msg_namelen);
-		other=unix_find_other(sun->sun_path, &err);
-		if(other==NULL)
+		size=skb_tailroom(skb);		/* If we dropped back on a limit then our skb is smaller */
+
+		skb->sk=sk;
+		skb->free=1;
+		
+		memcpy_fromiovec(skb_put(skb,size),msg->msg_iov, size);
+
+		cli();
+		if(sun==NULL)
 		{
-			kfree_skb(skb, FREE_WRITE);
-			sti();
-			return err;
+			other=sk->protinfo.af_unix.other;
+			if(sock->type==SOCK_DGRAM && other->dead)
+			{
+				other->protinfo.af_unix.locks--;
+				sk->protinfo.af_unix.other=NULL;
+				sock->state=SS_UNCONNECTED;
+				sti();
+				if(!sent)
+					return -ECONNRESET;
+				else
+					return sent;
+			}
 		}
+		else
+		{
+			unix_mkname(sun, msg->msg_namelen);
+			other=unix_find_other(sun->sun_path, &err);
+			if(other==NULL)
+			{
+				kfree_skb(skb, FREE_WRITE);
+				sti();
+				if(sent)
+					return sent;
+				else
+					return err;
+			}
+		}
+		skb_queue_tail(&other->receive_queue, skb);
+		sti();
+		other->data_ready(other,size);
+		sent+=size;
 	}
-	skb_queue_tail(&other->receive_queue, skb);
-	sti();
-	other->data_ready(other,len);
-	return len;
+	return sent;
 }
 		
 static int unix_recvmsg(struct socket *sock, struct msghdr *msg, int size, int noblock, int flags, int *addr_len)
--- net/ax25/af_ax25.c.old	Sat Sep  2 14:23:26 1995
+++ net/ax25/af_ax25.c	Sat Sep  2 14:23:26 1995
@@ -1720,7 +1720,7 @@
 	/* Assume the worst case */
 	size = len + 3 + size_ax25_addr(dp) + AX25_BPQ_HEADER_LEN;
 
-	if ((skb = sock_alloc_send_skb(sk, size, 0, &err)) == NULL)
+	if ((skb = sock_alloc_send_skb(sk, size, 0, 0, &err)) == NULL)
 		return err;
 
 	skb->sk   = sk;
--- net/appletalk/dpp.c.old	Sat Sep  2 14:23:04 1995
+++ net/appletalk/ddp.c	Sat Sep  2 14:23:04 1995
@@ -1545,7 +1545,7 @@
 	
 	size += dev->hard_header_len;
 
-	skb = sock_alloc_send_skb(sk, size, 0 , &err);
+	skb = sock_alloc_send_skb(sk, size, 0, 0 , &err);
 	if(skb==NULL)
 		return err;
 
--- net/ax25/ax25_out.c.old	Sat Sep  2 14:24:13 1995
+++ net/ax25/ax25_out.c	Sat Sep  2 14:24:13 1995
@@ -71,7 +71,7 @@
 
 		while (skb->len > 0) {
 			if (skb->sk != NULL) {
-				if ((skbn = sock_alloc_send_skb(skb->sk, mtu + 2 + frontlen, 0, &err)) == NULL)
+				if ((skbn = sock_alloc_send_skb(skb->sk, mtu + 2 + frontlen, 0, 0, &err)) == NULL)
 					return;
 			} else {
 				if ((skbn = alloc_skb(mtu + 2 + frontlen, GFP_ATOMIC)) == NULL)
--- net/core/sock.c.old	Sat Sep  2 14:21:35 1995
+++ net/core/sock.c	Sat Sep  2 22:01:16 1995
@@ -64,6 +64,7 @@
  *		Alan Cox	:	Make SO_DEBUG superuser only.
  *		Alan Cox	:	Allow anyone to clear SO_DEBUG
  *					(compatibility fix)
+ *		Alan Cox	:	Added optimistic memory grabbing for AF_UNIX throughput.
  *
  * To Fix:
  *
@@ -421,7 +422,7 @@
  *	Generic send/receive buffer handlers
  */
 
-struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size, int noblock, int *errcode)
+struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size, unsigned long fallback, int noblock, int *errcode)
 {
 	struct sk_buff *skb;
 	int err;
@@ -446,8 +447,21 @@
 			return NULL;
 		}
 		
-		skb = sock_wmalloc(sk, size, 0, GFP_KERNEL);
+		if(!fallback)
+			skb = sock_wmalloc(sk, size, 0, GFP_KERNEL);
+		else
+		{
+			/* The buffer get won't block, or use the atomic queue. It does
+			   produce annoying no free page messages still.... */
+			skb = sock_wmalloc(sk, size, 0 , GFP_BUFFER);
+			if(!skb)
+				skb=sock_wmalloc(sk, fallback, 0, GFP_KERNEL);
+		}
 		
+		/*
+		 *	This means we have too many buffers for this socket already.
+		 */
+		 
 		if(skb==NULL)
 		{
 			unsigned long tmp;
--- net/core/iovec.c.old	Sat Sep  2 21:45:59 1995
+++ net/core/iovec.c	Sat Sep  2 22:38:37 1995
@@ -6,6 +6,9 @@
  *		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:
+ *		Andrew Lunn	:	Errors in iovec copying.
  */
 
 
@@ -64,10 +67,15 @@
 {
 	while(len>0)
 	{
-		int copy = min(iov->iov_len,len);
-		memcpy_tofs(iov->iov_base,kdata,copy);
-		kdata+=copy;
-		len-=copy;
+		if(iov->iov_len)
+		{
+			int copy = min(iov->iov_len,len);
+			memcpy_tofs(iov->iov_base,kdata,copy);
+			kdata+=copy;
+			len-=copy;
+			iov->iov_len-=copy;
+			iov->iov_base+=copy;
+		}
 		iov++;
 	}
 }
@@ -81,10 +89,15 @@
 	int copy;
 	while(len>0)
 	{
-		copy=min(len,iov->iov_len);
-		memcpy_fromfs(kdata, iov->iov_base, copy);
-		len-=copy;
-		kdata+=copy;
+		if(iov->iov_len)
+		{
+			copy=min(len,iov->iov_len);
+			memcpy_fromfs(kdata, iov->iov_base, copy);
+			len-=copy;
+			kdata+=copy;
+			iov->iov_base+=copy;
+			iov->iov_len-=copy;
+		}
 		iov++;
 	}
 }
--- net/ipv4/ip.c.old	Sat Sep  2 14:25:39 1995
+++ net/ipv4/ip.c	Sun Sep  3 23:52:39 1995
@@ -90,6 +90,7 @@
  *	Gerhard Koerting	:	IP fragmentation forwarding fix
  *		Alan Cox	:	Device lock against page fault.
  *		Alan Cox	:	IP_HDRINCL facility.
+ *	Werner Almesberger	:	Zero fragment bug
  *
  *  
  *
@@ -2531,7 +2532,7 @@
 	if(length+20 <= dev->mtu && !MULTICAST(daddr) && daddr!=0xFFFFFFFF && daddr!=dev->pa_brdaddr)
 	{	
 		int error;
-		struct sk_buff *skb=sock_alloc_send_skb(sk, length+20+15+dev->hard_header_len,0,&error);
+		struct sk_buff *skb=sock_alloc_send_skb(sk, length+20+15+dev->hard_header_len,0, 0,&error);
 		if(skb==NULL)
 		{
 			ip_statistics.IpOutDiscards++;
@@ -2614,7 +2615,7 @@
 	 
 	fraglen = length - offset + fragheaderlen;
 	
-	if(fraglen==0)
+	if(length-offset==0)
 	{
 		fraglen = maxfraglen;
 		offset -= maxfraglen-fragheaderlen;
@@ -2660,7 +2661,7 @@
 		 *	Get the memory we require with some space left for alignment.
 		 */
 
-		skb = sock_alloc_send_skb(sk, fraglen+15, 0, &error);
+		skb = sock_alloc_send_skb(sk, fraglen+15, 0, 0, &error);
 		if (skb == NULL)
 		{
 			ip_statistics.IpOutDiscards++;
--- net/ipv4/tcp.c.old	Sat Sep  2 14:27:55 1995
+++ net/ipv4/tcp.c	Sat Sep  2 14:27:55 1995
@@ -141,7 +141,7 @@
  *		Alan Cox	:	Per route irtt.
  *		Matt Day	:	Select() match BSD precisely on error
  *		Alan Cox	:	New buffers
- *		Mark Tamsky	:	Various sk->prot->retransmits and 
+ *		Marc Tamsky	:	Various sk->prot->retransmits and 
  *					sk->retransmits misupdating fixed.
  *					Fixed tcp_write_timeout: stuck close,
  *					and TCP syn retries gets used now.
--- net/netrom/af_netrom.c.old	Sat Sep  2 14:26:12 1995
+++ net/netrom/af_netrom.c	Sat Sep  2 17:29:24 1995
@@ -1019,11 +1019,10 @@
 	return 1;
 }
 
-static int nr_sendto(struct socket *sock, const void *ubuf, int len, int noblock,
-	unsigned flags, struct sockaddr *usip, int addr_len)
+static int nr_sendmsg(struct socket *sock, struct msghdr *msg, int len, int noblock, int flags)
 {
 	struct sock *sk = (struct sock *)sock->data;
-	struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)usip;
+	struct sockaddr_ax25 *usax = (struct sockaddr_ax25 *)msg->msg_name;
 	int err;
 	struct sockaddr_ax25 sax;
 	struct sk_buff *skb;
@@ -1046,7 +1045,7 @@
 		return -ENETUNREACH;
 		
 	if (usax) {
-		if (addr_len < sizeof(sax))
+		if (msg->msg_namelen < sizeof(sax))
 			return -EINVAL;
 		memcpy(&sax, usax, sizeof(sax));
 		if (sk->type == SOCK_SEQPACKET && memcmp(&sk->nr->dest_addr, &sax.sax25_call, sizeof(ax25_address)) != 0)
@@ -1069,7 +1068,7 @@
 
 	size = len + AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + 3 + NR_NETWORK_LEN + NR_TRANSPORT_LEN;
 
-	if ((skb = sock_alloc_send_skb(sk, size, 0, &err)) == NULL)
+	if ((skb = sock_alloc_send_skb(sk, size, 0, 0, &err)) == NULL)
 		return err;
 
 	skb->sk   = sk;
@@ -1110,7 +1109,7 @@
 		printk("NET/ROM: Appending user data\n");
 
 	/* User data follows immediately after the NET/ROM transport header */
-	memcpy_fromfs(asmptr, ubuf, len);
+	memcpy_fromiovec(asmptr, msg->msg_iov, len);
 
 	if (sk->debug)
 		printk("NET/ROM: Transmitting buffer\n");
@@ -1125,6 +1124,21 @@
 	return len;
 }
 
+static int nr_sendto(struct socket *sock, const void *ubuf, int size, int noblock, unsigned flags,
+		struct sockaddr *sa, int addr_len)
+{
+	struct iovec iov;
+	struct msghdr msg;
+	iov.iov_base=(void *)ubuf;
+	iov.iov_len=size;
+	msg.msg_name=(void *)sa;
+	msg.msg_namelen=addr_len;
+	msg.msg_accrights=NULL;
+	msg.msg_iov=&iov;
+	msg.msg_iovlen=1;
+	return nr_sendmsg(sock,&msg,size,noblock,flags);	
+}
+
 static int nr_send(struct socket *sock, const void *ubuf, int size, int noblock, unsigned flags)
 {
 	return nr_sendto(sock, ubuf, size, noblock, flags, NULL, 0);
@@ -1132,21 +1146,23 @@
 
 static int nr_write(struct socket *sock, const char *ubuf, int size, int noblock)
 {
-	return nr_send(sock, ubuf, size, noblock, 0);
+	return nr_sendto(sock, ubuf, size, noblock, 0, NULL, 0);
 }
 
-static int nr_recvfrom(struct socket *sock, void *ubuf, int size, int noblock,
-		   unsigned flags, struct sockaddr *sip, int *addr_len)
+static int nr_recvmsg(struct socket *sock, struct msghdr *msg, int size, int noblock,
+		   int flags, int *addr_len)
 {
 	struct sock *sk = (struct sock *)sock->data;
-	struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)sip;
+	struct sockaddr_ax25 *sax = (struct sockaddr_ax25 *)msg->msg_name;
 	int copied;
 	struct sk_buff *skb;
 	int er;
 
 	if (sk->err) {
+		cli();
 		er      = -sk->err;
 		sk->err = 0;
+		sti();
 		return er;
 	}
 	
@@ -1170,7 +1186,7 @@
 	}
 
 	copied = (size < skb->len) ? size : skb->len;
-	skb_copy_datagram(skb, 0, ubuf, copied);
+	skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
 	
 	if (sax != NULL) {
 		struct sockaddr_ax25 addr;
@@ -1188,6 +1204,24 @@
 	return copied;
 }		
 
+static int nr_recvfrom(struct socket *sock, void *ubuf, int size, int noblock, unsigned flags,
+		struct sockaddr *sa, int *addr_len)
+{
+	struct iovec iov;
+	struct msghdr msg;
+	iov.iov_base=ubuf;
+	iov.iov_len=size;
+	msg.msg_name=(void *)sa;
+	msg.msg_namelen=0;
+	if (addr_len)
+		msg.msg_namelen = *addr_len;
+	msg.msg_accrights=NULL;
+	msg.msg_iov=&iov;
+	msg.msg_iovlen=1;
+	return nr_recvmsg(sock,&msg,size,noblock,flags,addr_len);	
+}
+
+
 static int nr_recv(struct socket *sock, void *ubuf, int size , int noblock,
 	unsigned flags)
 {
@@ -1387,6 +1421,8 @@
 	nr_setsockopt,
 	nr_getsockopt,
 	nr_fcntl,
+	nr_sendmsg,
+	nr_recvmsg
 };
 
 static struct notifier_block nr_dev_notifier = {
--- net/netrom/nr_out.c.old	Sat Sep  2 14:26:35 1995
+++ net/netrom/nr_out.c	Sat Sep  2 14:26:35 1995
@@ -61,7 +61,7 @@
 		frontlen = skb_headroom(skb);
 
 		while (skb->len > 0) {
-			if ((skbn = sock_alloc_send_skb(sk, frontlen + mtu, 0, &err)) == NULL)
+			if ((skbn = sock_alloc_send_skb(sk, frontlen + mtu, 0, 0, &err)) == NULL)
 				return;
 
 			skbn->sk   = sk;
--- drivers/net/net_init.c.old	Mon Sep  4 00:01:10 1995
+++ drivers/net/net_init.c	Mon Sep  4 00:01:51 1995
@@ -15,6 +15,9 @@
 	Modifications/additions by Bjorn Ekwall <bj0rn@blox.se>:
 		ethdev_index[MAX_ETH_CARDS]
 		register_netdev() / unregister_netdev()
+		
+	Modifications by Wolfgang Walter
+		Use dev_close cleanly so we always shut things down tidily.
 */
 
 #include <linux/config.h>
--- net/Changes.old	Mon Sep  4 00:15:39 1995
+++ net/Changes	Mon Sep  4 00:18:12 1995
@@ -95,7 +95,7 @@
 o	Appletalk router fixes [Michael Callahan]	[TESTED]
 o	TCP state error fixes [Mark Tamsky]		[TESTED]
 o	Verify area fixes [Heiko Eissfeldt]		[TESTED]
-o	Routes use metric field	[John Naylor]		[TESTED/NOT YET AS BSD]
+o	Routes use metric field	[John Naylor]		[TESTED]
 o	Major AX.25/NetROM fixes [John Nalor]		[TESTED]
 
 ------->>>>>  NET3 030  <<<<<----------
@@ -177,16 +177,44 @@
 o	Datagram generic iovec support			[IN]
 o	Misc minor bug fixes				[IN]
 
--------->>>>> 1.3.22 I expect <<<<<-------
+-------->>>>> 1.3.22  <<<<<-------
 
-o	Device lock against page fault			[IN]
+o	Device lock against page fault			[TESTED]
 o	IP_HDRINCL					[TESTED]
 o	IP firewalling spoofing protection		[IN]
 o	IGMP bug fixes and workarounds			[TESTED]
 o	IFF_ALLMULTI protocol layer support		[TESTED]
 o	First parts of IP multicast routing code	[IN]
-o	Generate BSD ENETDOWN errors			[IN]
+o	Generate BSD ENETDOWN errors			[TESTED]
+o	Clean device unload bug<Walter Wolfgang>	[IN]
 
+-------->>>>> 1.3.23 <<<<<-------
+
+o	Missing IGMP includes fixes			[TESTED]
+o	Smarter buffer use options for sockets		[IN]
+o	AF_UNIX smarter buffer driving			[IN]
+o	AF_UNIX full BSD semantics on STREAM writes	[IN]
+o	IOVEC's support repeated calls to copy more	[IN]
+o	Zero fragment 'solaris nfs' bug fixed <Werner>  [IN]
+o	NetROM supports sendmsg/recvmsg			[IN]
+
+---------- Things Linus had for a while and not merged ----------------
+
+o	Paul Gortmakers 8390 Copy and checksum		[PLEASE ADD 8)]
+
+---------- Things pending from other people to chase -------------
+
+o	Tom May's insw_and_checksum()
+
+---------- Things pending for me to merge --------------
+
+o	IPFW support for TOS changing (Al Longyear)
+o	/dev/skip /dev/ipah etc - Kernel/Usermode communications module (me)
+o	AF_UNIX garbage collect code
+o	Closing socket change (Marc Tamsky)
+o	Faster closedown option for heavy use sites (me)
+
+--------------- Tbings That Need Doing Before 1.4 ------------------
 
 o	Finish merging the bridge code
 o	SIOCSLEEPRT patch
@@ -202,11 +230,14 @@
 o	Clean up RAW AX.25 sockets.
 o	Finish 802.2 Class I code to be compliant to the oddities of 802.2
 o	Full variable length AX.25 support		[JSN doing]
-o	Tidy BPQ support
+o	Tidy BPQ support to use an bpqip tunnel device
 o	Strange eth0-eth3 bug 
 o	Finish IPIP bug fixes
 o	Why doesnt the PROTO_UNREACH get sent ?
-
+o	IP protocols using sendmsg()
+o	Kill off old ip_queue_xmit/ip_send stuff.
+o	Remove kernel RARP and replace with user mode daemon.
+o	Throw out existing firewall ioctl()'s and use a single table load.
 
 0.2
 ---
@@ -222,7 +253,7 @@
 
 0.3
 ---
-o	Merge the layered protocol support.
+o	Merge the layered protocol support.		[ABANDONED TOO SLOW]
 o	IP firewalling performance - caching and radix trees.
 o	Zebedee
 o	802.2 Class 2 services (eg netbios).
@@ -279,7 +310,7 @@
 
 10.	Frame Relay/WAN/ISDN drivers [I'm working on the sonix EuroISDN board
 driver but thats for an internal project and its general release is still
-a maybe (so is finishing it ;))][Someone is working on Frame Relay].
+a maybe (so is finishing it ;))][Jim Freeman is working on Frame Relay].
 
 11.	IP over SCSI.
 
@@ -307,6 +338,9 @@
 
 19.	IPv4 IP-AH and IP-ESP.
 [Taken]
+
+20.	SKIP IP security using ENskip-0.10 - started
+[Me]
 
 BTW: Don't let the magic words 'kernel programming' worry you. Its like DOS
 - you make a mistake you have to reboot. You do at least get dumps and a

home help back first fref pref prev next nref lref last post