#endif
static void carp_stop(struct carp_softc *, int);
static void carp_suspend(struct carp_softc *, int);
+static void carp_ioctl_stop(struct carp_softc *);
static void carp_ifaddr(void *, struct ifnet *, enum ifaddr_event,
struct ifaddr *);
static void carp_ifdetach_dispatch(netmsg_t);
static void carp_clone_destroy_dispatch(netmsg_t);
static void carp_init_dispatch(netmsg_t);
+static void carp_ioctl_stop_dispatch(netmsg_t);
static MALLOC_DEFINE(M_CARP, "CARP", "CARP interfaces");
char devname[IFNAMSIZ];
int error = 0;
+ ASSERT_IFNET_SERIALIZED_ALL(ifp);
+
carp_gettok();
ifa = (struct ifaddr *)addr;
if ((ifp->if_flags & IFF_RUNNING) == 0)
carp_init(sc);
} else if (ifp->if_flags & IFF_RUNNING) {
- carp_stop(sc, 0);
+ carp_ioctl_stop(sc);
}
break;
}
static void
+carp_ioctl_stop_dispatch(netmsg_t msg)
+{
+ struct netmsg_carp *cmsg = (struct netmsg_carp *)msg;
+ struct carp_softc *sc = cmsg->nc_softc;
+
+ carp_gettok();
+ carp_stop(sc, 0);
+ carp_reltok();
+
+ lwkt_replymsg(&cmsg->base.lmsg, 0);
+}
+
+static void
+carp_ioctl_stop(struct carp_softc *sc)
+{
+ struct ifnet *ifp = &sc->arpcom.ac_if;
+ struct netmsg_carp cmsg;
+
+ ASSERT_IFNET_SERIALIZED_ALL(ifp);
+
+ ifnet_deserialize_all(ifp);
+
+ bzero(&cmsg, sizeof(cmsg));
+ netmsg_init(&cmsg.base, NULL, &curthread->td_msgport, 0,
+ carp_ioctl_stop_dispatch);
+ cmsg.nc_softc = sc;
+
+ lwkt_domsg(cpu_portfn(0), &cmsg.base.lmsg, 0);
+
+ ifnet_serialize_all(ifp);
+}
+
+static void
carp_init_dispatch(netmsg_t msg)
{
struct netmsg_carp *cmsg = (struct netmsg_carp *)msg;