unet-cli: strip initial newline in usage message
[project/unetd.git] / pex.h
diff --git a/pex.h b/pex.h
index 11f783fc398d6846401a430829efbf8aa07b1570..271d998bc62106782f27e99307d020f9d2d746fa 100644 (file)
--- a/pex.h
+++ b/pex.h
@@ -5,21 +5,66 @@
 #ifndef __UNETD_PEX_H
 #define __UNETD_PEX_H
 
+#include <sys/socket.h>
 #include <libubox/uloop.h>
+#include "stun.h"
+
+#define NETWORK_PEX_HOSTS_LIMIT        128
 
 struct network;
 
 struct network_pex_host {
        struct list_head list;
+       uint64_t timeout;
+       uint64_t last_active;
+       uint64_t last_ping;
        union network_endpoint endpoint;
 };
 
 struct network_pex {
        struct uloop_fd fd;
        struct list_head hosts;
+       int num_hosts;
        struct uloop_timeout request_update_timer;
 };
 
+enum network_stun_state {
+       STUN_STATE_IDLE,
+       STUN_STATE_PEX_QUERY_WAIT,
+       STUN_STATE_STUN_QUERY_SEND,
+       STUN_STATE_STUN_QUERY_WAIT,
+};
+
+struct network_stun_server {
+       struct list_head list;
+
+       struct avl_node pending_node;
+       struct stun_request req;
+
+       const char *host;
+       uint8_t seq;
+       bool req_auth_port;
+       bool pending;
+};
+
+struct network_stun {
+       struct list_head servers;
+       struct avl_tree pending;
+
+       struct uloop_timeout timer;
+
+       enum network_stun_state state;
+       bool wgport_disabled;
+
+       uint16_t auth_port_ext;
+       uint16_t port_local;
+       uint16_t port_ext;
+
+       int retry;
+
+       struct uloop_fd socket;
+};
+
 enum pex_event {
        PEX_EV_HANDSHAKE,
        PEX_EV_ENDPOINT_CHANGE,
@@ -30,15 +75,25 @@ enum pex_event {
 void network_pex_init(struct network *net);
 int network_pex_open(struct network *net);
 void network_pex_close(struct network *net);
+void network_pex_free(struct network *net);
 
 void network_pex_event(struct network *net, struct network_peer *peer,
                       enum pex_event ev);
+void network_pex_create_host(struct network *net, union network_endpoint *ep,
+                            unsigned int timeout);
+
+void network_stun_init(struct network *net);
+void network_stun_free(struct network *net);
+void network_stun_server_add(struct network *net, const char *host);
+void network_stun_rx_packet(struct network *net, const void *data, size_t len);
+void network_stun_update_port(struct network *net, bool auth, uint16_t val);
+void network_stun_start(struct network *net);
 
 static inline bool network_pex_active(struct network_pex *pex)
 {
        return pex->fd.fd >= 0;
 }
 
-int global_pex_open(void);
+int global_pex_open(const char *unix_path);
 
 #endif