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); }
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))); }
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; }
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; }
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"); }
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; }
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; }
static bool is_RFC3927(const unsigned char *ipaddr) { return is_ipv4_mapped(ipaddr) && ipaddr[GB(3)] == 169 && ipaddr[GB(2)] == 254; }