This file contains post-release ERRATA for altq-1.2. Currently 1 problem is listed. 1. mrouted fails for an ATM subinterface (1999/5/22) Problem description: A multicast-capable interface should accept SIOCSIFFLAGS, SIOCADDMULTI and SIOCDELMULTI ioctls. (mrouted uses these ioctls.) Solution: Appy the following patch to sys-altq/dev/en/midway.c. There are 2 versions; one for 3.1/3.2 and the other for 2.2.8. (the 2 versions were slightly out-of-sync so that the patch also tries to sync the difference.) ------------------------------------------------------------------------ patch for FreeBSD-3.1 or 3.2: --- midway.c- Fri May 21 23:58:11 1999 +++ midway.c Sat May 22 20:02:26 1999 @@ -1241,6 +1241,9 @@ break; #endif case SIOCSIFADDR: +#if defined(INET6) && defined(SIOCSIFADDR_IN6) + case SIOCSIFADDR_IN6: +#endif ifp->if_flags |= IFF_UP; #if defined(INET) || defined(INET6) if (ifa->ifa_addr->sa_family == AF_INET @@ -1261,7 +1264,18 @@ break; case SIOCSIFFLAGS: +#ifdef ATM_PVCEXT + /* point-2-point pvc is allowed to change if_flags */ + if (((ifp->if_flags & IFF_UP) + && !(ifp->if_flags & IFF_RUNNING)) + || (!(ifp->if_flags & IFF_UP) + && (ifp->if_flags & IFF_RUNNING))) { + en_reset(sc); + en_init(sc); + } +#else error = EINVAL; +#endif break; #if defined(SIOCSIFMTU) /* ??? copied from if_de */ @@ -1286,6 +1300,27 @@ #endif /* SIOCSIFMTU */ #ifdef ATM_PVCEXT + case SIOCADDMULTI: + case SIOCDELMULTI: + if (ifp == &sc->enif || ifr == 0) { + error = EAFNOSUPPORT; /* XXX */ + break; + } + switch (ifr->ifr_addr.sa_family) { +#ifdef INET + case AF_INET: + break; +#endif +#ifdef INET6 + case AF_INET6: + break; +#endif + default: + error = EAFNOSUPPORT; + break; + } + break; + case SIOCGPVCSIF: if (ifp != &sc->enif) { sprintf(ifr->ifr_name, "%s%d", @@ -1502,12 +1537,14 @@ if (m == NULL) break; /* >>> exit 'while(1)' here <<< */ m_freem(m); + IF_DROP(&sc->enif.if_snd); } while (1) { IF_DEQUEUE(&sc->rxslot[slot].q, m); if (m == NULL) break; /* >>> exit 'while(1)' here <<< */ m_freem(m); + IF_DROP(&sc->enif.if_snd); } sc->rxslot[slot].oth_flags &= ~ENOTHER_SWSL; if (sc->rxslot[slot].oth_flags & ENOTHER_DRAIN) { @@ -1786,6 +1823,7 @@ if (en_mfix(sc, &lastm, prev) == 0) { /* failed? */ m_freem(m); m = NULL; + sc->enif.if_oerrors++; break; } if (first) @@ -1819,6 +1857,7 @@ printf("%s: output vpi=%d, vci=%d out of card range, dropping...\n", sc->sc_dev.dv_xname, atm_vpi, atm_vci); m_freem(m); + sc->enif.if_oerrors++; continue; } @@ -1927,6 +1966,7 @@ #endif EN_COUNT(sc->txmbovr); m_freem(m); + IF_DROP(&ifp->if_snd); #ifdef EN_DEBUG printf("%s: tx%d: buffer space shortage\n", sc->sc_dev.dv_xname, txchan); @@ -2385,6 +2425,7 @@ if (launch.t != tmp) panic("en dequeue drop"); m_freem(launch.t); + IF_DROP(&sc->enif.if_snd); sc->txslot[chan].mbsize -= launch.mlen; goto again; } ------------------------------------------------------------------------ patch for FreeBSD-2.2.8: --- midway.c- Sat May 22 03:07:43 1999 +++ midway.c Sat May 22 20:02:53 1999 @@ -1235,7 +1235,7 @@ break; #endif case SIOCSIFADDR: -#ifdef INET6 +#if defined(INET6) && defined(SIOCSIFADDR_IN6) case SIOCSIFADDR_IN6: #endif ifp->if_flags |= IFF_UP; @@ -1258,6 +1258,8 @@ break; case SIOCSIFFLAGS: +#ifdef ATM_PVCEXT + /* point-2-point pvc is allowed to change if_flags */ if (((ifp->if_flags & IFF_UP) && !(ifp->if_flags & IFF_RUNNING)) || (!(ifp->if_flags & IFF_UP) @@ -1265,6 +1267,9 @@ en_reset(sc); en_init(sc); } +#else + error = EINVAL; +#endif break; #if defined(SIOCSIFMTU) /* ??? copied from if_de */ @@ -1289,6 +1294,27 @@ #endif /* SIOCSIFMTU */ #ifdef ATM_PVCEXT + case SIOCADDMULTI: + case SIOCDELMULTI: + if (ifp == &sc->enif || ifr == 0) { + error = EAFNOSUPPORT; /* XXX */ + break; + } + switch (ifr->ifr_addr.sa_family) { +#ifdef INET + case AF_INET: + break; +#endif +#ifdef INET6 + case AF_INET6: + break; +#endif + default: + error = EAFNOSUPPORT; + break; + } + break; + case SIOCGPVCSIF: if (ifp != &sc->enif) { sprintf(ifr->ifr_name, "%s%d", ------------------------------------------------------------------------