+
+__private_extern__
+void
+ipv6_duplicated_address(const char * if_name, const struct in6_addr * addr,
+ int hw_len, const void * hw_addr)
+{
+ uint8_t * hw_addr_bytes = (uint8_t *)hw_addr;
+ int i;
+ CFStringRef if_name_cf;
+ CFMutableStringRef key;
+ char ntopbuf[INET6_ADDRSTRLEN];
+ CFStringRef prefix;
+
+ if_name_cf = CFStringCreateWithCString(NULL, if_name,
+ kCFStringEncodingASCII);
+ prefix = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
+ kSCDynamicStoreDomainState,
+ if_name_cf,
+ kSCEntNetIPv6DuplicatedAddress);
+ ntopbuf[0] = '\0';
+ (void)inet_ntop(AF_INET6, addr, ntopbuf, sizeof(ntopbuf));
+ key = CFStringCreateMutableCopy(NULL, 0, prefix);
+ CFStringAppendFormat(key, NULL, CFSTR("/%s"), ntopbuf);
+ for (i = 0; i < hw_len; i++) {
+ CFStringAppendFormat(key, NULL, CFSTR("%s%02x"),
+ (i == 0) ? "/" : ":", hw_addr_bytes[i]);
+ }
+ SCDynamicStoreNotifyValue(store, key);
+ CFRelease(key);
+ CFRelease(prefix);
+ CFRelease(if_name_cf);
+}
+
+__private_extern__
+void
+nat64_prefix_request(const char *if_name)
+{
+ CFStringRef if_name_cf;
+ CFStringRef key;
+
+ if_name_cf = CFStringCreateWithCString(NULL, if_name, kCFStringEncodingASCII);
+ key = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
+ kSCDynamicStoreDomainState,
+ if_name_cf,
+ kSCEntNetNAT64PrefixRequest);
+ CFRelease(if_name_cf);
+ SC_log(LOG_DEBUG, "Post NAT64 prefix request: %@", key);
+ SCDynamicStoreNotifyValue(store, key);
+ CFRelease(key);
+}
+
+__private_extern__ void
+ipv6_router_expired(const char *if_name)
+{
+ CFStringRef if_name_cf;
+ CFStringRef key;
+
+ if_name_cf = CFStringCreateWithCString(NULL, if_name, kCFStringEncodingASCII);
+ key = SCDynamicStoreKeyCreateNetworkInterfaceEntity(NULL,
+ kSCDynamicStoreDomainState,
+ if_name_cf,
+ kSCEntNetIPv6RouterExpired);
+ CFRelease(if_name_cf);
+ SC_log(LOG_DEBUG, "Post IPv6 Router Expired: %@", key);
+ SCDynamicStoreNotifyValue(store, key);
+ CFRelease(key);
+}