--- ipsec-tools-0.8.2/src/racoon/grabmyaddr.c 2013-04-12 04:53:52.000000000 -0500 +++ ipsec-tools-0.8.2/src/racoon/grabmyaddr.c 2014-07-30 14:40:50.986130838 -0500 @@ -432,8 +432,9 @@ sin6 = (struct sockaddr_in6 *) &addr; memcpy(&sin6->sin6_addr, RTA_DATA(rta[IFA_LOCAL]), sizeof(sin6->sin6_addr)); - if (!IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) - return 0; + //Why is this restricting to link local only? + //if (!IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) + // return 0; sin6->sin6_scope_id = ifa->ifa_index; netlink_add_del_address(h->nlmsg_type == RTM_NEWADDR, --- ipsec-tools-0.8.2/src/racoon/sockmisc.c 2011-03-14 12:18:13.000000000 -0500 +++ ipsec-tools-0.8.2/src/racoon/sockmisc.c 2014-07-30 15:09:27.809500681 -0500 @@ -123,9 +123,12 @@ port2 = ((struct sockaddr_in6 *)addr2)->sin6_port; if (memcmp(sa1, sa2, sizeof(struct in6_addr)) != 0) return CMPSADDR_MISMATCH; - if (((struct sockaddr_in6 *)addr1)->sin6_scope_id != - ((struct sockaddr_in6 *)addr2)->sin6_scope_id) - return CMPSADDR_MISMATCH; + //Addresses match at this point, so check one for link local scope + if (IN6_IS_ADDR_LINKLOCAL(&(((struct sockaddr_in6 *)addr1)->sin6_addr))) + //Verify matching scope_id on link local addrs + if (((struct sockaddr_in6 *)addr1)->sin6_scope_id != + ((struct sockaddr_in6 *)addr2)->sin6_scope_id) + return CMPSADDR_MISMATCH; break; #endif default: