mirror of https://github.com/oxen-io/lokinet
more
parent
f557027692
commit
74112dd6f3
@ -0,0 +1,2 @@
|
|||||||
|
[router]
|
||||||
|
|
@ -1,10 +1,40 @@
|
|||||||
#include <sarp.h>
|
#include <sarp.h>
|
||||||
|
#include <sarp/mem.h>
|
||||||
|
#include <sarp/ev.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
struct sarp_router * router;
|
||||||
|
struct sarp_config * gconfig;
|
||||||
|
struct sarp_ev_loop * mainloop;
|
||||||
|
|
||||||
int main(int argc, char * argv[])
|
int main(int argc, char * argv[])
|
||||||
{
|
{
|
||||||
struct sarp_router * router = NULL;
|
const char * conffname = "daemon.ini";
|
||||||
struct sarp_alloc mem;
|
if (argc > 1)
|
||||||
sarp_mem_jemalloc(&mem);
|
conffname = argv[1];
|
||||||
|
sarp_mem_jemalloc();
|
||||||
|
sarp_new_config(&gconfig);
|
||||||
|
sarp_ev_loop_alloc(&mainloop);
|
||||||
|
|
||||||
|
if(sarp_load_config(gconfig, conffname))
|
||||||
|
{
|
||||||
|
printf("!!! failed to load %s\n", conffname);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("loaded config %s\n", conffname);
|
||||||
|
sarp_init_router(&router);
|
||||||
|
sarp_configure_router(router, gconfig);
|
||||||
|
printf("running...\n");
|
||||||
|
sarp_run_router(router, mainloop);
|
||||||
|
sarp_ev_loop_run(mainloop);
|
||||||
|
}
|
||||||
|
printf("shutting down.");
|
||||||
|
sarp_free_router(&router);
|
||||||
|
printf(".");
|
||||||
|
sarp_free_config(&gconfig);
|
||||||
|
printf(".");
|
||||||
|
sarp_ev_loop_free(&mainloop);
|
||||||
|
printf(".\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef SARP_AI_H
|
||||||
|
#define SARP_AI_H
|
||||||
|
#include <sarp/crypto.h>
|
||||||
|
#include <sarp/net.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct sarp_address_info
|
||||||
|
{
|
||||||
|
uint16_t rank;
|
||||||
|
sarp_pubkey_t enc_key;
|
||||||
|
char * dialect;
|
||||||
|
struct in6_addr ip;
|
||||||
|
uint16_t port;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool sarp_address_info_bencode(struct sarp_address_info * ai, sarp_buffer_t * buff);
|
||||||
|
bool sarp_address_info_bdecode(struct sarp_address_info * ai, sarp_buffer_t buff);
|
||||||
|
|
||||||
|
struct sarp_address_info_list;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef SARP_XI_H
|
||||||
|
#define SARP_XI_H
|
||||||
|
#include <sarp/net.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct sarp_exit_info
|
||||||
|
{
|
||||||
|
in6_addr address;
|
||||||
|
in6_addr netmask;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sarp_exit_info_list;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef SARP_NET_H
|
||||||
|
#define SARP_NET_H
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef SARP_RC_H
|
||||||
|
#define SARP_RC_H
|
||||||
|
#include <sarp/address_info.h>
|
||||||
|
#include <sarp/exit_info.h>
|
||||||
|
#include <sarp/crypto.h>
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct sarp_router_contact
|
||||||
|
{
|
||||||
|
sarp_buffer_t raw;
|
||||||
|
struct sarp_address_info_list * addreses;
|
||||||
|
sarp_pubkey_t pubkey;
|
||||||
|
struct sarp_exit_info_list * exits;
|
||||||
|
sarp_sig_t signature;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool sarp_rc_bdecode(struct sarp_router_contact * rc, sarp_buffer_t buf);
|
||||||
|
bool sarp_rc_bencode(struct sarp_router_contact * rc, sarp_buffer_t * buf);
|
||||||
|
void sarp_rc_free(struct sarp_router_contact ** rc);
|
||||||
|
bool sarp_rc_verify_sig(struct sarp_rotuer_contact * rc);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef SARP_SI_H
|
||||||
|
#define SARP_SI_H
|
||||||
|
#include <sarp/crypto.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct sarp_service_info
|
||||||
|
{
|
||||||
|
sarp_buffer_t name;
|
||||||
|
sarp_pubkey_t signingkey;
|
||||||
|
sarp_buffer_t vanity;
|
||||||
|
};
|
||||||
|
|
||||||
|
void sarp_service_info_hash(struct sarp_service_info * si, sarp_hash_t * h);
|
||||||
|
bool sarp_service_info_bencode(struct sarp_serivce_info * si, sarp_buffer_t * buff);
|
||||||
|
bool sarp_service_info_bdecode(struct sarp_serivce_info * si, sarp_buffer_t buff);
|
||||||
|
void sarp_service_info_free(struct sarp_service_info ** si);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
@ -0,0 +1,39 @@
|
|||||||
|
#include <sarp/address_info.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
bool sarp_address_info_bencode(struct sarp_address_info * ai, sarp_buffer_t * buff)
|
||||||
|
{
|
||||||
|
uint8_t * ptr = buff->cur;
|
||||||
|
size_t sz = sarp_buffer_size_left(buff);
|
||||||
|
uint8_t * end = ptr + sz;
|
||||||
|
int r = 0;
|
||||||
|
r = snprintf(ptr, (end - ptr), "d1:ci%de1:e32:", ai->rank);
|
||||||
|
if (r == -1) return false;
|
||||||
|
ptr += r;
|
||||||
|
if( ( end - ptr ) <= 0 ) return false;
|
||||||
|
|
||||||
|
memcpy(ptr, ai->enc_key, sizeof(ai->enc_key));
|
||||||
|
ptr += sizeof(ai->enc_key);
|
||||||
|
if( ( end - ptr ) <= 0 ) return false;
|
||||||
|
|
||||||
|
r = snprintf(ptr, (end - ptr), "1:d%ld:%s", strlen(ai->dialect), ai->dialect);
|
||||||
|
if (r == -1) return false;
|
||||||
|
ptr += r;
|
||||||
|
if( ( end - ptr ) <= 0 ) return false;
|
||||||
|
|
||||||
|
r = snprintf(ptr, (end - ptr), "1:i%ld:", sizeof(ai->ip));
|
||||||
|
if(r == -1) return false;
|
||||||
|
ptr += r;
|
||||||
|
if( ( end - ptr ) <= 0) return false;
|
||||||
|
|
||||||
|
memcpy(ptr, &ai->ip, sizeof(ai->ip));
|
||||||
|
ptr += sizeof(ai->ip);
|
||||||
|
if( ( end - ptr ) <= 0) return false;
|
||||||
|
|
||||||
|
r = snprintf(ptr, (end - ptr), "1:pi%dee", ai->port);
|
||||||
|
if( r == -1) return false;
|
||||||
|
ptr += r;
|
||||||
|
buff->cur = ptr;
|
||||||
|
return end - ptr <= sz;
|
||||||
|
}
|
@ -0,0 +1,81 @@
|
|||||||
|
#include <sarp/ev.h>
|
||||||
|
#include <sarp/mem.h>
|
||||||
|
#include <uv.h>
|
||||||
|
|
||||||
|
struct sarp_ev_loop
|
||||||
|
{
|
||||||
|
uv_loop_t _loop;
|
||||||
|
|
||||||
|
uv_loop_t * loop() { return &_loop; }
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace sarp
|
||||||
|
{
|
||||||
|
struct udp_listener
|
||||||
|
{
|
||||||
|
uv_udp_t _handle;
|
||||||
|
struct sarp_udp_listener * listener;
|
||||||
|
|
||||||
|
uv_udp_t * handle() { return &_handle; }
|
||||||
|
};
|
||||||
|
|
||||||
|
static void udp_alloc_cb(uv_handle_t * h, size_t sz, uv_buf_t * buf)
|
||||||
|
{
|
||||||
|
buf->base = static_cast<char *>(sarp_g_mem.malloc(sz));
|
||||||
|
buf->len = sz;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void udp_recv_cb(uv_udp_t* handle, ssize_t nread, const uv_buf_t* buf, const struct sockaddr* addr, unsigned flags)
|
||||||
|
{
|
||||||
|
udp_listener * l = static_cast<udp_listener *>(handle->data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
void sarp_ev_loop_alloc(struct sarp_ev_loop ** ev)
|
||||||
|
{
|
||||||
|
*ev = static_cast<sarp_ev_loop*>(sarp_g_mem.malloc(sizeof(struct sarp_ev_loop)));
|
||||||
|
if (*ev)
|
||||||
|
{
|
||||||
|
uv_loop_init((*ev)->loop());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sarp_ev_loop_free(struct sarp_ev_loop ** ev)
|
||||||
|
{
|
||||||
|
if(*ev)
|
||||||
|
{
|
||||||
|
uv_loop_close((*ev)->loop());
|
||||||
|
sarp_g_mem.free(*ev);
|
||||||
|
}
|
||||||
|
*ev = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sarp_ev_loop_run(struct sarp_ev_loop * ev)
|
||||||
|
{
|
||||||
|
return uv_run(ev->loop(), UV_RUN_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sarp_ev_add_udp_listener(struct sarp_ev_loop * ev, struct sarp_udp_listener * listener)
|
||||||
|
{
|
||||||
|
sockaddr_in6 addr;
|
||||||
|
uv_ip6_addr(listener->host, listener->port, &addr);
|
||||||
|
int ret = 0;
|
||||||
|
sarp::udp_listener * l = static_cast<sarp::udp_listener *>(sarp_g_mem.malloc(sizeof(sarp::udp_listener)));
|
||||||
|
listener->impl = l;
|
||||||
|
l->handle()->data = l;
|
||||||
|
l->listener = listener;
|
||||||
|
|
||||||
|
ret = uv_udp_init(ev->loop(), l->handle());
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
ret = uv_udp_bind(l->handle(), (const sockaddr *)&addr, 0);
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
ret = uv_udp_recv_start(l->handle(), sarp::udp_alloc_cb, sarp::udp_recv_cb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
#include <sarp/mem.h>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
struct sarp_alloc sarp_g_mem = {
|
||||||
|
.malloc = nullptr,
|
||||||
|
.realloc = nullptr,
|
||||||
|
.calloc = nullptr,
|
||||||
|
.free = nullptr
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue