diff -ur --new-file old/atm/BUGS new/atm/BUGS --- old/atm/BUGS Fri Nov 6 16:36:58 1998 +++ new/atm/BUGS Sat Dec 5 01:40:57 1998 @@ -1,6 +1,10 @@ -Known bugs and restrictions in version 0.51 +Known bugs and restrictions in version 0.52 =========================================== + - ENI driver: closing an AAL0 socket while data is arriving at a high rate + hangs in the close system call + - mpcd: adds an MPOA Egress Cache Tag Extension in the MPOA Cache Imposition + Replies it sends even if the extension is missing from the incoming Request - ANS: libresolve conflicts with libc on some systems - ENI driver loses synchronization on some systems, leading to panics or hung VCs (these may be two distinct problems) diff -ur --new-file old/atm/CHANGES new/atm/CHANGES --- old/atm/CHANGES Fri Nov 6 16:36:22 1998 +++ new/atm/CHANGES Sat Dec 5 01:44:40 1998 @@ -1,3 +1,31 @@ +Version 0.51 to 0.52 (5-DEC-1998) +==================== + +Bug fixes +--------- + + - atmsigd crashed when receiving STATUS ENQUIRY for call in Null state + (reported by Heikki Vatiainen) + - outbound endpoint reference didin't have the 16th bit toggled (fixed by + Andrew Lunn) + - lec.c: fixed a bug in kernel which could cause kernel part to deadlock when + signalling was not started successfully (by Heikki Vatiainen) + - MPOA: bug fixes and other changes, see atm/mpoa/CHANGELOG (by Heikki + Vatiainen) + +New features +------------ + + - LANE: both kernel & daemon: support for ELANs which have MTUs greater than + 1516 (by Eric H. Kinzie) + - MPOA: can now ask LECS for configuratino information (by Heikki Vatiainen) + +Other changes +------------- + + - zeppelin.8: updated (Heikki Vatiainen) + + Version 0.50 to 0.51 (6-NOV-1998) ==================== diff -ur --new-file old/atm/README new/atm/README --- old/atm/README Fri Nov 6 16:36:27 1998 +++ new/atm/README Sat Dec 5 01:27:05 1998 @@ -1,4 +1,4 @@ -ATM on Linux, release 0.51 (alpha) by Werner Almesberger, EPFL ICA +ATM on Linux, release 0.52 (alpha) by Werner Almesberger, EPFL ICA ============================================== Werner.Almesberger@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 Nov 6 16:37:41 1998 +++ new/atm/USAGE Sat Dec 5 01:58:08 1998 @@ -1,4 +1,4 @@ -Usage instructions - ATM on Linux, release 0.51 +Usage instructions - ATM on Linux, release 0.52 ------------------------------------------------- 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.51.tar.gz + ftp://lrcftp.epfl.ch/pub/linux/atm/dist/atm-0.52.tar.gz - the Linux kernel, version 2.1.126, e.g. from ftp://ftp.kernel.org/pub/linux/kernel/v2.1/linux-2.1.126.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.51.tar.gz +tar xfz atm-0.52.tar.gz and the kernel source: diff -ur --new-file old/atm/VERSION new/atm/VERSION --- old/atm/VERSION Thu Nov 5 18:26:42 1998 +++ new/atm/VERSION Sat Dec 5 01:27:00 1998 @@ -1 +1 @@ -0.51 +0.52 diff -ur --new-file old/atm/atm.patch new/atm/atm.patch --- old/atm/atm.patch Tue Nov 3 18:56:14 1998 +++ new/atm/atm.patch Sat Dec 5 01:58:02 1998 @@ -14524,8 +14524,8 @@ +}; +#endif /* _ATMLEC_H_ */ --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/include/linux/atmmpc.h Sun Nov 1 15:31:53 1998 -@@ -0,0 +1,99 @@ ++++ work/include/linux/atmmpc.h Sat Dec 5 01:45:34 1998 +@@ -0,0 +1,124 @@ +#ifndef _ATMMPC_H_ +#define _ATMMPC_H_ + @@ -14565,6 +14565,15 @@ + uint16_t holding_time; +} eg_ctrl_info; + ++struct mpc_parameters{ ++ uint16_t mpc_p1; /* Shortcut-Setup Frame Count */ ++ uint16_t mpc_p2; /* Shortcut-Setup Frame Time */ ++ uint8_t mpc_p3[8]; /* Flow-detection Protocols */ ++ uint16_t mpc_p4; /* MPC Initial Retry Time */ ++ uint16_t mpc_p5; /* MPC Retry Time Maximum */ ++ uint16_t mpc_p6; /* Hold Down Time */ ++}; ++ +struct k_message{ + uint16_t type; + uint32_t ip_mask; @@ -14572,6 +14581,7 @@ + union { + in_ctrl_info in_info; + eg_ctrl_info eg_info; ++ struct mpc_parameters params; + } content; + struct atm_qos qos; +} k_message; @@ -14584,6 +14594,16 @@ + uint8_t type[2]; /* Ether type (for IP) (0x0800) */ +}; + ++/* TLVs this MPC recognizes */ ++#define TLV_MPOA_DEVICE_TYPE 0x00a03e2a ++ ++/* MPOA device types in MPOA Device Type TLV */ ++#define NON_MPOA 0 ++#define MPS 1 ++#define MPC 2 ++#define MPS_AND_MPC 3 ++ ++ +/* MPC parameter defaults */ + +#define MPC_P1 10 /* Shortcut-Setup Frame Count */ @@ -14603,11 +14623,11 @@ + +#define SND_MPOA_RES_RQST 201 +#define SET_MPS_CTRL_ADDR 202 -+#define SND_MPOA_RES_RTRY 203 /* Different type in a retry due to req id.*/ ++#define SND_MPOA_RES_RTRY 203 /* Different type in a retry due to req id */ +#define STOP_KEEP_ALIVE_SM 204 +#define EGRESS_ENTRY_REMOVED 205 +#define SND_EGRESS_PURGE 206 -+#define DIE 207 ++#define DIE 207 /* tell the daemon to exit() */ +#define DATA_PLANE_PURGE 208 /* Data plane purge because of egress cache hit miss or dead MPS */ +#define OPEN_INGRESS_SVC 209 + @@ -14619,10 +14639,15 @@ +#define EGRESS_PURGE_RCVD 104 +#define MPS_DEATH 105 +#define CACHE_IMPOS_RCVD 106 -+#define SET_MPC_CTRL_ADDR 107 /* Our MPC's control ATM address */ ++#define SET_MPC_CTRL_ADDR 107 /* Our MPC's control ATM address */ +#define SET_MPS_MAC_ADDR 108 +#define CLEAN_UP_AND_EXIT 109 -+ ++#define SET_MPC_PARAMS 110 /* MPC configuration parameters */ ++ ++/* Message types - bidirectional */ ++ ++#define RELOAD 301 /* kill -HUP the daemon for reload */ ++ +#endif /* _ATMMPC_H_ */ + --- /dev/null Tue Jan 1 05:00:00 1980 @@ -17969,8 +17994,8 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/lec.c Tue Nov 3 18:41:56 1998 -@@ -0,0 +1,2043 @@ ++++ work/net/atm/lec.c Sat Dec 5 01:49:36 1998 +@@ -0,0 +1,2054 @@ +/* + * lec.c: Lan Emulation driver + * Marko Kiiskila carnil@cs.tut.fi @@ -18093,6 +18118,7 @@ + if (!priv->lecd) { + printk("%s:No lecd attached\n",dev->name); + priv->stats.tx_errors++; ++ dev->tbusy = 1; + return -EUNATCH; + } + if (dev->tbusy) { @@ -18541,6 +18567,15 @@ + return 0; +} + ++/* shamelessly stolen from drivers/net/net_init.c */ ++static int lec_change_mtu(struct device *dev, int new_mtu) ++{ ++ if ((new_mtu < 68) || (new_mtu > 18190)) ++ return -EINVAL; ++ dev->mtu = new_mtu; ++ return 0; ++} ++ +static int +lec_init(struct device *dev) +{ @@ -18551,6 +18586,7 @@ + memset(dev->priv,0,sizeof(struct lec_priv)); + + ether_setup(dev); ++ dev->change_mtu = lec_change_mtu; + dev->hard_header = lec_hard_header; + dev->rebuild_header = lec_rebuild_header; + dev->hard_header_cache = NULL; @@ -20278,8 +20314,8 @@ + +#endif --- /dev/null Tue Jan 1 05:00:00 1980 -+++ work/net/atm/mpc.c Sun Nov 1 15:31:53 1998 -@@ -0,0 +1,1485 @@ ++++ work/net/atm/mpc.c Sat Dec 5 01:50:04 1998 +@@ -0,0 +1,1519 @@ +#include <linux/kernel.h> +#include <linux/string.h> +#include <linux/timer.h> @@ -20338,11 +20374,13 @@ +static void ingress_purge_rcvd(struct k_message *msg, struct mpoa_client *mpc); +static void egress_purge_rcvd(struct k_message *msg, struct mpoa_client *mpc); +static void mps_death(struct k_message *msg, struct mpoa_client *mpc); -+static void clean_up(struct k_message *msg, struct mpoa_client *mpc); ++static void clean_up(struct k_message *msg, struct mpoa_client *mpc, int action); +static void MPOA_cache_impos_rcvd(struct k_message *msg, struct mpoa_client *mpc); +static void set_mpc_ctrl_addr_rcvd(struct k_message *mesg, struct mpoa_client *mpc); +static void set_mps_mac_addr_rcvd(struct k_message *mesg, struct mpoa_client *mpc); + ++static uint8_t *copy_macs(struct mpoa_client *mpc, uint8_t *router_mac, ++ uint8_t *tlvs, uint8_t mps_macs, uint8_t device_type); +static void purge_egress_shortcut(struct atm_vcc *vcc, eg_cache_entry *entry); + +static void send_set_mps_ctrl_addr(char *addr, struct mpoa_client *mpc); @@ -20630,7 +20668,7 @@ +} + +/* -+ * lec device calls this via its dev->priv->lan2_ops->associate_indicator() ++ * lec device calls this via its dev->priv->lane2_ops->associate_indicator() + * when it sees a TLV in LE_ARP packet. + * We fill in the pointer above when we see a LANE2 lec initializing + * See LANE2 spec 3.1.5 @@ -20665,37 +20703,6 @@ + printk("mpoa: (%s) lane2_assoc_ind: TLV type was 0, returning\n", dev->name); + return; + } -+ /* Sampo-Add: start */ -+ switch(type){ -+ case TLV_SC_SETUP_FRAME_COUNT: -+ mpc->parameters.mpc_p1 = (*(tlvs+1)<<8) | (*tlvs); -+ printk("mpoa: lane2_assoc_ind(): MPC_p1 = %d\n",mpc->parameters.mpc_p1); -+ break; -+ case TLV_SC_SETUP_FRAME_TIME: -+ mpc->parameters.mpc_p2 = (*(tlvs+1)<<8) | (*tlvs); -+ printk("mpoa: lane2_assoc_ind(): MPC_p2 = %d\n",mpc->parameters.mpc_p2); -+ break; -+ case TLV_FLOW_DETECTION_PROTOCOLS: -+ memcpy(mpc->parameters.mpc_p3, tlvs, length); -+ printk("mpoa: lane2_assoc_ind(): MPC_p3 = %s\n",mpc->parameters.mpc_p3); -+ break; -+ case TLV_MPC_ININTIAL_RETRY_TIME: -+ mpc->parameters.mpc_p4 = (*(tlvs+1)<<8) | (*tlvs); -+ printk("mpoa: lane2_assoc_ind(): MPC_p4 = %d\n",mpc->parameters.mpc_p4); -+ break; -+ case TLV_MPC_RETRY_TIME_MAXIMUM: -+ mpc->parameters.mpc_p5 = (*(tlvs+1)<<8) | (*tlvs); -+ printk("mpoa: lane2_assoc_ind(): MPC_p5 = %d\n",mpc->parameters.mpc_p5); -+ break; -+ case TLV_HOLD_DOWN_TIME: -+ mpc->parameters.mpc_p6 = (*(tlvs+1)<<8) | (*tlvs); -+ printk("mpoa: lane2_assoc_ind(): MPC_p6 = %d\n",mpc->parameters.mpc_p6); -+ break; -+ default: -+ break; -+ -+ } -+ /* Sampo-Add: end */ + + if (type != TLV_MPOA_DEVICE_TYPE) { + tlvs += length; @@ -20730,25 +20737,8 @@ + /* ok, now we can go and tell our daemon the control address of MPS */ + send_set_mps_ctrl_addr(tlvs, mpc); + -+ tlvs += 20; if (mpoa_device_type == MPS_AND_MPC) tlvs += 20; -+ /* collect the MPS MAC addresses */ -+ if (mpc->number_of_mps_macs < number_of_mps_macs) { -+ kfree(mpc->mps_macs); /* need more space */ -+ mpc->mps_macs = kmalloc(number_of_mps_macs*ETH_ALEN, GFP_KERNEL); -+ if (mpc->mps_macs == NULL) { -+ printk("mpoa: (%s) lane2_assoc_ind: out of mem\n", dev->name); -+ return; -+ } -+ } -+ -+ /* be careful not to zero out any command line MACs */ -+ if (number_of_mps_macs > 0) { -+ mpc->number_of_mps_macs = number_of_mps_macs; -+ while (number_of_mps_macs > 0) { -+ memcpy(mpc->mps_macs, tlvs, ETH_ALEN); -+ tlvs += ETH_ALEN; number_of_mps_macs--; -+ } -+ } ++ tlvs = copy_macs(mpc, mac_addr, tlvs, number_of_mps_macs, mpoa_device_type); ++ if (tlvs == NULL) return; + } + if (end_of_tlvs - tlvs != 0) + printk("mpoa: (%s) lane2_assoc_ind: ignoring %d bytes of trailing TLV carbage\n", @@ -20756,6 +20746,41 @@ + return; +} + ++/* ++ * store either advertizing router's MAC address ++ * or the MAC address(es) in this TLV ++ */ ++static uint8_t *copy_macs(struct mpoa_client *mpc, uint8_t *router_mac, ++ uint8_t *tlvs, uint8_t mps_macs, uint8_t device_type) ++{ ++ int num_macs; ++ num_macs = (mps_macs > 1) ? mps_macs : 1; ++ ++ if (mpc->number_of_mps_macs != num_macs) { ++ kfree(mpc->mps_macs); ++ mpc->number_of_mps_macs = num_macs; ++ mpc->mps_macs = kmalloc(num_macs*ETH_ALEN, GFP_KERNEL); ++ if (mpc->mps_macs == NULL) { ++ printk("mpoa: (%s) copy_macs: out of mem\n", mpc->dev->name); ++ return NULL; ++ } ++ } ++ ++ /* copy the advertizing routers MAC address */ ++ memcpy(mpc->mps_macs, router_mac, ETH_ALEN); ++ ++ tlvs += 20; if (device_type == MPS_AND_MPC) tlvs += 20; ++ /* ++ * collect the MPS MAC addresses. ++ * however, it is possible that TLV includes no MACs ++ */ ++ if (mps_macs > 0) ++ memcpy(mpc->mps_macs, tlvs, mps_macs*ETH_ALEN); ++ tlvs += mps_macs*ETH_ALEN; ++ ++ return tlvs; ++} ++