/*
- * Copyright (c) 2002-2003 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2002-2007, 2011, 2013 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
#define s6_addr16 __u6_addr.__u6_addr16
-#ifndef kSCPropNetIPv6DestAddresses
-#define kSCPropNetIPv6DestAddresses SCSTR("DestAddresses")
-#endif
-
-#ifndef kSCPropNetIPv6Flags
-#define kSCPropNetIPv6Flags SCSTR("Flags")
-#endif
-
-#ifndef kSCPropNetIPv6PrefixLength
-#define kSCPropNetIPv6PrefixLength SCSTR("PrefixLength")
-#endif
-
#ifdef NOTYET
#ifndef kSCPropNetIPv6ScopeID
#define kSCPropNetIPv6ScopeID SCSTR("ScopeID")
static CFMutableDictionaryRef
-getIF(CFStringRef key, CFMutableDictionaryRef oldIFs, CFMutableDictionaryRef newIFs)
+copyIF(CFStringRef key, CFMutableDictionaryRef oldIFs, CFMutableDictionaryRef newIFs)
{
CFDictionaryRef dict = NULL;
CFMutableDictionaryRef newDict = NULL;
} else if (dict) {
cache_SCDynamicStoreRemoveValue(store, key);
}
+ network_changed = TRUE;
}
return;
&kCFTypeDictionaryValueCallBacks);
if (!ifap) {
- if (getifaddrs(&ifap_temp) < 0) {
+ if (getifaddrs(&ifap_temp) == -1) {
SCLog(TRUE, LOG_ERR, CFSTR("getifaddrs() failed: %s"), strerror(errno));
goto error;
}
}
}
- if (sock < 0) {
+ if (sock == -1) {
sock = dgram_socket(AF_INET6);
- if (sock < 0) {
+ if (sock == -1) {
SCLog(TRUE, LOG_NOTICE, CFSTR("interface_update_ipv6: socket open failed, %s"), strerror(errno));
goto error;
}
kSCEntNetIPv6);
CFRelease(interface);
- newDict = getIF(key, oldIFs, newIFs);
+ newDict = copyIF(key, oldIFs, newIFs);
- sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
+ /* ALIGN: ifa->ifa_addr aligned (getifaddrs), cast ok. */
+ sin6 = (struct sockaddr_in6 *)(void *)ifa->ifa_addr;
/* XXX: embedded link local addr check */
- if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
+ if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) || IN6_IS_ADDR_MC_LINKLOCAL(&sin6->sin6_addr)) {
u_int16_t index;
index = sin6->sin6_addr.s6_addr16[1];
#ifdef NOTYET
appendScopeID (newDict, sin6);
#endif /* NOTYET */
- appendPrefixLen(newDict, (struct sockaddr_in6 *)ifa->ifa_netmask);
+ /* ALIGN: ifa should be aligned (from getifaddrs), cast ok.
+ * appendPrefixLen expect byte alignment */
+ appendPrefixLen(newDict, (struct sockaddr_in6 *)(void *)ifa->ifa_netmask);
appendFlags (newDict, flags6);
- if (ifa->ifa_flags & IFF_POINTOPOINT) {
+ if (ifa->ifa_flags & IFF_POINTOPOINT
+ && ifa->ifa_dstaddr != NULL) {
struct sockaddr_in6 *dst6;
- dst6 = (struct sockaddr_in6 *)ifa->ifa_dstaddr;
+ /* ALIGN: ifa should be aligned (from getifaddrs), cast ok. */
+ dst6 = (struct sockaddr_in6 *)(void *)ifa->ifa_dstaddr;
/* XXX: embedded link local addr check */
- if (IN6_IS_ADDR_LINKLOCAL(&dst6->sin6_addr)) {
+ if (IN6_IS_ADDR_LINKLOCAL(&dst6->sin6_addr) || IN6_IS_ADDR_MC_LINKLOCAL(&dst6->sin6_addr)) {
u_int16_t index;
index = dst6->sin6_addr.s6_addr16[1];
kSCEntNetIPv6);
CFRelease(interface);
- newDict = getIF(key, oldIFs, newIFs);
+ newDict = copyIF(key, oldIFs, newIFs);
CFDictionarySetValue(newIFs, key, newDict);
CFRelease(newDict);
error :
if (ifap_temp) freeifaddrs(ifap_temp);
- if (sock >= 0) close(sock);
+ if (sock != -1) close(sock);
CFRelease(oldIFs);
CFRelease(newIFs);