bstp_initialize_port(sc, bif);
if (sc->sc_ifp->if_flags & IFF_LINK1)
bstp_timer_start(&bif->bif_link1_timer, 0);
+ bstp_configuration_update(sc);
bstp_port_state_selection(sc);
}
static int bridge_ioctl_flush(struct bridge_softc *, void *);
static int bridge_ioctl_gpri(struct bridge_softc *, void *);
static int bridge_ioctl_spri(struct bridge_softc *, void *);
+static int bridge_ioctl_reinit(struct bridge_softc *, void *);
static int bridge_ioctl_ght(struct bridge_softc *, void *);
static int bridge_ioctl_sht(struct bridge_softc *, void *);
static int bridge_ioctl_gfd(struct bridge_softc *, void *);
*/
ifp->if_init(sc);
}
+
+ /*
+ * If running and link flag state change we have to
+ * reinitialize as well.
+ */
+ if ((ifp->if_flags & IFF_RUNNING) &&
+ (ifp->if_flags & (IFF_LINK0|IFF_LINK1|IFF_LINK2)) !=
+ sc->sc_copy_flags) {
+ sc->sc_copy_flags = ifp->if_flags &
+ (IFF_LINK0|IFF_LINK1|IFF_LINK2);
+ bridge_control(sc, 0, bridge_ioctl_reinit, NULL);
+ }
+
break;
case SIOCSIFMTU:
}
static int
+bridge_ioctl_reinit(struct bridge_softc *sc, void *arg __unused)
+{
+ if (sc->sc_ifp->if_flags & IFF_RUNNING)
+ bstp_initialization(sc);
+ return (0);
+}
+
+static int
bridge_ioctl_ght(struct bridge_softc *sc, void *arg)
{
struct ifbrparam *param = arg;
struct bridge_iflist_head sc_spanlist; /* span ports list */
int sc_span; /* has span ports */
struct bridge_timer sc_link_timer;
+ int sc_copy_flags; /* copy if_flags */
};
#define sc_if sc_arp.ac_if