1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-19 10:53:58 +00:00

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)
This commit is contained in:
Will Andrews 2010-09-06 21:06:06 +00:00
parent e24fa11d3e
commit 15249f73e9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=212266

View File

@ -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;
}