summaryrefslogtreecommitdiff
path: root/sys/netinet6/in6_ifattach.c
diff options
context:
space:
mode:
authorRyan Thomas McBride <mcbride@cvs.openbsd.org>2006-08-31 12:37:32 +0000
committerRyan Thomas McBride <mcbride@cvs.openbsd.org>2006-08-31 12:37:32 +0000
commit8f1b5f08005818e9f1f30cec646b83baa2863bab (patch)
tree22f804fcd687a4eb32fc6acc2bf8d6ef59a0c127 /sys/netinet6/in6_ifattach.c
parent1328da2283b759b4caa1fc12085179e869ca44aa (diff)
Automatically add a IPv6 link-local address to carp interfaces when the
virtual MAC address is set. Among other things, this makes route6d work correctly on systems with carp interfaces. In order to ensure backwards compatibility, we do not include IPv6 link-local addresses in generating the HMAC, but we accept HMACs with AND without the link-local addresses. They will be added to the HMAC in a future release. In short: this change should only affect backwards compatibility for IPv6 users who are manually adding link-local addresses on carp interfaces. testing mtu@ todd@ ok mpf@ henning@ deraadt@
Diffstat (limited to 'sys/netinet6/in6_ifattach.c')
-rw-r--r--sys/netinet6/in6_ifattach.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/sys/netinet6/in6_ifattach.c b/sys/netinet6/in6_ifattach.c
index 9a3bf06c8f6..d26b3997805 100644
--- a/sys/netinet6/in6_ifattach.c
+++ b/sys/netinet6/in6_ifattach.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: in6_ifattach.c,v 1.42 2006/06/16 16:49:40 henning Exp $ */
+/* $OpenBSD: in6_ifattach.c,v 1.43 2006/08/31 12:37:31 mcbride Exp $ */
/* $KAME: in6_ifattach.c,v 1.124 2001/07/18 08:32:51 jinmei Exp $ */
/*
@@ -65,7 +65,6 @@ int ip6_auto_linklocal = 1; /* enable by default */
static int get_rand_ifid(struct ifnet *, struct in6_addr *);
static int get_hw_ifid(struct ifnet *, struct in6_addr *);
static int get_ifid(struct ifnet *, struct ifnet *, struct in6_addr *);
-static int in6_ifattach_linklocal(struct ifnet *, struct ifnet *);
static int in6_ifattach_loopback(struct ifnet *);
#define EUI64_GBIT 0x01
@@ -169,6 +168,7 @@ found:
switch (ifp->if_type) {
/* IEEE802/EUI64 cases - what others? */
case IFT_ETHER:
+ case IFT_CARP:
case IFT_FDDI:
case IFT_ATM:
case IFT_IEEE1394:
@@ -315,7 +315,7 @@ success:
return 0;
}
-static int
+int
in6_ifattach_linklocal(ifp, altifp)
struct ifnet *ifp;
struct ifnet *altifp; /*secondary EUI64 source*/
@@ -372,11 +372,12 @@ in6_ifattach_linklocal(ifp, altifp)
/*
* Now call in6_update_ifa() to do a bunch of procedures to configure
- * a link-local address. We can set NULL to the 3rd argument, because
- * we know there's no other link-local address on the interface
- * and therefore we are adding one (instead of updating one).
+ * a link-local address. In the case of CARP, we may be called after
+ * one has already been configured, so check if it's already there
+ * with in6ifa_ifpforlinklocal() and clobber it if it exists.
*/
- if ((error = in6_update_ifa(ifp, &ifra, NULL)) != 0) {
+ if ((error = in6_update_ifa(ifp, &ifra,
+ in6ifa_ifpforlinklocal(ifp, 0))) != 0) {
/*
* XXX: When the interface does not support IPv6, this call
* would fail in the SIOCSIFADDR ioctl. I believe the
@@ -403,7 +404,8 @@ in6_ifattach_linklocal(ifp, altifp)
/* NOTREACHED */
}
#endif
- if (in6if_do_dad(ifp) && (ifp->if_flags & IFF_POINTOPOINT) == 0) {
+ if (in6if_do_dad(ifp) && ((ifp->if_flags & IFF_POINTOPOINT) ||
+ (ifp->if_type == IFT_CARP)) == 0) {
ia->ia6_flags &= ~IN6_IFF_NODAD;
ia->ia6_flags |= IN6_IFF_TENTATIVE;
}
@@ -597,6 +599,7 @@ in6_ifattach(ifp, altifp)
* quirks based on interface type
*/
switch (ifp->if_type) {
+ /* we attach a link-local address when a vhid is assigned */
case IFT_CARP:
return;
default: