diff -ur --new-file old/atm/.kernel new/atm/.kernel --- old/atm/.kernel Fri Jan 16 15:47:19 1998 +++ new/atm/.kernel Wed Mar 18 19:12:48 1998 @@ -1,2 +1,2 @@ # this file is used to control automated generation of differences -2.1.79 +2.1.90 diff -ur --new-file old/atm/CHANGES new/atm/CHANGES --- old/atm/CHANGES Fri Mar 13 22:04:04 1998 +++ new/atm/CHANGES Fri Mar 27 00:20:46 1998 @@ -1,3 +1,29 @@ +Version 0.34 to 0.35 (27-MAR-1998) +==================== + +Bug fixes +--------- + + - ilmid compared memcmp results with -1,1, which fails under optimization + (fixed by Damian Gilmurray) + - various fixes and cleanup in how CLIP interacts with the neighbour cache + (spotted by Alexey Kuznetsov) + - Rules.make complained about missing "optprocess" command on some occasions + +New features +------------ + + - upgraded to the 2.1.90 kernel + - added some components for ATM switch control (not properly integrated yet, + so they don't do anything useful at the moment; written by Roman Pletka) + +Other changes +------------- + + - eliminated various compiler warnings when compiling with glibc2 + - removed clip_hard_header (suggested by Alexey Kuznetsov) + + Version 0.33 to 0.34 (13-MAR-1998) ==================== diff -ur --new-file old/atm/README new/atm/README --- old/atm/README Thu Mar 12 18:29:54 1998 +++ new/atm/README Fri Mar 27 00:55:21 1998 @@ -1,4 +1,4 @@ -ATM on Linux, release 0.34 (alpha) by Werner Almesberger, EPFL ICA +ATM on Linux, release 0.35 (alpha) by Werner Almesberger, EPFL ICA ============================================== Werner.Almesberger@epfl.ch This is experimental software. There are known major bugs and certainly @@ -9,7 +9,7 @@ device drivers, source for demons, management and test tools, and some documentation. -The kernel patch is relative to the "standard" 2.1.79 kernel. +The kernel patch is relative to the "standard" 2.1.90 kernel. The following network devices are supported: ATM over TCP pseudo device for "dry runs" diff -ur --new-file old/atm/Rules.make new/atm/Rules.make --- old/atm/Rules.make Wed Mar 4 10:09:33 1998 +++ new/atm/Rules.make Thu Mar 26 23:07:08 1998 @@ -27,18 +27,23 @@ # # STANDARDS += -DCISCO +ifeq ($(TOPDIR),) +TOPDIR=.. +endif + CC=cc -CFLAGS_NOWARN=-g -DVERSION=\"`cat ../VERSION`\" $(INCLUDES) -I../lib +CFLAGS_NOWARN=-g -DVERSION=\"`cat $(TOPDIR)/VERSION`\" \ + $(INCLUDES) -I$(TOPDIR)/lib CFLAGS_NOOPT=$(CFLAGS_NOWARN) -Wall -Wshadow -Wpointer-arith -Wcast-align \ -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes \ #-Wmissing-declarations (gcc 2.6.x only) #-Wconversion (breaks inline) -CFLAGS_OPT=#-O2 +CFLAGS_OPT=-O2 CFLAGS=$(CFLAGS_NOOPT) $(CFLAGS_OPT) $(CFLAGS_PRIVATE) CFLAGS_LEX=$(CFLAGS_NOWARN) $(CFLAGS_OPT) CFLAGS_YACC=$(CFLAGS_NOWARN) $(CFLAGS_OPT) -DYY_USE_CONST LDFLAGS= -LDLIBS=-L../lib -latm -larequipa -LIBDEPS += ../lib/libatm.a ../lib/libarequipa.a +LDLIBS=-L$(TOPDIR)/lib -latm -larequipa +LIBDEPS += $(TOPDIR)/lib/libatm.a $(TOPDIR)/lib/libarequipa.a YACC=bison -y -d #-v INSTROOT= INSTPREFIX=$(INSTROOT)/usr/local @@ -114,15 +119,17 @@ @process() { if [ ! -z "$$3" ]; then dir=$$2; shift 2; \ echo "cd $$dir; rm -f $$*"; \ cd $$dir; rm -f $$*; fi; }; \ + optprocess() { :; }; \ $(PROCLIST) filenames: @process() { if [ ! -z "$$3" ]; then dir=$$2; shift 2; \ for n in $$*; do echo $$dir/$$n; done; fi; }; \ + optprocess() { process $$*; }; \ $(PROCLIST) depend: - $(CPP) -M *.c $(INCLUDES) -I../lib >.tmpdepend + $(CPP) -M *.c $(INCLUDES) -I$(TOPDIR)/lib >.tmpdepend mv .tmpdepend .depend clean: @@ -138,7 +145,7 @@ $(CC) -c $(CFLAGS_YACC) y.tab.c ifneq ($(NOLIBATMDEP),yes) -$(PGMS) dummy: ../lib/libatm.a +$(PGMS) dummy: $(TOPDIR)/lib/libatm.a endif ifeq (.depend,$(wildcard .depend)) diff -ur --new-file old/atm/USAGE new/atm/USAGE --- old/atm/USAGE Fri Mar 13 22:07:11 1998 +++ new/atm/USAGE Fri Mar 27 01:07:35 1998 @@ -1,4 +1,4 @@ -Usage instructions - ATM on Linux, release 0.34 (alpha) +Usage instructions - ATM on Linux, release 0.35 (alpha) --------------------------------------------------------- For updates of ATM on Linux, please check the Web page at @@ -17,9 +17,9 @@ In order to install this package, you need - the package itself - ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.34.tar.gz - - the Linux kernel, version 2.1.79, e.g. from - ftp://ftp.kernel.org/pub/linux/kernel/v2.1/linux-2.1.79.tar.gz + ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.35.tar.gz + - the Linux kernel, version 2.1.90, e.g. from + ftp://ftp.kernel.org/pub/linux/kernel/v2.1/linux-2.1.90.tar.gz - Perl, version 4 or 5 - if you want memory debugging: MPR version 1.6, e.g. from ftp://sunsite.unc.edu/pub/Linux/devel/lang/c/mpr-1.6.tar.gz @@ -33,11 +33,11 @@ all the files listed above there. Then extract the ATM on Linux distribution: -tar xfz atm-0.34.tar.gz +tar xfz atm-0.35.tar.gz and the kernel source: -tar xfz linux-2.1.79.tar.gz +tar xfz linux-2.1.90.tar.gz Finally, you can extract the ATM-related patches: diff -ur --new-file old/atm/VERSION new/atm/VERSION --- old/atm/VERSION Fri Mar 6 21:34:28 1998 +++ new/atm/VERSION Fri Mar 27 00:27:37 1998 @@ -1 +1 @@ -0.34 +0.35 diff -ur --new-file old/atm/atm.patch new/atm/atm.patch --- old/atm/atm.patch Fri Mar 13 22:27:46 1998 +++ new/atm/atm.patch Fri Mar 27 01:10:08 1998 @@ -1,6 +1,15 @@ ---- ref/Makefile Mon Jan 12 23:47:55 1998 -+++ work/Makefile Fri Mar 13 23:28:28 1998 -@@ -129,6 +129,10 @@ +--- ref/Makefile Fri Mar 27 02:39:46 1998 ++++ work/Makefile Thu Mar 19 15:06:14 1998 +@@ -85,7 +85,7 @@ + # standard CFLAGS + # + +-CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer ++CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -g + + ifdef CONFIG_CPP + CFLAGS := $(CFLAGS) -x c++ +@@ -121,6 +121,10 @@ DRIVERS := $(DRIVERS) drivers/net/net.a @@ -11,7 +20,7 @@ ifeq ($(CONFIG_SCSI),y) DRIVERS := $(DRIVERS) drivers/scsi/scsi.a endif -@@ -317,6 +321,7 @@ +@@ -318,6 +322,7 @@ if [ -f NET_MODULES ]; then inst_mod NET_MODULES net; fi; \ if [ -f IPV4_MODULES ]; then inst_mod IPV4_MODULES ipv4; fi; \ if [ -f IPV6_MODULES ]; then inst_mod IPV6_MODULES ipv6; fi; \ @@ -19,9 +28,9 @@ if [ -f SCSI_MODULES ]; then inst_mod SCSI_MODULES scsi; fi; \ if [ -f FS_MODULES ]; then inst_mod FS_MODULES fs; fi; \ if [ -f NLS_MODULES ]; then inst_mod NLS_MODULES fs; fi; \ ---- ref/Documentation/Configure.help Mon Jan 12 23:46:16 1998 -+++ work/Documentation/Configure.help Thu Jan 15 22:49:10 1998 -@@ -2191,6 +2191,79 @@ +--- ref/Documentation/Configure.help Fri Mar 27 02:39:46 1998 ++++ work/Documentation/Configure.help Wed Mar 18 21:01:26 1998 +@@ -2237,6 +2237,79 @@ This is a backward compatibility option, choose Y for now. This option will be removed soon. @@ -102,15 +111,15 @@ CONFIG_SCSI If you want to use a SCSI harddisk, SCSI tapedrive, SCSI CDROM or --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/Documentation/atm.txt Thu Jan 15 22:49:10 1998 ++++ work/Documentation/atm.txt Wed Mar 18 21:01:26 1998 @@ -0,0 +1,4 @@ +In order to use anything but the most primitive functions of ATM, +several user-mode programs are required to assist the kernel. These +programs and related material can be found via the ATM on Linux Web +page at http://lrcwww.epfl.ch/linux-atm/ ---- ref/arch/i386/config.in Mon Jan 5 09:06:25 1998 -+++ work/arch/i386/config.in Thu Jan 15 22:49:10 1998 -@@ -84,6 +84,9 @@ +--- ref/arch/i386/config.in Fri Mar 27 02:39:46 1998 ++++ work/arch/i386/config.in Wed Mar 18 21:01:26 1998 +@@ -90,6 +90,9 @@ bool 'Network device support' CONFIG_NETDEVICES if [ "$CONFIG_NETDEVICES" = "y" ]; then source drivers/net/Config.in @@ -121,7 +130,7 @@ endmenu fi --- ref/drivers/Makefile Thu Dec 4 00:17:30 1997 -+++ work/drivers/Makefile Thu Jan 15 22:49:10 1998 ++++ work/drivers/Makefile Wed Mar 18 21:01:26 1998 @@ -9,7 +9,7 @@ SUB_DIRS := block char net misc #streams @@ -144,7 +153,7 @@ ifeq ($(CONFIG_AP1000),y) --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/Config.in Thu Jan 15 22:49:10 1998 ++++ work/drivers/atm/Config.in Wed Mar 18 21:01:27 1998 @@ -0,0 +1,23 @@ +# +# ATM device configuration @@ -170,7 +179,7 @@ +# tristate 'IDT 77201 (NICStAR)' CONFIG_ATM_NICSTAR y +fi --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/Makefile Thu Jan 15 22:49:10 1998 ++++ work/drivers/atm/Makefile Wed Mar 18 21:01:27 1998 @@ -0,0 +1,57 @@ +# File: drivers/atm/Makefile +# @@ -230,7 +239,7 @@ + +include $(TOPDIR)/Rules.make --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/atmdev_init.c Thu Jan 15 22:49:10 1998 ++++ work/drivers/atm/atmdev_init.c Wed Mar 18 21:01:27 1998 @@ -0,0 +1,48 @@ +/* drivers/atm/atmdev_init.c - ATM device driver initialization */ + @@ -281,7 +290,7 @@ + return devs; +} --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/atmtcp.c Thu Feb 12 17:46:28 1998 ++++ work/drivers/atm/atmtcp.c Wed Mar 18 21:09:25 1998 @@ -0,0 +1,226 @@ +/* drivers/atm/atmtcp.c - ATM over TCP "device" driver */ + @@ -357,7 +366,7 @@ + out_vcc = vcc->dev->dev_data; + if (!out_vcc) { + if (vcc->pop) vcc->pop(vcc,skb); -+ else dev_kfree_skb(skb,FREE_WRITE); ++ else dev_kfree_skb(skb); + vcc->stats->tx_err++; + return -ENOLINK; + } @@ -370,7 +379,7 @@ + } + if (!new_skb) { + if (vcc->pop) vcc->pop(vcc,skb); -+ else dev_kfree_skb(skb,FREE_WRITE); ++ else dev_kfree_skb(skb); + vcc->stats->tx_err++; + return -ENOBUFS; + } @@ -380,7 +389,7 @@ + hdr->length = htonl(skb->len); + memcpy(skb_put(new_skb,skb->len),skb->data,skb->len); + if (vcc->pop) vcc->pop(vcc,skb); -+ else dev_kfree_skb(skb,FREE_WRITE); ++ else dev_kfree_skb(skb); + out_vcc->push(out_vcc,new_skb); + return 0; +} @@ -411,7 +420,7 @@ + break; + if (!out_vcc) { + if (vcc->pop) vcc->pop(vcc,skb); -+ else dev_kfree_skb(skb,FREE_WRITE); ++ else dev_kfree_skb(skb); + vcc->stats->tx_err++; + return 0; + } @@ -423,12 +432,12 @@ + } + if (!new_skb) { + if (vcc->pop) vcc->pop(vcc,skb); -+ else dev_kfree_skb(skb,FREE_WRITE); ++ else dev_kfree_skb(skb); + return -ENOBUFS; + } + memcpy(skb_put(new_skb,skb->len),skb->data,skb->len); + if (vcc->pop) vcc->pop(vcc,skb); -+ else dev_kfree_skb(skb,FREE_WRITE); ++ else dev_kfree_skb(skb); + out_vcc->push(out_vcc,new_skb); + return 0; +} @@ -510,7 +519,7 @@ + return dev->number; +} --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/eni.c Mon Mar 9 22:29:00 1998 ++++ work/drivers/atm/eni.c Wed Mar 18 21:08:35 1998 @@ -0,0 +1,2148 @@ +/* drivers/atm/eni.c - Efficient Networks ENI155P device driver */ + @@ -925,7 +934,7 @@ + } + if (!j || j > 2*RX_DMA_BUF) { + printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n"); -+ if (skb) kfree_skb(skb,FREE_READ); ++ if (skb) kfree_skb(skb); + return -1; + } + dma[j-2] |= MID_DMA_END; @@ -939,7 +948,7 @@ + if (!NEPMOK(dma_wr,j+j+1,dma_rd,NR_DMA_RX)) { /* @@@ +1 is ugly */ + printk(KERN_WARNING DEV_LABEL "(itf %d): RX DMA full\n", + vcc->dev->number); -+ if (skb) kfree_skb(skb,FREE_READ); ++ if (skb) kfree_skb(skb); + return -1; + } + for (i = 0; i < j; i++) { @@ -1237,7 +1246,7 @@ + } + eni_vcc->rxing--; + eni_vcc->rx_pos = skb->atm.pos & (eni_vcc->words-1); -+ if (!skb->len) kfree_skb(skb,FREE_READ); ++ if (!skb->len) kfree_skb(skb); + else { + EVENT("pushing (len=%ld)\n",skb->len,0); + if (vcc->qos.aal == ATM_AAL0) @@ -1637,7 +1646,7 @@ + } + ENI_VCC(vcc)->txing -= skb->atm.size; + if (vcc->pop) vcc->pop(vcc,skb); -+ else dev_kfree_skb(skb,FREE_WRITE); ++ else dev_kfree_skb(skb); + vcc->stats->tx++; + wake_up(&eni_dev->tx_wait); +dma_complete++; @@ -2460,17 +2469,17 @@ + + DPRINTK(">eni_send\n"); + if (!ENI_VCC(vcc)->tx) { -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + return -EINVAL; + } + if (!skb) { + printk(KERN_CRIT "!skb in eni_send ?\n"); -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + return -EINVAL; + } + if (vcc->qos.aal == ATM_AAL0) { + if (skb->len != ATM_CELL_SIZE-1) { -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + return -EINVAL; + } + *(unsigned long *) skb->data = htonl(*(unsigned long *) @@ -2661,7 +2670,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/eni.h Fri Mar 13 19:59:47 1998 ++++ work/drivers/atm/eni.h Thu Mar 19 15:09:41 1998 @@ -0,0 +1,105 @@ +/* drivers/atm/eni.h - Efficient Networks ENI155P device driver declarations */ + @@ -2769,7 +2778,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/midway.h Thu Jan 15 22:49:10 1998 ++++ work/drivers/atm/midway.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,265 @@ +/* drivers/atm/midway.h - Efficient Networks Midway (SAR) description */ + @@ -3037,7 +3046,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/suni.c Fri Mar 6 14:38:40 1998 ++++ work/drivers/atm/suni.c Wed Mar 18 21:01:27 1998 @@ -0,0 +1,301 @@ +/* drivers/atm/suni.c - PMC SUNI (PHY) driver */ + @@ -3341,7 +3350,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/suni.h Fri Mar 13 19:59:44 1998 ++++ work/drivers/atm/suni.h Thu Mar 19 15:09:39 1998 @@ -0,0 +1,219 @@ +/* drivers/atm/suni.h - PMC SUNI (PHY) declarations */ + @@ -3563,7 +3572,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/tonga.h Thu Jan 15 22:49:10 1998 ++++ work/drivers/atm/tonga.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,20 @@ +/* drivers/atm/tonga.h - Efficient Networks Tonga (PCI bridge) declarations */ + @@ -3586,7 +3595,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/uPD98401.h Thu Jan 15 22:49:10 1998 ++++ work/drivers/atm/uPD98401.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,292 @@ +/* drivers/atm/uPD98401.h - NEC uPD98401 (SAR) declarations */ + @@ -3881,7 +3890,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/uPD98402.c Thu Feb 12 17:44:52 1998 ++++ work/drivers/atm/uPD98402.c Wed Mar 18 21:01:27 1998 @@ -0,0 +1,224 @@ +/* drivers/atm/uPD98402.c - NEC uPD98402 (PHY) declarations */ + @@ -4108,7 +4117,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/uPD98402.h Thu Jan 15 22:49:10 1998 ++++ work/drivers/atm/uPD98402.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,106 @@ +/* drivers/atm/uPD98402.h - NEC uPD98402 (PHY) declarations */ + @@ -4217,8 +4226,8 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/zatm.c Fri Mar 6 21:32:07 1998 -@@ -0,0 +1,1871 @@ ++++ work/drivers/atm/zatm.c Wed Mar 18 21:08:59 1998 +@@ -0,0 +1,1870 @@ +/* drivers/atm/zatm.c - ZeitNet ZN122x device driver */ + +/* Written 1995-1998 by Werner Almesberger, EPFL LRC/ICA */ @@ -4474,8 +4483,7 @@ +{ + struct sk_buff *skb; + -+ while ((skb = skb_dequeue(&ZATM_DEV(dev)->pool[pool]))) -+ kfree_skb(skb,FREE_READ); ++ while ((skb = skb_dequeue(&ZATM_DEV(dev)->pool[pool]))) kfree_skb(skb); +} + + @@ -4856,12 +4864,12 @@ + event_dump(); + } + if (!size) { -+ kfree_skb(skb,FREE_READ); ++ kfree_skb(skb); + if (vcc) vcc->stats->rx_err++; + continue; + } + if (!atm_charge(vcc,skb->truesize)) { -+ kfree_skb(skb,FREE_READ); ++ kfree_skb(skb); + continue; + } + skb->len = size; @@ -5073,7 +5081,7 @@ + dsc = (u32 *) kmalloc(uPD98401_TXPD_SIZE*2+ + uPD98401_TXBD_SIZE*skb->atm.iovcnt,GFP_ATOMIC); + if (!dsc) { -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + return -EAGAIN; + } + /* @@@ should check alignment */ @@ -5123,7 +5131,7 @@ + *(u32 *) skb->atm.pos = 0; /* mark as invalid */ + zatm_vcc->txing--; + if (vcc->pop) vcc->pop(vcc,skb); -+ else dev_kfree_skb(skb,FREE_WRITE); ++ else dev_kfree_skb(skb); + while ((skb = skb_dequeue(&zatm_vcc->backlog))) + if (do_tx(skb) == RING_BUSY) { + skb_queue_head(&zatm_vcc->backlog,skb); @@ -5967,12 +5975,12 @@ + + EVENT(">zatm_send 0x%lx\n",(unsigned long) skb,0); + if (!ZATM_VCC(vcc)->tx_chan || !(vcc->flags & ATM_VF_READY)) { -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + return -EINVAL; + } + if (!skb) { + printk(KERN_CRIT "!skb in zatm_send ?\n"); -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + return -EINVAL; + } + skb->atm.vcc = vcc; @@ -6091,7 +6099,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/zatm.h Fri Mar 13 19:59:50 1998 ++++ work/drivers/atm/zatm.h Thu Mar 19 15:09:46 1998 @@ -0,0 +1,129 @@ +/* drivers/atm/zatm.h - ZeitNet ZN122x device driver declarations */ + @@ -6223,7 +6231,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/drivers/atm/zeprom.h Thu Jan 15 22:49:10 1998 ++++ work/drivers/atm/zeprom.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,34 @@ +/* drivers/atm/zeprom.h - ZeitNet ZN122x EEPROM (NM93C46) declarations */ + @@ -6259,8 +6267,8 @@ +/* No other commands are needed. */ + +#endif ---- ref/drivers/block/genhd.c Sun Jan 4 19:40:15 1998 -+++ work/drivers/block/genhd.c Thu Jan 15 22:49:10 1998 +--- ref/drivers/block/genhd.c Fri Feb 6 19:29:22 1998 ++++ work/drivers/block/genhd.c Wed Mar 18 21:01:27 1998 @@ -58,6 +58,7 @@ extern int blk_dev_init(void); extern int scsi_dev_init(void); @@ -6269,7 +6277,7 @@ /* * disk_name() is used by genhd.c and md.c. -@@ -1106,6 +1107,9 @@ +@@ -1111,6 +1112,9 @@ #endif #ifdef CONFIG_INET net_dev_init(); @@ -6280,7 +6288,7 @@ #ifdef CONFIG_VT console_map_init(); --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/arequipa.h Fri Mar 6 12:20:36 1998 ++++ work/include/linux/arequipa.h Thu Mar 19 15:13:57 1998 @@ -0,0 +1,63 @@ +/* arequipa.h - Arequipa interface definitions */ + @@ -6346,7 +6354,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/atm.h Fri Mar 6 12:20:09 1998 ++++ work/include/linux/atm.h Thu Mar 19 15:09:39 1998 @@ -0,0 +1,254 @@ +/* atm.h - general ATM declarations */ + @@ -6361,7 +6369,7 @@ + * documentation. Do not change them. + */ + -+#include ++#include +#include +#include + @@ -6558,7 +6566,7 @@ + char pub[ATM_E164_LEN+1]; /* public address (E.164) */ + /* unused addresses must be bzero'ed */ + char lij_type; /* role in LIJ call; one of ATM_LIJ* */ -+ __u32 lij_id; /* LIJ call identifier */ ++ uint32_t lij_id; /* LIJ call identifier */ + } sas_addr; /* SVC address */ +}; + @@ -6603,7 +6611,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/atm_eni.h Thu Jan 15 22:49:10 1998 ++++ work/include/linux/atm_eni.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,15 @@ +/* atm_eni.h - Driver-specific declarations of the ENI driver (for use by + driver-specific utilities) */ @@ -6621,7 +6629,24 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/atm_tcp.h Thu Jan 15 22:49:10 1998 ++++ work/include/linux/atm_stdint.h Wed Mar 18 23:23:45 1998 +@@ -0,0 +1,14 @@ ++/* atm_stdint.h - work-around until kernel and glibc are in sync again */ ++ ++/* Hacked 1998 by Werner Almesberger, EPFL ICA */ ++ ++ ++#if !defined(_LINUX_ATM_STDINT_H) && !defined(_STDINT_H) ++#define _LINUX_ATM_STDINT_H ++#define _STDINT_H ++ ++typedef unsigned char uint8_t; ++typedef unsigned short uint16_t; ++typedef unsigned int uint32_t; ++ ++#endif +--- /dev/null Tue Jan 1 05:00:00 1980 ++++ work/include/linux/atm_tcp.h Thu Mar 19 15:09:50 1998 @@ -0,0 +1,30 @@ +/* atm_tcp.h - Driver-specific declarations of the ATMTCP driver (for use by + driver-specific utilities) */ @@ -6632,7 +6657,7 @@ +#ifndef LINUX_ATM_TCP_H +#define LINUX_ATM_TCP_H + -+#include ++#include + + +/* @@ -6640,9 +6665,9 @@ + */ + +struct atmtcp_hdr { -+ __u16 vpi; -+ __u16 vci; -+ __u32 length; /* ... of data part */ ++ uint16_t vpi; ++ uint16_t vci; ++ uint32_t length; /* ... of data part */ +}; + + @@ -6654,7 +6679,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/atm_zatm.h Thu Jan 15 22:49:10 1998 ++++ work/include/linux/atm_zatm.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,54 @@ +/* atm_zatm.h - Driver-specific declarations of the ZATM driver (for use by + driver-specific utilities) */ @@ -6711,7 +6736,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/atmarp.h Fri Mar 6 12:20:30 1998 ++++ work/include/linux/atmarp.h Thu Mar 19 15:13:14 1998 @@ -0,0 +1,104 @@ +/* atmarp.h - ATM ARP protocol and kernel-demon interface definitions */ + @@ -6818,7 +6843,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/atmclip.h Thu Jan 15 22:49:10 1998 ++++ work/include/linux/atmclip.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,21 @@ +/* atmclip.h - Classical IP over ATM */ + @@ -6842,7 +6867,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/atmdev.h Fri Mar 13 19:58:59 1998 ++++ work/include/linux/atmdev.h Thu Mar 19 15:09:39 1998 @@ -0,0 +1,304 @@ +/* atmdev.h - ATM device driver declarations */ + @@ -7149,7 +7174,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/atmioc.h Thu Jan 15 22:49:10 1998 ++++ work/include/linux/atmioc.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,38 @@ +/* atmioc.h - ranges for ATM-related ioctl numbers */ + @@ -7190,7 +7215,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/atmlec.h Fri Mar 6 12:20:36 1998 ++++ work/include/linux/atmlec.h Thu Mar 19 15:13:57 1998 @@ -0,0 +1,65 @@ +/* + * @@ -7258,7 +7283,7 @@ +}; +#endif /* _ATMLEC_H_ */ --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/atmsap.h Thu Mar 5 16:37:51 1998 ++++ work/include/linux/atmsap.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,161 @@ +/* atmsap.h - ATM Service Access Point addressing definitions */ + @@ -7422,7 +7447,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/atmsvc.h Fri Mar 6 12:20:35 1998 ++++ work/include/linux/atmsvc.h Thu Mar 19 15:13:57 1998 @@ -0,0 +1,52 @@ +/* atmsvc.h - ATM signaling kernel-demon interface definitions */ + @@ -7476,8 +7501,8 @@ + (tp).max_pcr : (tp).min_pcr ? (tp).min_pcr : ATM_MAX_PCR) + +#endif ---- ref/include/linux/if_arp.h Tue Jan 13 01:44:26 1998 -+++ work/include/linux/if_arp.h Thu Jan 15 23:34:05 1998 +--- ref/include/linux/if_arp.h Sat Mar 7 06:03:10 1998 ++++ work/include/linux/if_arp.h Wed Mar 18 22:15:50 1998 @@ -35,6 +35,7 @@ #define ARPHRD_ARCNET 7 /* ARCnet */ #define ARPHRD_APPLETLK 8 /* APPLEtalk */ @@ -7496,9 +7521,9 @@ /* ARP ioctl request. */ ---- ref/include/linux/skbuff.h Tue Jan 13 01:43:19 1998 -+++ work/include/linux/skbuff.h Thu Jan 15 23:32:59 1998 -@@ -115,6 +115,24 @@ +--- ref/include/linux/skbuff.h Sat Mar 7 06:02:21 1998 ++++ work/include/linux/skbuff.h Wed Mar 18 22:14:41 1998 +@@ -117,6 +117,24 @@ __u32 shapestamp; /* Stamp for shaper */ __u16 shapepend; /* Pending */ #endif @@ -7524,7 +7549,7 @@ /* These are just the default values. This is run time configurable. --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/sonet.h Thu Jan 15 22:49:10 1998 ++++ work/include/linux/sonet.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,52 @@ +/* sonet.h - SONET/SHD physical layer control */ + @@ -7578,17 +7603,9 @@ +#define SONET_FRSENSE_SIZE 6 /* C1[3],H1[3] (0xff for unknown) */ + +#endif ---- ref/include/net/arp.h Tue Jan 13 01:46:43 1998 -+++ work/include/net/arp.h Thu Feb 12 11:16:08 1998 -@@ -18,4 +18,5 @@ - extern int arp_bind_neighbour(struct dst_entry *dst); - extern int arp_mc_map(u32 addr, u8 *haddr, struct device *dev, int dir); - extern void arp_ifdown(struct device *dev); -+ - #endif /* _ARP_H */ --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/net/atmclip.h Fri Mar 13 20:00:02 1998 -@@ -0,0 +1,66 @@ ++++ work/include/net/atmclip.h Thu Mar 26 21:59:40 1998 +@@ -0,0 +1,64 @@ +/* net/atm/atmarp.h - RFC1577 ATM ARP */ + +/* Written 1995-1998 by Werner Almesberger, EPFL LRC/ICA */ @@ -7628,7 +7645,6 @@ + pending */ + unsigned long expires; /* entry expiration time */ + struct neighbour *neigh; /* neighbour back-pointer */ -+ struct atmarp_entry *next; /* ugly linked list ... */ +}; + + @@ -7636,7 +7652,6 @@ + + +struct clip_priv { -+ struct atmarp_entry *table; /* ARP table */ + char name[8]; /* interface name */ + int number; /* for convenience ... */ + struct enet_statistics stats; @@ -7655,9 +7670,9 @@ +int clip_arp_ioctl(struct device *dev,unsigned int cmd,void *arg); + +#endif ---- ref/net/Config.in Tue Jan 13 00:28:48 1998 -+++ work/net/Config.in Sat Mar 7 00:16:04 1998 -@@ -22,6 +22,20 @@ +--- ref/net/Config.in Thu Feb 19 23:46:15 1998 ++++ work/net/Config.in Wed Mar 18 21:01:27 1998 +@@ -23,6 +23,20 @@ fi fi fi @@ -7679,7 +7694,7 @@ comment ' ' tristate 'The IPX protocol' CONFIG_IPX --- ref/net/Makefile Sun Nov 30 23:00:39 1997 -+++ work/net/Makefile Mon Feb 16 17:57:36 1998 ++++ work/net/Makefile Wed Mar 18 21:01:27 1998 @@ -9,7 +9,8 @@ MOD_SUB_DIRS := ipv4 @@ -7705,7 +7720,7 @@ ifeq ($(CONFIG_DECNET),y) --- ref/net/protocols.c Sun Nov 30 23:00:40 1997 -+++ work/net/protocols.c Thu Jan 15 22:49:10 1998 ++++ work/net/protocols.c Wed Mar 18 21:01:27 1998 @@ -79,6 +79,10 @@ extern void rif_init(struct net_proto *); #endif @@ -7729,9 +7744,9 @@ #ifdef NEED_LLC { "802.2LLC", llc_init }, /* 802.2 LLC */ ---- ref/net/ipv4/arp.c Tue Jan 13 00:28:25 1998 -+++ work/net/ipv4/arp.c Tue Jan 27 18:06:25 1998 -@@ -114,6 +114,9 @@ +--- ref/net/ipv4/arp.c Fri Mar 27 02:39:54 1998 ++++ work/net/ipv4/arp.c Wed Mar 18 21:01:27 1998 +@@ -115,6 +115,9 @@ #include #endif #endif @@ -7741,7 +7756,7 @@ #include #include -@@ -400,7 +403,11 @@ +@@ -405,7 +408,11 @@ if (dev == NULL) return 0; if (dst->neighbour == NULL) @@ -7754,9 +7769,9 @@ return (dst->neighbour != NULL); } -@@ -857,6 +864,24 @@ - if ((r.arp_flags & ATF_COM) && r.arp_ha.sa_family != dev->type) - goto out; +@@ -877,6 +884,24 @@ + default: + return -EINVAL; } + +#ifdef CONFIG_ATM_CLIP @@ -7777,10 +7792,10 @@ + } +#endif - switch(cmd) { - case SIOCDARP: + if (r.arp_pa.sa_family != AF_INET) + return -EPFNOSUPPORT; --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/Makefile Fri Mar 6 13:25:11 1998 ++++ work/net/atm/Makefile Wed Mar 18 21:01:27 1998 @@ -0,0 +1,52 @@ +# +# Makefile for the ATM Protocol Families. @@ -7835,7 +7850,7 @@ + +include $(TOPDIR)/Rules.make --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/addr.c Thu Feb 12 18:07:56 1998 ++++ work/net/atm/addr.c Wed Mar 18 21:01:27 1998 @@ -0,0 +1,159 @@ +/* net/atm/addr.c - Local ATM address registry */ + @@ -7997,7 +8012,7 @@ + return total; +} --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/addr.h Fri Mar 13 20:00:07 1998 ++++ work/net/atm/addr.h Thu Mar 19 15:13:57 1998 @@ -0,0 +1,18 @@ +/* net/atm/addr.h - Local ATM address registry */ + @@ -8018,8 +8033,8 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/clip.c Fri Mar 13 23:29:45 1998 -@@ -0,0 +1,728 @@ ++++ work/net/atm/clip.c Fri Mar 27 02:00:54 1998 +@@ -0,0 +1,710 @@ +/* clip.c - RFC1577 Classical IP over ATM */ + +/* Written 1995-1998 by Werner Almesberger, EPFL LRC/ICA */ @@ -8096,7 +8111,7 @@ + } + *ctrl->reply = ctrl->arg; + wake_up(&atmarpd_sleep); -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + return 0; +} + @@ -8162,7 +8177,7 @@ + if (entry->vccs) return; + entry->expires = jiffies-1; + /* force resolution or expiration */ -+ error = neigh_update(entry->neigh,NULL,NUD_STALE,0,0); ++ error = neigh_update(entry->neigh,NULL,NUD_NONE,0,0); + if (error) + printk(KERN_CRIT "unlink_clip_vcc: " + "neigh_update failed with %d\n",error); @@ -8175,20 +8190,19 @@ + +static void idle_timer_check(unsigned long dummy) +{ -+ struct device *itf; -+ struct atmarp_entry **entry; -+ unsigned long flags; ++ int i; + + /*DPRINTK("idle_timer_check\n");*/ -+ save_flags(flags); -+ cli(); -+ for (itf = clip_devs; itf; itf = PRIV(itf)->next) { -+ entry = &PRIV(itf)->table; -+ while (*entry) { ++ if (atomic_read(&clip_tbl.lock)) return; ++ for (i = 0; i <= NEIGH_HASHMASK; i++) { ++ struct neighbour **np; ++ ++ for (np = &clip_tbl.hash_buckets[i]; *np;) { ++ struct neighbour *n = *np; ++ struct atmarp_entry *entry = NEIGH2ENTRY(n); + struct clip_vcc *clip_vcc; -+ struct neighbour *neigh; + -+ for (clip_vcc = (*entry)->vccs; clip_vcc; ++ for (clip_vcc = entry->vccs; clip_vcc; + clip_vcc = clip_vcc->next) { + if (clip_vcc->vcc->family == PF_ATMPVC) + continue; @@ -8196,37 +8210,36 @@ + jiffies) { + DPRINTK("releasing vcc %p->%p of " + "entry %p\n",clip_vcc,clip_vcc->vcc, -+ *entry); ++ entry); + atm_async_release_vcc(clip_vcc->vcc, + -ETIMEDOUT); + } + } -+ if ((*entry)->vccs || (*entry)->expires > jiffies) { -+ entry = &(*entry)->next; ++ if (entry->vccs || entry->expires > jiffies) { ++ np = &n->next; + continue; + } -+ if (atomic_read(&(*entry)->neigh->refcnt)) { ++ if (atomic_read(&n->refcnt)) { + struct sk_buff *skb; + + DPRINTK("destruction postponed with ref %d\n", -+ atomic_read(&(*entry)->neigh->refcnt)); -+ while ((skb = skb_dequeue( -+ &(*entry)->neigh->arp_queue)) != NULL) -+ dev_kfree_skb(skb,FREE_WRITE); -+ entry = &(*entry)->next; ++ atomic_read(&n->refcnt)); ++ while ((skb = skb_dequeue(&n->arp_queue)) != ++ NULL) ++ dev_kfree_skb(skb); ++ np = &n->next; + continue; + } -+ neigh = (*entry)->neigh; -+ *entry = (*entry)->next; -+ DPRINTK("expired itf %p, neigh %p\n",itf,neigh); -+ neigh->tbl = NULL; -+ neigh_destroy(neigh); ++ *np = n->next; ++ DPRINTK("expired neigh %p\n",n); ++ n->tbl = NULL; ++ clip_tbl.entries--; ++ neigh_destroy(n); + } + } + idle_timer.expires = jiffies+CLIP_CHECK_INTERVAL*HZ; + del_timer(&idle_timer); + add_timer(&idle_timer); -+ restore_flags(flags); +} + + @@ -8234,7 +8247,7 @@ +{ + DPRINTK("clip_arp_rcv\n"); + if (!skb->atm.vcc || !atm_charge(skb->atm.vcc,skb->truesize)) { -+ kfree_skb(skb,FREE_READ); ++ kfree_skb(skb); + return 0; + } + DPRINTK("pushing to %p\n",skb->atm.vcc); @@ -8260,7 +8273,7 @@ + skb->dev = clip_vcc->entry ? clip_vcc->entry->neigh->dev : clip_devs; + /* clip_vcc_entry == NULL if we don't have an IP address yet */ + if (!skb->dev) { -+ kfree_skb(skb,FREE_READ); ++ kfree_skb(skb); + return; + } + skb->atm.vcc = vcc; @@ -8302,7 +8315,7 @@ +static void clip_neigh_error(struct neighbour *neigh,struct sk_buff *skb) +{ + icmp_send(skb,ICMP_DEST_UNREACH,ICMP_HOST_UNREACH,0); -+ kfree_skb(skb,FREE_WRITE); ++ kfree_skb(skb); +} + + @@ -8311,8 +8324,8 @@ + clip_neigh_destroy, /* destructor */ + clip_neigh_solicit, /* solicit */ + clip_neigh_error, /* error_report */ -+ neigh_resolve_output, /* output */ -+ neigh_connected_output, /* connected_output */ ++ ip_acct_output, /* output */ ++ ip_acct_output, /* connected_output */ + ip_acct_output, /* hh_output */ + ip_acct_output /* queue_xmit */ +}; @@ -8335,8 +8348,6 @@ + entry->neigh = neigh; + entry->vccs = NULL; + entry->expires = jiffies+ATMARP_RETRY_DELAY*HZ; -+ entry->next = PRIV(dev)->table; -+ PRIV(dev)->table = entry; + return 0; +} + @@ -8350,22 +8361,26 @@ + NULL, /* pconstructor */ + NULL, /* pdestructor */ + NULL, /* proxy_redo */ -+ { -+ NULL, -+ NULL, -+ 30*HZ, -+ 1*HZ, -+ 60*HZ, -+ 30*HZ, -+ 5*HZ, -+ 3, -+ 3, -+ 0, -+ 3, -+ 1*HZ, -+ (8*HZ)/10, -+ 1*HZ, -+ 64 ++ { /* neigh_parms */ ++ NULL, /* next */ ++ NULL, /* neigh_setup */ ++ &clip_tbl, /* tbl */ ++ 0, /* entries */ ++ NULL, /* priv */ ++ NULL, /* sysctl_table */ ++ 30*HZ, /* base_reachable_time */ ++ 1*HZ, /* retrans_time */ ++ 60*HZ, /* gc_staletime */ ++ 30*HZ, /* reachable_time */ ++ 5*HZ, /* delay_probe_time */ ++ 3, /* queue_len */ ++ 3, /* ucast_probes */ ++ 0, /* app_probes */ ++ 3, /* mcast_probes */ ++ 1*HZ, /* anycast_delay */ ++ (8*HZ)/10, /* proxy_delay */ ++ 1*HZ, /* proxy_qlen */ ++ 64 /* locktime */ + }, + 30*HZ,128,512,1024 /* copied from ARP ... */ +}; @@ -8388,27 +8403,6 @@ +} + + -+static int clip_hard_header(struct sk_buff *skb,struct device *dev, -+ unsigned short type,void *daddr,void *saddr,unsigned len) -+{ -+ void *here; -+ -+ DPRINTK("clip_hard_header (skb %p)\n",skb); -+ here = skb_push(skb,RFC1483LLC_LEN); -+ memcpy(here,llc_oui,sizeof(llc_oui)); -+ ((u16 *) here)[3] = htons(type); -+ skb->atm.encap = 1; -+ /* -+ * We may not know the neighbour when clip_hard_header is invoked, so -+ * we encapsulate and remember to de-encapsulate later, if necessary. -+ * A cleaner way of doing all this would be to link encapsulation to -+ * the device, which then of course means that PVCs can't be mixed on -+ * the same interface (but that's doesn't change functionality). -+ */ -+ return RFC1483LLC_LEN; -+} -+ -+ +static int clip_start_xmit(struct sk_buff *skb,struct device *dev) +{ + struct atmarp_entry *entry; @@ -8416,14 +8410,14 @@ + DPRINTK("clip_start_xmit (skb %p)\n",skb); + if (!skb->dst) { + printk(KERN_ERR "clip_start_xmit: skb->dst == NULL\n"); -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + return 0; + } + if (!skb->dst->neighbour) { +#if 0 + skb->dst->neighbour = clip_find_neighbour(skb->dst,1); + if (!skb->dst->neighbour) { -+ dev_kfree_skb(skb,FREE_WRITE); /* lost that one */ ++ dev_kfree_skb(skb); /* lost that one */ + PRIV(dev)->stats.tx_dropped++; + return 0; + } @@ -8438,7 +8432,7 @@ + if (entry->neigh->arp_queue.qlen < ATMARP_MAX_UNRES_PACKETS) + skb_queue_tail(&entry->neigh->arp_queue,skb); + else { -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + PRIV(dev)->stats.tx_dropped++; + } + return 0; @@ -8447,9 +8441,12 @@ + skb->atm.vcc = entry->vccs->vcc; + DPRINTK("using neighbour %p, vcc %p\n",skb->dst->neighbour, + skb->atm.vcc); -+ if (!entry->vccs->encap && skb->atm.encap) { -+ skb_pull(skb,RFC1483LLC_LEN); -+ skb->atm.encap = 0; ++ if (entry->vccs->encap) { ++ void *here; ++ ++ here = skb_push(skb,RFC1483LLC_LEN); ++ memcpy(here,llc_oui,sizeof(llc_oui)); ++ ((u16 *) here)[3] = skb->protocol; + } + atomic_add(skb->truesize,&skb->atm.vcc->tx_inuse); + skb->atm.iovcnt = 0; @@ -8494,7 +8491,7 @@ + restore_flags(flags); + /* re-process everything received between connection setup and MKIP */ + while ((skb = skb_dequeue(©))) -+ if (!clip_devs) kfree_skb(skb,FREE_READ); ++ if (!clip_devs) kfree_skb(skb); + else { + clip_push(vcc,skb); + PRIV(skb->dev)->stats.rx_packets--; @@ -8585,7 +8582,7 @@ + dev->hard_start_xmit = clip_start_xmit; + /* sg_xmit ... */ + ether_setup(dev); -+ dev->hard_header = clip_hard_header; ++ dev->hard_header = NULL; + dev->rebuild_header = NULL; + dev->hard_header_cache = NULL; + dev->header_cache_update = NULL; @@ -8688,7 +8685,7 @@ + if (skb_peek(&vcc->recvq)) + printk(KERN_ERR "atmarpd_close: closing with requests " + "pending\n"); -+ while ((skb = skb_dequeue(&vcc->recvq))) kfree_skb(skb,FREE_READ); ++ while ((skb = skb_dequeue(&vcc->recvq))) kfree_skb(skb); + DPRINTK("(done)\n"); +} + @@ -8749,8 +8746,8 @@ + return 0; +} --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/common.c Fri Mar 13 20:18:26 1998 -@@ -0,0 +1,919 @@ ++++ work/net/atm/common.c Wed Mar 18 21:31:19 1998 +@@ -0,0 +1,903 @@ +/* net/atm/common.c - ATM sockets (common part for PVC and SVC) */ + +/* Written 1995-1998 by Werner Almesberger, EPFL LRC/ICA */ @@ -8912,7 +8909,7 @@ + atm_return(vcc,skb->truesize); + if (vcc->dev->ops->free_rx_skb) + vcc->dev->ops->free_rx_skb(vcc,skb); -+ else kfree_skb(skb,FREE_READ); ++ else kfree_skb(skb); + } + if (atomic_read(&vcc->rx_inuse)) + printk(KERN_WARNING "atm_release_vcc: strange ... " @@ -9143,7 +9140,7 @@ + el -= (iov->iov_len > el)?el:iov->iov_len; + iov++; + } -+ if (!vcc->dev->ops->free_rx_skb) kfree_skb(skb,FREE_READ); ++ if (!vcc->dev->ops->free_rx_skb) kfree_skb(skb); + else vcc->dev->ops->free_rx_skb(vcc, skb); + return error ? error : eff_len; + } @@ -9157,7 +9154,7 @@ +#endif + { + error = copy_to_user(buff,skb->data,eff_len) ? -EFAULT : 0; -+ if (!vcc->dev->ops->free_rx_skb) kfree_skb(skb,FREE_READ); ++ if (!vcc->dev->ops->free_rx_skb) kfree_skb(skb); + else vcc->dev->ops->free_rx_skb(vcc, skb); + } + return error ? error : eff_len; @@ -9203,7 +9200,7 @@ + res = lock_user((unsigned long) buff,size,max_iov, + (struct iovec *) skb->data); + if (res < 0) { -+ kfree_skb(skb,FREE_WRITE); ++ kfree_skb(skb); + if (res != -EAGAIN) return res; + } + else { @@ -9228,7 +9225,7 @@ + } + skb->atm.iovcnt = 0; + if (copy_from_user(skb_put(skb,size),buff,size)) { -+ kfree_skb(skb,FREE_WRITE); ++ kfree_skb(skb); + return -EFAULT; + } + if (eff != size) memset(skb->data+size,0,eff-size); @@ -9237,14 +9234,14 @@ +} + + -+unsigned int atm_poll(struct socket *sock,poll_table *wait) ++unsigned int atm_poll(struct file *file,struct socket *sock,poll_table *wait) +{ + struct atm_vcc *vcc; + unsigned int mask; + + vcc = ATM_SD(sock); -+ poll_wait(&vcc->sleep,wait); -+ poll_wait(&vcc->wsleep,wait); ++ poll_wait(file,&vcc->sleep,wait); ++ poll_wait(file,&vcc->wsleep,wait); + mask = 0; + if (skb_peek(&vcc->recvq) || skb_peek(&vcc->listenq)) + mask |= POLLIN | POLLRDNORM; @@ -9281,22 +9278,6 @@ +} + + -+/* @@@ stolen from net/socket.c - should be in a common header file */ -+ -+ -+struct socket *sockfd_lookup(int fd) -+{ -+ struct file *file; -+ struct inode *inode; -+ -+ if (fd < 0 || fd >= NR_OPEN || !(file = current->files->fd[fd])) -+ return NULL; -+ inode = file->f_dentry->d_inode; -+ if (!inode || !inode->i_sock) return NULL; -+ return &inode->u.socket_i; -+} -+ -+ +int atm_ioctl(struct socket *sock,unsigned int cmd,unsigned long arg) +{ + struct atm_dev *dev; @@ -9365,8 +9346,8 @@ + { + struct socket *session; + -+ if (!(session = sockfd_lookup(arg))) -+ return -ENOTSOCK; ++ if (!(session = sockfd_lookup(arg,&error))) ++ return error; + if (sock->ops->family != PF_ATMSVC || + session->ops->family != PF_ATMSVC) + return -EPROTOTYPE; @@ -9397,8 +9378,8 @@ + { + struct socket *upper; + -+ if (!(upper = sockfd_lookup(arg))) -+ return -ENOTSOCK; ++ if (!(upper = sockfd_lookup(arg,&error))) ++ return error; + if (upper->ops->family != PF_INET) + return -EPROTOTYPE; + return arequipa_preset(sock,upper->sk); @@ -9671,7 +9652,7 @@ + return atm_do_getsockopt(sock,level,optname,optval,len); +} --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/common.h Fri Mar 13 19:57:08 1998 ++++ work/net/atm/common.h Wed Mar 18 22:21:08 1998 @@ -0,0 +1,44 @@ +/* net/atm/common.h - ATM sockets (common part for PVC and SVC) */ + @@ -9692,7 +9673,7 @@ + int flags,struct scm_cookie *scm); +int atm_sendmsg(struct socket *sock,struct msghdr *m,int total_len, + struct scm_cookie *scm); -+unsigned int atm_poll(struct socket *sock,poll_table *wait); ++unsigned int atm_poll(struct file *file,struct socket *sock,poll_table *wait); +int atm_ioctl(struct socket *sock,unsigned int cmd,unsigned long arg); +int atm_setsockopt(struct socket *sock,int level,int optname,char *optval, + int optlen); @@ -9718,7 +9699,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/ipcommon.c Thu Jan 15 22:49:11 1998 ++++ work/net/atm/ipcommon.c Wed Mar 18 21:01:27 1998 @@ -0,0 +1,52 @@ +/* net/atm/ipcommon.c - Common items for all ways of doing IP over ATM */ + @@ -9773,7 +9754,7 @@ + skb_queue_head_init(from); +} --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/ipcommon.h Fri Mar 13 20:00:17 1998 ++++ work/net/atm/ipcommon.h Thu Mar 19 15:14:06 1998 @@ -0,0 +1,23 @@ +/* net/atm/ipcommon.h - Common items for all ways of doing IP over ATM */ + @@ -9799,7 +9780,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/misc.c Fri Mar 6 21:29:38 1998 ++++ work/net/atm/misc.c Wed Mar 18 21:01:27 1998 @@ -0,0 +1,187 @@ +/* net/atm/misc.c - Various functions for use by ATM drivers */ + @@ -9989,7 +9970,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/lec.c Fri Mar 13 23:09:42 1998 ++++ work/net/atm/lec.c Wed Mar 18 21:19:34 1998 @@ -0,0 +1,1895 @@ +/* + * lec.c: Lan Emulation driver @@ -10121,7 +10102,7 @@ + */ + priv->stats.tx_dropped++; + printk("%s: lec_send_packet: transmit timed out, dropping packet...\n", dev->name); -+ dev_kfree_skb(skb, FREE_WRITE); ++ dev_kfree_skb(skb); + dev->tbusy=0; + return 0; +#if 0 @@ -10173,7 +10154,7 @@ + priv->stats.tx_dropped++; + printk("%s:lec_send_packet: bad vcc, dropping packet...\n", + dev->name); -+ dev_kfree_skb(skb, FREE_WRITE); /* like in clip.c */ ++ dev_kfree_skb(skb); /* like in clip.c */ + dev->tbusy=0; + return 0; + } else { @@ -10379,10 +10360,10 @@ + break; + default: + printk("%s: Unknown message type %d\n", dev->name, mesg->type); -+ dev_kfree_skb(skb, FREE_WRITE); ++ dev_kfree_skb(skb); + return -EINVAL; + } -+ dev_kfree_skb(skb, FREE_WRITE); ++ dev_kfree_skb(skb); + return 0; +} + @@ -10405,7 +10386,7 @@ + printk("%s lec_atm_close: closing with messages pending\n", + dev->name); + while ((skb = skb_dequeue(&vcc->recvq))) { -+ dev_kfree_skb(skb,FREE_READ); ++ dev_kfree_skb(skb); + atm_return(vcc, skb->truesize); + } + @@ -10570,7 +10551,7 @@ + /* Probably looping back, or if lecd is missing, + lecd has gone down */ + DPRINTK("Ignoring loopback frame...\n"); -+ dev_kfree_skb(skb, FREE_READ); ++ dev_kfree_skb(skb); + return; + } + if (priv->lec_arp_empty_ones) { /* FILTER DATA!!!! */ @@ -11887,7 +11868,7 @@ +} + --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/lec.h Fri Mar 13 20:00:07 1998 ++++ work/net/atm/lec.h Thu Mar 19 15:13:57 1998 @@ -0,0 +1,112 @@ +/* + * @@ -12002,7 +11983,7 @@ +#endif _LEC_H_ + --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/lec_arpc.h Fri Mar 13 20:00:07 1998 ++++ work/net/atm/lec_arpc.h Thu Mar 19 15:13:57 1998 @@ -0,0 +1,112 @@ +/* + * Lec arp cache @@ -12117,8 +12098,8 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/proc.c Fri Mar 13 23:25:51 1998 -@@ -0,0 +1,607 @@ ++++ work/net/atm/proc.c Thu Mar 26 21:57:46 1998 +@@ -0,0 +1,610 @@ +/* net/atm/proc.c - ATM /proc interface */ + +/* Written 1995-1998 by Werner Almesberger, EPFL LRC/ICA */ @@ -12554,28 +12535,31 @@ + } +#ifdef CONFIG_ATM_CLIP + if (ino == INO(arp)) { -+ struct device *dev; -+ struct atmarp_entry *entry; -+ int count; ++ struct neighbour *n; ++ int i,count; + + count = *pos; -+ for (dev = clip_devs; dev; dev = PRIV(dev)->next) -+ for (entry = PRIV(dev)->table; entry; -+ entry = entry->next) { ++ neigh_table_lock(&clip_tbl); ++ for (i = 0; i <= NEIGH_HASHMASK; i++) ++ for (n = clip_tbl.hash_buckets[i]; n; n = n->next) { ++ struct atmarp_entry *entry = NEIGH2ENTRY(n); + struct clip_vcc *vcc; + + if (!entry->vccs) { + if (--count) continue; -+ atmarp_info(dev,entry,NULL,buf); ++ atmarp_info(n->dev,entry,NULL,buf); ++ neigh_table_unlock(&clip_tbl); + return strlen(buf); + } + for (vcc = entry->vccs; vcc; + vcc = vcc->next) { + if (--count) continue; -+ atmarp_info(dev,entry,vcc,buf); ++ atmarp_info(n->dev,entry,vcc,buf); ++ neigh_table_unlock(&clip_tbl); + return strlen(buf); + } + } ++ neigh_table_unlock(&clip_tbl); + return 0; + } +#endif @@ -12727,7 +12711,7 @@ + return error; +} --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/protocols.h Thu Jan 15 22:49:11 1998 ++++ work/net/atm/protocols.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,16 @@ +/* net/atm/protocols.h - ATM protocol handler entry points */ + @@ -12746,7 +12730,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/pvc.c Mon Feb 9 16:24:56 1998 ++++ work/net/atm/pvc.c Wed Mar 18 21:01:27 1998 @@ -0,0 +1,157 @@ +/* net/atm/pvc.c - ATM PVC sockets */ + @@ -12906,7 +12890,7 @@ +#endif +} --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/raw.c Thu Jan 15 22:49:11 1998 ++++ work/net/atm/raw.c Wed Mar 18 21:10:47 1998 @@ -0,0 +1,80 @@ +/* net/atm/raw.c - Raw AAL0 and AAL5 transports */ + @@ -12958,7 +12942,7 @@ +#endif + DPRINTK("APopR (%d) %d -= %d\n",vcc->vci,vcc->tx_inuse,skb->truesize); + atomic_sub(skb->truesize+ATM_PDU_OVHD,&vcc->tx_inuse); -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + wake_up(&vcc->wsleep); +} + @@ -12989,7 +12973,7 @@ + return 0; +} --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/resources.c Thu Feb 12 17:01:03 1998 ++++ work/net/atm/resources.c Wed Mar 18 21:01:27 1998 @@ -0,0 +1,174 @@ +/* net/atm/resources.c - Staticly allocated resources */ + @@ -13166,7 +13150,7 @@ + } +} --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/resources.h Fri Mar 13 20:00:07 1998 ++++ work/net/atm/resources.h Thu Mar 19 15:13:57 1998 @@ -0,0 +1,29 @@ +/* net/atm/resources.h - ATM-related resources */ + @@ -13198,7 +13182,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/signaling.c Fri Mar 13 20:18:19 1998 ++++ work/net/atm/signaling.c Wed Mar 18 21:10:56 1998 @@ -0,0 +1,253 @@ +/* net/atm/signaling.c - ATM signaling */ + @@ -13252,7 +13236,7 @@ + sleep_on(&sigd_sleep); +#else + printk(KERN_WARNING "atmsvc: no signaling demon\n"); -+ kfree_skb(skb,FREE_READ); ++ kfree_skb(skb); + return; +#endif + } @@ -13349,7 +13333,7 @@ + return -EINVAL; + } + if (vcc->callback) vcc->callback(vcc); -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + return 0; +} + @@ -13406,7 +13390,7 @@ + sigd = NULL; + if (skb_peek(&vcc->recvq)) + printk(KERN_ERR "sigd_close: closing with requests pending\n"); -+ while ((skb = skb_dequeue(&vcc->recvq))) kfree_skb(skb,FREE_READ); ++ while ((skb = skb_dequeue(&vcc->recvq))) kfree_skb(skb); + purge_vccs(nodev_vccs); + for (dev = atm_devs; dev; dev = dev->next) purge_vccs(dev->vccs); +} @@ -13454,7 +13438,7 @@ + return 0; +} --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/signaling.h Fri Mar 13 20:00:07 1998 ++++ work/net/atm/signaling.h Thu Mar 19 15:13:57 1998 @@ -0,0 +1,25 @@ +/* net/atm/signaling.h - ATM signaling */ + @@ -13482,7 +13466,7 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/svc.c Fri Mar 13 21:59:03 1998 ++++ work/net/atm/svc.c Wed Mar 18 21:11:03 1998 @@ -0,0 +1,384 @@ +/* net/atm/svc.c - ATM SVC sockets */ + @@ -13561,7 +13545,7 @@ + DPRINTK("LISTEN REL\n"); + sigd_enq(NULL,as_reject,vcc,NULL,NULL); /* @@@ should include + the reason */ -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + } + vcc->flags &= ~(ATM_VF_REGIS | ATM_VF_RELEASED | ATM_VF_CLOSE); + /* may retry later */ @@ -13734,7 +13718,7 @@ + new_vcc->sap = msg->sap; + error = atm_connect(newsock,msg->pvc.sap_addr.itf, + msg->pvc.sap_addr.vpi,msg->pvc.sap_addr.vci); -+ dev_kfree_skb(skb,FREE_WRITE); ++ dev_kfree_skb(skb); + old_vcc->backlog_quota++; + if (error) { + sigd_enq(NULL,as_reject,old_vcc,NULL,NULL); @@ -13869,7 +13853,7 @@ + } +} --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/tunable.h Thu Jan 15 22:49:11 1998 ++++ work/net/atm/tunable.h Wed Mar 18 21:01:27 1998 @@ -0,0 +1,26 @@ +/* net/atm/tunable.h - Tunable parameters of ATM support */ + @@ -13897,9 +13881,9 @@ + quota per PDU */ + +#endif ---- ref/net/core/skbuff.c Tue Jan 13 00:28:25 1998 -+++ work/net/core/skbuff.c Thu Jan 15 22:49:11 1998 -@@ -187,6 +187,12 @@ +--- ref/net/core/skbuff.c Wed Feb 25 07:08:02 1998 ++++ work/net/core/skbuff.c Wed Mar 18 21:01:27 1998 +@@ -186,6 +186,12 @@ skb->end = bptr + len; skb->len = 0; skb->inclone = 0; @@ -13912,7 +13896,7 @@ return skb; } -@@ -256,6 +262,9 @@ +@@ -255,6 +261,9 @@ atomic_set(&n->users, 1); n->inclone = inbuff; n->destructor = NULL; @@ -13922,7 +13906,7 @@ return n; } -@@ -309,6 +318,9 @@ +@@ -308,6 +317,9 @@ n->stamp=skb->stamp; n->destructor = NULL; n->security=skb->security; diff -ur --new-file old/atm/doc/usage.tex new/atm/doc/usage.tex --- old/atm/doc/usage.tex Thu Mar 12 17:37:23 1998 +++ new/atm/doc/usage.tex Fri Mar 27 00:54:58 1998 @@ -1,7 +1,7 @@ %%def%:= %:\begin{verbatim} -%:Usage instructions - ATM on Linux, release 0.34 (alpha) +%:Usage instructions - ATM on Linux, release 0.35 (alpha) %:--------------------------------------------------------- %: %:\end{verbatim} @@ -38,14 +38,14 @@ \title{ATM on Linux \\ User's guide \\ - Release 0.34 (alpha)} + Release 0.35 (alpha)} \author{Werner Almesberger \\ {\tt Werner.Almesberger@epfl.ch} \\ \\ Institute for computer Communications and Applications (ICA) \\ EPFL, CH-1015 Lausanne, Switzerland} -\date{March 12, 1997} +\date{March 27, 1997} \begin{document} \maketitle @@ -81,9 +81,9 @@ 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.34.tar.gz} - \item the Linux kernel, version 2.1.79, e.g. from - \url{ftp://ftp.kernel.org/pub/linux/kernel/v2.1/linux-2.1.79.tar.gz} + \url{ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.35.tar.gz} + \item the Linux kernel, version 2.1.90, e.g. from + \url{ftp://ftp.kernel.org/pub/linux/kernel/v2.1/linux-2.1.90.tar.gz} \item Perl, version 4 or 5 \item if you want memory debugging: MPR version 1.6, e.g. from \url{ftp://sunsite.unc.edu/pub/Linux/devel/lang/c/mpr-1.6.tar.gz} @@ -98,13 +98,13 @@ distribution: \begin{verbatim} -tar xfz atm-0.34.tar.gz +tar xfz atm-0.35.tar.gz \end{verbatim} and the kernel source: \begin{verbatim} -tar xfz linux-2.1.79.tar.gz +tar xfz linux-2.1.90.tar.gz \end{verbatim} Finally, you can extract the ATM-related patches: diff -ur --new-file old/atm/doc/usage.txt new/atm/doc/usage.txt --- old/atm/doc/usage.txt Fri Mar 13 22:07:11 1998 +++ new/atm/doc/usage.txt Fri Mar 27 01:07:35 1998 @@ -1,4 +1,4 @@ -Usage instructions - ATM on Linux, release 0.34 (alpha) +Usage instructions - ATM on Linux, release 0.35 (alpha) --------------------------------------------------------- For updates of ATM on Linux, please check the Web page at @@ -17,9 +17,9 @@ In order to install this package, you need - the package itself - ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.34.tar.gz - - the Linux kernel, version 2.1.79, e.g. from - ftp://ftp.kernel.org/pub/linux/kernel/v2.1/linux-2.1.79.tar.gz + ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.35.tar.gz + - the Linux kernel, version 2.1.90, e.g. from + ftp://ftp.kernel.org/pub/linux/kernel/v2.1/linux-2.1.90.tar.gz - Perl, version 4 or 5 - if you want memory debugging: MPR version 1.6, e.g. from ftp://sunsite.unc.edu/pub/Linux/devel/lang/c/mpr-1.6.tar.gz @@ -33,11 +33,11 @@ all the files listed above there. Then extract the ATM on Linux distribution: -tar xfz atm-0.34.tar.gz +tar xfz atm-0.35.tar.gz and the kernel source: -tar xfz linux-2.1.79.tar.gz +tar xfz linux-2.1.90.tar.gz Finally, you can extract the ATM-related patches: diff -ur --new-file old/atm/ilmid/util.c new/atm/ilmid/util.c --- old/atm/ilmid/util.c Mon May 5 05:48:52 1997 +++ new/atm/ilmid/util.c Fri Mar 20 14:05:17 1998 @@ -31,14 +31,14 @@ if(o1->octetLen > o2->octetLen) { result = memcmp(o1->octs, o2->octs, o2->octetLen); - if(result == -1) + if(result < 0) return AsnOidLess; else return AsnOidGreater; } else if(o1->octetLen < o2->octetLen) { result = memcmp(o1->octs, o2->octs, o1->octetLen); - if(result == 1) + if(result > 0) return AsnOidGreater; else if(result == 0) return AsnOidRoot; @@ -47,7 +47,7 @@ } else { result = memcmp(o1->octs, o2->octs, o1->octetLen); - if(result == -1) + if(result < 0) return AsnOidLess; else if(result == 0) return AsnOidEqual; diff -ur --new-file old/atm/lane/connect.c new/atm/lane/connect.c --- old/atm/lane/connect.c Sun Jan 18 12:14:14 1998 +++ new/atm/lane/connect.c Wed Mar 18 22:11:50 1998 @@ -127,8 +127,6 @@ idle_state, join_state, oper_state }; -extern int errno; - /* Functions */ /* Initialize local data */ diff -ur --new-file old/atm/lane/connect_bus.c new/atm/lane/connect_bus.c --- old/atm/lane/connect_bus.c Sun Jan 18 12:14:33 1998 +++ new/atm/lane/connect_bus.c Wed Mar 18 22:12:09 1998 @@ -83,8 +83,6 @@ idle_state, NULL, operational_state }; -extern int errno; - /* Functions */ /* Initialize local data */ diff -ur --new-file old/atm/lane/lecs.c new/atm/lane/lecs.c --- old/atm/lane/lecs.c Wed Nov 19 12:59:25 1997 +++ new/atm/lane/lecs.c Wed Mar 18 22:12:17 1998 @@ -41,8 +41,6 @@ static int stay_alive = 1; static int reset = 0; -extern int errno; - #define DUMP_PACKETS 0 static void diff -ur --new-file old/atm/led/address.c new/atm/led/address.c --- old/atm/led/address.c Wed Nov 19 12:59:16 1997 +++ new/atm/led/address.c Wed Mar 18 22:08:52 1998 @@ -39,7 +39,6 @@ #include #include #include -#include /* Atm includes */ #include @@ -76,8 +75,6 @@ } Client_t; Client_t *Clientlist = NULL; - -extern int errno; void addr_reg_timer_callback(HANDLE context); diff -ur --new-file old/atm/led/conn.c new/atm/led/conn.c --- old/atm/led/conn.c Thu Mar 5 22:07:22 1998 +++ new/atm/led/conn.c Wed Mar 18 22:10:44 1998 @@ -92,8 +92,6 @@ #define LISTENING 9 #define KERNEL_SOCK 10 -extern int errno; - typedef struct _conn_t_ { int fd; /* Socket connected to this connection */ unsigned long age_limit; /* In seconds. If this SVC is idle (no traffic) diff -ur --new-file old/atm/led/kernel_itf.c new/atm/led/kernel_itf.c --- old/atm/led/kernel_itf.c Sun Feb 1 13:23:03 1998 +++ new/atm/led/kernel_itf.c Wed Mar 18 22:16:25 1998 @@ -37,7 +37,6 @@ #include /* for malloc() and free() */ /* Atm includes */ #include -#include #include /* Local includes */ @@ -50,7 +49,6 @@ #include "emask.h" /* Local vars */ -extern int errno; static int lec_socket; /* Callback func array */ static kernel_callback callback_funcs[ATMLEC_MSG_TYPE_MAX]; diff -ur --new-file old/atm/lib/arequipa.c new/atm/lib/arequipa.c --- old/atm/lib/arequipa.c Wed Nov 5 03:22:29 1997 +++ new/atm/lib/arequipa.c Wed Mar 18 21:38:37 1998 @@ -1,15 +1,16 @@ /* arequipa.c - AREQUIPA support functions */ -/* Written 1996,1997 by Jean-Michel Pittet and Werner Almesberger, EPFL-LRC */ +/* Written 1996-1998 by Jean-Michel Pittet and Werner Almesberger, + EPFL-LRC/ICA */ #include #include #include #include -#include #include +#include "atm.h" #include "atmsap.h" #include "arequipa.h" diff -ur --new-file old/atm/lib/atm2text.c new/atm/lib/atm2text.c --- old/atm/lib/atm2text.c Wed Nov 13 13:47:26 1996 +++ new/atm/lib/atm2text.c Wed Mar 18 21:38:47 1998 @@ -1,12 +1,11 @@ /* atm2text.c - Converts binary encoding of ATM address to textual representation */ -/* Written 1995,1996 by Werner Almesberger, EPFL-LRC */ +/* Written 1995-1998 by Werner Almesberger, EPFL-LRC/ICA */ #include #include -#include #include "atm.h" #include "atmres.h" diff -ur --new-file old/atm/lib/atmequal.c new/atm/lib/atmequal.c --- old/atm/lib/atmequal.c Fri Jan 5 14:07:19 1996 +++ new/atm/lib/atmequal.c Wed Mar 18 21:38:56 1998 @@ -1,12 +1,11 @@ /* atmequal.c - Compares ATM addresses for equality */ -/* Written 1995,1996 by Werner Almesberger, EPFL-LRC */ +/* Written 1995-1998 by Werner Almesberger, EPFL-LRC/ICA */ #include #include #include -#include #include "atm.h" diff -ur --new-file old/atm/lib/misc.c new/atm/lib/misc.c --- old/atm/lib/misc.c Wed Mar 4 08:20:51 1998 +++ new/atm/lib/misc.c Wed Mar 18 21:39:13 1998 @@ -1,6 +1,6 @@ /* misc.c - Miscellaneous library functions */ -/* Written 1997,1998 by Werner Almesberger, EPFL-ICA */ +/* Written 1997,1998 by Werner Almesberger, EPFL-ICA/ICA */ #include @@ -9,7 +9,6 @@ #include #include #include /* for htons */ -#include #include #include diff -ur --new-file old/atm/lib/sdu2cell.c new/atm/lib/sdu2cell.c --- old/atm/lib/sdu2cell.c Tue Apr 22 12:25:22 1997 +++ new/atm/lib/sdu2cell.c Wed Mar 18 21:39:35 1998 @@ -1,10 +1,9 @@ /* sdu2cr.c - Converts SDU sizes and SDU counts to cell counts */ -/* Written 1996,1997 by Werner Almesberger, EPFL-LRC */ +/* Written 1996-1998 by Werner Almesberger, EPFL-LRC/ICA */ #include -#include #include "atm.h" diff -ur --new-file old/atm/lib/text2atm.c new/atm/lib/text2atm.c --- old/atm/lib/text2atm.c Wed Nov 5 03:20:53 1997 +++ new/atm/lib/text2atm.c Wed Mar 18 21:35:17 1998 @@ -1,14 +1,13 @@ /* text2atm.c - Converts textual representation of ATM address to binary encoding */ -/* Written 1995,1996 by Werner Almesberger, EPFL-LRC */ +/* Written 1995-1998 by Werner Almesberger, EPFL-LRC/ICA */ #include #include #include #include -#include #include "atm.h" #include "atmsap.h" diff -ur --new-file old/atm/lib/text2qos.c new/atm/lib/text2qos.c --- old/atm/lib/text2qos.c Thu Nov 6 00:26:10 1997 +++ new/atm/lib/text2qos.c Wed Mar 18 21:39:55 1998 @@ -1,7 +1,7 @@ /* text2qos.c - Converts textual representation of QOS parameters to binary encoding */ -/* Written 1996,1997 by Werner Almesberger, EPFL-LRC */ +/* Written 1996-1998 by Werner Almesberger, EPFL-LRC/ICA */ #include @@ -9,7 +9,6 @@ #include #include #include -#include #include "atm.h" diff -ur --new-file old/atm/mkdist new/atm/mkdist --- old/atm/mkdist Thu Mar 12 17:36:51 1998 +++ new/atm/mkdist Fri Mar 27 01:07:15 1998 @@ -1,7 +1,7 @@ #!/bin/sh [ -r ./VERSION ] || exit 1 VERSION=`cat ./VERSION` -SRCDIR=$HOME/k/2179 +SRCDIR=$HOME/k/2190 ARCHDIR=$HOME/l/arch ( cd $SRCDIR @@ -108,6 +108,9 @@ atm/lane/units.h \ atm/aqd/Makefile atm/aqd/arequipad.c atm/aqd/io.h atm/aqd/io.c \ atm/aqd/arequipad.8 atm/aqd/aqpvc.c atm/aqd/aqpvc.8 \ + atm/switch/Makefile atm/switch/Rules.make atm/switch/fab.h \ + atm/switch/io.h atm/switch/io.c atm/switch/proto.h atm/switch/proto.c \ + atm/switch/relay.c atm/switch/debug/Makefile atm/switch/debug/debug.c \ atm/extra/extra.html atm/extra/Makefile atm/extra/tcpdump-3.0.4-1.patch \ atm/extra/bind-4.9.5-REL.patch atm/extra/hosts2ans.pl \ atm/config/README atm/config/Makefile atm/config\ diff -ur --new-file old/atm/sigd/timeout.c new/atm/sigd/timeout.c --- old/atm/sigd/timeout.c Thu Nov 6 03:38:11 1997 +++ new/atm/sigd/timeout.c Wed Mar 18 22:13:35 1998 @@ -1,12 +1,11 @@ /* timeout.c - Processing of signaling timeout events */ -/* Written 1995-1997 by Werner Almesberger, EPFL-LRC */ +/* Written 1995-1998 by Werner Almesberger, EPFL-LRC/ICA */ #include #include #include -#include #include "atmd.h" diff -ur --new-file old/atm/switch/Makefile new/atm/switch/Makefile --- old/atm/switch/Makefile Thu Jan 1 01:00:00 1970 +++ new/atm/switch/Makefile Wed Mar 25 20:29:14 1998 @@ -0,0 +1,8 @@ +SW_OBJS=io.o proto.o relay.o + +all: libsw.a + +include ../Rules.make + +libsw.a: $(SW_OBJS) + ar rcs libsw.a $(SW_OBJS) diff -ur --new-file old/atm/switch/Rules.make new/atm/switch/Rules.make --- old/atm/switch/Rules.make Thu Jan 1 01:00:00 1970 +++ new/atm/switch/Rules.make Wed Mar 25 20:26:34 1998 @@ -0,0 +1,3 @@ +TOPDIR=../.. + +include $(TOPDIR)/Rules.make diff -ur --new-file old/atm/switch/debug/Makefile new/atm/switch/debug/Makefile --- old/atm/switch/debug/Makefile Thu Jan 1 01:00:00 1970 +++ new/atm/switch/debug/Makefile Wed Mar 25 20:38:24 1998 @@ -0,0 +1,9 @@ +LIBS=-latmd -lsw -L.. +LIBDEPS=../../lib/libatmd.a ../libsw.a +OBJS=debug.o +SYSPGMS=sw_debug + +include ../Rules.make + +sw_debug: $(OBJS) + $(CC) $(LDFLAGS) -o sw_debug $(OBJS) $(LIBS) $(LDLIBS) diff -ur --new-file old/atm/switch/debug/debug.c new/atm/switch/debug/debug.c --- old/atm/switch/debug/debug.c Thu Jan 1 01:00:00 1970 +++ new/atm/switch/debug/debug.c Mon Mar 23 13:24:46 1998 @@ -0,0 +1,65 @@ +/* debug.c - Simple debugging "switch" */ + +/* Written 1998 by Werner Almesberger, EPFL DI-ICA */ + + +#include + +#include + +#include "../fab.h" + + +#define COMPONENT "FAB(debug)" + + +#define PRV(call) ((FAB *) (call)->fab) + + +typedef struct _fab { + CALL *next; /* relay.c may not keep track of calls, but WE are */ +} FAB; + + +static CALL *calls; + + +void fab_init(CALL *call) +{ + PRV(call) = alloc_t(FAB); + PRV(call)->next = calls; + calls = call; +} + + +void fab_destroy(CALL *call) +{ + CALL **walk; + + for (walk = &calls; *walk; walk = &PRV(*walk)->next) + if (*walk == call) break; + if (!*walk) + diag(COMPONENT,DIAG_FATAL,"fab_destroy: call %p not found",call); + *walk = PRV(call)->next; + free(PRV(call)); + PRV(call) = NULL; +} + + +void fab_op(CALL *call,int op,const struct atm_qos *qos, + void (*callback)(CALL *call,int okay,void *user),void *user) +{ + diag(COMPONENT,DIAG_INFO,"fab_op%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", + !op ? " FREE" : "",op & RM_RSV(_RM_ANY) ? " RM_RSV:" : "", + op & RM_IN_TX ? " IN_TX" : "",op & RM_IN_RX ? " IN_RX" : "", + op & RM_OUT_TX ? " OUT_TX" : "",op & RM_OUT_RX ? " OUT_RX" : "", + op & RM_PATH_TX ? " PATH_TX" : "",op & RM_PATH_RX ? " PATH_RX" : "", + op & RM_CLAIM(_RM_ANY) ? " RM_CLAIM:" : "", + op & _RM_SHIFT(RM_IN_TX) ? " IN_TX" : "", + op & _RM_SHIFT(RM_IN_RX) ? " IN_RX" : "", + op & _RM_SHIFT(RM_OUT_TX) ? " OUT_TX" : "", + op & _RM_SHIFT(RM_OUT_RX) ? " OUT_RX" : "", + op & _RM_SHIFT(RM_PATH_TX) ? " PATH_TX" : "", + op & _RM_SHIFT(RM_PATH_RX) ? " PATH_RX" : ""); + callback(call,1,user); +} diff -ur --new-file old/atm/switch/fab.h new/atm/switch/fab.h --- old/atm/switch/fab.h Thu Jan 1 01:00:00 1970 +++ new/atm/switch/fab.h Mon Mar 23 13:19:42 1998 @@ -0,0 +1,77 @@ +/* fab.h - Generic switch fabric interface */ + +/* Written 1997,1998 by Werner Almesberger, EPFL DI-ICA */ + + +#ifndef _FAB_H +#define _FAB_H + +#include "proto.h" + + +#define RM_FREE 0 +#define RM_IN_TX 1 +#define RM_IN_RX 2 +#define RM_IN (RM_IN_TX | RM_IN_RX) +#define RM_OUT_TX 4 +#define RM_OUT_RX 8 +#define RM_OUT (RM_OUT_TX | RM_OUT_RX) +#define RM_PATH_TX 16 +#define RM_PATH_RX 32 +#define RM_PATH (RM_PATH_TX | RM_PATH_RX) +#define _RM_ANY (RM_IN | RM_OUT | RM_PATH) + +#define _RM_SHIFT(what) ((what) << 6) +#define _RM_UNSHIFT(what) ((what) >> 6) +#define RM_RSV(what) (what) +#define RM_CLAIM(what) _RM_SHIFT(what) + + +/* --- Provided by the relay core ------------------------------------------ */ + +/* + * Add a file descriptor to probe for reading in the central dispatcher. If + * the FD if readable, the callback function is invoked. The dispatcher does + * not attempt to read itself. + */ + +void sw_fd_add(int fd,void (*callback)(int fd,void *user),void *user); + +/* + * Remove a file descriptor from the central dispatcher. This function can be + * invoked from within a callback function. + */ + +void sw_fd_remove(int fd); + +/* --- Provided by fabric control ------------------------------------------ */ + +/* + * Initialize the fabric-specific part of a call structure, i.e. allocate a + * fab-specific descriptor and attach it to call->fab. This function is called + * before the first fab_op or fab_destroy. + */ + +void fab_init(CALL *call); + +/* + * Destroy the fab-specific part of a call structure. This function is only + * invoked once per call and only after any pending fab_op has completed. + */ + +void fab_destroy(CALL *call); + +/* + * Allocate/change resources and set up paths in the switch fabric. fab_op may + * be requested to operate on several parts of a call (i.e. the incoming side, + * the outgoing side, or the path through the switch fabric) at the same time. + * Internal scheduling is left to fab_op. Upon completion, fab_op invokes the + * callback function (once). fab_op may invoke the callback function before + * returning. Only one fab_op may be in progress at a time for a call, but any + * number of concurrent calls can be processed. + */ + +void fab_op(CALL *call,int op,const struct atm_qos *qos, + void (*callback)(CALL *call,int okay,void *user),void *user); + +#endif diff -ur --new-file old/atm/switch/io.c new/atm/switch/io.c --- old/atm/switch/io.c Thu Jan 1 01:00:00 1970 +++ new/atm/switch/io.c Mon Feb 16 18:44:27 1998 @@ -0,0 +1,44 @@ +/* io.c - I/O operations */ + +/* Written 1997-1998 by Roman Pletka, EPFL-LRC */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "atm.h" +#include "atmd.h" + +/*#include "proto.h"*/ +#include "io.h" + +#define COMPONENT "IO" + +void to_sigd(long id,struct atmsvc_msg *msg) { + int err; + err = write(id,msg,sizeof(*msg)); + if (err == sizeof(*msg)) return; + if (err < 0) { + perror("write"); + } +} + +void to_rm(long id,struct atmsvc_msg *msg) { + int err; + err = write(id,msg,sizeof(*msg)); + if (err == sizeof(*msg)) return; + if (err < 0) { + perror("write"); + } +} diff -ur --new-file old/atm/switch/io.h new/atm/switch/io.h --- old/atm/switch/io.h Thu Jan 1 01:00:00 1970 +++ new/atm/switch/io.h Mon Feb 16 18:44:40 1998 @@ -0,0 +1,13 @@ +/* io.h - I/O operations */ + +/* Written 1997-1998 by Roman Pletka, EPFL-LRC */ + +#ifndef IO_H +#define IO_H + +#include +#include + +void to_sigd(long id,struct atmsvc_msg *msg); +void to_rm(long id,struct atmsvc_msg *msg); +#endif diff -ur --new-file old/atm/switch/proto.c new/atm/switch/proto.c --- old/atm/switch/proto.c Thu Jan 1 01:00:00 1970 +++ new/atm/switch/proto.c Fri Mar 27 00:19:33 1998 @@ -0,0 +1,263 @@ +/* proto.c - Common protocol functions and structures */ + +/* Written 1997-1998 by Roman Pletka, EPFL-SSC */ +/* Modified 1998 by Werner Almesberger, EPFL ICA */ + + +#include +#include +#include +#include +#include + +#include "atmd.h" +#include "io.h" +#include "proto.h" + + +#define COMPONENT "SWITCH" + +static const char *as_msgs[] = { + "as_catch_null", "as_bind", "as_connect", + "as_accept", "as_reject","as_listen", + "as_okay", "as_error", "as_indicate", + "as_close", "as_itf_notify", "as_modify", + "as_identify"}; +static const char *cs_states[]= { + "cs_invalid", "cs_null", "cs_listening", + "cs_connected", "cs_indicated", "cs_called_accepted", + "cs_rm_accepted", "cs_rm_accepted2", "cs_caller_error", + "cs_rejected", "cs_rejected2", "cs_caller_closing", + "cs_called_closed", "cs_called_closed2", "cs_free_rm", + "cs_rejecting", "cs_will_close", "cs_call_indicated", + "cs_caller_closed" }; +static const char *sources[4] = {"CALLER","CALLED","RM"}; + + +static CALL *calls = NULL; + + +CALL *new_call(unsigned long id) +{ + CALL *call; + + call = alloc_t(CALL); + memset(call,0,sizeof(CALL)); + call->state = cs_invalid; + call->in.id = id; + call->out.id = 0; + call->listen = NULL; + call->next = calls; + calls = call; + return call; +} + + +void free_call(CALL *call) +{ + + call->state = cs_invalid; + free(call); + printf("Call 0x%p killed\n",call); + /* because call is not in a double linked chain, the next-pointer + in the previous element will not point to the next element! + But this chain is only for debbuging (except at startup) we neglect + this fact... */ +} + + +void new_state(CALL *call,STATE state) +{ + call->state = state; + print_state(call); +} + + +void send_sigd(unsigned long vcc, + unsigned long listen_vcc, + enum atmsvc_msg_type type, + int reply, + const struct sockaddr_atmpvc *pvc, + const struct sockaddr_atmsvc *svc, + const struct sockaddr_atmsvc *local, + const struct atm_sap *sap, + const struct atm_qos *qos) +{ + struct atmsvc_msg *msg; + + msg = alloc_t(struct atmsvc_msg); + msg->vcc = vcc; + msg->listen_vcc = listen_vcc; + msg->type = type; + msg->reply = reply; + if (pvc) msg->pvc = *pvc; + else memset(&msg->pvc,0,sizeof(msg->pvc)); + if (sap) msg->sap = *sap; + else memset(&msg->sap,0,sizeof(msg->sap)); + if (qos) msg->qos = *qos; + else memset(&msg->qos,0,sizeof(msg->qos)); + if (local) msg->local = *local; + else memset(&msg->local,0,sizeof(msg->local)); + if (svc) msg->svc = *svc; + else memset(&msg->svc,0,sizeof(msg->svc)); + to_sigd(vcc,msg); + free(msg); +} + +void send_listen(void) +{ + CALL *call; + struct atmsvc_msg msg; + + for (call = calls; call; call = call->next) { + memset(&msg,0,sizeof(msg)); + /* compose the message */ + msg.type = as_listen; + msg.vcc = (unsigned long) call; + msg.svc.sas_family = AF_ATMSVC; + msg.qos.aal = ATM_AAL5; + msg.qos.txtp.traffic_class = msg.qos.rxtp.traffic_class = ATM_ANYCLASS; + /* msg.sap ; */ + call->listen = call; + to_sigd(call->in.id,&msg); + new_state(call,cs_null); + } +} + +void send_identify(CALL *call) +{ + struct atmsvc_msg msg; + + /* this is always sent to caller */ + memset(&msg,0,sizeof(msg)); + + /* compose the message */ + msg.type = as_identify; + msg.vcc = (unsigned long) call; + msg.listen_vcc = (unsigned long) call->listen; + + /* We have to complete the message (vci,vpi..) */ + msg.pvc = call->in.pvc; + to_sigd(call->in.id,&msg); +} + +void send_connect(CALL *call) +{ + struct atmsvc_msg msg; + + /* this is always sent to called */ + memset(&msg,0,sizeof(msg)); + /* compose the message */ + msg.type = as_connect; + msg.vcc = (unsigned long) call | CALLED; /* some kind of magic... */ + msg.local = call->in.svc; + msg.qos = call->in.qos; + msg.svc = call->out.svc; + msg.sap = call->sap; + /* we have to give VCI/VPI */ + msg.pvc = call->out.pvc; + to_sigd(call->out.id,&msg); +} + +void send_reject(CALL *call, int err_code) +{ + struct atmsvc_msg msg; + + /* this is always sent to called */ + memset(&msg,0,sizeof(msg)); + msg.type = as_reject; + msg.vcc = (unsigned long) call; + msg.reply = err_code; + /* msg.listen_vcc = call->in.id; */ + to_sigd(call->in.id,&msg); +} + +void send_reject_not_id(CALL *call, int err_code) +{ + struct atmsvc_msg msg; + + /* this is always sent to called */ + memset(&msg,0,sizeof(msg)); + msg.type = as_reject; + msg.vcc = (unsigned long) call->listen; + msg.reply = err_code; + /* msg.listen_vcc = call->in.id; */ + to_sigd(call->in.id,&msg); +} + +void send_close(CALL *call,int dest) +{ + unsigned long id; + struct atmsvc_msg msg; + + memset(&msg,0,sizeof(msg)); + msg.type = as_close; + msg.vcc = (unsigned long) call | dest; /* dest: CALLER or CALLED */ + id = dest == CALLER ? id = call->in.id : call->out.id; + /* msg.reply = ??!! */ + to_sigd(id,&msg); +} + +void send_accept(CALL *call) +{ + struct atmsvc_msg msg; + + memset(&msg,0,sizeof(msg)); + msg.type = as_accept; + msg.vcc = (unsigned long) call; + /* msg.listen_vcc = call->in.id; */ + to_sigd(call->in.id,&msg); +} + +void send_free_rm(long id, CALL *call) +{ + /* here we send an as_close msg */ + struct atmsvc_msg msg; + + memset(&msg,0,sizeof(msg)); + msg.type = as_close; + msg.vcc = (unsigned long) call | RM; + to_rm(id,&msg); +} + +/*****************************************************************************/ +/* Demultiplexing with magic number: caller - called - rm */ +/*****************************************************************************/ +CALL *demux_in(unsigned long *srce, struct atmsvc_msg *msg) +{ + /* The multiplexing informations are in the 3 least significant bits + of the call pointer. We can do this, because the compiler aligns + memory reservation to pointers with 3 ls-bits = 0. + */ + CALL *call; + + if ((msg->type == as_identify) || (msg->type == as_indicate)) { + call = (struct _call *) (msg->listen_vcc); + *srce = CALLER; + return call; + } /* all identify msgs come from a listening call */ + else { + call = (struct _call *) (msg->vcc & ~3); + *srce = (unsigned long) (msg->vcc & 3); + return call; + } +} + +/*****************************************************************************/ +/* Debugging functions */ +/*****************************************************************************/ +void print_msg(struct atmsvc_msg *msg, CALL *call,unsigned long source) { + + printf("Msg '%s' received from %s vcc=%ld for call 0x%p, listen: %ld\n", + as_msgs[msg->type], sources[source], msg->vcc, call, + msg->listen_vcc); +} +void print_state(CALL *call) { + printf(" Call 0x%p entered state '%s'\n", + call , cs_states[call->state]); +} +void print_call(CALL *call) { + printf(" Call 0x%p in state %s, caller-id:%ld, called-id:%ld\n", + call, cs_states[call->state], + call->in.id, call->out.id); +} diff -ur --new-file old/atm/switch/proto.h new/atm/switch/proto.h --- old/atm/switch/proto.h Thu Jan 1 01:00:00 1970 +++ new/atm/switch/proto.h Mon Mar 23 11:02:37 1998 @@ -0,0 +1,88 @@ +/* proto.h - Common protocol functions and structures */ + +/* Written 1997-1998 by Roman Pletka, EPFL SSC */ +/* Modified 1998 by Werner Almesberger, EPFL ICA */ + +#ifndef PROTO_H +#define PROTO_H + +#define CALLER 0 /* We add this to the call pointer. It */ +#define CALLED 1 /* helps us to find out the source of the */ +#define RM 2 /* message. */ + +#include + +#include "atmsap.h" +#include "atmd.h" + + +typedef enum { /* call states */ + cs_invalid, cs_null, cs_listening, + cs_connected, cs_indicated, cs_called_accepted, + cs_rm_accepted, cs_rm_accepted2, cs_caller_error, + cs_rejected, cs_rejected2, cs_caller_closing, + cs_called_closed, cs_called_closed2, cs_free_rm, + cs_rejecting, cs_will_close, cs_call_indicated, + cs_caller_closed + +} STATE; + +typedef struct _party { + unsigned long id; + struct sockaddr_atmpvc pvc; /* itf and CI */ + struct sockaddr_atmsvc svc; /* remote address */ + struct atm_qos qos; /* QOS parameters */ +} PARTY; + +typedef struct _call { + STATE state; + unsigned long caller_id,called_id; /* file descriptors to pipes */ + PARTY in; /* caller data */ + PARTY out; /* called data */ + + struct atm_sap sap; /* SAP (BHLI and BLLI) */ + + int error; /* error code for close */ + /* --- switch fabric control data -------------------------------------- */ + void *fab; + /* --- some meta-information ------------------------------------------- */ + struct _call *next; /* next call (for debugging) */ + struct _call *listen; /* pointer to corresponding listening + "call" (more like a socket) */ +} CALL; + +/* + * Note that the linked list is not properly maintained and serves mainly + * debugging purposes. + */ + + +#define SEND_ERROR(vcc,code) \ + send_sigd(vcc,0L,as_error,code,NULL,NULL,NULL,NULL,NULL) + +void send_sigd(unsigned long vcc,unsigned long listen_vcc, + enum atmsvc_msg_type type,int reply,const struct sockaddr_atmpvc *pvc, + const struct sockaddr_atmsvc *svc,const struct sockaddr_atmsvc *local, + const struct atm_sap *sap,const struct atm_qos *qos); +void send_identify(CALL *call); +void send_listen(void); +void send_connect(CALL *call); +void send_reject(CALL *call, int err_code); +void send_reject_not_id(CALL *call, int err_code); +void send_close(CALL *call,int dest); +void send_accept(CALL *call); + +CALL *new_call(unsigned long id); +void free_call(CALL *call); +void new_state(CALL *call,STATE state); + +void send_free_rm(long id, CALL *call); + +CALL *demux_in(unsigned long *srce, struct atmsvc_msg *msg); + +/* some debugging functions */ +void print_msg(struct atmsvc_msg *msg, CALL *call,unsigned long source); +void print_state(CALL *call); +void print_call(CALL *call); + +#endif diff -ur --new-file old/atm/switch/relay.c new/atm/switch/relay.c --- old/atm/switch/relay.c Thu Jan 1 01:00:00 1970 +++ new/atm/switch/relay.c Mon Mar 23 10:58:35 1998 @@ -0,0 +1,386 @@ +/* switch.c - Handles signaling an ATM switch */ + +/* Written 1997-1998 by Roman Pletka, EPFL SSC */ +/* Modified 1998 by Werner Almesberger, EPFL ICA */ + + +#include /* perror */ +#include +#include /* select,open */ +#include +#include /* open */ +#include /* open */ +#include /* select */ +#include /* select */ + +#include "io.h" +#include "proto.h" + +/*#include "atmsvc.h"*/ + + + +#define MAX_ITF 10 /* limit max number of interfaces */ + +static int in,out[MAX_ITF],rm; + + + +static void from_sigd(struct atmsvc_msg *msg) +{ + CALL *call; + CALL *old_call; + unsigned long source; + + /* Choose right call and source (caller/called/rm)*/ + call = demux_in(&source, msg); + print_msg(msg,call,source); + print_call(call); + + switch (call->state) { + case cs_null: + if (source == CALLER) { + switch(msg->type) { + case as_okay: /* enter cs_listening state */ + new_state(call,cs_listening); + break; + case as_error: /* sigd says "no" */ + printf("sigd not ready for listening\n"); + /* kill the listening "call" ??!! */ + break; + default: + printf("Error: Socket\n"); + abort(); + break; + } + } + break; + case cs_listening: + if (source == CALLER && msg->type == as_indicate) { + /* now work starts... */ + old_call = call; + call = new_call(old_call->in.id); /* fd to out pipe */ + /* save data in call: pvc,local,qos,sap */ + call->in.pvc = msg->pvc; /* maybe it's in the msg */ + call->in.qos = msg->qos; + call->out.svc = msg->local; + call->in.svc = msg->svc; + call->sap = msg->sap; + call->listen = old_call; + + msg->vcc = msg->listen_vcc; + /* ask for vci,vpi... */ + msg->vcc = (unsigned long) call | RM; /* some kind of magic... */ + to_rm(rm,msg); /* forwards indicate as it is */ + new_state(call,cs_indicated); + } + else { + if (msg->type == as_close) { + /* close the listening "call" */ + send_close(call, CALLER); + new_state(call, cs_will_close); + } + } + break; + case cs_indicated: + if (source == RM) { + switch(msg->type) { + case as_okay: + /* find fd/itf->out.id for called from msg */ + call->out.id = out[msg->pvc.sap_addr.itf]; + call->out.pvc = call->in.pvc = msg->pvc; /* @@@@ hmm, that looks wrong*/ + /* send connect to called and enter state cs_rm_accepted */ + send_identify(call); + send_connect(call); + new_state(call,cs_rm_accepted); + break; + case as_error: + /* send as_reject to caller + and enter state cs_invalid */ + send_reject_not_id(call,msg->reply); + new_state(call,cs_invalid); + free_call(call); + break; + default: + abort(); + break; + } + } + else { + printf("Error: in state cs_indicated. Msg from %ld != RM expected.\n", + source); + abort(); + } + break; + case cs_rm_accepted: + if (source == CALLED) { + switch(msg->type) { + case as_okay: + /* send claim */ + msg->vcc = (unsigned long) call | RM; /* some kind of magic... */ + /* save msg content in call */ + call->out.qos = msg->qos; + to_rm(rm,msg); /* claim ??!! */ + new_state(call,cs_called_accepted); + break; + case as_error: + send_reject(call,msg->reply); + new_state(call,cs_invalid); + free_call(call); + break; + default: + abort(); + break; + } + } + else { + printf("Error: in state cs_rm_accepted. " + "Msg from %ld != CALLED expected.\n", + source); + abort(); + } + break; + case cs_rm_accepted2: + /* msg from: caller(error,okay) or called(close) */ + switch (source) { + case CALLER: + switch(msg->type) { + case as_okay: /* complete the call */ + new_state(call, cs_connected); + break; + case as_error: + /* send close called */ + send_close(call, CALLED); + new_state(call, cs_caller_error); + break; + default: + abort(); + break; + } + break; + case CALLED: + if (msg->type == as_close) { + /* send close to called */ + send_close(call, CALLED); + new_state(call, cs_called_closed); + } + else abort(); + break; + default: + abort(); + break; + } + break; + case cs_rejected: + /* wait for close msg from called */ + if (source == CALLED) { + if (msg->type == as_close){ + new_state(call,cs_invalid); + free_call(call); + } + } + else abort(); + /* else error */ + break; + case cs_called_accepted: + if (source == CALLED) { + if (msg->type == as_close){ + /* send reject to caller and send close to called */ + send_reject(call, msg->reply); + send_close(call,CALLED); + new_state(call,cs_rejecting); + } + } + if (source == RM) { + switch(msg->type) { + case as_okay: + /* send accept to caller */ + send_accept(call); + new_state(call,cs_rm_accepted2); + break; + case as_error: + /* send reject to caller and close to called */ + send_reject(call,msg->reply); + send_close(call,CALLED); + new_state(call, cs_rejected); + break; + default: + abort(); + break; + } + } + break; + case cs_connected: + if (msg->type == as_close) { + if (source == CALLER) { + send_close(call, CALLER); + send_close(call, CALLED); + new_state(call, cs_caller_closed); + } + else if (source == CALLED) { + send_close(call, CALLER); + send_close(call, CALLED); + new_state(call, cs_called_closed2); + } + } + /* else error */ + else abort(); + break; + case cs_rejecting: + if (source == RM ) { + switch(msg->type) { + case as_error: + free_call(call); + break; + case as_okay: + /* free resources */ + send_free_rm(rm,call); + new_state(call, cs_free_rm); + break; + default: + abort(); + break; + } + } + break; + case cs_called_closed: + if (source == CALLER) { + switch(msg->type) { + case as_error: + send_free_rm(rm, call); + new_state(call, cs_free_rm); + break; + case as_okay: + send_close(call, CALLER); + new_state(call, cs_caller_closing); + break; + default: + abort(); + break; + } + } + case cs_called_closed2: + if (source == CALLER && msg->type == as_close) { + send_free_rm(rm, call); + new_state(call, cs_free_rm); + } + /* else error */ + break; + case cs_caller_error: + if (source == CALLED && msg->type == as_close) { + send_free_rm(rm, call); + new_state(call, cs_free_rm); + break; + } + case cs_caller_closing: + if (source == CALLER && msg->type == as_close) { + send_free_rm(rm, call); + new_state(call, cs_free_rm); + } + else abort(); + break; + case cs_caller_closed: + if (source == CALLED && msg->type == as_close) { + send_free_rm(rm, call); + new_state(call, cs_free_rm); + } + else abort(); + /* else error */ + break; + case cs_free_rm: + if (source == RM) { + switch(msg->type) { + case as_error: + free_call(call); + printf("Error: RM couldn't free resources\n"); + break; + case as_okay: + free_call(call); + break; + default: + abort(); + break; + } + } + else abort(); + break; + case cs_will_close: + if (source == CALLER) { + switch (msg->type) { + case as_close: + free_call(call); + break; + case as_indicate: + send_reject_not_id(call, 0); + new_state(call, cs_call_indicated); + free_call(call); + break; + default: + abort(); + break; + } + } + break; + default: + abort(); + break; + } +} + +/*****************************************************************************/ +/* M A I N */ +/*****************************************************************************/ + +int main(int argc, char *argv[]) +{ + static unsigned char buffer[sizeof(struct atmsvc_msg)]; + int nb_itf; + int i; + + if (argc < 5) { + printf("Usage: %s in rm [out1 out_2 ...]\n",argv[0]); + exit(1); + } + if ((argc+1) > MAX_ITF) { + printf("%s: Too many interfaces (%d > %d)",argv[0],argc-1,MAX_ITF); + exit(1); + } + + nb_itf = argc-3; + + /* open all pipes and send listen */ + if ((in = open(argv[1],O_RDWR)) < 0) { /* actually read-only */ + perror(argv[1]); + return 1; + } + if ((rm = open(argv[2],O_RDWR)) < 0) { /* actually read-only */ + perror(argv[2]); + return 1; + } + + for(i=0;i