mirror of
https://github.com/oxen-io/lokinet
synced 2023-12-14 06:53:00 +01:00
refactor iwp, get rid of dtls
This commit is contained in:
parent
cb53d66869
commit
cb351ae9ff
|
@ -10,7 +10,7 @@ find_package(sodium)
|
|||
set(EXE llarpd)
|
||||
set(EXE_SRC daemon/main.c)
|
||||
|
||||
set(LIBS ${sodium_LIBRARY_RELEASE} pthread stdc++fs jemalloc mbedtls)
|
||||
set(LIBS ${sodium_LIBRARY_RELEASE} pthread stdc++fs jemalloc mbedx509 mbedcrypto mbedtls)
|
||||
|
||||
set(LIB llarp)
|
||||
|
||||
|
@ -20,11 +20,10 @@ set(LIB_SRC
|
|||
llarp/config.cpp
|
||||
llarp/crypto_async.c
|
||||
llarp/crypto_libsodium.cpp
|
||||
llarp/dtls_link.cpp
|
||||
llarp/ev.cpp
|
||||
llarp/exit_info.c
|
||||
llarp/exit_route.c
|
||||
llarp/iwp_link.c
|
||||
llarp/iwp_link.cpp
|
||||
llarp/link.c
|
||||
llarp/link_intro.cpp
|
||||
llarp/link_relay_down.cpp
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct iwp_configure_args {
|
||||
struct llarp_iwp_args {
|
||||
struct llarp_alloc * mem;
|
||||
struct llarp_crypto* crypto;
|
||||
const char * keyfile;
|
||||
};
|
||||
|
||||
void iwp_link_init(struct llarp_link* link, struct iwp_configure_args args,
|
||||
void iwp_link_init(struct llarp_link* link, struct llarp_iwp_args args,
|
||||
struct llarp_msg_muxer* muxer);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
#include <llarp/dtls.h>
|
||||
#include <llarp/net.h>
|
||||
|
||||
#include <mbedtls/ssl.h>
|
||||
|
||||
#include <map>
|
||||
#include "crypto.hpp"
|
||||
#include "fs.hpp"
|
||||
#include "net.hpp"
|
||||
|
||||
namespace iwp
|
||||
{
|
||||
|
||||
struct dtls_session
|
||||
{
|
||||
};
|
||||
|
@ -23,6 +26,21 @@ struct dtls_link
|
|||
uint32_t timeout_job_id;
|
||||
std::map<llarp::Addr, llarp_link_session> sessions;
|
||||
|
||||
dtls_link()
|
||||
{
|
||||
mbedtls_x509_crt_init( &servercert );
|
||||
mbedtls_pk_init( &privkey );
|
||||
}
|
||||
|
||||
entropy_context entropy;
|
||||
ecdsa_context ecdsa;
|
||||
mbedtls_ssl_context ssl;
|
||||
mbedtls_ssl_cookie_ctx cookie_ctx;
|
||||
mbedtls_x509_crt servercert;
|
||||
mbedtls_ssl_config conf;
|
||||
mbedtls_pk_context privkey;
|
||||
mbedtls_timing_delay_context timer;
|
||||
|
||||
void inbound_session(llarp::Addr & src)
|
||||
{
|
||||
|
||||
|
@ -79,6 +97,15 @@ void dtls_recvfrom(struct llarp_udp_io * udp, const struct sockaddr *saddr, void
|
|||
static bool dtls_link_configure(struct llarp_link * l, struct llarp_ev_loop * netloop, const char * ifname, int af, uint16_t port)
|
||||
{
|
||||
dtls_link * link = static_cast<dtls_link*>(l->impl);
|
||||
|
||||
if(!link->ensure_privkey())
|
||||
return false;
|
||||
|
||||
if(!link->ensure_certfile())
|
||||
return false;
|
||||
|
||||
// bind
|
||||
|
||||
link->udp.addr.sa_family = af;
|
||||
if(!llarp_getifaddr(ifname, af, &link->udp.addr))
|
||||
return false;
|
||||
|
@ -177,22 +204,22 @@ void dtls_link_free(struct llarp_link *l)
|
|||
link->~dtls_link();
|
||||
mem->free(mem, link);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
||||
void dtls_link_init(struct llarp_link * link, struct llarp_dtls_args args, struct llarp_msg_muxer * muxer)
|
||||
void iwp_link_init(struct llarp_link * link, struct llarp_iwp_args args, struct llarp_msg_muxer * muxer)
|
||||
{
|
||||
link->impl = dtls_link_alloc(args.mem, muxer, args.keyfile, args.certfile);
|
||||
link->name = dtls_link_name;
|
||||
link->configure = dtls_link_configure;
|
||||
link->start_link = dtls_link_start;
|
||||
link->stop_link = dtls_link_stop;
|
||||
link->iter_sessions = dtls_link_iter_sessions;
|
||||
link->try_establish = dtls_link_try_establish;
|
||||
link->acquire_session_for_addr = dtls_link_session_for_addr;
|
||||
link->mark_session_active = dtls_link_mark_session_active;
|
||||
link->free_impl = dtls_link_free;
|
||||
link->impl = iwp::link_alloc(args.mem, muxer, args.keyfile, args.certfile);
|
||||
link->name = iwp::link_name;
|
||||
link->configure = iwp::link_configure;
|
||||
link->start_link = iwp::link_start;
|
||||
link->stop_link = iwp::link_stop;
|
||||
link->iter_sessions = iwp::link_iter_sessions;
|
||||
link->try_establish = iwp::link_try_establish;
|
||||
link->acquire_session_for_addr = iwp::link_session_for_addr;
|
||||
link->mark_session_active = iwp::link_mark_session_active;
|
||||
link->free_impl = iwp::link_free;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
#include <llarp/iwp.h>
|
||||
#include <llarp/ev.h>
|
||||
|
||||
struct iwp_link
|
||||
{
|
||||
struct llarp_alloc * alloc;
|
||||
struct llarp_ev_loop *netloop;
|
||||
const char * keyfile;
|
||||
struct llarp_udp_io udp;
|
||||
};
|
||||
|
||||
|
||||
static const char * iwp_link_name()
|
||||
{
|
||||
return "IWP";
|
||||
}
|
||||
|
||||
static bool iwp_link_configure(struct llarp_link * l, struct llarp_ev_loop * netloop, const char * ifname, int af, uint16_t port)
|
||||
{
|
||||
struct iwp_link * link = l->impl;
|
||||
link->udp.user = link;
|
||||
link->netloop = netloop;
|
||||
return llarp_ev_add_udp(link->netloop, &link->udp) != -1;
|
||||
}
|
||||
|
||||
static struct iwp_link * iwp_link_alloc(struct iwp_configure_args * args)
|
||||
{
|
||||
struct iwp_link * l = args->mem->alloc(args->mem, sizeof(struct iwp_link), 16);
|
||||
l->alloc = args->mem;
|
||||
l->keyfile = args->keyfile;
|
||||
return l;
|
||||
}
|
||||
|
||||
void iwp_link_init(struct llarp_link * link, struct iwp_configure_args args,
|
||||
struct llarp_msg_muxer * muxer)
|
||||
{
|
||||
link->impl = iwp_link_alloc(&args);
|
||||
link->name = iwp_link_name;
|
||||
link->configure = iwp_link_configure;
|
||||
}
|
212
llarp/iwp_link.cpp
Normal file
212
llarp/iwp_link.cpp
Normal file
|
@ -0,0 +1,212 @@
|
|||
#include <llarp/iwp.h>
|
||||
#include <llarp/net.h>
|
||||
|
||||
|
||||
#include <map>
|
||||
#include "crypto.hpp"
|
||||
#include "fs.hpp"
|
||||
#include "net.hpp"
|
||||
|
||||
namespace iwp
|
||||
{
|
||||
|
||||
struct session
|
||||
{
|
||||
};
|
||||
|
||||
struct server
|
||||
{
|
||||
struct llarp_alloc * mem;
|
||||
struct llarp_logic * logic;
|
||||
struct llarp_ev_loop * netloop;
|
||||
struct llarp_msg_muxer * muxer;
|
||||
struct llarp_udp_io udp;
|
||||
char keyfile[255];
|
||||
uint32_t timeout_job_id;
|
||||
std::map<llarp::Addr, llarp_link_session> sessions;
|
||||
|
||||
void inbound_session(llarp::Addr & src)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void cleanup_dead()
|
||||
{
|
||||
// todo: implement
|
||||
}
|
||||
|
||||
bool ensure_privkey()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void handle_cleanup_timer(void * l, uint64_t orig, uint64_t left)
|
||||
{
|
||||
server * link = static_cast<server *>(l);
|
||||
link->timeout_job_id = 0;
|
||||
if(!left)
|
||||
{
|
||||
link->cleanup_dead();
|
||||
//TODO: exponential backoff for cleanup timer ?
|
||||
link->issue_cleanup_timer(orig);
|
||||
}
|
||||
}
|
||||
|
||||
static void handle_recvfrom(struct llarp_udp_io * udp, const struct sockaddr *saddr, void * buf, ssize_t sz)
|
||||
{
|
||||
server * link = static_cast<server *>(udp->user);
|
||||
llarp::Addr src = *saddr;
|
||||
auto itr = link->sessions.find(src);
|
||||
if (itr == link->sessions.end())
|
||||
{
|
||||
link->inbound_session(src);
|
||||
}
|
||||
}
|
||||
|
||||
void cancel_timer()
|
||||
{
|
||||
if(timeout_job_id)
|
||||
{
|
||||
llarp_logic_cancel_call(logic, timeout_job_id);
|
||||
}
|
||||
timeout_job_id = 0;
|
||||
}
|
||||
|
||||
void issue_cleanup_timer(uint64_t timeout)
|
||||
{
|
||||
llarp_timeout_job job = {
|
||||
.timeout = timeout,
|
||||
.user = this,
|
||||
.handler = &server::handle_cleanup_timer
|
||||
};
|
||||
timeout_job_id = llarp_logic_call_later(logic, job);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
server * link_alloc(struct llarp_alloc * mem, struct llarp_msg_muxer * muxer, const char * keyfile)
|
||||
{
|
||||
void * ptr = mem->alloc(mem, sizeof(struct server), 8);
|
||||
if(ptr)
|
||||
{
|
||||
server * link = new (ptr) server;
|
||||
link->mem = mem;
|
||||
link->muxer = muxer;
|
||||
strncpy(link->keyfile, keyfile, sizeof(link->keyfile));
|
||||
return link;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
const char * link_name()
|
||||
{
|
||||
return "dtls";
|
||||
}
|
||||
|
||||
|
||||
bool link_configure(struct llarp_link * l, struct llarp_ev_loop * netloop, const char * ifname, int af, uint16_t port)
|
||||
{
|
||||
server * link = static_cast<server*>(l->impl);
|
||||
|
||||
if(!link->ensure_privkey())
|
||||
return false;
|
||||
|
||||
// bind
|
||||
|
||||
link->udp.addr.sa_family = af;
|
||||
if(!llarp_getifaddr(ifname, af, &link->udp.addr))
|
||||
return false;
|
||||
switch(af)
|
||||
{
|
||||
case AF_INET:
|
||||
((sockaddr_in *)&link->udp.addr)->sin_port = htons(port);
|
||||
break;
|
||||
case AF_INET6:
|
||||
((sockaddr_in6 *)(&link->udp.addr))->sin6_port = htons(port);
|
||||
break;
|
||||
// TODO: AF_PACKET
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
link->netloop = netloop;
|
||||
link->udp.recvfrom = &server::handle_recvfrom;
|
||||
link->udp.user = link;
|
||||
return llarp_ev_add_udp(link->netloop, &link->udp) != -1;
|
||||
}
|
||||
|
||||
bool link_start(struct llarp_link * l, struct llarp_logic * logic)
|
||||
{
|
||||
server * link = static_cast<server*>(l->impl);
|
||||
link->timeout_job_id = 0;
|
||||
link->logic = logic;
|
||||
// start cleanup timer
|
||||
link->issue_cleanup_timer(1000);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool link_stop(struct llarp_link *l)
|
||||
{
|
||||
server * link = static_cast<server*>(l->impl);
|
||||
link->cancel_timer();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void link_iter_sessions(struct llarp_link * l, struct llarp_link_session_iter * iter)
|
||||
{
|
||||
server * link = static_cast<server*>(l->impl);
|
||||
iter->link = l;
|
||||
for (auto & item : link->sessions)
|
||||
if(!iter->visit(iter, &item.second)) return;
|
||||
}
|
||||
|
||||
|
||||
void link_try_establish(struct llarp_link * link, struct llarp_link_establish_job job, struct llarp_link_session_listener l)
|
||||
{
|
||||
}
|
||||
|
||||
void link_mark_session_active(struct llarp_link * link, struct llarp_link_session * s)
|
||||
{
|
||||
}
|
||||
|
||||
struct llarp_link_session * link_session_for_addr(struct llarp_link * l, const struct sockaddr * saddr)
|
||||
{
|
||||
if(saddr)
|
||||
{
|
||||
server * link = static_cast<server*>(l->impl);
|
||||
for(auto & session : link->sessions)
|
||||
{
|
||||
if(session.second.addr == *saddr) return &link->sessions[session.first];
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void link_free(struct llarp_link *l)
|
||||
{
|
||||
server * link = static_cast<server*>(l->impl);
|
||||
struct llarp_alloc * mem = link->mem;
|
||||
link->~server();
|
||||
mem->free(mem, link);
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
||||
void iwp_link_init(struct llarp_link * link, struct llarp_iwp_args args, struct llarp_msg_muxer * muxer)
|
||||
{
|
||||
link->impl = iwp::link_alloc(args.mem, muxer, args.keyfile);
|
||||
link->name = iwp::link_name;
|
||||
link->configure = iwp::link_configure;
|
||||
link->start_link = iwp::link_start;
|
||||
link->stop_link = iwp::link_stop;
|
||||
link->iter_sessions = iwp::link_iter_sessions;
|
||||
link->try_establish = iwp::link_try_establish;
|
||||
link->acquire_session_for_addr = iwp::link_session_for_addr;
|
||||
link->mark_session_active = iwp::link_mark_session_active;
|
||||
link->free_impl = iwp::link_free;
|
||||
}
|
||||
|
||||
}
|
|
@ -112,23 +112,12 @@ void router_iter_config(llarp_config_iterator *iter, const char *section,
|
|||
}
|
||||
|
||||
struct llarp_link *link;
|
||||
if (StrEq(section, "dtls-links"))
|
||||
{
|
||||
link = llarp::Alloc<llarp_link>(self->mem);
|
||||
llarp::Zero(link, sizeof(*link));
|
||||
llarp_dtls_args args = {
|
||||
.mem = self->mem,
|
||||
.keyfile=self->transport_keyfile,
|
||||
.certfile=self->transport_certfile,
|
||||
};
|
||||
dtls_link_init(link, args, &self->muxer);
|
||||
}
|
||||
else if (StrEq(section, "iwp-links"))
|
||||
if (StrEq(section, "iwp-links"))
|
||||
{
|
||||
link = llarp::Alloc<llarp_link>(self->mem);
|
||||
llarp::Zero(link, sizeof(*link));
|
||||
|
||||
iwp_configure_args args = {
|
||||
llarp_iwp_args args = {
|
||||
.mem = self->mem,
|
||||
.crypto = &self->crypto,
|
||||
.keyfile=self->transport_keyfile,
|
||||
|
|
Loading…
Reference in a new issue