diff -ur --new-file old/linux/include/linux/atmdev.h new/linux/include/linux/atmdev.h --- old/linux/include/linux/atmdev.h Fri Feb 19 23:05:23 1999 +++ new/linux/include/linux/atmdev.h Fri Feb 19 23:06:07 1999 @@ -1,6 +1,6 @@ -/* atmdev.h - ATM device driver declarations */ +/* atmdev.h - ATM device driver declarations and various related items */ -/* Written 1995-1998 by Werner Almesberger, EPFL LRC/ICA */ +/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */ #ifndef LINUX_ATMDEV_H @@ -104,6 +104,20 @@ #define ATM_MF_SET (ATM_MF_INC_RSV | ATM_MF_INC_SHP | ATM_MF_DEC_RSV | \ ATM_MF_DEC_SHP | ATM_MF_BWD) +/* + * ATM_VS_* are used to express VC state in a human-friendly way. + */ + +#define ATM_VS_IDLE 0 /* VC is not used */ +#define ATM_VS_CONNECTED 1 /* VC is connected */ +#define ATM_VS_CLOSING 2 /* VC is closing */ +#define ATM_VS_LISTEN 3 /* VC is listening for incoming setups */ +#define ATM_VS_INUSE 4 /* VC is in use (registered with atmsigd) */ +#define ATM_VS_BOUND 5 /* VC is bound */ + +#define ATM_VS2TXT_MAP \ + "IDLE", "CONNECTED", "CLOSING", "LISTEN", "INUSE", "BOUND" + #ifdef __KERNEL__ @@ -148,6 +162,13 @@ #define ATM_VF_SESSION 4096 /* VCC is p2mp session control descriptor */ #define ATM_VF_HASSAP 8192 /* SAP has been set */ #define ATM_VF_CLOSE 32768 /* asynchronous close - treat like VF_RELEASED*/ + +#define ATM_VF2VS(flags) \ + ((flags) & ATM_VF_READY ? ATM_VS_CONNECTED : \ + (flags) & ATM_VF_RELEASED ? ATM_VS_CLOSING : \ + (flags) & ATM_VF_LISTEN ? ATM_VS_LISTEN : \ + (flags) & ATM_VF_REGIS ? ATM_VS_INUSE : \ + (flags) & ATM_VF_BOUND ? ATM_VS_BOUND : ATM_VS_IDLE) #define ATM_DF_CLOSE 1 /* close device when last VCC is closed */ diff -ur --new-file old/linux/include/linux/pkt_sched.h new/linux/include/linux/pkt_sched.h --- old/linux/include/linux/pkt_sched.h Fri Feb 19 23:05:23 1999 +++ new/linux/include/linux/pkt_sched.h Fri Feb 19 23:06:08 1999 @@ -282,9 +282,10 @@ TCA_ATM_PTR, /* pointer to descriptor - later */ TCA_ATM_HDR, /* LL header */ TCA_ATM_EXCESS, /* excess traffic class (0 for CLP) */ - TCA_ATM_ADDR /* PVC address (for output only) */ + TCA_ATM_ADDR, /* PVC address (for output only) */ + TCA_ATM_STATE /* VC state (ATM_VS_*; for output only) */ }; -#define TCA_ATM_MAX TCA_ATM_ADDR +#define TCA_ATM_MAX TCA_ATM_STATE #endif diff -ur --new-file old/linux/net/atm/lec.c new/linux/net/atm/lec.c --- old/linux/net/atm/lec.c Fri Feb 19 23:05:23 1999 +++ new/linux/net/atm/lec.c Fri Feb 19 23:06:08 1999 @@ -990,9 +990,9 @@ #if 0 /* August 6, 1998 */ entry->vcc->flags |= ATM_VF_RELEASED; entry->vcc->flags &= ~ATM_VF_READY; - atm_async_release_vcc(entry->vcc, -EPIPE); -#endif entry->vcc->push(entry->vcc, NULL); +#endif + atm_async_release_vcc(entry->vcc, -EPIPE); entry->vcc = NULL; } if (entry->recv_vcc) { @@ -1000,9 +1000,9 @@ #if 0 entry->recv_vcc->flags |= ATM_VF_RELEASED; entry->recv_vcc->flags &= ~ATM_VF_READY; - atm_async_release_vcc(entry->recv_vcc, -EPIPE); -#endif entry->recv_vcc->push(entry->recv_vcc, NULL); +#endif + atm_async_release_vcc(entry->recv_vcc, -EPIPE); entry->recv_vcc = NULL; } } @@ -1771,6 +1771,11 @@ entry->old_recv_push = old_push; #endif entry = make_entry(priv, bus_mac); + if (entry == NULL) { + lec_arp_unlock(priv); + return; + } + del_timer(&entry->timer); memcpy(entry->atm_addr, ioc_data->atm_addr, ATM_ESA_LEN); entry->recv_vcc = vcc; entry->old_recv_push = old_push; @@ -1828,9 +1833,6 @@ entry->recv_vcc?entry->recv_vcc->vci:0); found_entry=1; del_timer(&entry->timer); - if (entry->vcc) { - lec_arp_clear_vccs(entry); - } entry->vcc = vcc; entry->old_push = old_push; if (entry->status == ESI_VC_PENDING) { @@ -1931,8 +1933,10 @@ lec_arp_lock(priv); to_add = make_entry(priv, mac_addr); - if (!to_add) + if (!to_add) { + lec_arp_unlock(priv); return -ENOMEM; + } memcpy(to_add->atm_addr, vcc->remote.sas_addr.prv, ATM_ESA_LEN); to_add->status = ESI_FORWARD_DIRECT; to_add->flags |= LEC_PERMANENT_FLAG; diff -ur --new-file old/linux/net/atm/proc.c new/linux/net/atm/proc.c --- old/linux/net/atm/proc.c Fri Feb 19 23:05:23 1999 +++ new/linux/net/atm/proc.c Fri Feb 19 23:06:08 1999 @@ -1,6 +1,6 @@ /* net/atm/proc.c - ATM /proc interface */ -/* Written 1995-1998 by Werner Almesberger, EPFL LRC/ICA */ +/* Written 1995-1999 by Werner Almesberger, EPFL LRC/ICA */ /* * The mechanism used here isn't designed for speed but rather for convenience @@ -273,12 +273,9 @@ static const char *vcc_state(struct atm_vcc *vcc) { - if (vcc->flags & ATM_VF_READY) return "CONNECTED"; - if (vcc->flags & ATM_VF_RELEASED) return "CLOSING"; - if (vcc->flags & ATM_VF_LISTEN) return "LISTEN"; - if (vcc->flags & ATM_VF_REGIS) return "INUSE"; - if (vcc->flags & ATM_VF_BOUND) return "BOUND"; - return "IDLE"; + static const char *map[] = { ATM_VS2TXT_MAP }; + + return map[ATM_VF2VS(vcc->flags)]; } diff -ur --new-file old/linux/net/sched/sch_atm.c new/linux/net/sched/sch_atm.c --- old/linux/net/sched/sch_atm.c Fri Feb 19 23:05:23 1999 +++ new/linux/net/sched/sch_atm.c Fri Feb 19 23:06:08 1999 @@ -1,6 +1,6 @@ /* net/sched/sch_atm.c - ATM VC selection "queueing discipline" */ -/* Written 1998 by Werner Almesberger, EPFL ICA */ +/* Written 1998,1999 by Werner Almesberger, EPFL ICA */ #include @@ -527,12 +527,15 @@ RTA_PUT(skb,TCA_ATM_HDR,flow->hdr_len,flow->hdr); if (flow->vcc) { struct sockaddr_atmpvc pvc; + int state; pvc.sap_family = AF_ATMPVC; pvc.sap_addr.itf = flow->vcc->dev ? flow->vcc->dev->number : -1; pvc.sap_addr.vpi = flow->vcc->vpi; pvc.sap_addr.vci = flow->vcc->vci; RTA_PUT(skb,TCA_ATM_ADDR,sizeof(pvc),&pvc); + state = ATM_VF2VS(flow->vcc->flags); + RTA_PUT(skb,TCA_ATM_STATE,sizeof(state),&state); } if (flow->excess) RTA_PUT(skb,TCA_ATM_EXCESS,sizeof(u32),&flow->classid); .