7 #include "curve25519.h"
11 #define UNETD_GLOBAL_PEX_PORT 51819
12 #define PEX_BUF_SIZE 1024
13 #define PEX_RX_BUF_SIZE 16384
14 #define UNETD_NET_DATA_SIZE_MAX (128 * 1024)
22 PEX_MSG_UPDATE_REQUEST
,
23 PEX_MSG_UPDATE_RESPONSE
,
24 PEX_MSG_UPDATE_RESPONSE_DATA
,
25 PEX_MSG_UPDATE_RESPONSE_NO_DATA
,
26 PEX_MSG_ENDPOINT_NOTIFY
,
27 PEX_MSG_ENDPOINT_PORT_NOTIFY
,
36 uint8_t id
[PEX_ID_LEN
];
41 uint8_t auth_id
[PEX_ID_LEN
];
44 #define PEER_EP_F_IPV6 (1 << 0)
45 #define PEER_EP_F_LOCAL (1 << 1)
47 struct pex_peer_endpoint
{
50 uint8_t peer_id
[PEX_ID_LEN
];
56 uint8_t local_addr
[16];
59 struct pex_update_request
{
60 uint64_t req_id
; /* must be first */
64 struct pex_update_response
{
65 uint64_t req_id
; /* must be first */
67 uint8_t e_key
[CURVE25519_KEY_SIZE
];
70 struct pex_update_response_data
{
71 uint64_t req_id
; /* must be first */
75 struct pex_update_response_no_data
{
76 uint64_t req_id
; /* must be first */
80 struct pex_endpoint_port_notify
{
84 struct pex_msg_update_send_ctx
{
85 const uint8_t *pubkey
;
86 const uint8_t *auth_key
;
95 struct pex_msg_local_control
{
97 uint8_t auth_id
[PEX_ID_LEN
];
98 union network_endpoint ep
;
102 struct pex_hdr
*pex_rx_accept(void *data
, size_t len
, bool ext
);
104 typedef void (*pex_recv_cb_t
)(void *data
, size_t len
, struct sockaddr_in6
*addr
);
105 typedef void (*pex_recv_control_cb_t
)(struct pex_msg_local_control
*msg
, int len
);
107 int pex_open(void *addr
, size_t addr_len
, pex_recv_cb_t cb
, bool server
);
108 int pex_unix_open(const char *path
, pex_recv_control_cb_t cb
);
109 void pex_close(void);
111 int pex_socket(void);
112 int pex_raw_socket(int family
);
113 uint64_t pex_network_hash(const uint8_t *auth_key
, uint64_t req_id
);
114 struct pex_hdr
*__pex_msg_init(const uint8_t *pubkey
, uint8_t opcode
);
115 struct pex_hdr
*__pex_msg_init_ext(const uint8_t *pubkey
, const uint8_t *auth_key
,
116 uint8_t opcode
, bool ext
);
117 int __pex_msg_send(int fd
, const void *addr
, void *ip_hdr
, size_t ip_hdrlen
);
118 void *pex_msg_append(size_t len
);
120 struct pex_update_request
*
121 pex_msg_update_request_init(const uint8_t *pubkey
, const uint8_t *priv_key
,
122 const uint8_t *auth_key
, union network_endpoint
*addr
,
123 uint64_t cur_version
, bool ext
);
124 void *pex_msg_update_response_recv(const void *data
, int len
, enum pex_opcode op
,
125 int *data_len
, uint64_t *timestamp
);
127 void pex_msg_update_response_init(struct pex_msg_update_send_ctx
*ctx
,
128 const uint8_t *pubkey
, const uint8_t *auth_key
,
129 const uint8_t *peer_key
, bool ext
,
130 struct pex_update_request
*req
,
131 const void *data
, int len
);
132 bool pex_msg_update_response_continue(struct pex_msg_update_send_ctx
*ctx
);