Set scope on MC address so IPv6 carp advertisement will not get dropped
in ip6_output. In case this fails handle the error directly and log it[1]. In addition permit CARP over v6 in ip_fw2. PR: kern/98622 Similar patch by: suz Discussed with: glebius [1] Tested by: Paul.Dekkers surfnet.nl, Philippe.Pegon crc.u-strasbg.fr MFC after: 3 days
This commit is contained in:
parent
5bfeaa3839
commit
7002145d8e
@ -970,9 +970,14 @@ carp_send_ad_locked(struct carp_softc *sc)
|
||||
sizeof(struct in6_addr));
|
||||
/* set the multicast destination */
|
||||
|
||||
ip6->ip6_dst.s6_addr8[0] = 0xff;
|
||||
ip6->ip6_dst.s6_addr8[1] = 0x02;
|
||||
ip6->ip6_dst.s6_addr16[0] = htons(0xff02);
|
||||
ip6->ip6_dst.s6_addr8[15] = 0x12;
|
||||
if (in6_setscope(&ip6->ip6_dst, sc->sc_carpdev, NULL) != 0) {
|
||||
SC2IFP(sc)->if_oerrors++;
|
||||
m_freem(m);
|
||||
CARP_LOG("%s: in6_setscope failed\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
ch_ptr = (struct carp_header *)(&ip6[1]);
|
||||
bcopy(&ch, ch_ptr, sizeof(ch));
|
||||
|
@ -74,6 +74,7 @@
|
||||
#include <netinet/ip_fw.h>
|
||||
#include <netinet/ip_divert.h>
|
||||
#include <netinet/ip_dummynet.h>
|
||||
#include <netinet/ip_carp.h>
|
||||
#include <netinet/pim.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <netinet/tcp_timer.h>
|
||||
@ -2284,6 +2285,16 @@ do { \
|
||||
PULLUP_TO(hlen, ulp, struct pim);
|
||||
break;
|
||||
|
||||
case IPPROTO_CARP:
|
||||
PULLUP_TO(hlen, ulp, struct carp_header);
|
||||
if (((struct carp_header *)ulp)->carp_version !=
|
||||
CARP_VERSION)
|
||||
return (IP_FW_DENY);
|
||||
if (((struct carp_header *)ulp)->carp_type !=
|
||||
CARP_ADVERTISEMENT)
|
||||
return (IP_FW_DENY);
|
||||
break;
|
||||
|
||||
case IPPROTO_IPV6: /* RFC 2893 */
|
||||
PULLUP_TO(hlen, ulp, struct ip6_hdr);
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user