diff -ur --new-file old/atm/BUGS new/atm/BUGS
--- old/atm/BUGS	Fri Apr  4 20:20:54 1997
+++ new/atm/BUGS	Thu Apr 10 11:58:54 1997
@@ -1,13 +1,35 @@
+Known bugs and restrictions in version 0.30
+===========================================
+
+ - Arequipa sometimes eats the first packet (probably fixed)
+ - ENI driver should be more tolerant about data alignment when sending
+ - libresolve conflicts with libc on some systems
+ - atmarp is said to break proxy ARP
+
+
 Known bugs and restrictions in version 0.29
 ===========================================
 
+ - Arequipa sometimes eats the first packet
+ - atmsigd -N is reported to fail in some unspecified way
+ - ENI driver should be more tolerant about data alignment when sending
+ - libresolve conflicts with libc on some systems
+ - qgen is said to exhibit memory leak on q_open/q_close (need to verify)
+ - atmarp is said to break proxy ARP
+ - atmsigd reported to die and hang in eni.c:close_tx (fixed ?)
+ - atmarpd sometimes complains about "ARP: unknown hw protocol 0xaaaa". (fixed?)
+
+
+Known bugs and restrictions in version 0.28
+===========================================
+
  - ENI driver seems to get confused when closing VC with low PCR and data
    pending (this is a more precise diagnosis of the "ident mismatch" problem)
  - didn't fix all the 0.27 and 0.28 problems listed below
  - select is reported to fail miserably when used with atmtcp
 
 
-Known bugs and restrictions in version 0.28
+Known bugs and restrictions in version 0.27
 ===========================================
 
  - Arequipa sometimes eats the first packet
@@ -19,7 +41,7 @@
    indicate that data gets corrupted somewhere.
 
 
-Known bugs and restrictions in version 0.27
+Known bugs and restrictions in version 0.26
 ===========================================
 
  - the AAL changes probably broke LANE
diff -ur --new-file old/atm/CHANGES new/atm/CHANGES
--- old/atm/CHANGES	Fri Apr  4 22:35:27 1997
+++ new/atm/CHANGES	Thu Apr 10 12:53:01 1997
@@ -1,3 +1,29 @@
+Version 0.29 to 0.30 (10-APR-1997)
+====================
+
+Bug fixes
+---------
+
+ - atmtcp didn't use vcc->push and therefore got the buffer usage accounting
+   wrong (fix by Gerald Hanusch)
+ - when closing a VC, the ENI driver didn't wait until all TX data has really
+   left the board, which created a close/open race (found by Richard Jones)
+ - SSCOP sometimes omitted the last element in a STAT PDU (fix - even with
+   optimization vs. Q.2110 - by Ngo Bach Long)
+ - atmarpd allowed ARP information to change permanent entries (found by Gerald
+   Hanusch)
+ - atmsigd's get_pvc used the maximum SDU size, thereby wasting buffer space
+   very quickly, which led to signaling problems (reported by Richard Jones and
+   Rik Wade)
+ - oops, the BUGS file was always one version number ahead
+ - ATMARP had a race between packets sent by the remote station and the
+   ATMARP_MKIP ioctl. This caused the dreaded "unknown hw protocol 0xaaaa"
+   error. (Finally fixed thanks to a dump provided by Patrick Flynn)
+ - Arequipa had the same race for AREQUIPA_INCOMING. This probably caused the
+   occasional "loss" (they were actually kept in vcc->recvq until the
+   connection was closed) of the first packet(s).
+
+
 Version 0.28 to 0.29 (4-APR-1997)
 ====================
 
diff -ur --new-file old/atm/README new/atm/README
--- old/atm/README	Fri Apr  4 21:35:31 1997
+++ new/atm/README	Thu Apr 10 12:10:21 1997
@@ -1,4 +1,4 @@
-ATM on Linux, release 0.98 (pre-alpha) by Werner Almesberger, EPFL LRC
+ATM on Linux, release 0.30 (pre-alpha) by Werner Almesberger, EPFL LRC
 ====================================== werner.almesberger@lrc.di.epfl.ch
 
 This is experimental software. There are known major bugs and certainly
diff -ur --new-file old/atm/USAGE new/atm/USAGE
--- old/atm/USAGE	Fri Apr  4 22:31:12 1997
+++ new/atm/USAGE	Thu Apr 10 12:53:55 1997
@@ -1,4 +1,4 @@
-Usage instructions  -  ATM on Linux, release 0.29 (pre-alpha)
+Usage instructions  -  ATM on Linux, release 0.30 (pre-alpha)
 -------------------------------------------------------------
 
 For updates of ATM on Linux, please check the Web page at  
@@ -17,7 +17,7 @@
 In order to install this package, you need 
 
   - the package itself  
-    ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.29.tar.gz  
+    ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.30.tar.gz  
   - the Linux kernel, version 2.0.25, e.g. from  
     ftp://ftp.cs.helsinki.fi/pub/Software/Linux/Kernel/v2.0/linux-2.0.25.tar.gz  
   - Perl, version 4 or 5 
@@ -33,7 +33,7 @@
 all the files listed above there. Then extract the ATM on Linux 
 distribution:
 
-tar xfz atm-0.29.tar.gz
+tar xfz atm-0.30.tar.gz
 
 and the kernel source:
 
diff -ur --new-file old/atm/VERSION new/atm/VERSION
--- old/atm/VERSION	Fri Apr  4 20:53:48 1997
+++ new/atm/VERSION	Thu Apr 10 12:10:00 1997
@@ -1 +1 @@
-0.29
+0.30
diff -ur --new-file old/atm/arpd/arp.c new/atm/arpd/arp.c
--- old/atm/arpd/arp.c	Fri Apr  4 11:11:23 1997
+++ new/atm/arpd/arp.c	Tue Apr  8 13:23:23 1997
@@ -476,11 +476,24 @@
 	if (vcc) {
 	    entry = vcc->entry;
 	    if (!entry->itf) Q_REMOVE(unknown_incoming,entry);
+	    else if (entry->ip && entry->ip != ip && (entry->flags & ATF_PERM))
+		  {
+		    diag(COMPONENT,DIAG_ERROR,"ignoring attempt to change IP "
+		      "address of permanent entry (to %d.%d.%d.%d)",ipp[0],
+		      ipp[1],ipp[2],ipp[3]);
+		    return;
+		}
 	}
 	else {
 	    entry = alloc_entry(1);
 	    entry->flags = ATF_PUBL;
 	}
+    if (entry->addr && (entry->flags & ATF_PERM) &&
+      !atm_equal(entry->addr,addr,0,0)) {
+	diag(COMPONENT,DIAG_ERROR,"ignoring attempt to change ATM address of "
+	  "permanent entry");
+	return;
+    }
     if (entry->state == as_valid && entry->ip == ip && entry->addr &&
       atm_equal(entry->addr,addr,0,0)) return; /* no news */
     STOP_TIMER(entry);
diff -ur --new-file old/atm/atm-0.29-1.spec new/atm/atm-0.29-1.spec
--- old/atm/atm-0.29-1.spec	Fri Apr  4 20:55:37 1997
+++ new/atm/atm-0.29-1.spec	Thu Jan  1 01:00:00 1970
@@ -1,138 +0,0 @@
-Summary:	ATM (Asynchronous Transfer Mode)
-Name:		atm
-Version:	0.29
-Release:	1
-Source:		atm-0.29.tar.gz
-Source:		lrcftp.epfl.ch:/pub/linux/atm/dist/atm-0.29.tar.gz
-Copyright:	distributable
-Group:		Networking/ATM
-ExclusiveArch:	i386
-ExclusiveOS:	Linux
-
-%description
-Programs, libraries, and configuration files required for using ATM
-on Linux. Note that you still need to patch your kernel.
-
-%package ans
-Summary:	ANS (ATM Name Server)
-Group:		Networking/ATM
-
-%description ans
-ANS is a version of BIND with extensions for ATM. This package contains
-the complete BIND distribution, including tools like nslookup and dig.
-
-%prep
-
-%setup -n atm
-
-%build
-make
-cd extra
-make tcpdump
-make ans
-
-%install
-INSTPREFIX=/usr make -e
-cd config/redhat-4.0
-make install
-cd ../../extra
-INSTPREFIX=/usr make -e install
-
-%files ans
-/usr/lib/libresolv.a
-/usr/include/arpa/inet.h
-/usr/include/arpa/nameser.h
-/usr/include/netdb.h
-/usr/include/resolv.h
-/usr/include/sys/bitypes.h
-/usr/lib/lib44bsd.a
-/usr/sbin/named
-/usr/sbin/named-xfer
-/usr/sbin/named.restart
-/usr/sbin/named.reload
-/usr/sbin/ndc
-/usr/bin/nslookup
-/usr/lib/nslookup.help
-/usr/bin/host
-/usr/bin/dig
-/usr/bin/dnsquery
-/usr/bin/addr
-/usr/man/man1/dig.1
-/usr/man/man1/host.1
-/usr/man/man1/dnsquery.1
-/usr/man/man8/named.8
-/usr/man/man8/named.reload.8
-/usr/man/man8/named.restart.8
-/usr/man/man8/ndc.8
-/usr/man/man8/named-xfer.8
-/usr/man/man8/nslookup.8
-/usr/man/man3/gethostbyname.3
-/usr/man/man3/resolver.3
-/usr/man/man3/getnetent.3
-/usr/man/man5/resolver.5
-/usr/man/man7/hostname.7
-/usr/man/man7/mailaddr.7
-
-%files
-%doc README
-%doc USAGE
-%config /etc/sysconfig/atm
-%config /etc/atmsigd.conf
-%config /etc/sysconfig/network-scripts/ifcfg-atm0
-%config /etc/sysconfig/network-scripts/ifup-atm
-%config /etc/hosts.atm
-/usr/sbin/tcpdump
-/usr/lib/libatm.a
-/usr/lib/libatmd.a
-/usr/lib/libarequipa.a
-/usr/include/atm.h
-/usr/include/atmd.h
-/usr/include/atmsap.h
-/usr/include/arequipa.h
-/usr/sbin/atmaddr
-/usr/sbin/atmtcp
-/usr/sbin/zntune
-/usr/bin/atmdiag
-/usr/bin/atmdump
-/usr/bin/sonetdiag
-/usr/man/man8/atmaddr.8
-/usr/man/man8/atmdiag.8
-/usr/man/man8/atmdump.8
-/usr/man/man8/atmtcp.8
-/usr/sbin/clip
-/usr/sbin/atmarp
-/usr/man/man8/clip.8
-/usr/man/man8/atmarp.8
-/usr/bin/aping
-/usr/bin/aread
-/usr/bin/awrite
-/usr/bin/br
-/usr/bin/bw
-/usr/bin/ttcp_atm
-/usr/bin/window
-/usr/sbin/delay
-/usr/sbin/aqtest
-/usr/sbin/ed
-/usr/sbin/encopy
-/usr/sbin/endump
-/usr/sbin/zndump
-/usr/sbin/znth
-/usr/sbin/atmsigd
-/usr/man/man4/atmsigd.conf.4
-/usr/man/man8/atmsigd.8
-/usr/sbin/atmarpd
-/usr/man/man8/atmarpd.8
-/usr/sbin/ilmid
-/usr/sbin/zeppelin
-/usr/man/man8/zeppelin.8
-/usr/sbin/les
-/usr/sbin/bus
-/usr/sbin/lecs
-/usr/man/man8/les.8
-/usr/man/man8/lecs.8
-/usr/man/man8/bus.8
-/usr/sbin/arequipad
-/usr/sbin/aqpvc
-/usr/man/man8/arequipad.8
-/usr/man/man8/aqpvc.8
-/usr/man/man7/qos.7
diff -ur --new-file old/atm/atm-0.30-1.spec new/atm/atm-0.30-1.spec
--- old/atm/atm-0.30-1.spec	Thu Jan  1 01:00:00 1970
+++ new/atm/atm-0.30-1.spec	Thu Apr 10 12:56:09 1997
@@ -0,0 +1,138 @@
+Summary:	ATM (Asynchronous Transfer Mode)
+Name:		atm
+Version:	0.30
+Release:	1
+Source:		atm-0.30.tar.gz
+Source:		lrcftp.epfl.ch:/pub/linux/atm/dist/atm-0.30.tar.gz
+Copyright:	distributable
+Group:		Networking/ATM
+ExclusiveArch:	i386
+ExclusiveOS:	Linux
+
+%description
+Programs, libraries, and configuration files required for using ATM
+on Linux. Note that you still need to patch your kernel.
+
+%package ans
+Summary:	ANS (ATM Name Server)
+Group:		Networking/ATM
+
+%description ans
+ANS is a version of BIND with extensions for ATM. This package contains
+the complete BIND distribution, including tools like nslookup and dig.
+
+%prep
+
+%setup -n atm
+
+%build
+make
+cd extra
+make tcpdump
+make ans
+
+%install
+INSTPREFIX=/usr make -e
+cd config/redhat-4.0
+make install
+cd ../../extra
+INSTPREFIX=/usr make -e install
+
+%files ans
+/usr/lib/libresolv.a
+/usr/include/arpa/inet.h
+/usr/include/arpa/nameser.h
+/usr/include/netdb.h
+/usr/include/resolv.h
+/usr/include/sys/bitypes.h
+/usr/lib/lib44bsd.a
+/usr/sbin/named
+/usr/sbin/named-xfer
+/usr/sbin/named.restart
+/usr/sbin/named.reload
+/usr/sbin/ndc
+/usr/bin/nslookup
+/usr/lib/nslookup.help
+/usr/bin/host
+/usr/bin/dig
+/usr/bin/dnsquery
+/usr/bin/addr
+/usr/man/man1/dig.1
+/usr/man/man1/host.1
+/usr/man/man1/dnsquery.1
+/usr/man/man8/named.8
+/usr/man/man8/named.reload.8
+/usr/man/man8/named.restart.8
+/usr/man/man8/ndc.8
+/usr/man/man8/named-xfer.8
+/usr/man/man8/nslookup.8
+/usr/man/man3/gethostbyname.3
+/usr/man/man3/resolver.3
+/usr/man/man3/getnetent.3
+/usr/man/man5/resolver.5
+/usr/man/man7/hostname.7
+/usr/man/man7/mailaddr.7
+
+%files
+%doc README
+%doc USAGE
+%config /etc/sysconfig/atm
+%config /etc/atmsigd.conf
+%config /etc/sysconfig/network-scripts/ifcfg-atm0
+%config /etc/sysconfig/network-scripts/ifup-atm
+%config /etc/hosts.atm
+/usr/sbin/tcpdump
+/usr/lib/libatm.a
+/usr/lib/libatmd.a
+/usr/lib/libarequipa.a
+/usr/include/atm.h
+/usr/include/atmd.h
+/usr/include/atmsap.h
+/usr/include/arequipa.h
+/usr/sbin/atmaddr
+/usr/sbin/atmtcp
+/usr/sbin/zntune
+/usr/bin/atmdiag
+/usr/bin/atmdump
+/usr/bin/sonetdiag
+/usr/man/man8/atmaddr.8
+/usr/man/man8/atmdiag.8
+/usr/man/man8/atmdump.8
+/usr/man/man8/atmtcp.8
+/usr/sbin/clip
+/usr/sbin/atmarp
+/usr/man/man8/clip.8
+/usr/man/man8/atmarp.8
+/usr/bin/aping
+/usr/bin/aread
+/usr/bin/awrite
+/usr/bin/br
+/usr/bin/bw
+/usr/bin/ttcp_atm
+/usr/bin/window
+/usr/sbin/delay
+/usr/sbin/aqtest
+/usr/sbin/ed
+/usr/sbin/encopy
+/usr/sbin/endump
+/usr/sbin/zndump
+/usr/sbin/znth
+/usr/sbin/atmsigd
+/usr/man/man4/atmsigd.conf.4
+/usr/man/man8/atmsigd.8
+/usr/sbin/atmarpd
+/usr/man/man8/atmarpd.8
+/usr/sbin/ilmid
+/usr/sbin/zeppelin
+/usr/man/man8/zeppelin.8
+/usr/sbin/les
+/usr/sbin/bus
+/usr/sbin/lecs
+/usr/man/man8/les.8
+/usr/man/man8/lecs.8
+/usr/man/man8/bus.8
+/usr/sbin/arequipad
+/usr/sbin/aqpvc
+/usr/man/man8/arequipad.8
+/usr/man/man8/aqpvc.8
+/usr/man/man7/qos.7
diff -ur --new-file old/atm/atm.patch new/atm/atm.patch
--- old/atm/atm.patch	Fri Apr  4 22:35:42 1997
+++ new/atm/atm.patch	Thu Apr 10 13:15:43 1997
@@ -432,8 +432,8 @@
 +	return devs;
 +}
 --- /dev/null	Mon Jul 18 01:46:18 1994
-+++ work/drivers/atm/atmtcp.c	Thu Feb  6 19:27:13 1997
-@@ -0,0 +1,317 @@
++++ work/drivers/atm/atmtcp.c	Mon Apr  7 14:11:46 1997
+@@ -0,0 +1,316 @@
 +/* drivers/atm/atmtcp.c - ATM over TCP "device" driver */
 + 
 +/* Written 1995,1996 by Werner Almesberger, EPFL LRC */
@@ -662,8 +662,7 @@
 +			if (walk->vpi == ntohs(hdr.vpi) && walk->vci ==
 +			    ntohs(hdr.vci)) break;
 +		if (walk) {
-+			skb_queue_tail(&walk->recvq,skb);
-+			wake_up(&walk->sleep);
++			vcc->push(vcc,skb);
 +			nonblock = 1;
 +			vcc->stats->rx++;
 +		}
@@ -752,8 +751,8 @@
 +
 +#endif
 --- /dev/null	Mon Jul 18 01:46:18 1994
-+++ work/drivers/atm/eni.c	Fri Apr  4 19:58:42 1997
-@@ -0,0 +1,1953 @@
++++ work/drivers/atm/eni.c	Thu Apr 10 13:05:46 1997
+@@ -0,0 +1,1958 @@
 +/* drivers/atm/eni.c - Efficient Networks ENI155P device driver */
 + 
 +/* Written 1995-1997 by Werner Almesberger, EPFL LRC */
@@ -823,7 +822,6 @@
 +#define DPRINTK(format,args...)
 +#endif
 +
-+
 +#ifndef CONFIG_ATM_ENI_DEBUG
 +
 +
@@ -1682,7 +1680,7 @@
 +
 +	DPRINTK(">do_tx\n");
 +	NULLCHECK(skb);
-+	EVENT("do_tx: skb=0x%p, %d bytes\n",skb,skb->len);
++	EVENT("do_tx: skb=0x%p, %d bytes\n",(unsigned long) skb,skb->len);
 +	vcc = skb->atm.vcc;
 +	NULLCHECK(vcc);
 +	eni_dev = ENI_DEV(vcc->dev);
@@ -1968,10 +1966,16 @@
 +	save_flags(flags);
 +	cli();
 +	while (skb_peek(&eni_vcc->tx->backlog) || eni_vcc->txing) {
-+		printk("%d TX left\n",eni_vcc->txing);
 +		DPRINTK("%d TX left\n",eni_vcc->txing);
 +		sleep_on(&eni_dev->tx_wait);
 +	}
++	/*
++	 * Looping a few times in here is probably far cheaper than keeping
++	 * track of TX completions all the time, so let's poll a bit ...
++	 */
++	while (eni_dev->reg[MID_TX_RDPTR(eni_vcc->tx->index)] !=
++	    eni_dev->reg[MID_TX_DESCRSTART(eni_vcc->tx->index)])
++		schedule();
 +	restore_flags(flags);
 +#if 0
 +	if (skb_peek(&eni_vcc->tx->backlog))
@@ -13968,8 +13972,8 @@
 +
 +#endif
 --- /dev/null	Mon Jul 18 01:46:18 1994
-+++ work/net/atm/atmarp.c	Fri Apr  4 19:36:36 1997
-@@ -0,0 +1,624 @@
++++ work/net/atm/atmarp.c	Thu Apr 10 12:13:13 1997
+@@ -0,0 +1,635 @@
 +/* atmarp.c - RFC1577 ATM ARP */
 +
 +/* Written 1995-1997 by Werner Almesberger, EPFL LRC */
@@ -14218,10 +14222,21 @@
 +
 +static void attach_entry(struct atm_vcc *vcc,struct atmarp_entry *entry)
 +{
++	struct sk_buff_head copy;
++	struct sk_buff *skb;
++	unsigned long flags;
++
++	save_flags(flags);
++	cli();
 +	AE(vcc) = entry;
 +	entry->old_push = vcc->push;
 +	vcc->push = atm_push_ip;
 +	entry->vcc = vcc;
++	skb_migrate(&vcc->recvq,&copy);
++	vcc->rx_inuse = 0;
++	restore_flags(flags);
++	/* re-process everything received between connection setup and MKIP */
++	while ((skb = skb_dequeue(&copy))) atm_push_ip(vcc,skb);
 +}
 +
 +
@@ -14651,11 +14666,11 @@
 +
 +#endif
 --- /dev/null	Mon Jul 18 01:46:18 1994
-+++ work/net/atm/ipcommon.h	Wed Apr  2 22:39:38 1997
-@@ -0,0 +1,73 @@
++++ work/net/atm/ipcommon.h	Thu Apr 10 09:16:09 1997
+@@ -0,0 +1,74 @@
 +/* net/atm/ipcommon.h - Common items for all ways of doing IP over ATM */
 +
-+/* Written 1996 by Werner Almesberger, EPFL LRC */
++/* Written 1996,1997 by Werner Almesberger, EPFL LRC */
 +
 +
 +#ifndef NET_ATM_IPCOMMON_H
@@ -14724,11 +14739,12 @@
 +    int (*hard_start_xmit)(struct sk_buff *skb,struct device *dev),
 +    unsigned short extra_flags);
 +int ipcom_pick_number(int number);
++void skb_migrate(struct sk_buff_head *from,struct sk_buff_head *to);
 +
 +#endif
 --- /dev/null	Mon Jul 18 01:46:18 1994
-+++ work/net/atm/ipcommon.c	Fri Apr  4 19:31:40 1997
-@@ -0,0 +1,213 @@
++++ work/net/atm/ipcommon.c	Thu Apr 10 10:39:03 1997
+@@ -0,0 +1,232 @@
 +/* net/atm/ipcommon.c - Common items for all ways of doing IP over ATM */
 +
 +/* Written 1996,1997 by Werner Almesberger, EPFL LRC */
@@ -14942,9 +14958,28 @@
 +        }
 +	return number;
 +}
++
++
++/*
++ * skb_migrate moves the list at FROM to TO, emptying FROM in the process.
++ * This function should live in skbuff.c or skbuff.h. Note that skb_migrate
++ * is not atomic, so turn off interrupts when using it.
++ */
++
++
++void skb_migrate(struct sk_buff_head *from,struct sk_buff_head *to)
++{
++	struct sk_buff *prev;
++
++	prev = from->prev;
++	from->next->prev = (struct sk_buff *) to;
++	prev->next = (struct sk_buff *) to;
++	*to = *from;
++	skb_queue_head_init(from);
++}
 --- /dev/null	Mon Jul 18 01:46:18 1994
-+++ work/net/atm/arequipa.c	Tue Mar 11 23:10:33 1997
-@@ -0,0 +1,445 @@
++++ work/net/atm/arequipa.c	Thu Apr 10 12:13:20 1997
+@@ -0,0 +1,452 @@
 +/* net/atm/arequipa.c - Application requested IP over ATM */
 + 
 +/* Written 1996,1997 by Jean-Michel Pittet and Werner Almesberger, EPFL LRC */
@@ -15143,6 +15178,8 @@
 +static void make_aq_vcc(struct socket *lower,int incoming)
 +{
 +	struct atm_vcc *vcc;
++	struct sk_buff_head copy;
++	struct sk_buff *skb;
 +	unsigned long flags;
 +
 +	save_flags(flags);
@@ -15161,8 +15198,13 @@
 +	    aq_list = vcc;
 +	}
 +	vcc->generation = aq_generation++;
++	skb_migrate(&vcc->recvq,&copy);
++	vcc->rx_inuse = 0;
 +	restore_flags(flags);
 +	lower->file->f_count++;
++	/* re-process everything received between connection setup and
++	   AREQUIPA_INCOMING*/
++	while ((skb = skb_dequeue(&copy))) atm_push_arequipa(vcc,skb);
 +}
 +
 +
diff -ur --new-file old/atm/doc/usage.tex new/atm/doc/usage.tex
--- old/atm/doc/usage.tex	Fri Apr  4 22:22:37 1997
+++ new/atm/doc/usage.tex	Thu Apr 10 12:10:44 1997
@@ -1,7 +1,7 @@
 %%def%:=
 
 %:\begin{verbatim}
-%:Usage instructions  -  ATM on Linux, release 0.29 (pre-alpha)
+%:Usage instructions  -  ATM on Linux, release 0.30 (pre-alpha)
 %:-------------------------------------------------------------
 %:
 %:\end{verbatim}
@@ -38,14 +38,14 @@
 
 \title{ATM on Linux \\
   User's guide \\
-  Release 0.29 (pre-alpha)}
+  Release 0.30 (pre-alpha)}
 \author{Werner Almesberger \\
   {\tt werner.almesberger@lrc.di.epfl.ch} \\
   \\
   Laboratoire de R\'eseaux de Communication (LRC) \\
   EPFL, CH-1015 Lausanne, Switzerland}
  
-\date{April 4, 1997}
+\date{April 10, 1997}
 
 \begin{document}
 \maketitle
@@ -81,7 +81,7 @@
 In order to install this package, you need
 \begin{itemize}
   \item the package itself
-    \url{ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.29.tar.gz}
+    \url{ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.30.tar.gz}
   \item the Linux kernel, version 2.0.25, e.g. from
 \url{ftp://ftp.cs.helsinki.fi/pub/Software/Linux/Kernel/v2.0/linux-2.0.25.tar.gz}
   \item Perl, version 4 or 5
@@ -98,7 +98,7 @@
 distribution:
 
 \begin{verbatim}
-tar xfz atm-0.29.tar.gz
+tar xfz atm-0.30.tar.gz
 \end{verbatim}
 
 and the kernel source:
diff -ur --new-file old/atm/doc/usage.txt new/atm/doc/usage.txt
--- old/atm/doc/usage.txt	Fri Apr  4 22:31:12 1997
+++ new/atm/doc/usage.txt	Thu Apr 10 12:53:55 1997
@@ -1,4 +1,4 @@
-Usage instructions  -  ATM on Linux, release 0.29 (pre-alpha)
+Usage instructions  -  ATM on Linux, release 0.30 (pre-alpha)
 -------------------------------------------------------------
 
 For updates of ATM on Linux, please check the Web page at  
@@ -17,7 +17,7 @@
 In order to install this package, you need 
 
   - the package itself  
-    ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.29.tar.gz  
+    ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.30.tar.gz  
   - the Linux kernel, version 2.0.25, e.g. from  
     ftp://ftp.cs.helsinki.fi/pub/Software/Linux/Kernel/v2.0/linux-2.0.25.tar.gz  
   - Perl, version 4 or 5 
@@ -33,7 +33,7 @@
 all the files listed above there. Then extract the ATM on Linux 
 distribution:
 
-tar xfz atm-0.29.tar.gz
+tar xfz atm-0.30.tar.gz
 
 and the kernel source:
 
diff -ur --new-file old/atm/saal/sscop.c new/atm/saal/sscop.c
--- old/atm/saal/sscop.c	Wed Apr  2 19:51:20 1997
+++ new/atm/saal/sscop.c	Mon Apr  7 16:03:36 1997
@@ -1001,22 +1001,26 @@
     /* K */
     curr = 0;
     i = dsc->vr_r;
-    while (NORM_RX(i) < NORM_RX(dsc->vr_h)) {
-	if (queue_lookup(&dsc->rx_buf,i)) {
-	    INC24(i);
-	    continue;
-	}
-	dsc->list[curr++] = htonl(i);
-	if (curr >= dsc->cf_max_stat) {
-	    send_pdu(dsc,SSCOP_STAT,dsc->list,curr*4);
-	    curr = 0;
+    if (i != dsc->vr_h) {
+	while (NORM_RX(i) < NORM_RX(dsc->vr_h)) {
+	    if (queue_lookup(&dsc->rx_buf,i)) {
+		INC24(i);
+		continue;
+	    }
+	    dsc->list[curr++] = htonl(i);
+	    if (curr >= dsc->cf_max_stat) {
+		send_pdu(dsc,SSCOP_STAT,dsc->list,curr*4);
+		curr = 0;
+		dsc->list[curr++] = htonl(i);
+	    }
+	    do INC24(i);
+	    while (i != dsc->vr_h && !queue_lookup(&dsc->rx_buf,i));
+	    if (i == dsc->vr_h) break; /* append is done right b4 send_pdu */
 	    dsc->list[curr++] = htonl(i);
+	    INC24(i); /* short-cut, since i < VR(H) && SD.N(S) == i in RB */
 	}
-	do INC24(i);
-	while (i != dsc->vr_h && !queue_lookup(&dsc->rx_buf,i));
 	dsc->list[curr++] = htonl(i);
     }
-    if (NORM_RX(i) > NORM_RX(dsc->vr_h)) dsc->list[curr++] = htonl(i);
     send_pdu(dsc,SSCOP_STAT,dsc->list,curr*4);
 }
 
diff -ur --new-file old/atm/sigd/io.c new/atm/sigd/io.c
--- old/atm/sigd/io.c	Wed Mar 26 17:40:13 1997
+++ new/atm/sigd/io.c	Wed Apr  9 13:24:24 1997
@@ -337,6 +337,7 @@
     memset(&qos,0,sizeof(qos));
     qos.aal = ATM_AAL5;
     qos.rxtp.traffic_class = qos.txtp.traffic_class = ATM_UBR;
+    qos.rxtp.max_sdu = qos.txtp.max_sdu = 1; /* smallest possible SDU size */
     if (setsockopt(s,SOL_ATM,SO_ATMQOS,&qos,sizeof(qos)) < 0)
 	diag(COMPONENT,DIAG_FATAL,"setsockopt SO_ATMQOS: %s",strerror(errno));
     memset(&addr,0,sizeof(addr));