git: 5ee92cbd82d0 - main - carp: don't chain call vrrp_send_ad via carp_send_ad

From: Kristof Provost <kp_at_FreeBSD.org>
Date: Wed, 08 May 2024 11:19:55 UTC
The branch main has been updated by kp:

URL: https://cgit.FreeBSD.org/src/commit/?id=5ee92cbd82d0afb65bc5feabf29d8417307d38ad

commit 5ee92cbd82d0afb65bc5feabf29d8417307d38ad
Author:     Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2024-04-29 22:33:51 +0000
Commit:     Kristof Provost <kp@FreeBSD.org>
CommitDate: 2024-05-08 11:19:04 +0000

    carp: don't chain call vrrp_send_ad via carp_send_ad
    
    Provide inline send_ad_locked() that switches between protocol
    specific sending function.
    
    Rename carp_send_ad() to carp_callout() to avoid getting lost in
    all these multiple foo_send_ad.
    
    No functional change intended.
    
    Reviewed by:    kp
    Differential Revision:  https://reviews.freebsd.org/D45036
---
 sys/netinet/ip_carp.c | 36 ++++++++++++++++++++++--------------
 1 file changed, 22 insertions(+), 14 deletions(-)

diff --git a/sys/netinet/ip_carp.c b/sys/netinet/ip_carp.c
index cf7c8d03ca73..332e76b492fa 100644
--- a/sys/netinet/ip_carp.c
+++ b/sys/netinet/ip_carp.c
@@ -350,7 +350,6 @@ static void	carp_setrun(struct carp_softc *, sa_family_t);
 static void	carp_master_down(void *);
 static void	carp_master_down_locked(struct carp_softc *,
     		    const char* reason);
-static void	carp_send_ad(void *);
 static void	carp_send_ad_locked(struct carp_softc *);
 static void	vrrp_send_ad_locked(struct carp_softc *);
 static void	carp_addroute(struct carp_softc *);
@@ -1087,6 +1086,19 @@ carp_prepare_ad(struct mbuf *m, struct carp_softc *sc, struct carp_header *ch)
 	return (carp_tag(sc, m));
 }
 
+static inline void
+send_ad_locked(struct carp_softc *sc)
+{
+	switch (sc->sc_version) {
+	case CARP_VERSION_CARP:
+		carp_send_ad_locked(sc);
+		break;
+	case CARP_VERSION_VRRPv3:
+		vrrp_send_ad_locked(sc);
+		break;
+	}
+}
+
 /*
  * To avoid LORs and possible recursions this function shouldn't
  * be called directly, but scheduled via taskqueue.
@@ -1103,7 +1115,7 @@ carp_send_ad_all(void *ctx __unused, int pending __unused)
 		if (sc->sc_state == MASTER) {
 			CARP_LOCK(sc);
 			CURVNET_SET(sc->sc_carpdev->if_vnet);
-			carp_send_ad_locked(sc);
+			send_ad_locked(sc);
 			CURVNET_RESTORE();
 			CARP_UNLOCK(sc);
 		}
@@ -1113,7 +1125,7 @@ carp_send_ad_all(void *ctx __unused, int pending __unused)
 
 /* Send a periodic advertisement, executed in callout context. */
 static void
-carp_send_ad(void *v)
+carp_callout(void *v)
 {
 	struct carp_softc *sc = v;
 	struct epoch_tracker et;
@@ -1121,7 +1133,7 @@ carp_send_ad(void *v)
 	NET_EPOCH_ENTER(et);
 	CARP_LOCK_ASSERT(sc);
 	CURVNET_SET(sc->sc_carpdev->if_vnet);
-	carp_send_ad_locked(sc);
+	send_ad_locked(sc);
 	CURVNET_RESTORE();
 	CARP_UNLOCK(sc);
 	NET_EPOCH_EXIT(et);
@@ -1205,11 +1217,7 @@ carp_send_ad_locked(struct carp_softc *sc)
 
 	NET_EPOCH_ASSERT();
 	CARP_LOCK_ASSERT(sc);
-
-	if (sc->sc_version == CARP_VERSION_VRRPv3) {
-		vrrp_send_ad_locked(sc);
-		return;
-	}
+	MPASS(sc->sc_version == CARP_VERSION_CARP);
 
 	advskew = DEMOTE_ADVSKEW(sc);
 	tv.tv_sec = sc->sc_advbase;
@@ -1339,7 +1347,7 @@ carp_send_ad_locked(struct carp_softc *sc)
 #endif /* INET6 */
 
 resched:
-	callout_reset(&sc->sc_ad_tmo, tvtohz(&tv), carp_send_ad, sc);
+	callout_reset(&sc->sc_ad_tmo, tvtohz(&tv), carp_callout, sc);
 }
 
 static void
@@ -1520,7 +1528,7 @@ vrrp_send_ad_locked(struct carp_softc *sc)
 
 resched:
 	callout_reset(&sc->sc_ad_tmo, sc->sc_vrrp_adv_inter * hz / 100,
-	    carp_send_ad, sc);
+	    carp_callout, sc);
 }
 
 static void
@@ -1760,7 +1768,7 @@ carp_master_down_locked(struct carp_softc *sc, const char *reason)
 	switch (sc->sc_state) {
 	case BACKUP:
 		carp_set_state(sc, MASTER, reason);
-		carp_send_ad_locked(sc);
+		send_ad_locked(sc);
 #ifdef INET
 		carp_send_arp(sc);
 #endif
@@ -1852,11 +1860,11 @@ carp_setrun(struct carp_softc *sc, sa_family_t af)
 			tv.tv_sec = sc->sc_advbase;
 			tv.tv_usec = sc->sc_advskew * 1000000 / 256;
 			callout_reset(&sc->sc_ad_tmo, tvtohz(&tv),
-			    carp_send_ad, sc);
+			    carp_callout, sc);
 		} else {
 			callout_reset(&sc->sc_ad_tmo,
 			    sc->sc_vrrp_adv_inter * hz / 100,
-			    carp_send_ad, sc);
+			    carp_callout, sc);
 		}
 		break;
 	}