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/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[])
|
||||
{
|
||||
struct sarp_router * router = NULL;
|
||||
struct sarp_alloc mem;
|
||||
sarp_mem_jemalloc(&mem);
|
||||
const char * conffname = "daemon.ini";
|
||||
if (argc > 1)
|
||||
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;
|
||||
}
|
||||
|
@ -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