Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Oct 2010 00:37:40 +0000 (UTC)
From:      Xin LI <delphij@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r213506 - stable/7/sys/netinet
Message-ID:  <201010070037.o970beMP023346@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: delphij
Date: Thu Oct  7 00:37:40 2010
New Revision: 213506
URL: http://svn.freebsd.org/changeset/base/213506

Log:
  MFC r211059:
  
  Address an edge condition that we found at work, where the carp(4)
  interface goes to issue LINK_UP, then LINK_DOWN, then LINK_UP at
  cold boot.  This behavior is not observed when carp(4) interface
  is created slightly later, when the underlying interface is fully
  up.
  
  Before this change what happen at boot is roughly:
  
   - ifconfig creates em0 interface;
   - ifconfig clones a carp device using em0;
     (em0's link state is DOWN at this point)
   - carp state: INIT -> BACKUP [*]
   - carp state: BACKUP -> MASTER
   - [Some negotiate between em0 and switch]
   - em0 kicks up link state change event
     (em0's link state is now up DOWN at this point)
   - do_link_state_change() -> carp_carpdev_state()
   - carp state: MASTER -> INIT (via carp_set_state(sc, INIT)) [+]
   - carp state: INIT -> BACKUP
   - carp state: BACKUP -> MASTER
  
  At the [*] stage, em0 did not received any broadcast message from other
  node, and assume our node is the master, thus carp(4) sets the link
  state to "UP" after becoming a master.  At [+], the master status
  is forcely set to "INIT", then an election is casted, after which our
  node would actually become a master.
  
  We believe that at the [*] stage, the master status should remain as
  "INIT" since the underlying parent interface's link state is not up.
  
  Obtained from:  iXsystems, Inc.
  Reported by:    jpaetzel

Modified:
  stable/7/sys/netinet/ip_carp.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/netinet/ip_carp.c
==============================================================================
--- stable/7/sys/netinet/ip_carp.c	Thu Oct  7 00:36:58 2010	(r213505)
+++ stable/7/sys/netinet/ip_carp.c	Thu Oct  7 00:37:40 2010	(r213506)
@@ -1349,7 +1349,8 @@ carp_setrun(struct carp_softc *sc, sa_fa
 		CARP_SCLOCK_ASSERT(sc);
 
 	if (SC2IFP(sc)->if_flags & IFF_UP &&
-	    sc->sc_vhid > 0 && (sc->sc_naddrs || sc->sc_naddrs6))
+	    sc->sc_vhid > 0 && (sc->sc_naddrs || sc->sc_naddrs6) &&
+	    sc->sc_carpdev->if_link_state == LINK_STATE_UP)
 		SC2IFP(sc)->if_drv_flags |= IFF_DRV_RUNNING;
 	else {
 		SC2IFP(sc)->if_drv_flags &= ~IFF_DRV_RUNNING;



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