This file contains post-release ERRATA for altq-2.1. Currently 2 problems are listed. 1. rsvpd dies at cbq_modifyflow() (2000/01/22) 2. CBQ outage in a long run (2000/01/29) 1. rsvpd dies at cbq_modifyflow() (2000/01/22) Problem description: a pointer (cbq_clinfo) is not initialized in cbq_modifyflow() in rsvpd-kit/tc_altq.c. (only affects rsvpd) Solution: Appy the following patch to rsvpd-kit/tc_altq.c. problem report by Xin Wang --- /src/kjc/altq-2.1/rsvpd-kit/tc_altq.c Tue Dec 28 21:09:46 1999 +++ tc_altq.c Sat Jan 22 19:44:23 2000 @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: tc_altq.c,v 1.2 1999/12/28 11:55:27 kjc Exp $ + * $Id: tc_altq.c,v 1.3 2000/01/22 19:42:37 kjc Exp kjc $ */ /************************ tc_altq.c ********************************* @@ -644,6 +644,7 @@ return (QOPERR_ADMISSION_NOSVC); } + cbq_clinfo = tch->ifinfo->resv_class->private; error = qop_cbq_modify_class(tch->clinfo, cbq_clinfo->class_spec.priority, bandwidth, 2. CBQ outage in a long run (2000/01/29) CBQ experiences outage (stop sending packets) in a long stress test. The outage period varies from a few minutes to a few hours and that the router will recover for a varying periods of time. Problem description: Somehow, the kernel timer expires earlier than the expected time under certain conditions (the cause of this phenomenon is not known). When this happens, a resumed class could get suspended immediately after its resume for another offtime. Solution: Add a workaround that clears undertime when a class is resumed. Appy the following patch to sys-sltq/altq/altq_rmclass.c. problem report by George Uhl in [altq-120] Karl Pielorz --- altq_rmclass.c.orig Fri Jan 28 21:30:57 2000 +++ altq_rmclass.c Sat Jan 29 17:11:09 2000 @@ -913,6 +913,7 @@ UNTIMEOUT((timeout_t *)rmc_restart, cl, cl->callout_handle); cl->sleeping_ = 0; + cl->undertime_.tv_sec = 0; return (1); } @@ -1085,6 +1086,7 @@ if (cl->sleeping_) UNTIMEOUT((timeout_t *)rmc_restart, cl, cl->callout_handle); cl->sleeping_ = 0; + cl->undertime_.tv_sec = 0; #endif ifd->borrowed_[ifd->qi_] = cl->borrow_; ifd->cutoff_ = cl->borrow_->depth_; @@ -1203,6 +1205,7 @@ if (cl->sleeping_) UNTIMEOUT((timeout_t *)rmc_restart, cl, cl->callout_handle); cl->sleeping_ = 0; + cl->undertime_.tv_sec = 0; #endif ifd->borrowed_[ifd->qi_] = cl->borrow_; ifd->cutoff_ = cl->borrow_->depth_; @@ -1606,6 +1609,7 @@ s = splimp(); if (cl->sleeping_) { cl->sleeping_ = 0; + cl->undertime_.tv_sec = 0; if (ifd->queued_ < ifd->maxqueued_) { CBQTRACE(rmc_restart, 'trts', cl->stats_.handle);