Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 29 Sep 2012 05:52:19 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r241043 - head/sys/netinet
Message-ID:  <201209290552.q8T5qJor072700@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Sat Sep 29 05:52:19 2012
New Revision: 241043
URL: http://svn.freebsd.org/changeset/base/241043

Log:
  carp_send_ad() should never return without rescheduling next run.

Modified:
  head/sys/netinet/ip_carp.c

Modified: head/sys/netinet/ip_carp.c
==============================================================================
--- head/sys/netinet/ip_carp.c	Sat Sep 29 03:41:21 2012	(r241042)
+++ head/sys/netinet/ip_carp.c	Sat Sep 29 05:52:19 2012	(r241043)
@@ -771,10 +771,7 @@ carp_send_ad_locked(struct carp_softc *s
 		MGETHDR(m, M_NOWAIT, MT_HEADER);
 		if (m == NULL) {
 			CARPSTATS_INC(carps_onomem);
-			/* XXX maybe less ? */
-			callout_reset(&sc->sc_ad_tmo, tvtohz(&tv),
-			    carp_send_ad, sc);
-			return;
+			goto resched;
 		}
 		len = sizeof(*ip) + sizeof(ch);
 		m->m_pkthdr.len = len;
@@ -807,7 +804,7 @@ carp_send_ad_locked(struct carp_softc *s
 		ch_ptr = (struct carp_header *)(&ip[1]);
 		bcopy(&ch, ch_ptr, sizeof(ch));
 		if (carp_prepare_ad(m, sc, ch_ptr))
-			return;
+			goto resched;
 
 		m->m_data += sizeof(*ip);
 		ch_ptr->carp_cksum = carp_cksum(m, len - sizeof(*ip));
@@ -842,10 +839,7 @@ carp_send_ad_locked(struct carp_softc *s
 		MGETHDR(m, M_NOWAIT, MT_HEADER);
 		if (m == NULL) {
 			CARPSTATS_INC(carps_onomem);
-			/* XXX maybe less ? */
-			callout_reset(&sc->sc_ad_tmo, tvtohz(&tv),
-			    carp_send_ad, sc);
-			return;
+			goto resched;
 		}
 		len = sizeof(*ip6) + sizeof(ch);
 		m->m_pkthdr.len = len;
@@ -877,13 +871,13 @@ carp_send_ad_locked(struct carp_softc *s
 		if (in6_setscope(&ip6->ip6_dst, sc->sc_carpdev, NULL) != 0) {
 			m_freem(m);
 			CARP_DEBUG("%s: in6_setscope failed\n", __func__);
-			return;
+			goto resched;
 		}
 
 		ch_ptr = (struct carp_header *)(&ip6[1]);
 		bcopy(&ch, ch_ptr, sizeof(ch));
 		if (carp_prepare_ad(m, sc, ch_ptr))
-			return;
+			goto resched;
 
 		m->m_data += sizeof(*ip6);
 		ch_ptr->carp_cksum = carp_cksum(m, len - sizeof(*ip6));
@@ -913,6 +907,7 @@ carp_send_ad_locked(struct carp_softc *s
 	}
 #endif /* INET6 */
 
+resched:
 	callout_reset(&sc->sc_ad_tmo, tvtohz(&tv), carp_send_ad, sc);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201209290552.q8T5qJor072700>