Пример #1
0
static void test_ipv4_mapped(void)
{
	bool rc = is_ipv4_mapped((const unsigned char *)addr1);
	assert(rc);

	rc = is_ipv4_mapped((const unsigned char *)addr2);
	assert(!rc);
}
Пример #2
0
static bool is_RFC1918(const unsigned char *ipaddr)
{
	return is_ipv4_mapped(ipaddr) &&
		(ipaddr[GB(3)] == 10 ||
		(ipaddr[GB(3)] == 192 && ipaddr[GB(2)] == 168) ||
		(ipaddr[GB(3)] == 172 && (ipaddr[GB(2)] >= 16 && ipaddr[GB(2)] <= 31)));
}
Пример #3
0
void bn_address_str(char *host, size_t hostsz, const unsigned char *ipaddr)
{
	bool is_ipv4 = is_ipv4_mapped(ipaddr);

	if (is_ipv4) {
		struct sockaddr_in saddr;

		memset(&saddr, 0, sizeof(saddr));
		saddr.sin_family = AF_INET;
		memcpy(&saddr.sin_addr, &ipaddr[12], 4);

		getnameinfo((struct sockaddr *) &saddr, sizeof(saddr),
			    host, hostsz,
			    NULL, 0, NI_NUMERICHOST);
	} else {
		struct sockaddr_in6 saddr;

		memset(&saddr, 0, sizeof(saddr));
		saddr.sin6_family = AF_INET6;
		memcpy(&saddr.sin6_addr, ipaddr, 16);

		getnameinfo((struct sockaddr *) &saddr, sizeof(saddr),
			    host, hostsz,
			    NULL, 0, NI_NUMERICHOST);
	}

	host[hostsz - 1] = 0;
}
Пример #4
0
static bool is_local(const unsigned char *ipaddr)
{
	if (is_ipv4_mapped(ipaddr) &&
	    (ipaddr[GB(3)] == 127 || ipaddr[GB(3)] == 0))
		return true;

	static const unsigned char pchLocal[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
	if (!memcmp(ipaddr, pchLocal, sizeof(pchLocal)))
		return true;

	return false;
}
Пример #5
0
static void list_dns_seeds(void)
{
    GList *tmp, *addrlist = bu_dns_seed_addrs();

    size_t list_len = g_list_length(addrlist);
    unsigned int n_ent = 0;

    printf("[\n");

    for (tmp = addrlist; tmp != NULL; tmp = tmp->next) {
        struct bp_address *addr = tmp->data;
        char host[64];
        bool is_ipv4 = is_ipv4_mapped(addr->ip);

        if (is_ipv4) {
            struct sockaddr_in saddr;

            memset(&saddr, 0, sizeof(saddr));
            saddr.sin_family = AF_INET;
            memcpy(&saddr.sin_addr, &addr->ip[12], 4);

            getnameinfo((struct sockaddr *) &saddr, sizeof(saddr),
                        host, sizeof(host),
                        NULL, 0, NI_NUMERICHOST);
        } else {
            struct sockaddr_in6 saddr;

            memset(&saddr, 0, sizeof(saddr));
            saddr.sin6_family = AF_INET6;
            memcpy(&saddr.sin6_addr, &addr->ip, 16);

            getnameinfo((struct sockaddr *) &saddr, sizeof(saddr),
                        host, sizeof(host),
                        NULL, 0, NI_NUMERICHOST);
        }

        printf("  [ %s, \"%s\", %u, %llu ]%s\n",
               is_ipv4 ? "true" : "false",
               host,
               addr->port,
               (unsigned long long) addr->nServices,
               (n_ent == (list_len - 1)) ? "" : ",");

        n_ent++;
    }

    g_list_free_full(addrlist, g_free);

    printf("]\n");
}
Пример #6
0
static bool is_valid(const unsigned char *ipaddr)
{
	static const unsigned char none[16] = {};
	if (!memcmp(ipaddr, none, 16))
		return false;

	if (is_RFC3849(ipaddr))
		return false;

	if (is_ipv4_mapped(ipaddr) &&
	    !memcmp(ipaddr + 12, none, 4))
		return false;

	return true;
}
Пример #7
0
static bool nc_conn_start(struct nc_conn *conn)
{
	/* create socket */
	conn->ipv4 = is_ipv4_mapped(conn->peer.addr.ip);
	conn->fd = socket(conn->ipv4 ? AF_INET : AF_INET6,
			  SOCK_STREAM, IPPROTO_TCP);
	if (conn->fd < 0) {
		log_error("net: socket %s: %s",
			conn->addr_str,
			strerror(errno));
		return false;
	}

	/* set non-blocking */
	int flags = fcntl(conn->fd, F_GETFL, 0);
	if ((flags < 0) ||
	    (fcntl(conn->fd, F_SETFL, flags | O_NONBLOCK) < 0)) {
		log_error("net: socket fcntl %s: %s",
			conn->addr_str,
			strerror(errno));
		return false;
	}

	struct sockaddr *saddr;
	struct sockaddr_in6 saddr6;
	struct sockaddr_in saddr4;
	socklen_t saddr_len;

	/* fill out connect(2) address */
	if (conn->ipv4) {
		memset(&saddr4, 0, sizeof(saddr4));
		saddr4.sin_family = AF_INET;
		memcpy(&saddr4.sin_addr.s_addr,
		       &conn->peer.addr.ip[12], 4);
		saddr4.sin_port = htons(conn->peer.addr.port);

		saddr = (struct sockaddr *) &saddr4;
		saddr_len = sizeof(saddr4);
	} else {
		memset(&saddr6, 0, sizeof(saddr6));
		saddr6.sin6_family = AF_INET6;
		memcpy(&saddr6.sin6_addr.s6_addr,
		       &conn->peer.addr.ip[0], 16);
		saddr6.sin6_port = htons(conn->peer.addr.port);

		saddr = (struct sockaddr *) &saddr6;
		saddr_len = sizeof(saddr6);
	}

	/* initiate TCP connection */
	if (connect(conn->fd, saddr, saddr_len) < 0) {
		if (errno != EINPROGRESS) {
			log_error("net: socket connect %s: %s",
				conn->addr_str,
				strerror(errno));
			return false;
		}
	}

	return true;
}
Пример #8
0
static bool is_RFC3927(const unsigned char *ipaddr)
{
	return	is_ipv4_mapped(ipaddr) &&
		ipaddr[GB(3)] == 169 &&
		ipaddr[GB(2)] == 254;
}