summaryrefslogtreecommitdiff
path: root/toxcore/network.h
diff options
context:
space:
mode:
Diffstat (limited to 'toxcore/network.h')
-rw-r--r--toxcore/network.h139
1 files changed, 116 insertions, 23 deletions
diff --git a/toxcore/network.h b/toxcore/network.h
index 98307e5b..12a48868 100644
--- a/toxcore/network.h
+++ b/toxcore/network.h
@@ -39,17 +39,22 @@
39#include <windows.h> 39#include <windows.h>
40#include <ws2tcpip.h> 40#include <ws2tcpip.h>
41 41
42typedef unsigned int sock_t;
43
42#else // Linux includes 44#else // Linux includes
43 45
44#include <fcntl.h> 46#include <fcntl.h>
45#include <sys/socket.h> 47#include <sys/socket.h>
46#include <netinet/in.h> 48#include <netinet/in.h>
49#include <arpa/inet.h>
47#include <errno.h> 50#include <errno.h>
48#include <sys/time.h> 51#include <sys/time.h>
49#include <sys/types.h> 52#include <sys/types.h>
50#include <netdb.h> 53#include <netdb.h>
51#include <unistd.h> 54#include <unistd.h>
52 55
56typedef int sock_t;
57
53#endif 58#endif
54 59
55#ifndef VANILLA_NACL 60#ifndef VANILLA_NACL
@@ -66,7 +71,8 @@
66#define NET_PACKET_PING_REQUEST 0 /* Ping request packet ID. */ 71#define NET_PACKET_PING_REQUEST 0 /* Ping request packet ID. */
67#define NET_PACKET_PING_RESPONSE 1 /* Ping response packet ID. */ 72#define NET_PACKET_PING_RESPONSE 1 /* Ping response packet ID. */
68#define NET_PACKET_GET_NODES 2 /* Get nodes request packet ID. */ 73#define NET_PACKET_GET_NODES 2 /* Get nodes request packet ID. */
69#define NET_PACKET_SEND_NODES 3 /* Send nodes response packet ID. */ 74#define NET_PACKET_SEND_NODES 3 /* Send nodes response packet ID for IPv4 addresses. */
75#define NET_PACKET_SEND_NODES_IPV6 4 /* Send nodes response packet ID for other addresses. */
70#define NET_PACKET_HANDSHAKE 16 /* Handshake packet ID. */ 76#define NET_PACKET_HANDSHAKE 16 /* Handshake packet ID. */
71#define NET_PACKET_SYNC 17 /* SYNC packet ID. */ 77#define NET_PACKET_SYNC 17 /* SYNC packet ID. */
72#define NET_PACKET_DATA 18 /* Data packet ID. */ 78#define NET_PACKET_DATA 18 /* Data packet ID. */
@@ -74,6 +80,10 @@
74#define NET_PACKET_LAN_DISCOVERY 33 /* LAN discovery packet ID. */ 80#define NET_PACKET_LAN_DISCOVERY 33 /* LAN discovery packet ID. */
75#define NET_PACKET_GROUP_CHATS 48 /* Group chats packet ID. */ 81#define NET_PACKET_GROUP_CHATS 48 /* Group chats packet ID. */
76 82
83#define TOX_PORTRANGE_FROM 33445
84#define TOX_PORTRANGE_TO 33455
85#define TOX_PORT_DEFAULT TOX_PORTRANGE_FROM
86
77/* Current time, unix format */ 87/* Current time, unix format */
78#define unix_time() ((uint64_t)time(NULL)) 88#define unix_time() ((uint64_t)time(NULL))
79 89
@@ -82,27 +92,118 @@ typedef union {
82 uint8_t uint8[4]; 92 uint8_t uint8[4];
83 uint16_t uint16[2]; 93 uint16_t uint16[2];
84 uint32_t uint32; 94 uint32_t uint32;
85} IP; 95 struct in_addr in_addr;
96} IP4;
97
98typedef struct in6_addr IP6;
99
100typedef struct {
101 sa_family_t family;
102 union {
103 IP4 ip4;
104 IP6 ip6;
105 };
106} IPAny;
86 107
87typedef union { 108typedef union {
88 struct { 109 struct {
89 IP ip; 110 IP4 ip;
90 uint16_t port; 111 uint16_t port;
91 /* Not used for anything right now. */ 112 /* Not used for anything right now. */
92 uint16_t padding; 113 uint16_t padding;
93 }; 114 };
94 uint8_t uint8[8]; 115 uint8_t uint8[8];
95} IP_Port; 116} IP4_Port;
96 117
118/* will replace IP_Port as soon as the complete infrastructure is in place
119 * removed the unused union and padding also */
97typedef struct { 120typedef struct {
98 int16_t family; 121 IPAny ip;
99 uint16_t port; 122 uint16_t port;
100 IP ip; 123} IPAny_Port;
101 uint8_t zeroes[8]; 124
102#ifdef ENABLE_IPV6 125#undef TOX_ENABLE_IPV6
103 uint8_t zeroes2[12]; 126/* #define TOX_ENABLE_IPV6 */
127#ifdef TOX_ENABLE_IPV6
128#define TOX_ENABLE_IPV6_DEFAULT 1
129typedef IPAny IP;
130typedef IPAny_Port IP_Port;
131#else
132#define TOX_ENABLE_IPV6_DEFAULT 0
133typedef IP4 IP;
134typedef IP4_Port IP_Port;
104#endif 135#endif
105} ADDR; 136
137/* ip_ntoa
138 * converts ip into a string
139 * uses a static buffer, so mustn't used multiple times in the same output
140 */
141const char *ip_ntoa(IP *ip);
142
143/* ip_equal
144 * compares two IPAny structures
145 * unset means unequal
146 *
147 * returns 0 when not equal or when uninitialized
148 */
149int ip_equal(IP *a, IP *b);
150
151/* ipport_equal
152 * compares two IPAny_Port structures
153 * unset means unequal
154 *
155 * returns 0 when not equal or when uninitialized
156 */
157int ipport_equal(IP_Port *a, IP_Port *b);
158
159/* nulls out ip */
160void ip_reset(IP *ip);
161/* nulls out ip, sets family according to flag */
162void ip_init(IP *ip, uint8_t ipv6enabled);
163/* checks if ip is valid */
164int ip_isset(IP *ip);
165/* checks if ip is valid */
166int ipport_isset(IP_Port *ipport);
167/* copies an ip structure */
168void ip_copy(IP *target, IP *source);
169/* copies an ip_port structure */
170void ipport_copy(IP_Port *target, IP_Port *source);
171
172/*
173 * addr_resolve():
174 * uses getaddrinfo to resolve an address into an IP address
175 * uses the first IPv4/IPv6 addresses returned by getaddrinfo
176 *
177 * input
178 * address: a hostname (or something parseable to an IP address)
179 * to: to.family MUST be initialized, either set to a specific IP version
180 * (AF_INET/AF_INET6) or to the unspecified AF_UNSPEC (= 0), if both
181 * IP versions are acceptable
182 * extra can be NULL and is only set in special circumstances, see returns
183 *
184 * returns in *to a valid IPAny (v4/v6),
185 * prefers v6 if ip.family was AF_UNSPEC and both available
186 * returns in *extra an IPv4 address, if family was AF_UNSPEC and *to is AF_INET6
187 * returns 0 on failure
188 */
189int addr_resolve(const char *address, IP *to, IP *extra);
190
191/*
192 * addr_resolve_or_parse_ip
193 * resolves string into an IP address
194 *
195 * address: a hostname (or something parseable to an IP address)
196 * to: to.family MUST be initialized, either set to a specific IP version
197 * (AF_INET/AF_INET6) or to the unspecified AF_UNSPEC (= 0), if both
198 * IP versions are acceptable
199 * extra can be NULL and is only set in special circumstances, see returns
200 *
201 * returns in *tro a matching address (IPv6 or IPv4)
202 * returns in *extra, if not NULL, an IPv4 address, if to->family was AF_UNSPEC
203 * returns 1 on success
204 * returns 0 on failure
205 */
206int addr_resolve_or_parse_ip(const char *address, IP *to, IP *extra);
106 207
107/* Function to receive data, ip and port of sender is put into ip_port. 208/* Function to receive data, ip and port of sender is put into ip_port.
108 * Packet data is put into data. 209 * Packet data is put into data.
@@ -117,13 +218,11 @@ typedef struct {
117 218
118typedef struct { 219typedef struct {
119 Packet_Handles packethandlers[256]; 220 Packet_Handles packethandlers[256];
120 /* Our UDP socket. */
121#ifdef WIN32
122 unsigned int sock;
123#else
124 int sock;
125#endif
126 221
222 /* Our UDP socket. */
223 sa_family_t family;
224 uint16_t port;
225 sock_t sock;
127} Networking_Core; 226} Networking_Core;
128 227
129/* return current time in milleseconds since the epoch. */ 228/* return current time in milleseconds since the epoch. */
@@ -137,12 +236,7 @@ uint32_t random_int(void);
137/* Basic network functions: */ 236/* Basic network functions: */
138 237
139/* Function to send packet(data) of length length to ip_port. */ 238/* Function to send packet(data) of length length to ip_port. */
140#ifdef WIN32 239int sendpacket(Networking_Core *net, IP_Port ip_port, uint8_t *data, uint32_t length);
141int sendpacket(unsigned int sock, IP_Port ip_port, uint8_t *data, uint32_t length);
142#else
143int sendpacket(int sock, IP_Port ip_port, uint8_t *data, uint32_t length);
144#endif
145
146 240
147/* Function to call when packet beginning with byte is received. */ 241/* Function to call when packet beginning with byte is received. */
148void networking_registerhandler(Networking_Core *net, uint8_t byte, packet_handler_callback cb, void *object); 242void networking_registerhandler(Networking_Core *net, uint8_t byte, packet_handler_callback cb, void *object);
@@ -163,5 +257,4 @@ Networking_Core *new_networking(IP ip, uint16_t port);
163/* Function to cleanup networking stuff (doesn't do much right now). */ 257/* Function to cleanup networking stuff (doesn't do much right now). */
164void kill_networking(Networking_Core *net); 258void kill_networking(Networking_Core *net);
165 259
166
167#endif 260#endif