END_TEST START_TEST (test_sockaddr_int_IPv6_init) { char addr_str[256]; char addr_str_small[4]; uint8_t a[16] = {0x20, 0x1, 0x4, 0x70, 0xdc, 0x88, 0x0, 0x2, 0x2, 0x26, 0x18, 0xff, 0xfe, 0x92, 0x6d, 0x53}; uint16_t port = 4567; struct sockaddr_storage a_addr; struct sockaddr_storage b_addr; sockaddr_initFromIPv6Int((struct sockaddr_in6 *)&a_addr, a, htons(port)); fail_unless(sockaddr_initFromIPv6String((struct sockaddr_in6 *)&b_addr, "[2001:470:dc88:2:226:18ff:fe92:6d53]:4567")); sockaddr_toString( (struct sockaddr *)&a_addr, addr_str, 256, true); fail_unless( sockaddr_alike( (struct sockaddr *)&a_addr, (struct sockaddr *)&b_addr) ); fail_if( sockaddr_initFromIPv6String((struct sockaddr_in6 *)&b_addr, "[2001:470:dc88:2:226:18ff:fe92:6d53")); fail_if( sockaddr_initFromIPv6String((struct sockaddr_in6 *)&b_addr, "[2001:470:dc88:2:226:18ff:fe92:6d53:456]")); fail_if( sockaddr_initFromIPv6String((struct sockaddr_in6 *)&b_addr, "2001:470:dc88:2:226:18ff:fe92:6d53:4567]:4567")); }
static bool StoreBindResp(STUN_TRANSACTION_DATA* trans, StunMessage* resp) { STUN_CLIENT_DATA* client = trans->client; if (resp->hasXorMappedAddress) { if (resp->xorMappedAddress.familyType == STUN_ADDR_IPv4Family) { sockaddr_initFromIPv4Int( (struct sockaddr_in*)&trans->rflxAddr, htonl(resp->xorMappedAddress.addr.v4.addr), htons(resp->xorMappedAddress.addr.v4.port) ); } else if (resp->xorMappedAddress.familyType == STUN_ADDR_IPv6Family) { sockaddr_initFromIPv6Int( (struct sockaddr_in6*)&trans->rflxAddr, resp->xorMappedAddress.addr.v6.addr, htons(resp->xorMappedAddress.addr.v6.port) ); } return true; } else { StunPrint(client->logUserData, client->Log_cb, StunInfoCategory_Error, "<STUNCLIENT:%02d> Missing XorMappedAddress BindResp", trans->inst); return false; } }
int getRemoteTurnServerIp(struct turn_info *turnInfo, char *fqdn) { struct addrinfo hints, *res, *p; int status; char ipstr[INET6_ADDRSTRLEN]; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; // AF_INET or AF_INET6 to force version hints.ai_socktype = SOCK_STREAM; if ((status = getaddrinfo(fqdn, NULL, &hints, &res)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); return 2; } for(p = res;p != NULL; p = p->ai_next) { void *addr; char *ipver; // get the pointer to the address itself, // different fields in IPv4 and IPv6: if (p->ai_family == AF_INET) { // IPv4 struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; if ( ipv4->sin_port == 0 ) { sockaddr_initFromIPv4Int((struct sockaddr_in *)&turnInfo->remoteIp4, ipv4->sin_addr.s_addr, htons(3478)); } addr = &(ipv4->sin_addr); ipver = "IPv4"; } else { // IPv6 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr; if ( ipv6->sin6_port == 0 ) { sockaddr_initFromIPv6Int((struct sockaddr_in6 *)&turnInfo->remoteIp6, ipv6->sin6_addr.s6_addr, htons(3478)); } addr = &(ipv6->sin6_addr); ipver = "IPv6"; } // convert the IP to a string and print it: //inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr); //printf(" %s: %s\n", ipver, ipstr); } freeaddrinfo(res); // free the linked list return 0; }
int getSockaddrFromFqdn(struct sockaddr* addr_out, const char* fqdn, unsigned int port) { struct addrinfo hints, * res, * p; int status; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; /* AF_INET or AF_INET6 to force version */ hints.ai_socktype = SOCK_STREAM; if ( ( status = getaddrinfo(fqdn, NULL, &hints, &res) ) != 0 ) { fprintf( stderr, "getaddrinfo: %s\n", gai_strerror(status) ); return 2; } for (p = res; p != NULL; p = p->ai_next) { /* get the pointer to the address itself, */ /* different fields in IPv4 and IPv6: */ if (p->ai_family == AF_INET) /* IPv4 */ { struct sockaddr_in* ipv4 = (struct sockaddr_in*)p->ai_addr; if (ipv4->sin_port == 0) { sockaddr_initFromIPv4Int( (struct sockaddr_in*)addr_out, ipv4->sin_addr.s_addr, htons(port) ); } } else /* IPv6 */ { struct sockaddr_in6* ipv6 = (struct sockaddr_in6*)p->ai_addr; if (ipv6->sin6_port == 0) { sockaddr_initFromIPv6Int( (struct sockaddr_in6*)addr_out, ipv6->sin6_addr.s6_addr, htons(port) ); } } } freeaddrinfo(res); /* free the linked list */ return 0; }
END_TEST START_TEST (response_decode_IPv6) { StunMessage stunMsg; struct sockaddr_storage a; struct sockaddr_storage b; sockaddr_initFromString((struct sockaddr*)&b, "[2001:db8:1234:5678:11:2233:4455:6677]:32853"); fail_unless( stunlib_DecodeMessage( respv6, 96, &stunMsg, NULL, NULL )); fail_unless( stunlib_checkIntegrity(respv6, 96, &stunMsg, password, sizeof(password)) ); fail_unless ( 0 == memcmp(&stunMsg.msgHdr.id.octet,&idOctet,12)); fail_unless( stunMsg.msgHdr.msgType == STUN_MSG_BindResponseMsg ); fail_unless( stunMsg.hasXorMappedAddress ); sockaddr_initFromIPv6Int((struct sockaddr_in6 *)&a, stunMsg.xorMappedAddress.addr.v6.addr, htons(stunMsg.xorMappedAddress.addr.v6.port)); fail_unless( sockaddr_alike((struct sockaddr *)&a, (struct sockaddr *)&b) ); fail_unless( stunMsg.xorMappedAddress.addr.v6.port == port ); fail_unless( stunMsg.hasSoftware); fail_unless( strncmp( stunMsg.software.value, software_resp, max(stunMsg.software.sizeValue,sizeof(software_resp)) )==0 ); }