svn commit: r212266 - head/sys/netinet

Will Andrews will at FreeBSD.org
Mon Sep 6 21:06:06 UTC 2010


Author: will
Date: Mon Sep  6 21:06:06 2010
New Revision: 212266
URL: http://svn.freebsd.org/changeset/base/212266

Log:
  Fix CARP in backup mode by properly registering its hooks for INET and INET6
  using ipproto_{un,}register() and the newly created ip6proto_{un,}register()
  so that it can again receive IPPROTO_CARP packets allowing its state machine
  to work.
  
  Reviewed by:	bz
  Approved by:	ken (mentor)

Modified:
  head/sys/netinet/ip_carp.c

Modified: head/sys/netinet/ip_carp.c
==============================================================================
--- head/sys/netinet/ip_carp.c	Mon Sep  6 21:03:30 2010	(r212265)
+++ head/sys/netinet/ip_carp.c	Mon Sep  6 21:06:06 2010	(r212266)
@@ -2313,6 +2313,7 @@ carp_mod_cleanup(void)
 	if_clone_detach(&carp_cloner);
 #ifdef INET
 	if (proto_reg[CARP_INET] == 0) {
+		(void)ipproto_unregister(IPPROTO_CARP);
 		pf_proto_unregister(PF_INET, IPPROTO_CARP, SOCK_RAW);
 		proto_reg[CARP_INET] = -1;
 	}
@@ -2320,6 +2321,7 @@ carp_mod_cleanup(void)
 #endif
 #ifdef INET6
 	if (proto_reg[CARP_INET6] == 0) {
+		(void)ip6proto_unregister(IPPROTO_CARP);
 		pf_proto_unregister(PF_INET6, IPPROTO_CARP, SOCK_RAW);
 		proto_reg[CARP_INET6] = -1;
 	}
@@ -2335,6 +2337,7 @@ carp_mod_cleanup(void)
 static int
 carp_mod_load(void)
 {
+	int err;
 
 	if_detach_event_tag = EVENTHANDLER_REGISTER(ifnet_departure_event,
 		carp_ifdetach, NULL, EVENTHANDLER_PRI_ANY);
@@ -2357,6 +2360,12 @@ carp_mod_load(void)
 		carp_mod_cleanup();
 		return (EINVAL);
 	}
+	err = ip6proto_register(IPPROTO_CARP);
+	if (err) {
+		printf("carp: error %d registering with INET6\n", err);
+		carp_mod_cleanup();
+		return (EINVAL);
+	}
 #endif
 #ifdef INET
 	carp_iamatch_p = carp_iamatch;
@@ -2367,6 +2376,12 @@ carp_mod_load(void)
 		carp_mod_cleanup();
 		return (EINVAL);
 	}
+	err = ipproto_register(IPPROTO_CARP);
+	if (err) {
+		printf("carp: error %d registering with INET\n", err);
+		carp_mod_cleanup();
+		return (EINVAL);
+	}
 #endif
 	return 0;
 }


More information about the svn-src-all mailing list