Add part of platform-independent network API implementation

socket      -> net_socket
htons       -> net_htons
htonl       -> net_htonl
connect     -> net_connect
sendto      -> net_sendto_ip4
getaddrinfo -> net_getipport
sa_family_t -> Family
This commit is contained in:
Diadlo 2017-01-07 11:28:53 +03:00
parent b2d04eae9d
commit b19a9e5464
No known key found for this signature in database
GPG Key ID: 5AF9F2E29107C727
29 changed files with 480 additions and 338 deletions

View File

@ -38,13 +38,15 @@ START_TEST(test_basic)
ck_assert_msg(tcp_s != NULL, "Failed to create TCP relay server");
ck_assert_msg(tcp_server_listen_count(tcp_s) == NUM_PORTS, "Failed to bind to all ports");
Socket sock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in6 addr6_loopback = {0};
addr6_loopback.sin6_family = AF_INET6;
addr6_loopback.sin6_port = htons(ports[rand() % NUM_PORTS]);
addr6_loopback.sin6_addr = in6addr_loopback;
Socket sock = net_socket(TOX_AF_INET6, TOX_SOCK_STREAM, TOX_PROTO_TCP);
IP_Port ip_port_loopback;
ip_port_loopback.ip.family = AF_INET6;
ip_port_loopback.ip.ip6.uint64[0] = 0;
ip_port_loopback.ip.ip6.uint64[1] = 0;
ip_port_loopback.ip.ip6.uint8[15] = 1; // ::1
ip_port_loopback.port = net_htons(ports[rand() % NUM_PORTS]);
int ret = connect(sock, (struct sockaddr *)&addr6_loopback, sizeof(addr6_loopback));
int ret = net_connect(sock, ip_port_loopback);
ck_assert_msg(ret == 0, "Failed to connect to TCP relay server");
uint8_t f_public_key[CRYPTO_PUBLIC_KEY_SIZE];
@ -93,7 +95,7 @@ START_TEST(test_basic)
memcpy(r_req_p + 1, f_public_key, CRYPTO_PUBLIC_KEY_SIZE);
uint8_t r_req[2 + 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_MAC_SIZE];
uint16_t size = 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_MAC_SIZE;
size = htons(size);
size = net_htons(size);
encrypt_data_symmetric(f_shared_key, f_nonce, r_req_p, 1 + CRYPTO_PUBLIC_KEY_SIZE, r_req + 2);
increment_nonce(f_nonce);
memcpy(r_req, &size, 2);
@ -113,7 +115,7 @@ START_TEST(test_basic)
ck_assert_msg(recv_data_len == 2 + 2 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_MAC_SIZE,
"recv Failed. %u", recv_data_len);
memcpy(&size, packet_resp, 2);
ck_assert_msg(ntohs(size) == 2 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_MAC_SIZE, "Wrong packet size.");
ck_assert_msg(net_ntohs(size) == 2 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_MAC_SIZE, "Wrong packet size.");
uint8_t packet_resp_plain[4096];
ret = decrypt_data_symmetric(f_shared_key, f_nonce_r, packet_resp + 2, recv_data_len - 2, packet_resp_plain);
ck_assert_msg(ret != -1, "decryption failed");
@ -136,13 +138,16 @@ struct sec_TCP_con {
static struct sec_TCP_con *new_TCP_con(TCP_Server *tcp_s)
{
struct sec_TCP_con *sec_c = (struct sec_TCP_con *)malloc(sizeof(struct sec_TCP_con));
Socket sock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in6 addr6_loopback = {0};
addr6_loopback.sin6_family = AF_INET6;
addr6_loopback.sin6_port = htons(ports[rand() % NUM_PORTS]);
addr6_loopback.sin6_addr = in6addr_loopback;
Socket sock = net_socket(TOX_AF_INET6, TOX_SOCK_STREAM, TOX_PROTO_TCP);
int ret = connect(sock, (struct sockaddr *)&addr6_loopback, sizeof(addr6_loopback));
IP_Port ip_port_loopback;
ip_port_loopback.ip.family = AF_INET6;
ip_port_loopback.ip.ip6.uint64[0] = 0;
ip_port_loopback.ip.ip6.uint64[1] = 0;
ip_port_loopback.ip.ip6.uint8[15] = 1; // ::1
ip_port_loopback.port = net_htons(ports[rand() % NUM_PORTS]);
int ret = net_connect(sock, ip_port_loopback);
ck_assert_msg(ret == 0, "Failed to connect to TCP relay server");
uint8_t f_secret_key[CRYPTO_SECRET_KEY_SIZE];
@ -190,7 +195,7 @@ static int write_packet_TCP_secure_connection(struct sec_TCP_con *con, uint8_t *
{
VLA(uint8_t, packet, sizeof(uint16_t) + length + CRYPTO_MAC_SIZE);
uint16_t c_length = htons(length + CRYPTO_MAC_SIZE);
uint16_t c_length = net_htons(length + CRYPTO_MAC_SIZE);
memcpy(packet, &c_length, sizeof(uint16_t));
int len = encrypt_data_symmetric(con->shared_key, con->sent_nonce, data, length, packet + sizeof(uint16_t));
@ -405,7 +410,7 @@ START_TEST(test_client)
crypto_new_keypair(f_public_key, f_secret_key);
IP_Port ip_port_tcp_s;
ip_port_tcp_s.port = htons(ports[rand() % NUM_PORTS]);
ip_port_tcp_s.port = net_htons(ports[rand() % NUM_PORTS]);
ip_port_tcp_s.ip.family = AF_INET6;
get_ip6(&ip_port_tcp_s.ip.ip6, &in6addr_loopback);
TCP_Client_Connection *conn = new_TCP_connection(ip_port_tcp_s, self_public_key, f_public_key, f_secret_key, 0);
@ -435,7 +440,7 @@ START_TEST(test_client)
uint8_t f2_public_key[CRYPTO_PUBLIC_KEY_SIZE];
uint8_t f2_secret_key[CRYPTO_SECRET_KEY_SIZE];
crypto_new_keypair(f2_public_key, f2_secret_key);
ip_port_tcp_s.port = htons(ports[rand() % NUM_PORTS]);
ip_port_tcp_s.port = net_htons(ports[rand() % NUM_PORTS]);
TCP_Client_Connection *conn2 = new_TCP_connection(ip_port_tcp_s, self_public_key, f2_public_key, f2_secret_key, 0);
routing_response_handler(conn, response_callback, (char *)conn + 2);
routing_status_handler(conn, status_callback, (void *)2);
@ -503,7 +508,7 @@ START_TEST(test_client_invalid)
crypto_new_keypair(f_public_key, f_secret_key);
IP_Port ip_port_tcp_s;
ip_port_tcp_s.port = htons(ports[rand() % NUM_PORTS]);
ip_port_tcp_s.port = net_htons(ports[rand() % NUM_PORTS]);
ip_port_tcp_s.ip.family = AF_INET6;
get_ip6(&ip_port_tcp_s.ip.ip6, &in6addr_loopback);
TCP_Client_Connection *conn = new_TCP_connection(ip_port_tcp_s, self_public_key, f_public_key, f_secret_key, 0);
@ -572,7 +577,7 @@ START_TEST(test_tcp_connection)
IP_Port ip_port_tcp_s;
ip_port_tcp_s.port = htons(ports[rand() % NUM_PORTS]);
ip_port_tcp_s.port = net_htons(ports[rand() % NUM_PORTS]);
ip_port_tcp_s.ip.family = AF_INET6;
get_ip6(&ip_port_tcp_s.ip.ip6, &in6addr_loopback);
@ -581,7 +586,7 @@ START_TEST(test_tcp_connection)
ck_assert_msg(add_tcp_relay_connection(tc_1, connection, ip_port_tcp_s, tcp_server_public_key(tcp_s)) == 0,
"Could not add tcp relay to connection\n");
ip_port_tcp_s.port = htons(ports[rand() % NUM_PORTS]);
ip_port_tcp_s.port = net_htons(ports[rand() % NUM_PORTS]);
connection = new_tcp_connection_to(tc_2, tcp_connections_public_key(tc_1), 123);
ck_assert_msg(connection == 0, "Connection id wrong");
ck_assert_msg(add_tcp_relay_connection(tc_2, connection, ip_port_tcp_s, tcp_server_public_key(tcp_s)) == 0,
@ -681,7 +686,7 @@ START_TEST(test_tcp_connection2)
IP_Port ip_port_tcp_s;
ip_port_tcp_s.port = htons(ports[rand() % NUM_PORTS]);
ip_port_tcp_s.port = net_htons(ports[rand() % NUM_PORTS]);
ip_port_tcp_s.ip.family = AF_INET6;
get_ip6(&ip_port_tcp_s.ip.ip6, &in6addr_loopback);

View File

@ -276,7 +276,7 @@ static void increment_nonce_number_cmp(uint8_t *nonce, uint32_t num)
{
uint32_t num1, num2;
memcpy(&num1, nonce + (CRYPTO_NONCE_SIZE - sizeof(num1)), sizeof(num1));
num1 = ntohl(num1);
num1 = net_ntohl(num1);
num2 = num + num1;
if (num2 < num1) {
@ -291,7 +291,7 @@ static void increment_nonce_number_cmp(uint8_t *nonce, uint32_t num)
}
}
num2 = htonl(num2);
num2 = net_htonl(num2);
memcpy(nonce + (CRYPTO_NONCE_SIZE - sizeof(num2)), &num2, sizeof(num2));
}

View File

@ -623,7 +623,7 @@ loop_top:
IP_Port ip_port;
ip_init(&ip_port.ip, 1);
ip_port.ip.ip6.uint8[15] = 1;
ip_port.port = htons(DHT_DEFAULT_PORT + i);
ip_port.port = net_htons(DHT_DEFAULT_PORT + i);
DHT_bootstrap(dhts[(i - 1) % NUM_DHT], ip_port, dhts[i]->self_public_key);
}

View File

@ -21,7 +21,7 @@ START_TEST(test_addr_resolv_localhost)
* normally this should happen automatically
* cygwin doesn't do it for every network related function though
* e.g. not for getaddrinfo... */
socket(0, 0, 0);
net_socket(0, 0, 0);
errno = 0;
#endif
@ -35,12 +35,10 @@ START_TEST(test_addr_resolv_localhost)
ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno));
if (res > 0) {
ck_assert_msg(ip.family == AF_INET, "Expected family AF_INET, got %u.", ip.family);
struct in_addr addr;
fill_addr4(ip.ip4, &addr);
ck_assert_msg(ip.ip4.uint32 == htonl(0x7F000001), "Expected 127.0.0.1, got %s.", inet_ntoa(addr));
}
char ip_str[IP_NTOA_LEN];
ck_assert_msg(ip.family == AF_INET, "Expected family AF_INET, got %u.", ip.family);
ck_assert_msg(ip.ip4.uint32 == net_htonl(0x7F000001), "Expected 127.0.0.1, got %s.",
ip_ntoa(&ip, ip_str, sizeof(ip_str)));
ip_init(&ip, 1); // ipv6enabled = 1
res = addr_resolve(localhost, &ip, NULL);
@ -52,35 +50,29 @@ START_TEST(test_addr_resolv_localhost)
ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno));
if (res > 0) {
char ip_str[IP_NTOA_LEN];
ck_assert_msg(ip.family == AF_INET6, "Expected family AF_INET6 (%u), got %u.", AF_INET6, ip.family);
ck_assert_msg(!memcmp(&ip.ip6, &in6addr_loopback, sizeof(IP6)), "Expected ::1, got %s.",
ip_ntoa(&ip, ip_str, sizeof(ip_str)));
}
ck_assert_msg(ip.family == AF_INET6, "Expected family AF_INET6 (%u), got %u.", AF_INET6, ip.family);
ck_assert_msg(!memcmp(&ip.ip6, &in6addr_loopback, sizeof(IP6)), "Expected ::1, got %s.",
ip_ntoa(&ip, ip_str, sizeof(ip_str)));
if (!localhost_split) {
ip_init(&ip, 1); // ipv6enabled = 1
ip.family = AF_UNSPEC;
IP extra;
ip_reset(&extra);
res = addr_resolve(localhost, &ip, &extra);
ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno));
if (res > 0) {
char ip_str[IP_NTOA_LEN];
ck_assert_msg(ip.family == AF_INET6, "Expected family AF_INET6 (%u), got %u.", AF_INET6, ip.family);
ck_assert_msg(!memcmp(&ip.ip6, &in6addr_loopback, sizeof(IP6)), "Expected ::1, got %s.",
ip_ntoa(&ip, ip_str, sizeof(ip_str)));
struct in_addr addr;
fill_addr4(ip.ip4, &addr);
ck_assert_msg(extra.family == AF_INET, "Expected family AF_INET (%u), got %u.", AF_INET, extra.family);
ck_assert_msg(extra.ip4.uint32 == htonl(0x7F000001), "Expected 127.0.0.1, got %s.", inet_ntoa(addr));
}
} else {
if (localhost_split) {
printf("Localhost seems to be split in two.\n");
return;
}
ip_init(&ip, 1); // ipv6enabled = 1
ip.family = AF_UNSPEC;
IP extra;
ip_reset(&extra);
res = addr_resolve(localhost, &ip, &extra);
ck_assert_msg(res > 0, "Resolver failed: %u, %s (%x, %x)", errno, strerror(errno));
ck_assert_msg(ip.family == AF_INET6, "Expected family AF_INET6 (%u), got %u.", AF_INET6, ip.family);
ck_assert_msg(!memcmp(&ip.ip6, &in6addr_loopback, sizeof(IP6)), "Expected ::1, got %s.",
ip_ntoa(&ip, ip_str, sizeof(ip_str)));
ck_assert_msg(extra.family == AF_INET, "Expected family AF_INET (%u), got %u.", AF_INET, extra.family);
ck_assert_msg(extra.ip4.uint32 == net_htonl(0x7F000001), "Expected 127.0.0.1, got %s.",
ip_ntoa(&ip, ip_str, sizeof(ip_str)));
}
END_TEST
@ -101,18 +93,18 @@ START_TEST(test_ip_equal)
ck_assert_msg(res == 0, "ip_equal(NULL, PTR): expected result 0, got %u.", res);
ip1.family = AF_INET;
ip1.ip4.uint32 = htonl(0x7F000001);
ip1.ip4.uint32 = net_htonl(0x7F000001);
res = ip_equal(&ip1, &ip2);
ck_assert_msg(res == 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_UNSPEC, 0} ): expected result 0, got %u.", res);
ip2.family = AF_INET;
ip2.ip4.uint32 = htonl(0x7F000001);
ip2.ip4.uint32 = net_htonl(0x7F000001);
res = ip_equal(&ip1, &ip2);
ck_assert_msg(res != 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_INET, 127.0.0.1} ): expected result != 0, got 0.");
ip2.ip4.uint32 = htonl(0x7F000002);
ip2.ip4.uint32 = net_htonl(0x7F000002);
res = ip_equal(&ip1, &ip2);
ck_assert_msg(res == 0, "ip_equal( {AF_INET, 127.0.0.1}, {AF_INET, 127.0.0.2} ): expected result 0, got %u.", res);
@ -120,8 +112,8 @@ START_TEST(test_ip_equal)
ip2.family = AF_INET6;
ip2.ip6.uint32[0] = 0;
ip2.ip6.uint32[1] = 0;
ip2.ip6.uint32[2] = htonl(0xFFFF);
ip2.ip6.uint32[3] = htonl(0x7F000001);
ip2.ip6.uint32[2] = net_htonl(0xFFFF);
ip2.ip6.uint32[3] = net_htonl(0x7F000001);
ck_assert_msg(IPV6_IPV4_IN_V6(ip2.ip6) != 0,
"IPV6_IPV4_IN_V6(::ffff:127.0.0.1): expected != 0, got 0.");

View File

@ -166,11 +166,11 @@ int main(int argc, char *argv[])
fclose(file);
printf("\n");
printf("Port: %u\n", ntohs(dht->net->port));
printf("Port: %u\n", net_ntohs(dht->net->port));
if (argc > argvoffset + 3) {
printf("Trying to bootstrap into the network...\n");
uint16_t port = htons(atoi(argv[argvoffset + 2]));
uint16_t port = net_htons(atoi(argv[argvoffset + 2]));
uint8_t *bootstrap_key = hex_string_to_bin(argv[argvoffset + 3]);
int res = DHT_bootstrap_from_address(dht, argv[argvoffset + 1],
ipv6enabled, port, bootstrap_key);
@ -196,7 +196,7 @@ int main(int argc, char *argv[])
do_DHT(dht);
if (is_timeout(last_LANdiscovery, is_waiting_for_dht_connection ? 5 : LAN_DISCOVERY_INTERVAL)) {
send_LANdiscovery(htons(PORT), dht);
send_LANdiscovery(net_htons(PORT), dht);
last_LANdiscovery = unix_time();
}

View File

@ -406,7 +406,7 @@ int bootstrap_from_config(const char *cfg_file_path, DHT *dht, int enable_ipv6)
}
bs_public_key_bin = hex_string_to_bin(bs_public_key);
address_resolved = DHT_bootstrap_from_address(dht, bs_address, enable_ipv6, htons(bs_port),
address_resolved = DHT_bootstrap_from_address(dht, bs_address, enable_ipv6, net_htons(bs_port),
bs_public_key_bin);
free(bs_public_key_bin);

View File

@ -312,7 +312,7 @@ int main(int argc, char *argv[])
print_public_key(dht->self_public_key);
uint64_t last_LANdiscovery = 0;
const uint16_t htons_port = htons(port);
const uint16_t net_htons_port = net_htons(port);
int waiting_for_dht_connection = 1;
@ -325,7 +325,7 @@ int main(int argc, char *argv[])
do_DHT(dht);
if (enable_lan_discovery && is_timeout(last_LANdiscovery, LAN_DISCOVERY_INTERVAL)) {
send_LANdiscovery(htons_port, dht);
send_LANdiscovery(net_htons_port, dht);
last_LANdiscovery = unix_time();
}

View File

@ -61,7 +61,7 @@ int bootstrap_set_callbacks(Networking_Core *net, uint32_t version, uint8_t *mot
return -1;
}
bootstrap_version = htonl(version);
bootstrap_version = net_htonl(version);
memcpy(bootstrap_motd, motd, motd_length);
bootstrap_motd_length = motd_length;

View File

@ -88,16 +88,16 @@ static void print_assoc(IPPTsPng *assoc, uint8_t ours)
{
IP_Port *ipp = &assoc->ip_port;
char ip_str[IP_NTOA_LEN];
printf("\nIP: %s Port: %u", ip_ntoa(&ipp->ip, ip_str, sizeof(ip_str)), ntohs(ipp->port));
printf("\nIP: %s Port: %u", ip_ntoa(&ipp->ip, ip_str, sizeof(ip_str)), net_ntohs(ipp->port));
printf("\nTimestamp: %llu", (long long unsigned int) assoc->timestamp);
printf("\nLast pinged: %llu\n", (long long unsigned int) assoc->last_pinged);
ipp = &assoc->ret_ip_port;
if (ours) {
printf("OUR IP: %s Port: %u\n", ip_ntoa(&ipp->ip, ip_str, sizeof(ip_str)), ntohs(ipp->port));
printf("OUR IP: %s Port: %u\n", ip_ntoa(&ipp->ip, ip_str, sizeof(ip_str)), net_ntohs(ipp->port));
} else {
printf("RET IP: %s Port: %u\n", ip_ntoa(&ipp->ip, ip_str, sizeof(ip_str)), ntohs(ipp->port));
printf("RET IP: %s Port: %u\n", ip_ntoa(&ipp->ip, ip_str, sizeof(ip_str)), net_ntohs(ipp->port));
}
printf("Timestamp: %llu\n", (long long unsigned int) assoc->ret_timestamp);
@ -138,7 +138,7 @@ static void print_friendlist(DHT *dht)
int friendok = DHT_getfriendip(dht, dht->friends_list[k].public_key, &p_ip);
char ip_str[IP_NTOA_LEN];
printf("\nIP: %s:%u (%d)", ip_ntoa(&p_ip.ip, ip_str, sizeof(ip_str)), ntohs(p_ip.port), friendok);
printf("\nIP: %s:%u (%d)", ip_ntoa(&p_ip.ip, ip_str, sizeof(ip_str)), net_ntohs(p_ip.port), friendok);
printf("\nCLIENTS IN LIST:\n\n");
@ -227,7 +227,7 @@ int main(int argc, char *argv[])
perror("Initialization");
uint16_t port = htons(atoi(argv[argvoffset + 2]));
uint16_t port = net_htons(atoi(argv[argvoffset + 2]));
unsigned char *binary_string = hex_string_to_bin(argv[argvoffset + 3]);
int res = DHT_bootstrap_from_address(dht, argv[argvoffset + 1], ipv6enabled, port, binary_string);
free(binary_string);

View File

@ -126,7 +126,7 @@ int main(int argc, char *argv[])
}
if (argc == argvoffset + 4) {
uint16_t port = htons(atoi(argv[argvoffset + 2]));
uint16_t port = net_htons(atoi(argv[argvoffset + 2]));
uint8_t *bootstrap_key = hex_string_to_bin(argv[argvoffset + 3]);
int res = DHT_bootstrap_from_address(m->dht, argv[argvoffset + 1],
ipv6enabled, port, bootstrap_key);

View File

@ -50,7 +50,7 @@ int main(int argc, char *argv[])
IP ip = {0};
ip.family = AF_INET;
Socket sock = socket(ip.family, SOCK_DGRAM, IPPROTO_UDP);
Socket sock = net_socket(ip.family, TOX_SOCK_DGRAM, TOX_PROTO_UDP);
if (!sock_valid(sock)) {
return -1;
@ -60,29 +60,9 @@ int main(int argc, char *argv[])
return -1;
}
struct sockaddr_in target;
size_t addrsize = sizeof(struct sockaddr_in);
target.sin_family = AF_INET;
fill_addr4(ip.ip4, &target.sin_addr);
target.sin_port = htons(53);
uint8_t string[1024] = {0};
void *d = tox_dns3_new(hex_string_to_bin(argv[2]));
unsigned int i;
uint32_t request_id;
/*
for (i = 0; i < 255; ++i) {
tox_generate_dns3_string(d, string, sizeof(string), &request_id, string, i);
printf("%s\n", string);
}*/
uint8_t string[1024] = {0};
void *d = tox_dns3_new(hex_string_to_bin(argv[2]));
int len = tox_generate_dns3_string(d, string + 1, sizeof(string) - 1, &request_id, (uint8_t *)argv[3], strlen(argv[3]));
if (len == -1) {
@ -96,7 +76,11 @@ int main(int argc, char *argv[])
uint8_t id = rand();
uint32_t p_len = create_packet(packet, string, strlen((char *)string), id);
if (sendto(sock, (char *)packet, p_len, 0, (struct sockaddr *)&target, addrsize) != p_len) {
IP_Port ip_port;
ip_port.port = 53;
ip_port.ip = ip;
if (net_sendto_ip4(sock, (char *)packet, p_len, ip_port) != p_len) {
return -1;
}
@ -107,6 +91,7 @@ int main(int argc, char *argv[])
return -1;
}
unsigned int i;
for (i = r_len - 1; i != 0 && buffer[i] != '='; --i) {
;
}

View File

@ -165,7 +165,7 @@ void ac_iterate(ACSession *ac)
/* Pick up sampling rate from packet */
memcpy(&ac->lp_sampling_rate, msg->data, 4);
ac->lp_sampling_rate = ntohl(ac->lp_sampling_rate);
ac->lp_sampling_rate = net_ntohl(ac->lp_sampling_rate);
ac->lp_channel_count = opus_packet_get_nb_channels(msg->data + 4);

View File

@ -169,8 +169,8 @@ void send_update(BWController *bwc)
struct BWCMessage *b_msg = (struct BWCMessage *)(p_msg + 1);
p_msg[0] = BWC_PACKET_ID;
b_msg->lost = htonl(bwc->cycle.lost);
b_msg->recv = htonl(bwc->cycle.recv);
b_msg->lost = net_htonl(bwc->cycle.lost);
b_msg->recv = net_htonl(bwc->cycle.recv);
if (-1 == m_send_custom_lossy_packet(bwc->m, bwc->friend_number, p_msg, sizeof(p_msg))) {
LOGGER_WARNING(bwc->m->log, "BWC send failed (len: %d)! std error: %s", sizeof(p_msg), strerror(errno));
@ -192,8 +192,8 @@ static int on_update(BWController *bwc, const struct BWCMessage *msg)
bwc->cycle.lru = current_time_monotonic();
uint32_t recv = ntohl(msg->recv);
uint32_t lost = ntohl(msg->lost);
uint32_t recv = net_ntohl(msg->recv);
uint32_t lost = net_ntohl(msg->lost);
LOGGER_DEBUG(bwc->m->log, "recved: %u lost: %u", recv, lost);

View File

@ -405,7 +405,7 @@ static int handle_group_audio_packet(void *object, int groupnumber, int friendgr
uint16_t sequnum;
memcpy(&sequnum, packet, sizeof(sequnum));
pk->sequnum = ntohs(sequnum);
pk->sequnum = net_ntohs(sequnum);
pk->length = length - sizeof(uint16_t);
memcpy(pk->data, packet + sizeof(uint16_t), length - sizeof(uint16_t));
@ -513,7 +513,7 @@ static int send_audio_packet(Group_Chats *g_c, int groupnumber, uint8_t *packet,
VLA(uint8_t, data, 1 + sizeof(uint16_t) + length);
data[0] = GROUP_AUDIO_PACKET_ID;
uint16_t sequnum = htons(group_av->audio_sequnum);
uint16_t sequnum = net_htons(group_av->audio_sequnum);
memcpy(data + 1, &sequnum, sizeof(sequnum));
memcpy(data + 1 + sizeof(sequnum), packet, length);

View File

@ -131,12 +131,12 @@ int rtp_send_data(RTPSession *session, const uint8_t *data, uint16_t length, Log
header->ma = 0;
header->pt = session->payload_type % 128;
header->sequnum = htons(session->sequnum);
header->timestamp = htonl(current_time_monotonic());
header->ssrc = htonl(session->ssrc);
header->sequnum = net_htons(session->sequnum);
header->timestamp = net_htonl(current_time_monotonic());
header->ssrc = net_htonl(session->ssrc);
header->cpart = 0;
header->tlen = htons(length);
header->tlen = net_htons(length);
if (MAX_CRYPTO_DATA_SIZE > length + sizeof(struct RTPHeader) + 1) {
@ -170,7 +170,7 @@ int rtp_send_data(RTPSession *session, const uint8_t *data, uint16_t length, Log
}
sent += piece;
header->cpart = htons(sent);
header->cpart = net_htons(sent);
}
/* Send remaining */
@ -194,10 +194,10 @@ int rtp_send_data(RTPSession *session, const uint8_t *data, uint16_t length, Log
static bool chloss(const RTPSession *session, const struct RTPHeader *header)
{
if (ntohl(header->timestamp) < session->rtimestamp) {
if (net_ntohl(header->timestamp) < session->rtimestamp) {
uint16_t hosq, lost = 0;
hosq = ntohs(header->sequnum);
hosq = net_ntohs(header->sequnum);
lost = (hosq > session->rsequnum) ?
(session->rsequnum + 65535) - hosq :
@ -224,12 +224,12 @@ static struct RTPMessage *new_message(size_t allocate_len, const uint8_t *data,
msg->len = data_length - sizeof(struct RTPHeader);
memcpy(&msg->header, data, data_length);
msg->header.sequnum = ntohs(msg->header.sequnum);
msg->header.timestamp = ntohl(msg->header.timestamp);
msg->header.ssrc = ntohl(msg->header.ssrc);
msg->header.sequnum = net_ntohs(msg->header.sequnum);
msg->header.timestamp = net_ntohl(msg->header.timestamp);
msg->header.ssrc = net_ntohl(msg->header.ssrc);
msg->header.cpart = ntohs(msg->header.cpart);
msg->header.tlen = ntohs(msg->header.tlen);
msg->header.cpart = net_ntohs(msg->header.cpart);
msg->header.tlen = net_ntohs(msg->header.tlen);
return msg;
}
@ -255,14 +255,14 @@ int handle_rtp_packet(Messenger *m, uint32_t friendnumber, const uint8_t *data,
return -1;
}
if (ntohs(header->cpart) >= ntohs(header->tlen)) {
if (net_ntohs(header->cpart) >= net_ntohs(header->tlen)) {
/* Never allow this case to happen */
return -1;
}
bwc_feed_avg(session->bwc, length);
if (ntohs(header->tlen) == length - sizeof(struct RTPHeader)) {
if (net_ntohs(header->tlen) == length - sizeof(struct RTPHeader)) {
/* The message is sent in single part */
/* Only allow messages which have arrived in order;
@ -273,8 +273,8 @@ int handle_rtp_packet(Messenger *m, uint32_t friendnumber, const uint8_t *data,
}
/* Message is not late; pick up the latest parameters */
session->rsequnum = ntohs(header->sequnum);
session->rtimestamp = ntohl(header->timestamp);
session->rsequnum = net_ntohs(header->sequnum);
session->rtimestamp = net_ntohl(header->timestamp);
bwc_add_recv(session->bwc, length);
@ -311,20 +311,20 @@ int handle_rtp_packet(Messenger *m, uint32_t friendnumber, const uint8_t *data,
* processing message
*/
if (session->mp->header.sequnum == ntohs(header->sequnum) &&
session->mp->header.timestamp == ntohl(header->timestamp)) {
if (session->mp->header.sequnum == net_ntohs(header->sequnum) &&
session->mp->header.timestamp == net_ntohl(header->timestamp)) {
/* First case */
/* Make sure we have enough allocated memory */
if (session->mp->header.tlen - session->mp->len < length - sizeof(struct RTPHeader) ||
session->mp->header.tlen <= ntohs(header->cpart)) {
session->mp->header.tlen <= net_ntohs(header->cpart)) {
/* There happened to be some corruption on the stream;
* continue wihtout this part
*/
return 0;
}
memcpy(session->mp->data + ntohs(header->cpart), data + sizeof(struct RTPHeader),
memcpy(session->mp->data + net_ntohs(header->cpart), data + sizeof(struct RTPHeader),
length - sizeof(struct RTPHeader));
session->mp->len += length - sizeof(struct RTPHeader);
@ -346,7 +346,7 @@ int handle_rtp_packet(Messenger *m, uint32_t friendnumber, const uint8_t *data,
} else {
/* Second case */
if (session->mp->header.timestamp > ntohl(header->timestamp)) {
if (session->mp->header.timestamp > net_ntohl(header->timestamp)) {
/* The received message part is from the old message;
* discard it.
*/
@ -386,22 +386,22 @@ NEW_MULTIPARTED:
}
/* Message is not late; pick up the latest parameters */
session->rsequnum = ntohs(header->sequnum);
session->rtimestamp = ntohl(header->timestamp);
session->rsequnum = net_ntohs(header->sequnum);
session->rtimestamp = net_ntohl(header->timestamp);
bwc_add_recv(session->bwc, length);
/* Again, only store message if handler is present
*/
if (session->mcb) {
session->mp = new_message(ntohs(header->tlen) + sizeof(struct RTPHeader), data, length);
session->mp = new_message(net_ntohs(header->tlen) + sizeof(struct RTPHeader), data, length);
/* Reposition data if necessary */
if (ntohs(header->cpart)) {
if (net_ntohs(header->cpart)) {
;
}
memmove(session->mp->data + ntohs(header->cpart), session->mp->data, session->mp->len);
memmove(session->mp->data + net_ntohs(header->cpart), session->mp->data, session->mp->len);
}
}

View File

@ -706,7 +706,7 @@ bool toxav_audio_send_frame(ToxAV *av, uint32_t friend_number, const int16_t *pc
VLA(uint8_t, dest, sample_count + sizeof(sampling_rate)); /* This is more than enough always */
sampling_rate = htonl(sampling_rate);
sampling_rate = net_htonl(sampling_rate);
memcpy(dest, &sampling_rate, sizeof(sampling_rate));
int vrc = opus_encode(call->audio.second->encoder, pcm, sample_count,
dest + sizeof(sampling_rate), SIZEOF_VLA(dest) - sizeof(sampling_rate));

View File

@ -541,9 +541,9 @@ static int client_or_ip_port_in_list(Logger *log, Client_data *list, uint16_t le
char ip_str[IP_NTOA_LEN];
LOGGER_TRACE(log, "coipil[%u]: switching ipv4 from %s:%u to %s:%u", i,
ip_ntoa(&list[i].assoc4.ip_port.ip, ip_str, sizeof(ip_str)),
ntohs(list[i].assoc4.ip_port.port),
net_ntohs(list[i].assoc4.ip_port.port),
ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)),
ntohs(ip_port.port));
net_ntohs(ip_port.port));
}
if (LAN_ip(list[i].assoc4.ip_port.ip) != 0 && LAN_ip(ip_port.ip) == 0) {
@ -558,9 +558,9 @@ static int client_or_ip_port_in_list(Logger *log, Client_data *list, uint16_t le
char ip_str[IP_NTOA_LEN];
LOGGER_TRACE(log, "coipil[%u]: switching ipv6 from %s:%u to %s:%u", i,
ip_ntoa(&list[i].assoc6.ip_port.ip, ip_str, sizeof(ip_str)),
ntohs(list[i].assoc6.ip_port.port),
net_ntohs(list[i].assoc6.ip_port.port),
ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)),
ntohs(ip_port.port));
net_ntohs(ip_port.port));
}
if (LAN_ip(list[i].assoc6.ip_port.ip) != 0 && LAN_ip(ip_port.ip) == 0) {
@ -687,7 +687,7 @@ static uint8_t hardening_correct(const Hardening *h)
* helper for get_close_nodes(). argument list is a monster :D
*/
static void get_close_nodes_inner(const uint8_t *public_key, Node_format *nodes_list,
sa_family_t sa_family, const Client_data *client_list, uint32_t client_list_length,
Family sa_family, const Client_data *client_list, uint32_t client_list_length,
uint32_t *num_nodes_ptr, uint8_t is_LAN, uint8_t want_good)
{
if ((sa_family != AF_INET) && (sa_family != AF_INET6) && (sa_family != 0)) {
@ -758,7 +758,7 @@ static void get_close_nodes_inner(const uint8_t *public_key, Node_format *nodes_
* want_good : do we want only good nodes as checked with the hardening returned or not?
*/
static int get_somewhat_close_nodes(const DHT *dht, const uint8_t *public_key, Node_format *nodes_list,
sa_family_t sa_family, uint8_t is_LAN, uint8_t want_good)
Family sa_family, uint8_t is_LAN, uint8_t want_good)
{
uint32_t num_nodes = 0, i;
get_close_nodes_inner(public_key, nodes_list, sa_family,
@ -784,7 +784,7 @@ static int get_somewhat_close_nodes(const DHT *dht, const uint8_t *public_key, N
return num_nodes;
}
int get_close_nodes(const DHT *dht, const uint8_t *public_key, Node_format *nodes_list, sa_family_t sa_family,
int get_close_nodes(const DHT *dht, const uint8_t *public_key, Node_format *nodes_list, Family sa_family,
uint8_t is_LAN, uint8_t want_good)
{
memset(nodes_list, 0, MAX_SENT_NODES * sizeof(Node_format));
@ -2093,7 +2093,7 @@ static uint16_t NAT_getports(uint16_t *portlist, IP_Port *ip_portlist, uint16_t
for (i = 0; i < len; ++i) {
if (ip_equal(&ip_portlist[i].ip, &ip)) {
portlist[num] = ntohs(ip_portlist[i].port);
portlist[num] = net_ntohs(ip_portlist[i].port);
++num;
}
}
@ -2124,7 +2124,7 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports,
if (i == numports) { /* If all ports are the same, only try that one port. */
IP_Port pinging;
ip_copy(&pinging.ip, &ip);
pinging.port = htons(firstport);
pinging.port = net_htons(firstport);
send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].public_key);
} else {
for (i = dht->friends_list[friend_num].nat.punching_index; i != top; ++i) {
@ -2132,7 +2132,7 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports,
uint16_t port = port_list[(i / 2) % numports] + (i / (2 * numports)) * ((i % 2) ? -1 : 1);
IP_Port pinging;
ip_copy(&pinging.ip, &ip);
pinging.port = htons(port);
pinging.port = net_htons(port);
send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].public_key);
}
@ -2146,7 +2146,7 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports,
ip_copy(&pinging.ip, &ip);
for (i = dht->friends_list[friend_num].nat.punching_index2; i != top; ++i) {
pinging.port = htons(port + i);
pinging.port = net_htons(port + i);
send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].public_key);
}
@ -2262,7 +2262,7 @@ static int send_hardening_getnode_res(const DHT *dht, const Node_format *sendto,
}
/* TODO(irungentoo): improve */
static IPPTsPng *get_closelist_IPPTsPng(DHT *dht, const uint8_t *public_key, sa_family_t sa_family)
static IPPTsPng *get_closelist_IPPTsPng(DHT *dht, const uint8_t *public_key, Family sa_family)
{
uint32_t i;
@ -2393,7 +2393,7 @@ static int handle_hardening(void *object, IP_Port source, const uint8_t *source_
/* Return a random node from all the nodes we are connected to.
* TODO(irungentoo): improve this function.
*/
static Node_format random_node(DHT *dht, sa_family_t sa_family)
static Node_format random_node(DHT *dht, Family sa_family)
{
uint8_t id[CRYPTO_PUBLIC_KEY_SIZE];
uint32_t i;
@ -2499,7 +2499,7 @@ static void do_hardening(DHT *dht)
for (i = 0; i < LCLIENT_LIST * 2; ++i) {
IPPTsPng *cur_iptspng;
sa_family_t sa_family;
Family sa_family;
uint8_t *public_key = dht->close_clientlist[i / 2].public_key;
if (i % 2 == 0) {

View File

@ -356,7 +356,7 @@ bool node_addable_to_close_list(DHT *dht, const uint8_t *public_key, IP_Port ip_
* return the number of nodes returned.
*
*/
int get_close_nodes(const DHT *dht, const uint8_t *public_key, Node_format *nodes_list, sa_family_t sa_family,
int get_close_nodes(const DHT *dht, const uint8_t *public_key, Node_format *nodes_list, Family sa_family,
uint8_t is_LAN, uint8_t want_good);

View File

@ -86,9 +86,9 @@ static void fetch_broadcast_info(uint16_t port)
if (gateway.family == AF_INET && subnet_mask.family == AF_INET) {
IP_Port *ip_port = &ip_ports[count];
ip_port->ip.family = AF_INET;
uint32_t gateway_ip = ntohl(gateway.ip4.uint32), subnet_ip = ntohl(subnet_mask.ip4.uint32);
uint32_t gateway_ip = net_ntohl(gateway.ip4.uint32), subnet_ip = net_ntohl(subnet_mask.ip4.uint32);
uint32_t broadcast_ip = gateway_ip + ~subnet_ip - 1;
ip_port->ip.ip4.uint32 = htonl(broadcast_ip);
ip_port->ip.ip4.uint32 = net_htonl(broadcast_ip);
ip_port->port = port;
count++;
@ -124,7 +124,7 @@ static void fetch_broadcast_info(uint16_t port)
broadcast_count = 0;
Socket sock = 0;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
if ((sock = net_socket(TOX_AF_INET, TOX_SOCK_STREAM, 0)) < 0) {
return;
}
@ -174,7 +174,7 @@ static void fetch_broadcast_info(uint16_t port)
IP_Port *ip_port = &ip_ports[count];
ip_port->ip.family = AF_INET;
get_ip4(&ip_port->ip.ip4, &sock4->sin_addr);
ip_port->ip.ip4.uint32 = sock4->sin_addr.s_addr;
if (ip_port->ip.ip4.uint32 == 0) {
continue;
@ -228,7 +228,7 @@ static uint32_t send_broadcasts(Networking_Core *net, uint16_t port, const uint8
}
/* Return the broadcast ip. */
static IP broadcast_ip(sa_family_t family_socket, sa_family_t family_broadcast)
static IP broadcast_ip(Family family_socket, Family family_broadcast)
{
IP ip;
ip_reset(&ip);
@ -246,7 +246,7 @@ static IP broadcast_ip(sa_family_t family_socket, sa_family_t family_broadcast)
ip.family = AF_INET6;
ip.ip6.uint32[0] = 0;
ip.ip6.uint32[1] = 0;
ip.ip6.uint32[2] = htonl(0xFFFF);
ip.ip6.uint32[2] = net_htonl(0xFFFF);
ip.ip6.uint32[3] = INADDR_BROADCAST;
}
} else if (family_socket == AF_INET) {
@ -279,7 +279,7 @@ bool Local_ip(IP ip)
}
/* localhost in IPv6 (::1) */
if (ip.ip6.uint64[0] == 0 && ip.ip6.uint32[2] == 0 && ip.ip6.uint32[3] == htonl(1)) {
if (ip.ip6.uint64[0] == 0 && ip.ip6.uint32[2] == 0 && ip.ip6.uint32[3] == net_htonl(1)) {
return 1;
}
}

View File

@ -1113,7 +1113,7 @@ static int file_sendrequest(const Messenger *m, int32_t friendnumber, uint8_t fi
VLA(uint8_t, packet, 1 + sizeof(file_type) + sizeof(filesize) + FILE_ID_LENGTH + filename_length);
packet[0] = filenumber;
file_type = htonl(file_type);
file_type = net_htonl(file_type);
memcpy(packet + 1, &file_type, sizeof(file_type));
host_to_net((uint8_t *)&filesize, sizeof(filesize));
memcpy(packet + 1 + sizeof(file_type), &filesize, sizeof(filesize));
@ -2256,7 +2256,7 @@ static int handle_packet(void *object, int i, const uint8_t *temp, uint16_t len,
}
memcpy(&file_type, data + 1, sizeof(file_type));
file_type = ntohl(file_type);
file_type = net_ntohl(file_type);
memcpy(&filesize, data + 1 + sizeof(uint32_t), sizeof(filesize));
net_to_host((uint8_t *) &filesize, sizeof(filesize));
@ -2573,7 +2573,7 @@ void do_messenger(Messenger *m, void *userdata)
char id_str[IDSTRING_LEN];
LOGGER_TRACE(m->log, "C[%2u] %s:%u [%3u] %s",
client, ip_ntoa(&assoc->ip_port.ip, ip_str, sizeof(ip_str)),
ntohs(assoc->ip_port.port), last_pinged,
net_ntohs(assoc->ip_port.port), last_pinged,
id_to_string(cptr->public_key, id_str, sizeof(id_str)));
}
}
@ -2653,7 +2653,7 @@ void do_messenger(Messenger *m, void *userdata)
char id_str[IDSTRING_LEN];
LOGGER_TRACE(m->log, "F[%2u] => C[%2u] %s:%u [%3u] %s",
friend_idx, client, ip_ntoa(&assoc->ip_port.ip, ip_str, sizeof(ip_str)),
ntohs(assoc->ip_port.port), last_pinged,
net_ntohs(assoc->ip_port.port), last_pinged,
id_to_string(cptr->public_key, id_str, sizeof(id_str)));
}
}
@ -2779,13 +2779,13 @@ static uint32_t friends_list_save(const Messenger *m, uint8_t *data)
MIN(SAVED_FRIEND_REQUEST_SIZE, MAX_FRIEND_REQUEST_DATA_SIZE));
memcpy(temp.info, m->friendlist[i].info, friendrequest_length);
temp.info_size = htons(m->friendlist[i].info_size);
temp.info_size = net_htons(m->friendlist[i].info_size);
temp.friendrequest_nospam = m->friendlist[i].friendrequest_nospam;
} else {
memcpy(temp.name, m->friendlist[i].name, m->friendlist[i].name_length);
temp.name_length = htons(m->friendlist[i].name_length);
temp.name_length = net_htons(m->friendlist[i].name_length);
memcpy(temp.statusmessage, m->friendlist[i].statusmessage, m->friendlist[i].statusmessage_length);
temp.statusmessage_length = htons(m->friendlist[i].statusmessage_length);
temp.statusmessage_length = net_htons(m->friendlist[i].statusmessage_length);
temp.userstatus = m->friendlist[i].userstatus;
uint8_t last_seen_time[sizeof(uint64_t)];
@ -2866,8 +2866,8 @@ static int friends_list_load(Messenger *m, const uint8_t *data, uint32_t length)
continue;
}
setfriendname(m, fnum, temp.name, ntohs(temp.name_length));
set_friend_statusmessage(m, fnum, temp.statusmessage, ntohs(temp.statusmessage_length));
setfriendname(m, fnum, temp.name, net_ntohs(temp.name_length));
set_friend_statusmessage(m, fnum, temp.statusmessage, net_ntohs(temp.statusmessage_length));
set_friend_userstatus(m, fnum, temp.userstatus);
uint8_t last_seen_time[sizeof(uint64_t)];
memcpy(last_seen_time, &temp.last_seen_time, sizeof(uint64_t));
@ -2880,7 +2880,7 @@ static int friends_list_load(Messenger *m, const uint8_t *data, uint32_t length)
memcpy(address + CRYPTO_PUBLIC_KEY_SIZE, &(temp.friendrequest_nospam), sizeof(uint32_t));
uint16_t checksum = address_checksum(address, FRIEND_ADDRESS_SIZE - sizeof(checksum));
memcpy(address + CRYPTO_PUBLIC_KEY_SIZE + sizeof(uint32_t), &checksum, sizeof(checksum));
m_addfriend(m, address, temp.info, ntohs(temp.info_size));
m_addfriend(m, address, temp.info, net_ntohs(temp.info_size));
}
}

View File

@ -42,30 +42,8 @@ static int connect_sock_to(Socket sock, IP_Port ip_port, TCP_Proxy_Info *proxy_i
ip_port = proxy_info->ip_port;
}
struct sockaddr_storage addr = {0};
size_t addrsize;
if (ip_port.ip.family == AF_INET) {
struct sockaddr_in *addr4 = (struct sockaddr_in *)&addr;
addrsize = sizeof(struct sockaddr_in);
addr4->sin_family = AF_INET;
fill_addr4(ip_port.ip.ip4, &addr4->sin_addr);
addr4->sin_port = ip_port.port;
} else if (ip_port.ip.family == AF_INET6) {
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&addr;
addrsize = sizeof(struct sockaddr_in6);
addr6->sin6_family = AF_INET6;
fill_addr6(ip_port.ip.ip6, &addr6->sin6_addr);
addr6->sin6_port = ip_port.port;
} else {
return 0;
}
/* nonblocking socket, connect will never return success */
connect(sock, (struct sockaddr *)&addr, addrsize);
net_connect(sock, ip_port);
return 1;
}
@ -84,7 +62,7 @@ static int proxy_http_generate_connection_request(TCP_Client_Connection *TCP_con
return 0;
}
const uint16_t port = ntohs(TCP_conn->ip_port.port);
const uint16_t port = net_ntohs(TCP_conn->ip_port.port);
const int written = snprintf((char *)TCP_conn->last_packet, MAX_PACKET_SIZE, "%s%s:%hu%s%s:%hu%s", one, ip, port, two,
ip, port, three);
@ -389,7 +367,7 @@ static int write_packet_TCP_secure_connection(TCP_Client_Connection *con, const
VLA(uint8_t, packet, sizeof(uint16_t) + length + CRYPTO_MAC_SIZE);
uint16_t c_length = htons(length + CRYPTO_MAC_SIZE);
uint16_t c_length = net_htons(length + CRYPTO_MAC_SIZE);
memcpy(packet, &c_length, sizeof(uint16_t));
int len = encrypt_data_symmetric(con->shared_key, con->sent_nonce, data, length, packet + sizeof(uint16_t));
@ -653,7 +631,7 @@ TCP_Client_Connection *new_TCP_connection(IP_Port ip_port, const uint8_t *public
family = proxy_info->ip_port.ip.family;
}
Socket sock = socket(family, SOCK_STREAM, IPPROTO_TCP);
Socket sock = net_socket(family, TOX_SOCK_STREAM, TOX_PROTO_TCP);
if (!sock_valid(sock)) {
return NULL;

View File

@ -69,39 +69,12 @@ size_t tcp_server_listen_count(const TCP_Server *tcp_server)
return tcp_server->num_listening_socks;
}
/* this is needed to compile on Android below API 21
*/
/* This is needed to compile on Android below API 21
*/
#ifndef EPOLLRDHUP
#define EPOLLRDHUP 0x2000
#endif
/* return 1 on success
* return 0 on failure
*/
static int bind_to_port(Socket sock, int family, uint16_t port)
{
struct sockaddr_storage addr = {0};
size_t addrsize;
if (family == AF_INET) {
struct sockaddr_in *addr4 = (struct sockaddr_in *)&addr;
addrsize = sizeof(struct sockaddr_in);
addr4->sin_family = AF_INET;
addr4->sin_port = htons(port);
} else if (family == AF_INET6) {
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&addr;
addrsize = sizeof(struct sockaddr_in6);
addr6->sin6_family = AF_INET6;
addr6->sin6_port = htons(port);
} else {
return 0;
}
return (bind(sock, (struct sockaddr *)&addr, addrsize) == 0);
}
/* Set the size of the connection list to numfriends.
*
* return -1 if realloc fails.
@ -265,7 +238,7 @@ uint16_t read_TCP_length(Socket sock)
return 0;
}
length = ntohs(length);
length = net_ntohs(length);
if (length > MAX_PACKET_SIZE) {
return ~0;
@ -460,7 +433,7 @@ static int write_packet_TCP_secure_connection(TCP_Secure_Connection *con, const
VLA(uint8_t, packet, sizeof(uint16_t) + length + CRYPTO_MAC_SIZE);
uint16_t c_length = htons(length + CRYPTO_MAC_SIZE);
uint16_t c_length = net_htons(length + CRYPTO_MAC_SIZE);
memcpy(packet, &c_length, sizeof(uint16_t));
int len = encrypt_data_symmetric(con->shared_key, con->sent_nonce, data, length, packet + sizeof(uint16_t));
@ -1005,7 +978,7 @@ static int accept_connection(TCP_Server *TCP_server, Socket sock)
static Socket new_listening_TCP_socket(int family, uint16_t port)
{
Socket sock = socket(family, SOCK_STREAM, IPPROTO_TCP);
Socket sock = net_socket(family, TOX_SOCK_STREAM, TOX_PROTO_TCP);
if (!sock_valid(sock)) {
return ~0;

View File

@ -218,7 +218,7 @@ void increment_nonce_number(uint8_t *nonce, uint32_t host_order_num)
* that loop bounds and their potential underflow or overflow
* are independent of user-controlled input (you may have heard of the Heartbleed bug).
*/
const uint32_t big_endian_num = htonl(host_order_num);
const uint32_t big_endian_num = net_htonl(host_order_num);
const uint8_t *const num_vec = (const uint8_t *) &big_endian_num;
uint8_t num_as_nonce[crypto_box_NONCEBYTES] = {0};
num_as_nonce[crypto_box_NONCEBYTES - 4] = num_vec[0];

View File

@ -841,7 +841,7 @@ Friend_Connections *new_friend_connections(Onion_Client *onion_c, bool local_dis
static void LANdiscovery(Friend_Connections *fr_c)
{
if (fr_c->last_LANdiscovery + LAN_DISCOVERY_INTERVAL < unix_time()) {
send_LANdiscovery(htons(TOX_PORT_DEFAULT), fr_c->dht);
send_LANdiscovery(net_htons(TOX_PORT_DEFAULT), fr_c->dht);
fr_c->last_LANdiscovery = unix_time();
}
}

View File

@ -968,7 +968,7 @@ static unsigned int send_packet_group_peer(Friend_Connections *fr_c, int friendc
return 0;
}
group_num = htons(group_num);
group_num = net_htons(group_num);
VLA(uint8_t, packet, 1 + sizeof(uint16_t) + length);
packet[0] = packet_id;
memcpy(packet + 1, &group_num, sizeof(uint16_t));
@ -989,7 +989,7 @@ static unsigned int send_lossy_group_peer(Friend_Connections *fr_c, int friendco
return 0;
}
group_num = htons(group_num);
group_num = net_htons(group_num);
VLA(uint8_t, packet, 1 + sizeof(uint16_t) + length);
packet[0] = packet_id;
memcpy(packet + 1, &group_num, sizeof(uint16_t));
@ -1020,7 +1020,7 @@ int invite_friend(Group_Chats *g_c, int32_t friendnumber, int groupnumber)
uint8_t invite[INVITE_PACKET_SIZE];
invite[0] = INVITE_ID;
uint16_t groupchat_num = htons((uint16_t)groupnumber);
uint16_t groupchat_num = net_htons((uint16_t)groupnumber);
memcpy(invite + 1, &groupchat_num, sizeof(groupchat_num));
memcpy(invite + 1 + sizeof(groupchat_num), g->identifier, GROUP_IDENTIFIER_LENGTH);
@ -1074,7 +1074,7 @@ int join_groupchat(Group_Chats *g_c, int32_t friendnumber, uint8_t expected_type
Group_c *g = &g_c->chats[groupnumber];
uint16_t group_num = htons(groupnumber);
uint16_t group_num = net_htons(groupnumber);
g->status = GROUPCHAT_STATUS_VALID;
g->number_joined = -1;
memcpy(g->real_pk, g_c->m->net_crypto->self_public_key, CRYPTO_PUBLIC_KEY_SIZE);
@ -1087,7 +1087,7 @@ int join_groupchat(Group_Chats *g_c, int32_t friendnumber, uint8_t expected_type
if (send_conference_invite_packet(g_c->m, friendnumber, response, sizeof(response))) {
uint16_t other_groupnum;
memcpy(&other_groupnum, data, sizeof(other_groupnum));
other_groupnum = ntohs(other_groupnum);
other_groupnum = net_ntohs(other_groupnum);
memcpy(g->identifier, data + sizeof(uint16_t), GROUP_IDENTIFIER_LENGTH);
int close_index = add_conn_to_groupchat(g_c, friendcon_id, groupnumber, 0, 1);
@ -1241,7 +1241,7 @@ static int group_new_peer_send(const Group_Chats *g_c, int groupnumber, uint16_t
{
uint8_t packet[GROUP_MESSAGE_NEW_PEER_LENGTH];
peer_num = htons(peer_num);
peer_num = net_htons(peer_num);
memcpy(packet, &peer_num, sizeof(uint16_t));
memcpy(packet + sizeof(uint16_t), real_pk, CRYPTO_PUBLIC_KEY_SIZE);
memcpy(packet + sizeof(uint16_t) + CRYPTO_PUBLIC_KEY_SIZE, temp_pk, CRYPTO_PUBLIC_KEY_SIZE);
@ -1264,7 +1264,7 @@ static int group_kill_peer_send(const Group_Chats *g_c, int groupnumber, uint16_
{
uint8_t packet[GROUP_MESSAGE_KILL_PEER_LENGTH];
peer_num = htons(peer_num);
peer_num = net_htons(peer_num);
memcpy(packet, &peer_num, sizeof(uint16_t));
if (send_message_group(g_c, groupnumber, GROUP_MESSAGE_KILL_PEER_ID, packet, sizeof(packet)) > 0) {
@ -1412,7 +1412,7 @@ static void handle_friend_invite_packet(Messenger *m, uint32_t friendnumber, con
uint16_t other_groupnum, groupnum;
memcpy(&groupnum, data + 1 + sizeof(uint16_t), sizeof(uint16_t));
groupnum = ntohs(groupnum);
groupnum = net_ntohs(groupnum);
Group_c *g = get_group_c(g_c, groupnum);
@ -1440,7 +1440,7 @@ static void handle_friend_invite_packet(Messenger *m, uint32_t friendnumber, con
}
memcpy(&other_groupnum, data + 1, sizeof(uint16_t));
other_groupnum = ntohs(other_groupnum);
other_groupnum = net_ntohs(other_groupnum);
int friendcon_id = getfriendcon_id(m, friendnumber);
uint8_t real_pk[CRYPTO_PUBLIC_KEY_SIZE], temp_pk[CRYPTO_PUBLIC_KEY_SIZE];
@ -1507,7 +1507,7 @@ static unsigned int count_close_connected(Group_c *g)
static int send_packet_online(Friend_Connections *fr_c, int friendcon_id, uint16_t group_num, uint8_t *identifier)
{
uint8_t packet[1 + ONLINE_PACKET_DATA_SIZE];
group_num = htons(group_num);
group_num = net_htons(group_num);
packet[0] = PACKET_ID_ONLINE_PACKET;
memcpy(packet + 1, &group_num, sizeof(uint16_t));
memcpy(packet + 1 + sizeof(uint16_t), identifier, GROUP_IDENTIFIER_LENGTH);
@ -1526,7 +1526,7 @@ static int handle_packet_online(Group_Chats *g_c, int friendcon_id, const uint8_
int groupnumber = get_group_num(g_c, data + sizeof(uint16_t));
uint16_t other_groupnum;
memcpy(&other_groupnum, data, sizeof(uint16_t));
other_groupnum = ntohs(other_groupnum);
other_groupnum = net_ntohs(other_groupnum);
Group_c *g = get_group_c(g_c, groupnumber);
@ -1626,7 +1626,7 @@ static unsigned int send_peers(Group_Chats *g_c, int groupnumber, int friendcon_
p = packet + 1;
}
uint16_t peer_num = htons(g->group[i].peer_number);
uint16_t peer_num = net_htons(g->group[i].peer_number);
memcpy(p, &peer_num, sizeof(peer_num));
p += sizeof(peer_num);
memcpy(p, g->group[i].real_pk, CRYPTO_PUBLIC_KEY_SIZE);
@ -1672,7 +1672,7 @@ static int handle_send_peers(Group_Chats *g_c, int groupnumber, const uint8_t *d
while ((unsigned int)(length - (d - data)) >= sizeof(uint16_t) + CRYPTO_PUBLIC_KEY_SIZE * 2 + 1) {
uint16_t peer_num;
memcpy(&peer_num, d, sizeof(peer_num));
peer_num = ntohs(peer_num);
peer_num = net_ntohs(peer_num);
d += sizeof(uint16_t);
int peer_index = addpeer(g_c, groupnumber, d, d + CRYPTO_PUBLIC_KEY_SIZE, peer_num, userdata, true);
@ -1903,7 +1903,7 @@ static int send_message_group(const Group_Chats *g_c, int groupnumber, uint8_t m
}
VLA(uint8_t, packet, sizeof(uint16_t) + sizeof(uint32_t) + 1 + len);
uint16_t peer_num = htons(g->peer_number);
uint16_t peer_num = net_htons(g->peer_number);
memcpy(packet, &peer_num, sizeof(peer_num));
++g->message_number;
@ -1912,7 +1912,7 @@ static int send_message_group(const Group_Chats *g_c, int groupnumber, uint8_t m
++g->message_number;
}
uint32_t message_num = htonl(g->message_number);
uint32_t message_num = net_htonl(g->message_number);
memcpy(packet + sizeof(uint16_t), &message_num, sizeof(message_num));
packet[sizeof(uint16_t) + sizeof(uint32_t)] = message_id;
@ -1971,9 +1971,9 @@ int send_group_lossy_packet(const Group_Chats *g_c, int groupnumber, const uint8
}
VLA(uint8_t, packet, sizeof(uint16_t) * 2 + length);
uint16_t peer_number = htons(g->peer_number);
uint16_t peer_number = net_htons(g->peer_number);
memcpy(packet, &peer_number, sizeof(uint16_t));
uint16_t message_num = htons(g->lossy_message_number);
uint16_t message_num = net_htons(g->lossy_message_number);
memcpy(packet + sizeof(uint16_t), &message_num, sizeof(uint16_t));
memcpy(packet + sizeof(uint16_t) * 2, data, length);
@ -2000,7 +2000,7 @@ static void handle_message_packet_group(Group_Chats *g_c, int groupnumber, const
uint16_t peer_number;
memcpy(&peer_number, data, sizeof(uint16_t));
peer_number = ntohs(peer_number);
peer_number = net_ntohs(peer_number);
int index = get_peer_index(g, peer_number);
@ -2013,7 +2013,7 @@ static void handle_message_packet_group(Group_Chats *g_c, int groupnumber, const
uint32_t message_number;
memcpy(&message_number, data + sizeof(uint16_t), sizeof(message_number));
message_number = ntohl(message_number);
message_number = net_ntohl(message_number);
if (g->group[index].last_message_number == 0) {
g->group[index].last_message_number = message_number;
@ -2045,7 +2045,7 @@ static void handle_message_packet_group(Group_Chats *g_c, int groupnumber, const
uint16_t new_peer_number;
memcpy(&new_peer_number, msg_data, sizeof(uint16_t));
new_peer_number = ntohs(new_peer_number);
new_peer_number = net_ntohs(new_peer_number);
addpeer(g_c, groupnumber, msg_data + sizeof(uint16_t), msg_data + sizeof(uint16_t) + CRYPTO_PUBLIC_KEY_SIZE,
new_peer_number, userdata, true);
}
@ -2058,7 +2058,7 @@ static void handle_message_packet_group(Group_Chats *g_c, int groupnumber, const
uint16_t kill_peer_number;
memcpy(&kill_peer_number, msg_data, sizeof(uint16_t));
kill_peer_number = ntohs(kill_peer_number);
kill_peer_number = net_ntohs(kill_peer_number);
if (peer_number == kill_peer_number) {
delpeer(g_c, groupnumber, index, userdata);
@ -2142,7 +2142,7 @@ static int handle_packet(void *object, int friendcon_id, const uint8_t *data, ui
uint16_t groupnumber;
memcpy(&groupnumber, data + 1, sizeof(uint16_t));
groupnumber = ntohs(groupnumber);
groupnumber = net_ntohs(groupnumber);
Group_c *g = get_group_c(g_c, groupnumber);
if (!g) {
@ -2252,9 +2252,9 @@ static int handle_lossy(void *object, int friendcon_id, const uint8_t *data, uin
memcpy(&groupnumber, data + 1, sizeof(uint16_t));
memcpy(&peer_number, data + 1 + sizeof(uint16_t), sizeof(uint16_t));
memcpy(&message_number, data + 1 + sizeof(uint16_t) * 2, sizeof(uint16_t));
groupnumber = ntohs(groupnumber);
peer_number = ntohs(peer_number);
message_number = ntohs(message_number);
groupnumber = net_ntohs(groupnumber);
peer_number = net_ntohs(peer_number);
message_number = net_ntohs(message_number);
Group_c *g = get_group_c(g_c, groupnumber);

View File

@ -931,8 +931,8 @@ static int send_data_packet_helper(Net_Crypto *c, int crypt_connection_id, uint3
return -1;
}
num = htonl(num);
buffer_start = htonl(buffer_start);
num = net_htonl(num);
buffer_start = net_htonl(buffer_start);
uint16_t padding_length = (MAX_CRYPTO_DATA_SIZE - length) % CRYPTO_MAX_PADDING;
VLA(uint8_t, packet, sizeof(uint32_t) + sizeof(uint32_t) + padding_length + length);
memcpy(packet, &buffer_start, sizeof(uint32_t));
@ -1042,7 +1042,7 @@ static uint16_t get_nonce_uint16(const uint8_t *nonce)
{
uint16_t num;
memcpy(&num, nonce + (CRYPTO_NONCE_SIZE - sizeof(uint16_t)), sizeof(uint16_t));
return ntohs(num);
return net_ntohs(num);
}
#define DATA_NUM_THRESHOLD 21845
@ -1072,7 +1072,7 @@ static int handle_data_packet(const Net_Crypto *c, int crypt_connection_id, uint
uint16_t num_cur_nonce = get_nonce_uint16(nonce);
uint16_t num;
memcpy(&num, packet + 1, sizeof(uint16_t));
num = ntohs(num);
num = net_ntohs(num);
uint16_t diff = num - num_cur_nonce;
increment_nonce_number(nonce, diff);
int len = decrypt_data_symmetric(conn->shared_key, nonce, packet + 1 + sizeof(uint16_t),
@ -1343,8 +1343,8 @@ static int handle_data_packet_core(Net_Crypto *c, int crypt_connection_id, const
uint32_t buffer_start, num;
memcpy(&buffer_start, data, sizeof(uint32_t));
memcpy(&num, data + sizeof(uint32_t), sizeof(uint32_t));
buffer_start = ntohl(buffer_start);
num = ntohl(num);
buffer_start = net_ntohl(buffer_start);
num = net_ntohl(num);
uint64_t rtt_calc_time = 0;

View File

@ -55,6 +55,7 @@
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/types.h>
@ -70,7 +71,7 @@
#define EWOULDBLOCK WSAEWOULDBLOCK
#endif
static const char *inet_ntop(sa_family_t family, const void *addr, char *buf, size_t bufsize)
static const char *inet_ntop(Family family, const void *addr, char *buf, size_t bufsize)
{
if (family == AF_INET) {
struct sockaddr_in saddr;
@ -105,7 +106,7 @@ static const char *inet_ntop(sa_family_t family, const void *addr, char *buf, si
return NULL;
}
static int inet_pton(sa_family_t family, const char *addrString, void *addrbuf)
static int inet_pton(Family family, const char *addrString, void *addrbuf)
{
if (family == AF_INET) {
struct sockaddr_in saddr;
@ -140,6 +141,10 @@ static int inet_pton(sa_family_t family, const char *addrString, void *addrbuf)
#endif
static int make_proto(int proto);
static int make_socktype(int type);
static int make_family(int family);
/* Check if socket is valid.
*
* return 1 if valid
@ -302,11 +307,11 @@ uint64_t current_time_monotonic(void)
static uint32_t data_0(uint16_t buflen, const uint8_t *buffer)
{
return buflen > 4 ? ntohl(*(const uint32_t *)&buffer[1]) : 0;
return buflen > 4 ? net_ntohl(*(const uint32_t *)&buffer[1]) : 0;
}
static uint32_t data_1(uint16_t buflen, const uint8_t *buffer)
{
return buflen > 7 ? ntohl(*(const uint32_t *)&buffer[5]) : 0;
return buflen > 7 ? net_ntohl(*(const uint32_t *)&buffer[5]) : 0;
}
static void loglogdata(Logger *log, const char *message, const uint8_t *buffer,
@ -317,17 +322,17 @@ static void loglogdata(Logger *log, const char *message, const uint8_t *buffer,
if (res < 0) { /* Windows doesn't necessarily know %zu */
LOGGER_TRACE(log, "[%2u] %s %3hu%c %s:%hu (%u: %s) | %04x%04x",
buffer[0], message, (buflen < 999 ? (uint16_t)buflen : 999), 'E',
ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)), ntohs(ip_port.port), errno,
ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)), net_ntohs(ip_port.port), errno,
strerror(errno), data_0(buflen, buffer), data_1(buflen, buffer));
} else if ((res > 0) && ((size_t)res <= buflen)) {
LOGGER_TRACE(log, "[%2u] %s %3zu%c %s:%hu (%u: %s) | %04x%04x",
buffer[0], message, (res < 999 ? (size_t)res : 999), ((size_t)res < buflen ? '<' : '='),
ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)), ntohs(ip_port.port), 0, "OK",
ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)), net_ntohs(ip_port.port), 0, "OK",
data_0(buflen, buffer), data_1(buflen, buffer));
} else { /* empty or overwrite */
LOGGER_TRACE(log, "[%2u] %s %zu%c%zu %s:%hu (%u: %s) | %04x%04x",
buffer[0], message, (size_t)res, (!res ? '!' : '>'), buflen,
ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)), ntohs(ip_port.port), 0, "OK",
ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)), net_ntohs(ip_port.port), 0, "OK",
data_0(buflen, buffer), data_1(buflen, buffer));
}
}
@ -388,7 +393,7 @@ int sendpacket(Networking_Core *net, IP_Port ip_port, const uint8_t *data, uint1
ip6.uint32[0] = 0;
ip6.uint32[1] = 0;
ip6.uint32[2] = htonl(0xFFFF);
ip6.uint32[2] = net_htonl(0xFFFF);
ip6.uint32[3] = ip_port.ip.ip4.uint32;
fill_addr6(ip6, &addr6->sin6_addr);
@ -621,7 +626,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1
/* Initialize our socket. */
/* add log message what we're creating */
temp->sock = socket(temp->family, SOCK_DGRAM, IPPROTO_UDP);
temp->sock = net_socket(temp->family, TOX_SOCK_DGRAM, TOX_PROTO_UDP);
/* Check for socket error. */
if (!sock_valid(temp->sock)) {
@ -732,7 +737,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1
* it worked ok (which it did previously without a successful bind)
*/
uint16_t port_to_try = port_from;
*portptr = htons(port_to_try);
*portptr = net_htons(port_to_try);
int tries;
for (tries = port_from; tries <= port_to; tries++) {
@ -743,7 +748,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1
char ip_str[IP_NTOA_LEN];
LOGGER_DEBUG(log, "Bound successfully to %s:%u", ip_ntoa(&ip, ip_str, sizeof(ip_str)),
ntohs(temp->port));
net_ntohs(temp->port));
/* errno isn't reset on success, only set on failure, the failed
* binds with parallel clients yield a -EPERM to the outside if
@ -765,7 +770,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1
port_to_try = port_from;
}
*portptr = htons(port_to_try);
*portptr = net_htons(port_to_try);
}
char ip_str[IP_NTOA_LEN];
@ -947,16 +952,18 @@ const char *ip_ntoa(const IP *ip, char *ip_str, size_t length)
if (ip) {
if (ip->family == AF_INET) {
/* returns standard quad-dotted notation */
const struct in_addr *addr = (const struct in_addr *)&ip->ip4;
struct in_addr addr;
fill_addr4(ip->ip4, &addr);
ip_str[0] = 0;
inet_ntop(ip->family, addr, ip_str, length);
inet_ntop(ip->family, &addr, ip_str, length);
} else if (ip->family == AF_INET6) {
/* returns hex-groups enclosed into square brackets */
const struct in6_addr *addr = (const struct in6_addr *)&ip->ip6;
struct in6_addr addr;
fill_addr6(ip->ip6, &addr);
ip_str[0] = '[';
inet_ntop(ip->family, addr, &ip_str[1], length - 3);
inet_ntop(ip->family, &addr, &ip_str[1], length - 3);
size_t len = strlen(ip_str);
ip_str[len] = ']';
ip_str[len + 1] = 0;
@ -1067,7 +1074,7 @@ int addr_resolve(const char *address, IP *to, IP *extra)
return 0;
}
sa_family_t family = to->family;
Family family = to->family;
struct addrinfo *server = NULL;
struct addrinfo *walker = NULL;
@ -1175,3 +1182,197 @@ int addr_resolve_or_parse_ip(const char *address, IP *to, IP *extra)
return 1;
}
int net_connect(Socket sock, IP_Port ip_port)
{
struct sockaddr_storage addr = {0};
size_t addrsize;
if (ip_port.ip.family == AF_INET) {
struct sockaddr_in *addr4 = (struct sockaddr_in *)&addr;
addrsize = sizeof(struct sockaddr_in);
addr4->sin_family = AF_INET;
fill_addr4(ip_port.ip.ip4, &addr4->sin_addr);
addr4->sin_port = ip_port.port;
} else if (ip_port.ip.family == AF_INET6) {
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&addr;
addrsize = sizeof(struct sockaddr_in6);
addr6->sin6_family = AF_INET6;
fill_addr6(ip_port.ip.ip6, &addr6->sin6_addr);
addr6->sin6_port = ip_port.port;
} else {
return 0;
}
return connect(sock, (struct sockaddr *)&addr, addrsize);
}
int32_t net_getipport(const char* node, IP_Port** res, int type)
{
struct addrinfo *infos;
int ret = getaddrinfo(node, NULL, NULL, &infos);
if (ret != 0) {
return -1;
}
struct addrinfo *cur;
int count = 0;
for (cur = infos; count < INT32_MAX && cur != NULL; cur = cur->ai_next) {
if (cur->ai_socktype && type > 0 && cur->ai_socktype != type) {
continue;
}
if (cur->ai_family != AF_INET && cur->ai_family != AF_INET6) {
continue;
}
count++;
}
if (count == INT32_MAX) {
return -1;
}
*res = (IP_Port*)malloc(sizeof(IP_Port) * count);
if (*res == NULL) {
return -1;
}
IP_Port *ip_port = *res;
for (cur = infos; cur != NULL; cur = cur->ai_next) {
ip_port->ip.family = cur->ai_family;
if (cur->ai_socktype && type > 0 && cur->ai_socktype != type) {
continue;
}
if (cur->ai_family == AF_INET) {
struct sockaddr_in *addr = (struct sockaddr_in *)cur->ai_addr;
memcpy(&ip_port->ip.ip4, &addr->sin_addr, sizeof(IP4));
} else if (cur->ai_family == AF_INET6) {
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)cur->ai_addr;
memcpy(&ip_port->ip.ip6, &addr->sin6_addr, sizeof(IP6));
} else {
continue;
}
ip_port++;
}
freeaddrinfo(infos);
return count;
}
void net_freeipport(IP_Port* ip_ports)
{
free(ip_ports);
}
/* return 1 on success
* return 0 on failure
*/
int bind_to_port(Socket sock, int family, uint16_t port)
{
struct sockaddr_storage addr = {0};
size_t addrsize;
if (family == AF_INET) {
struct sockaddr_in *addr4 = (struct sockaddr_in *)&addr;
addrsize = sizeof(struct sockaddr_in);
addr4->sin_family = AF_INET;
addr4->sin_port = net_htons(port);
} else if (family == AF_INET6) {
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&addr;
addrsize = sizeof(struct sockaddr_in6);
addr6->sin6_family = AF_INET6;
addr6->sin6_port = net_htons(port);
} else {
return 0;
}
return (bind(sock, (struct sockaddr *)&addr, addrsize) == 0);
}
static int make_family(int family)
{
switch (family) {
case TOX_AF_INET:
return AF_INET;
case TOX_AF_INET6:
return AF_INET6;
default:
return family;
}
}
static int make_socktype(int type)
{
switch (type) {
case TOX_SOCK_STREAM:
return SOCK_STREAM;
case TOX_SOCK_DGRAM:
return SOCK_DGRAM;
default:
return type;
}
}
static int make_proto(int proto)
{
switch (proto) {
case TOX_PROTO_TCP:
return IPPROTO_TCP;
case TOX_PROTO_UDP:
return IPPROTO_UDP;
default:
return proto;
}
}
Socket net_socket(int domain, int type, int protocol)
{
int platform_domain = make_family(domain);
int platform_type = make_socktype(type);
int platform_prot = make_proto(protocol);
return socket(platform_domain, platform_type, platform_prot);
}
/* TODO: Remove, when tox DNS support will be removed.
* Used only by dns3_test.c
*/
size_t net_sendto_ip4(Socket sock, const char* buf, size_t n, IP_Port ip_port)
{
struct sockaddr_in target;
size_t addrsize = sizeof(target);
target.sin_family = make_family(ip_port.ip.family);
target.sin_port = net_htons(ip_port.port);
fill_addr4(ip_port.ip.ip4, &target.sin_addr);
return (size_t)sendto(sock, buf, n, 0, (struct sockaddr *)&target, addrsize);
}
uint32_t net_htonl(uint32_t hostlong)
{
return htonl(hostlong);
}
uint16_t net_htons(uint16_t hostshort)
{
return htons(hostshort);
}
uint32_t net_ntohl(uint32_t hostlong)
{
return ntohl(hostlong);
}
uint16_t net_ntohs(uint16_t hostshort)
{
return ntohs(hostshort);
}

View File

@ -53,9 +53,6 @@
#include <windows.h>
#include <ws2tcpip.h>
/* sa_family_t is the sockaddr_in / sockaddr_in6 family field */
typedef short sa_family_t;
#else // Linux includes
#include <arpa/inet.h>
@ -66,8 +63,12 @@ typedef short sa_family_t;
struct in_addr;
struct in6_addr;
struct addrinfo;
typedef short Family;
typedef int Socket;
Socket net_socket(int domain, int type, int protocol);
#define MAX_UDP_PACKET_SIZE 2048
@ -107,6 +108,18 @@ typedef enum NET_PACKET_TYPE {
#define TOX_PORTRANGE_TO 33545
#define TOX_PORT_DEFAULT TOX_PORTRANGE_FROM
/* Redefinitions of variables for safe transfer over wire. */
#define TOX_AF_INET 2
#define TOX_AF_INET6 10
#define TOX_TCP_INET 130
#define TOX_TCP_INET6 138
#define TOX_SOCK_STREAM 1
#define TOX_SOCK_DGRAM 2
#define TOX_PROTO_TCP 1
#define TOX_PROTO_UDP 2
/* TCP related */
#define TCP_ONION_FAMILY (AF_INET6 + 1)
#define TCP_INET (AF_INET6 + 2)
@ -151,6 +164,13 @@ void get_ip6(IP6 *ip, const struct in6_addr *addr);
void fill_addr4(IP4 ip, struct in_addr *addr);
void fill_addr6(IP6 ip, struct in6_addr *addr);
/* Convert values between host and network byte order.
*/
uint32_t net_htonl(uint32_t hostlong);
uint16_t net_htons(uint16_t hostshort);
uint32_t net_ntohl(uint32_t hostlong);
uint16_t net_ntohs(uint16_t hostshort);
/* Does the IP6 struct a contain an IPv4 address in an IPv6 one? */
#define IPV6_IPV4_IN_V6(a) ((a.uint64[0] == 0) && (a.uint32[2] == htonl (0xffff)))
@ -292,7 +312,7 @@ typedef struct {
Logger *log;
Packet_Handles packethandlers[256];
sa_family_t family;
Family family;
uint16_t port;
/* Our UDP socket. */
Socket sock;
@ -358,6 +378,32 @@ void networking_registerhandler(Networking_Core *net, uint8_t byte, packet_handl
/* Call this several times a second. */
void networking_poll(Networking_Core *net, void *userdata);
/* Connect a socket to the address specified by the ip_port. */
int net_connect(Socket sock, IP_Port ip_port);
/* High-level getaddrinfo implementation.
* Given node, which identifies an Internet host, net_getipport() fills an array
* with one or more IP_Port structures, each of which contains an Internet
* address that can be specified by calling net_connect(), the port is ignored.
*
* Skip all addresses with socktype != type (use type = -1 to get all addresses)
* To correctly deallocate array memory use net_freeipport()
*
* return number of elements in res array.
*/
int32_t net_getipport(const char* node, IP_Port** res, int type);
/* Deallocates memory allocated by net_getipport
*/
void net_freeipport(IP_Port* ip_ports);
/* return 1 on success
* return 0 on failure
*/
int bind_to_port(Socket sock, int family, uint16_t port);
size_t net_sendto_ip4(Socket sock, const char* buf, size_t n, IP_Port ip_port);
/* Initialize networking.
* bind to ip and port.
* ip must be in network order EX: 127.0.0.1 = (7F000001).

View File

@ -162,7 +162,7 @@ Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error)
return NULL;
}
m_options.proxy_info.ip_port.port = htons(tox_options_get_proxy_port(options));
m_options.proxy_info.ip_port.port = net_htons(tox_options_get_proxy_port(options));
}
}
@ -233,43 +233,24 @@ bool tox_bootstrap(Tox *tox, const char *address, uint16_t port, const uint8_t *
return 0;
}
struct addrinfo *root, *info;
IP_Port *root;
if (getaddrinfo(address, NULL, NULL, &root) != 0) {
int32_t count = net_getipport(address, &root, SOCK_DGRAM);
if (count == -1) {
SET_ERROR_PARAMETER(error, TOX_ERR_BOOTSTRAP_BAD_HOST);
return 0;
}
info = root;
unsigned int count = 0;
do {
IP_Port ip_port;
ip_port.port = htons(port);
ip_port.ip.family = info->ai_family;
if (info->ai_socktype && info->ai_socktype != SOCK_DGRAM) {
continue;
}
if (info->ai_family == AF_INET) {
struct sockaddr_in *addr = (struct sockaddr_in *)info->ai_addr;
get_ip4(&ip_port.ip.ip4, &addr->sin_addr);
} else if (info->ai_family == AF_INET6) {
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)info->ai_addr;
get_ip6(&ip_port.ip.ip6, &addr->sin6_addr);
} else {
continue;
}
unsigned int i;
for (i = 0; i < count; i++) {
root[i].port = htons(port);
Messenger *m = tox;
onion_add_bs_path_node(m->onion_c, ip_port, public_key);
DHT_bootstrap(m->dht, ip_port, public_key);
++count;
} while ((info = info->ai_next));
onion_add_bs_path_node(m->onion_c, root[i], public_key);
DHT_bootstrap(m->dht, root[i], public_key);
}
freeaddrinfo(root);
net_freeipport(root);
if (count) {
SET_ERROR_PARAMETER(error, TOX_ERR_BOOTSTRAP_OK);
@ -293,42 +274,23 @@ bool tox_add_tcp_relay(Tox *tox, const char *address, uint16_t port, const uint8
return 0;
}
struct addrinfo *root, *info;
IP_Port *root;
if (getaddrinfo(address, NULL, NULL, &root) != 0) {
int32_t count = net_getipport(address, &root, SOCK_STREAM);
if (count == -1) {
SET_ERROR_PARAMETER(error, TOX_ERR_BOOTSTRAP_BAD_HOST);
return 0;
}
info = root;
unsigned int count = 0;
do {
IP_Port ip_port;
ip_port.port = htons(port);
ip_port.ip.family = info->ai_family;
if (info->ai_socktype && info->ai_socktype != SOCK_STREAM) {
continue;
}
if (info->ai_family == AF_INET) {
struct sockaddr_in *addr = (struct sockaddr_in *)info->ai_addr;
get_ip4(&ip_port.ip.ip4, &addr->sin_addr);
} else if (info->ai_family == AF_INET6) {
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)info->ai_addr;
get_ip6(&ip_port.ip.ip6, &addr->sin6_addr);
} else {
continue;
}
unsigned int i;
for (i = 0; i < count; i++) {
root[i].port = htons(port);
Messenger *m = tox;
add_tcp_relay(m->net_crypto, ip_port, public_key);
++count;
} while ((info = info->ai_next));
add_tcp_relay(m->net_crypto, root[i], public_key);
}
freeaddrinfo(root);
net_freeipport(root);
if (count) {
SET_ERROR_PARAMETER(error, TOX_ERR_BOOTSTRAP_OK);
@ -387,13 +349,13 @@ void tox_self_get_address(const Tox *tox, uint8_t *address)
void tox_self_set_nospam(Tox *tox, uint32_t nospam)
{
Messenger *m = tox;
set_nospam(&(m->fr), htonl(nospam));
set_nospam(&(m->fr), net_htonl(nospam));
}
uint32_t tox_self_get_nospam(const Tox *tox)
{
const Messenger *m = tox;
return ntohl(get_nospam(&(m->fr)));
return net_ntohl(get_nospam(&(m->fr)));
}
void tox_self_get_public_key(const Tox *tox, uint8_t *public_key)
@ -1558,7 +1520,7 @@ void tox_self_get_dht_id(const Tox *tox, uint8_t *dht_id)
uint16_t tox_self_get_udp_port(const Tox *tox, TOX_ERR_GET_PORT *error)
{
const Messenger *m = tox;
uint16_t port = htons(m->net->port);
uint16_t port = net_htons(m->net->port);
if (port) {
SET_ERROR_PARAMETER(error, TOX_ERR_GET_PORT_OK);