pex: add support for figuring out the external data port via STUN servers
[project/unetd.git] / pex.h
diff --git a/pex.h b/pex.h
index d5d08878791591019ba67357e23de86cf53639dd..acaf372befc83b82aa8e04845fe6d8559e6b805b 100644 (file)
--- a/pex.h
+++ b/pex.h
@@ -5,7 +5,9 @@
 #ifndef __UNETD_PEX_H
 #define __UNETD_PEX_H
 
+#include <sys/socket.h>
 #include <libubox/uloop.h>
+#include "stun.h"
 
 struct network;
 
@@ -22,6 +24,43 @@ struct network_pex {
        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,
@@ -39,6 +78,13 @@ void network_pex_event(struct network *net, struct network_peer *peer,
 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;