mirror of
https://github.com/oxen-io/lokinet
synced 2023-12-14 06:53:00 +01:00
more
This commit is contained in:
parent
861c857217
commit
a449dffc09
10 changed files with 151 additions and 114 deletions
|
@ -19,9 +19,6 @@ struct llarp_ai {
|
|||
uint16_t port;
|
||||
};
|
||||
|
||||
/** allocator for address info */
|
||||
extern struct llarp_alloc *llarp_ai_alloc;
|
||||
|
||||
bool llarp_ai_bencode(struct llarp_ai *ai, llarp_buffer_t *buff);
|
||||
bool llarp_ai_bdecode(struct llarp_ai *ai, llarp_buffer_t buff);
|
||||
|
||||
|
|
|
@ -8,8 +8,8 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
struct llarp_xi {
|
||||
in6_addr address;
|
||||
in6_addr netmask;
|
||||
struct in6_addr address;
|
||||
struct in6_addr netmask;
|
||||
};
|
||||
|
||||
bool llarp_xi_bdecode(struct llarp_xi *xi, llarp_buffer_t *buf);
|
||||
|
|
22
include/llarp/iwp.h
Normal file
22
include/llarp/iwp.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
#ifndef LLARP_IWP_H_
|
||||
#define LLARP_IWP_H_
|
||||
#include <llarp/link.h>
|
||||
#include <llarp/msg_handler.h>
|
||||
#include <llarp/router_identity.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct iwp_configure_args
|
||||
{
|
||||
llarp_seckey_t seckey;
|
||||
};
|
||||
|
||||
void iwp_link_init(struct llarp_link * link, struct iwp_configure_args args, struct llarp_msg_muxer * muxer);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
|
@ -4,6 +4,7 @@
|
|||
#include <llarp/mem.h>
|
||||
#include <llarp/msg_handler.h>
|
||||
#include <llarp/obmd.h>
|
||||
#include <llarp/ev.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
@ -12,31 +13,24 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* wire layer transport interface
|
||||
*/
|
||||
struct llarp_link;
|
||||
|
||||
struct llarp_link *llarp_link_alloc(struct llarp_msg_muxer *muxer);
|
||||
void llarp_link_free(struct llarp_link **link);
|
||||
|
||||
bool llarp_link_configure_addr(struct llarp_link *link, const char *ifname,
|
||||
int af, uint16_t port);
|
||||
|
||||
/** get link listener for events */
|
||||
struct llarp_udp_listener *llarp_link_udp_listener(struct llarp_link *link);
|
||||
|
||||
void llarp_link_start(struct llarp_link *link);
|
||||
|
||||
struct llarp_link_queue *llarp_link_frame_queue(struct llarp_link *link);
|
||||
|
||||
void llarp_link_stop(struct llarp_link *link);
|
||||
|
||||
/**
|
||||
* wire layer transport session for point to point communication between us and another
|
||||
*/
|
||||
struct llarp_link_session;
|
||||
|
||||
struct llarp_link_session_listener {
|
||||
void *user;
|
||||
/** set by llarp_try_establish_session */
|
||||
/** set by try_establish */
|
||||
struct llarp_link *link;
|
||||
/** set by llarp_try_establish_session */
|
||||
/** set by try_establish */
|
||||
struct llarp_rc *rc;
|
||||
/** callback to handle result */
|
||||
void (*result)(struct llarp_link_session_listener *,
|
||||
struct llarp_link_session *);
|
||||
};
|
||||
|
@ -47,20 +41,34 @@ struct llarp_link_establish_job {
|
|||
uint64_t timeout;
|
||||
};
|
||||
|
||||
void llarp_link_try_establish_session(struct llarp_link *link,
|
||||
struct llarp_link_establish_job *job,
|
||||
struct llarp_link_session_listener *l);
|
||||
|
||||
struct llarp_link_session_iter {
|
||||
void *user;
|
||||
struct llarp_link *link;
|
||||
bool (*visit)(struct llarp_link_session_iter *, struct llarp_link_session *);
|
||||
};
|
||||
|
||||
void llarp_link_iter_sessions(struct llarp_link *l,
|
||||
struct llarp_link_session_iter *i);
|
||||
struct llarp_link
|
||||
{
|
||||
void * impl;
|
||||
int (*configure_addr)(struct llarp_link *, const char *, int, uint16_t);
|
||||
int (*start_link)(struct llarp_link *, struct llarp_ev_loop *);
|
||||
int (*stop_link)(struct llarp_link *);
|
||||
struct llarp_rc * (*get_our_rc)(struct llarp_link *);
|
||||
void (*iter_sessions)(struct llarp_link *, struct llarp_link_session_iter);
|
||||
void (*try_establish)(struct llarp_link *,
|
||||
struct llarp_link_establish_job,
|
||||
struct llarp_link_session_listener);
|
||||
void (*free)(struct llarp_link *);
|
||||
};
|
||||
|
||||
struct llarp_link_session
|
||||
{
|
||||
void * impl;
|
||||
struct llarp_rc * (*get_remote_rc)(struct llarp_link_session *);
|
||||
/** send an entire message, splits up into smaller pieces and does encryption */
|
||||
ssize_t (*sendto)(struct llarp_link_session *, llarp_buffer_t);
|
||||
};
|
||||
|
||||
struct llarp_rc *llarp_link_session_rc(struct llarp_link_session *s);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -11,6 +11,9 @@ extern "C" {
|
|||
// forward declair
|
||||
struct llarp_link;
|
||||
|
||||
/**
|
||||
* link layer outbound message sending muxer
|
||||
*/
|
||||
struct llarp_link_dispatcher;
|
||||
|
||||
struct llarp_link_dispatcher *llarp_init_link_dispatcher();
|
||||
|
|
32
include/llarp/router_identity.h
Normal file
32
include/llarp/router_identity.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
#ifndef LLARP_ROUTER_IDENT_H
|
||||
#define LLARP_ROUTER_IDENT_H
|
||||
#include <llarp/address_info.h>
|
||||
#include <llarp/router_contact.h>
|
||||
#include <llarp/crypto.h>
|
||||
#include <llarp/exit_info.h>
|
||||
#include <stdbool.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* rotuer identity private info
|
||||
*/
|
||||
struct llarp_router_ident
|
||||
{
|
||||
llarp_seckey_t signkey;
|
||||
uint64_t updated;
|
||||
uint16_t version;
|
||||
struct llarp_ai_list * addrs;
|
||||
struct llarp_xi_list * exits;
|
||||
};
|
||||
|
||||
bool llarp_router_ident_bdecode(struct llarp_router_ident *rc, llarp_buffer_t *buf);
|
||||
bool llarp_router_ident_bencode(struct llarp_router_ident *rc, llarp_buffer_t *buf);
|
||||
void llarp_router_ident_free(struct llarp_router_ident **rc);
|
||||
bool llarp_router_ident_gen_rc(struct llarp_router_ident * rc, llarp_buffer_t * buf);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
39
llarp/iwp.cpp
Normal file
39
llarp/iwp.cpp
Normal file
|
@ -0,0 +1,39 @@
|
|||
#include <llarp/iwp.h>
|
||||
#include <cstring>
|
||||
|
||||
namespace iwp
|
||||
{
|
||||
|
||||
struct link_impl
|
||||
{
|
||||
link_impl(llarp_seckey_t k)
|
||||
{
|
||||
memcpy(seckey, k, sizeof(seckey));
|
||||
}
|
||||
|
||||
llarp_seckey_t seckey;
|
||||
|
||||
int configure(const char * ifname, int af, uint16_t port)
|
||||
{
|
||||
// todo: implement
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
static int configure_addr(struct llarp_link * l, const char * ifname, int af, uint16_t port)
|
||||
{
|
||||
link_impl * link = static_cast<link_impl *>(l->impl);
|
||||
return link->configure(ifname, af, port);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
||||
void iwp_link_init(struct llarp_link * link, struct iwp_configure_args args, struct llarp_msg_muxer * muxer)
|
||||
{
|
||||
link->impl = new iwp::link_impl(args.seckey);
|
||||
link->configure_addr = &iwp::configure_addr;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
#include "link.hpp"
|
||||
#include <arpa/inet.h>
|
||||
#include <llarp/time.h>
|
||||
#include <uv.h>
|
||||
#include <cstring>
|
||||
#include "net.hpp"
|
||||
|
||||
bool operator<(const sockaddr_in6 addr0, const sockaddr_in6 addr1) {
|
||||
return memcmp(addr0.sin6_addr.s6_addr, addr1.sin6_addr.s6_addr,
|
||||
sizeof(addr0.sin6_addr)) &&
|
||||
addr0.sin6_port < addr1.sin6_port;
|
||||
}
|
||||
|
||||
namespace llarp {}
|
||||
|
||||
extern "C" {
|
||||
struct llarp_link *llarp_link_alloc() {
|
||||
return new llarp_link;
|
||||
}
|
||||
|
||||
void llarp_link_free(struct llarp_link **l) {
|
||||
if (*l) delete *l;
|
||||
*l = nullptr;
|
||||
}
|
||||
|
||||
struct llarp_udp_listener *llarp_link_udp_listener(struct llarp_link *l) {
|
||||
return &l->listener;
|
||||
}
|
||||
|
||||
bool llarp_link_configure_addr(struct llarp_link *link, const char *ifname,
|
||||
int af, uint16_t port) {
|
||||
af = AF_INET6;
|
||||
link->af = af;
|
||||
if (llarp::net::GetIfAddr(ifname, link->af, (sockaddr *)&link->localaddr)) {
|
||||
link->localaddr.sin6_family = af;
|
||||
link->localaddr.sin6_port = htons(port);
|
||||
link->listener.addr = &link->localaddr;
|
||||
char buff[128] = {0};
|
||||
uv_ip6_name(&link->localaddr, buff, sizeof(buff));
|
||||
printf("link %s configured with address %s\n", ifname, buff);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void llarp_link_stop(struct llarp_link *link) {
|
||||
llarp_ev_close_udp_listener(&link->listener);
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
#ifndef LLARP_LINK_HPP
|
||||
#define LLARP_LINK_HPP
|
||||
#include <llarp/crypto.h>
|
||||
#include <netinet/in.h>
|
||||
#include <cstdint>
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
|
||||
#include <llarp/ev.h>
|
||||
#include <llarp/router_contact.h>
|
||||
#include "mem.hpp"
|
||||
|
||||
struct llarp_link {
|
||||
static void *operator new(size_t sz) {
|
||||
return llarp_g_mem.alloc(sz, llarp::alignment<llarp_link>());
|
||||
}
|
||||
|
||||
static void operator delete(void *ptr) { llarp_g_mem.free(ptr); }
|
||||
|
||||
struct sockaddr_in6 localaddr;
|
||||
int af;
|
||||
llarp_udp_listener listener;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -2,7 +2,7 @@
|
|||
#include <llarp/ibfq.h>
|
||||
#include <llarp/link.h>
|
||||
#include <llarp/router.h>
|
||||
#include "link.hpp"
|
||||
#include <llarp/iwp.h>
|
||||
#include "str.hpp"
|
||||
|
||||
namespace llarp {
|
||||
|
@ -32,8 +32,7 @@ void llarp_router::ForEachLink(std::function<void(llarp_link *)> visitor) {
|
|||
} while (cur);
|
||||
}
|
||||
|
||||
void llarp_router::Close() { ForEachLink(llarp_link_stop); }
|
||||
|
||||
void llarp_router::Close() { ForEachLink([](llarp_link * l) { l->stop_link(l); }); }
|
||||
extern "C" {
|
||||
|
||||
struct llarp_router *llarp_init_router(struct llarp_threadpool *tp) {
|
||||
|
@ -54,7 +53,7 @@ int llarp_configure_router(struct llarp_router *router,
|
|||
|
||||
void llarp_run_router(struct llarp_router *router, struct llarp_ev_loop *loop) {
|
||||
router->ForEachLink([loop](llarp_link *link) {
|
||||
llarp_ev_add_udp_listener(loop, llarp_link_udp_listener(link));
|
||||
link->start_link(link, loop);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -62,7 +61,7 @@ void llarp_stop_router(struct llarp_router *router) { router->Close(); }
|
|||
|
||||
void llarp_free_router(struct llarp_router **router) {
|
||||
if (*router) {
|
||||
(*router)->ForEachLink([](llarp_link *link) { llarp_g_mem.free(link); });
|
||||
(*router)->ForEachLink([](llarp_link *link) { link->free(link); });
|
||||
delete *router;
|
||||
}
|
||||
*router = nullptr;
|
||||
|
@ -76,15 +75,27 @@ void router_iter_config(llarp_config_iterator *iter, const char *section,
|
|||
llarp_router *self = static_cast<llarp_router *>(iter->user);
|
||||
if (StrEq(section, "links")) {
|
||||
if (StrEq(val, "ip")) {
|
||||
struct llarp_link *link = llarp_link_alloc(&self->muxer);
|
||||
if (llarp_link_configure_addr(link, key, AF_INET6, 7000))
|
||||
struct llarp_link *link = llarp::Alloc<llarp_link>();
|
||||
iwp_configure_args args;
|
||||
self->crypto.keygen(&args.seckey);
|
||||
iwp_link_init(link, args, &self->muxer);
|
||||
if (link->configure_addr(link, key, AF_INET6, 7000))
|
||||
self->AddLink(link);
|
||||
else {
|
||||
llarp_link_free(&link);
|
||||
link->free(link);
|
||||
printf("failed to configure %s link for %s\n", val, key);
|
||||
}
|
||||
} else if (StrEq(val, "eth")) {
|
||||
/** todo: ethernet link */
|
||||
struct llarp_link *link = llarp::Alloc<llarp_link>();
|
||||
iwp_configure_args args;
|
||||
self->crypto.keygen(&args.seckey);
|
||||
iwp_link_init(link, args, &self->muxer);
|
||||
if (link->configure_addr(link, key, AF_PACKET, 0xD1CE))
|
||||
self->AddLink(link);
|
||||
else {
|
||||
link->free(link);
|
||||
printf("failed to configure %s link for %s\n", val, key);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue