1
1
Fork 0
mirror of https://github.com/oxen-io/lokinet synced 2023-12-14 06:53:00 +01:00
This commit is contained in:
Jeff Becker 2018-04-04 09:54:37 -04:00
parent 861c857217
commit a449dffc09
No known key found for this signature in database
GPG key ID: F357B3B42F6F9B05
10 changed files with 151 additions and 114 deletions

View file

@ -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);

View file

@ -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
View 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

View file

@ -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>
@ -11,32 +12,25 @@
#ifdef __cplusplus
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,21 +41,35 @@ 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_rc *llarp_link_session_rc(struct llarp_link_session *s);
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);
};
#ifdef __cplusplus
}
#endif

View file

@ -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();

View 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
View 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;
}
}

View file

@ -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);
}
}

View file

@ -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

View file

@ -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);
}
}
}
}