Module Name:    src
Committed By:   yamaguchi
Date:           Thu Sep 30 03:43:25 UTC 2021

Modified Files:
        src/sys/net: if.c
        src/sys/netinet: ip_carp.c

Log Message:
carp: Register carp_carpdev_state to link-state change hook


To generate a diff of this commit:
cvs rdiff -u -r1.494 -r1.495 src/sys/net/if.c
cvs rdiff -u -r1.115 -r1.116 src/sys/netinet/ip_carp.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if.c
diff -u src/sys/net/if.c:1.494 src/sys/net/if.c:1.495
--- src/sys/net/if.c:1.494	Thu Sep 30 03:39:39 2021
+++ src/sys/net/if.c	Thu Sep 30 03:43:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.c,v 1.494 2021/09/30 03:39:39 yamaguchi Exp $	*/
+/*	$NetBSD: if.c,v 1.495 2021/09/30 03:43:25 yamaguchi Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.494 2021/09/30 03:39:39 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.495 2021/09/30 03:43:25 yamaguchi Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -2397,11 +2397,6 @@ if_link_state_change_process(struct ifne
 	/* Notify that the link state has changed. */
 	rt_ifmsg(ifp);
 
-#if NCARP > 0
-	if (ifp->if_carp)
-		carp_carpdev_state(ifp);
-#endif
-
 	if (ifp->if_link_state_changed != NULL)
 		ifp->if_link_state_changed(ifp, link_state);
 

Index: src/sys/netinet/ip_carp.c
diff -u src/sys/netinet/ip_carp.c:1.115 src/sys/netinet/ip_carp.c:1.116
--- src/sys/netinet/ip_carp.c:1.115	Wed Jun 16 00:21:19 2021
+++ src/sys/netinet/ip_carp.c	Thu Sep 30 03:43:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_carp.c,v 1.115 2021/06/16 00:21:19 riastradh Exp $	*/
+/*	$NetBSD: ip_carp.c,v 1.116 2021/09/30 03:43:25 yamaguchi Exp $	*/
 /*	$OpenBSD: ip_carp.c,v 1.113 2005/11/04 08:11:54 mcbride Exp $	*/
 
 /*
@@ -33,7 +33,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.115 2021/06/16 00:21:19 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.116 2021/09/30 03:43:25 yamaguchi Exp $");
 
 /*
  * TODO:
@@ -113,6 +113,7 @@ struct carp_softc {
 	struct ethercom sc_ac;
 #define	sc_if		sc_ac.ec_if
 #define	sc_carpdev	sc_ac.ec_if.if_carpdev
+	void *sc_linkstate_hook;
 	int ah_cookie;
 	int lh_cookie;
 	struct ip_moptions sc_imo;
@@ -907,6 +908,7 @@ carp_clone_destroy(struct ifnet *ifp)
 static void
 carpdetach(struct carp_softc *sc)
 {
+	struct ifnet *ifp;
 	struct carp_if *cif;
 	int s;
 
@@ -929,13 +931,16 @@ carpdetach(struct carp_softc *sc)
 
 	KERNEL_LOCK(1, NULL);
 	s = splnet();
-	if (sc->sc_carpdev != NULL) {
-		/* XXX linkstatehook removal */
-		cif = (struct carp_if *)sc->sc_carpdev->if_carp;
+	ifp = sc->sc_carpdev;
+	if (ifp != NULL) {
+		if_linkstate_change_disestablish(ifp,
+		    sc->sc_linkstate_hook, NULL);
+
+		cif = (struct carp_if *)ifp->if_carp;
 		TAILQ_REMOVE(&cif->vhif_vrs, sc, sc_list);
 		if (!--cif->vhif_nvrs) {
-			ifpromisc(sc->sc_carpdev, 0);
-			sc->sc_carpdev->if_carp = NULL;
+			ifpromisc(ifp, 0);
+			ifp->if_carp = NULL;
 			free(cif, M_IFADDR);
 		}
 	}
@@ -1708,9 +1713,10 @@ carp_set_ifp(struct carp_softc *sc, stru
 		if (sc->sc_naddrs || sc->sc_naddrs6)
 			sc->sc_if.if_flags |= IFF_UP;
 		carp_set_enaddr(sc);
+		sc->sc_linkstate_hook = if_linkstate_change_establish(ifp,
+		    carp_carpdev_state, (void *)ifp);
 		KERNEL_LOCK(1, NULL);
 		s = splnet();
-		/* XXX linkstatehooks establish */
 		carp_carpdev_state(ifp);
 		splx(s);
 		KERNEL_UNLOCK_ONE(NULL);

Reply via email to