[1043] in linux-net channel archive
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