示例#1
0
static void
try_dscp_v6(void) {
#ifdef ISC_PLATFORM_HAVEIPV6
#ifdef WANT_IPV6
#ifdef IPV6_TCLASS
	char strbuf[ISC_STRERRORSIZE];
	struct addrinfo hints, *res0;
	int s, dscp = 0, n;
#if defined(IPV6_RECVTCLASS)
	int on = 1;
#endif /* IPV6_RECVTCLASS */

	memset(&hints, 0, sizeof(hints));
	hints.ai_family = AF_INET6;
	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_protocol = IPPROTO_UDP;
#ifdef AI_NUMERICHOST
	hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
#else
	hints.ai_flags = AI_PASSIVE;
#endif

	n = getaddrinfo("::1", NULL, &hints, &res0);
	if (n != 0 || res0 == NULL) {
		isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
			      ISC_LOGMODULE_SOCKET, ISC_LOG_DEBUG(10),
			      "getaddrinfo(::1): %s", gai_strerror(n));
		return;
	}

	s = socket(res0->ai_family, res0->ai_socktype, res0->ai_protocol);
	if (s == -1) {
		isc__strerror(errno, strbuf, sizeof(strbuf));
		isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
			      ISC_LOGMODULE_SOCKET, ISC_LOG_DEBUG(10),
			      "socket: %s", strbuf);
		freeaddrinfo(res0);
		return;
	}
	if (setsockopt(s, IPPROTO_IPV6, IPV6_TCLASS, &dscp, sizeof(dscp)) == 0)
		dscp_result |= ISC_NET_DSCPSETV6;

#ifdef IPV6_RECVTCLASS
	on = 1;
	if (setsockopt(s, IPPROTO_IPV6, IPV6_RECVTCLASS, &on, sizeof(on)) == 0)
		dscp_result |= ISC_NET_DSCPRECVV6;
#endif /* IPV6_RECVTCLASS */

#ifdef ISC_NET_BSD44MSGHDR
	if (cmsgsend(s, IPPROTO_IPV6, IPV6_TCLASS, res0))
		dscp_result |= ISC_NET_DSCPPKTV6;
#endif /* ISC_NET_BSD44MSGHDR */

	freeaddrinfo(res0);
	close(s);

#endif /* IPV6_TCLASS */
#endif /* WANT_IPV6 */
#endif /* ISC_PLATFORM_HAVEIPV6 */
}
示例#2
0
文件: net.c 项目: execunix/vinos
static void
try_dscp_v4(void) {
#ifdef IP_TOS
    char strbuf[ISC_STRERRORSIZE];
    struct addrinfo hints, *res0;
    int s, dscp = 0, n;
#ifdef IP_RECVTOS
    int on = 1;
#endif /* IP_RECVTOS */

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_DGRAM;
    hints.ai_protocol = IPPROTO_UDP;
#ifdef AI_NUMERICHOST
    hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
#else
    hints.ai_flags = AI_PASSIVE;
#endif

    n = getaddrinfo("127.0.0.1", NULL, &hints, &res0);
    if (n != 0 || res0 == NULL) {
        isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
                      ISC_LOGMODULE_SOCKET, ISC_LOG_DEBUG(10),
                      "getaddrinfo(127.0.0.1): %s", gai_strerror(n));
        return;
    }

    s = socket(res0->ai_family, res0->ai_socktype, res0->ai_protocol);

    if (s == -1) {
        isc__strerror(errno, strbuf, sizeof(strbuf));
        isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
                      ISC_LOGMODULE_SOCKET, ISC_LOG_DEBUG(10),
                      "socket: %s", strbuf);
        freeaddrinfo(res0);
        return;
    }

    if (setsockopt(s, IPPROTO_IP, IP_TOS, &dscp, sizeof(dscp)) == 0)
        dscp_result |= ISC_NET_DSCPSETV4;

#ifdef IP_RECVTOS
    on = 1;
    if (setsockopt(s, IPPROTO_IP, IP_RECVTOS, &on, sizeof(on)) == 0)
        dscp_result |= ISC_NET_DSCPRECVV4;
#endif /* IP_RECVTOS */

#ifdef ISC_NET_BSD44MSGHDR

#ifndef ISC_CMSG_IP_TOS
#ifdef __APPLE__
#define ISC_CMSG_IP_TOS 0	/* As of 10.8.2. */
#else /* ! __APPLE__ */
#define ISC_CMSG_IP_TOS 1
#endif /* ! __APPLE__ */
#endif /* ! ISC_CMSG_IP_TOS */

#if ISC_CMSG_IP_TOS
    if (cmsgsend(s, IPPROTO_IP, IP_TOS, res0))
        dscp_result |= ISC_NET_DSCPPKTV4;
#endif /* ISC_CMSG_IP_TOS */

#endif /* ISC_NET_BSD44MSGHDR */

    freeaddrinfo(res0);
    close(s);

#endif /* IP_TOS */
}