* create pseudo-interface with wildcard IPv6 address
*/
if (isc_net_probeipv6() == ISC_R_SUCCESS) {
- inter_list[idx].family = AF_INET6;
- inter_list[idx].sin.ss_family = AF_INET6;
- ((struct sockaddr_in6*)&inter_list[idx].sin)->sin6_addr = in6addr_any;
- ((struct sockaddr_in6*)&inter_list[idx].sin)->sin6_port = port;
+ struct interface *interface = new_interface(NULL);
+
+ interface->family = AF_INET6;
+ interface->sin.ss_family = AF_INET6;
+ ((struct sockaddr_in6*)&interface->sin)->sin6_addr = in6addr_any;
+ ((struct sockaddr_in6*)&interface->sin)->sin6_port = port;
+ # ifdef ISC_PLATFORM_HAVESCOPEID
- ((struct sockaddr_in6*)&inter_list[idx].sin)->sin6_scope_id = 0;
+ ((struct sockaddr_in6*)&interface->sin)->sin6_scope_id = 0;
+ # endif
- (void) strncpy(inter_list[idx].name, "wildcard", sizeof(inter_list[idx].name));
- inter_list[idx].mask.ss_family = AF_INET6;
- memset(&((struct sockaddr_in6*)&inter_list[idx].mask)->sin6_addr.s6_addr, 0xff, sizeof(struct in6_addr));
- inter_list[idx].bfd = INVALID_SOCKET;
- inter_list[idx].num_mcast = 0;
- inter_list[idx].received = 0;
- inter_list[idx].sent = 0;
- inter_list[idx].notsent = 0;
- inter_list[idx].flags = INT_UP;
- inter_list[idx].ignore_packets = ISC_TRUE;
- any6_interface = &inter_list[idx];
- wildipv6 = idx;
- idx++;
- }
-#endif
- return (idx);
+ (void) strncpy(interface->name, "wildcard", sizeof(interface->name));
+ interface->mask.ss_family = AF_INET6;
+ memset(&((struct sockaddr_in6*)&interface->mask)->sin6_addr.s6_addr, 0xff, sizeof(struct in6_addr));
+ interface->flags = INT_UP | INT_WILDCARD;
+ interface->ignore_packets = ISC_TRUE;
+
+ interface->fd = open_socket(&interface->sin,
+ interface->flags, 0, interface);
+
+ wildipv6 = interface;
+ any6_interface = interface;
+ add_interface(interface);
+ }
+#endif
}
+
isc_boolean_t
address_okay(isc_interface_t *isc_if) {
break;
case AF_INET6:
#ifdef INCLUDE_IPV6_MULTICAST_SUPPORT
- memcpy(&(((struct sockaddr_in6 *)&inter_list[ind].sin)->sin6_addr),
+ memcpy(&(((struct sockaddr_in6 *)&interface->sin)->sin6_addr),
&((struct sockaddr_in6*)&addr)->sin6_addr,
sizeof(struct in6_addr));
- ((struct sockaddr_in6*)&inter_list[ind].sin)->sin6_port = htons(NTP_PORT);
+ ((struct sockaddr_in6*)&interface->sin)->sin6_port = htons(NTP_PORT);
#ifdef ISC_PLATFORM_HAVESCOPEID
- ((struct sockaddr_in6*)&inter_list[ind].sin)->sin6_scope_id = ((struct sockaddr_in6*)&addr)->sin6_scope_id;
+ ((struct sockaddr_in6*)&interface->sin)->sin6_scope_id = ((struct sockaddr_in6*)&addr)->sin6_scope_id;
#endif
- memset(&((struct sockaddr_in6*)&inter_list[ind].mask)->sin6_addr.s6_addr, 0xff, sizeof(struct in6_addr));
+ memset(&((struct sockaddr_in6*)&interface->mask)->sin6_addr.s6_addr, 0xff, sizeof(struct in6_addr));
#endif
- i = findlocalcastinterface(&addr, INT_MULTICAST);
+ iface = findlocalcastinterface(&addr, INT_MULTICAST);
+ # ifdef ISC_PLATFORM_HAVESCOPEID
- if (i >= 0)
- lscope = ((struct sockaddr_in6*)&inter_list[i].sin)->sin6_scope_id;
+ if (iface) {
+ lscope = ((struct sockaddr_in6*)&iface->sin)->sin6_scope_id;
- DPRINTF(1, ("Found interface #%d %s, scope: %d for address %s\n", iface->ifnum, iface->name, lscope, stoa(&addr)));
+ }
+ # endif
-#ifdef DEBUG
- if (debug > 1)
- printf("Found interface index %d, scope: %d for address %s\n",
- i, lscope, stoa(&addr));
-#endif
++ DPRINTF(1, ("Found interface #%d %s, scope: %d for address %s\n", iface->ifnum, iface->name, lscope, stoa(&addr)));
break;
}
+
+ interface->bfd = INVALID_SOCKET;
+ interface->fd = open_socket(&interface->sin,
+ INT_MULTICAST, 1, interface);
- inter_list[ind].bfd = INVALID_SOCKET;
- inter_list[ind].fd = open_socket(&inter_list[ind].sin,
- INT_MULTICAST, 1, &inter_list[ind], ind);
- if (inter_list[ind].fd != INVALID_SOCKET)
+ if (interface->fd != INVALID_SOCKET)
{
- inter_list[ind].bfd = INVALID_SOCKET;
- inter_list[ind].ignore_packets = ISC_FALSE;
-
- (void) strncpy(inter_list[ind].name, "multicast",
- sizeof(inter_list[ind].name));
- ((struct sockaddr_in*)&inter_list[ind].mask)->sin_addr.s_addr =
+ interface->bfd = INVALID_SOCKET;
+ interface->flags |= INT_MCASTIF;
+ interface->ignore_packets = ISC_FALSE;
+
+ (void) strncpy(interface->name, "multicast",
+ sizeof(interface->name));
+ ((struct sockaddr_in*)&interface->mask)->sin_addr.s_addr =
htonl(~(u_int32)0);
- if (ind >= ninterfaces)
- ninterfaces = ind + 1;
-#ifdef DEBUG
- if(debug > 1)
- print_interface(ind);
-#endif
+ DPRINT_INTERFACE(2, (interface, "multicast add ", "\n"));
+ add_interface(interface);
}
else
{
sprintf(buff,
"bind() fd %d, family %d, port %d, scope %d, addr %s, in6_is_addr_multicast=%d flags=%d fails: %%m",
fd, addr->ss_family, (int)ntohs(((struct sockaddr_in6*)addr)->sin6_port),
- ((struct sockaddr_in6*)addr)->sin6_scope_id, stoa(addr),
+ # ifdef ISC_PLATFORM_HAVESCOPEID
+ ((struct sockaddr_in6*)addr)->sin6_scope_id
+ # else
+ -1
+ # endif
+ , stoa(addr),
IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)addr)->sin6_addr), flags);
#endif
- else
- return (INVALID_SOCKET);
+ else
+ return INVALID_SOCKET;
/*
* Don't log this under all conditions
}
#ifdef INCLUDE_IPV6_SUPPORT
else if(addr->ss_family == AF_INET6) {
- memcpy(&((struct sockaddr_in6*)&saddr)->sin6_addr, &((struct sockaddr_in6*)addr)->sin6_addr, sizeof(struct in6_addr));
+ memcpy(&((struct sockaddr_in6*)&saddr)->sin6_addr, &((struct sockaddr_in6*)addr)->sin6_addr, sizeof(struct in6_addr));
((struct sockaddr_in6*)&saddr)->sin6_port = htons(2000);
+ # ifdef ISC_PLATFORM_HAVESCOPEID
((struct sockaddr_in6*)&saddr)->sin6_scope_id = ((struct sockaddr_in6*)addr)->sin6_scope_id;
+ # endif
}
#endif
+
s = socket(addr->ss_family, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
- return (-1);
+ return NULL;
rtn = connect(s, (struct sockaddr *)&saddr, SOCKLEN(&saddr));
#ifndef SYS_WINNT