xsock_t comm_bind_tcp6(const struct in6_addr *my_addr, unsigned int my_ifindex, unsigned short my_port, int is_blocking) { #ifdef HAVE_IPV6 xsock_t sock; comm_init(); sock = comm_sock_open(AF_INET6, SOCK_STREAM, 0, is_blocking); if (sock == XORP_BAD_SOCKET) return (XORP_BAD_SOCKET); if (comm_set_reuseaddr(sock, 1) != XORP_OK) { comm_sock_close(sock); return (XORP_BAD_SOCKET); } if (comm_sock_bind6(sock, my_addr, my_ifindex, my_port) != XORP_OK) { comm_sock_close(sock); return (XORP_BAD_SOCKET); } return (sock); #else /* ! HAVE_IPV6 */ comm_sock_no_ipv6("comm_bind_tcp6", my_addr, my_ifindex, my_port, is_blocking); return (XORP_BAD_SOCKET); #endif /* ! HAVE_IPV6 */ }
int comm_sock_bind(xsock_t sock, const struct sockaddr *sin) { switch (sin->sa_family) { case AF_INET: { const struct sockaddr_in *sin4 = (const struct sockaddr_in *)((const void *)sin); return comm_sock_bind4(sock, &sin4->sin_addr, sin4->sin_port); } break; #ifdef HAVE_IPV6 case AF_INET6: { const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)((const void *)sin); return comm_sock_bind6(sock, &sin6->sin6_addr, sin6->sin6_scope_id, sin6->sin6_port); } break; #endif /* HAVE_IPV6 */ default: XLOG_FATAL("Error comm_sock_bind invalid family = %d", sin->sa_family); return (XORP_ERROR); } XLOG_UNREACHABLE(); return XORP_ERROR; }
xsock_t comm_bind_connect_tcp6(const struct in6_addr *local_addr, unsigned int my_ifindex, unsigned short local_port, const struct in6_addr *remote_addr, unsigned short remote_port, int is_blocking, int *in_progress) { #ifdef HAVE_IPV6 xsock_t sock; if (in_progress != NULL) *in_progress = 0; comm_init(); sock = comm_sock_open(AF_INET6, SOCK_STREAM, 0, is_blocking); if (sock == XORP_BAD_SOCKET) return (XORP_BAD_SOCKET); if (comm_set_reuseaddr(sock, 1) != XORP_OK) { comm_sock_close(sock); return (XORP_BAD_SOCKET); } if (comm_sock_bind6(sock, local_addr, my_ifindex, local_port) != XORP_OK) { comm_sock_close(sock); return (XORP_BAD_SOCKET); } if (comm_sock_connect6(sock, remote_addr, remote_port, is_blocking, in_progress) != XORP_OK) { /* * If this is a non-blocking socket and the connect couldn't * complete, then return the socket. */ if ((! is_blocking) && (in_progress != NULL) && (*in_progress == 1)) return (sock); comm_sock_close(sock); return (XORP_BAD_SOCKET); } return (sock); #else /* ! HAVE_IPV6 */ if (in_progress != NULL) *in_progress = 0; comm_sock_no_ipv6("comm_bind_connect_tcp6", local_addr, my_ifindex, local_port, remote_addr, remote_port, is_blocking, in_progress); return (XORP_BAD_SOCKET); #endif /* ! HAVE_IPV6 */ }
xsock_t comm_bind_join_udp6(const struct in6_addr *mcast_addr, unsigned int my_ifindex, unsigned short my_port, int reuse_flag, int is_blocking) { #ifdef HAVE_IPV6 xsock_t sock; comm_init(); sock = comm_sock_open(AF_INET6, SOCK_DGRAM, 0, is_blocking); if (sock == XORP_BAD_SOCKET) return (XORP_BAD_SOCKET); if (reuse_flag) { if (comm_set_reuseaddr(sock, 1) != XORP_OK) { comm_sock_close(sock); return (XORP_BAD_SOCKET); } if (comm_set_reuseport(sock, 1) != XORP_OK) { comm_sock_close(sock); return (XORP_BAD_SOCKET); } } /* Bind the socket */ if (comm_sock_bind6(sock, NULL, 0, my_port) != XORP_OK) { comm_sock_close(sock); return (XORP_BAD_SOCKET); } /* Join the multicast group */ if (comm_sock_join6(sock, mcast_addr, my_ifindex) != XORP_OK) { comm_sock_close(sock); return (XORP_BAD_SOCKET); } return (sock); #else /* ! HAVE_IPV6 */ comm_sock_no_ipv6("comm_bind_join_udp6", mcast_addr, my_ifindex, my_port, reuse_flag, is_blocking); return (XORP_BAD_SOCKET); #endif /* ! HAVE_IPV6 */ }