5b555ee5aa
- removes all the llarp_ev_* functions, replacing with methods/classes/functions in the llarp namespace. - banish ev/ev.h to the void - Passes various things by const lvalue ref, especially shared_ptr's that don't need to be copied (to avoid an atomic refcount increment/decrement). - Add a llarp::UDPHandle abstract class for UDP handling - Removes the UDP tick handler; code that needs tick can just do a separate handler on the event loop outside the UDP socket. - Adds an "OwnedBuffer" which owns its own memory but is implicitly convertible to a llarp_buffer_t. This is mostly needed to take over ownership of buffers from uvw without copying them as, currently, uvw does its own allocation (pending some open upstream issues/PRs). - Logic: - add `make_caller`/`call_forever`/`call_every` utility functions to abstract Call wrapping and dependent timed tasks. - Add inLogicThread() so that code can tell its inside the logic thread (typically for debugging assertions). - get rid of janky integer returns and dealing with cancellations on call_later: the other methods added here and the event loop code remove the need for them. - Event loop: - redo everything with uvw instead of libuv - rename EventLoopWakeup::Wakeup to EventLoopWakeup::Trigger to better reflect what it does. - add EventLoopRepeater for repeated events, and replace the code that reschedules itself every time it is called with a repeater. - Split up `EventLoop::run()` into a non-virtual base method and abstract `run_loop()` methods; the base method does a couple extra setup/teardown things that don't need to be in the derived class. - udp_listen is replaced with ev->udp(...) which returns a new UDPHandle object rather that needing gross C-style-but-not-actually-C-compatible structs. - Remove unused register_poll_fd_(un)readable - Use shared_ptr for EventLoopWakeup rather than returning a raw pointer; uvw lets us not have to worry about having the event loop class maintain ownership of it. - Add factory EventLoop::create() function to create a default (uvw-based) event loop (previously this was one of the llarp_ev_blahblah unnamespaced functions). - ev_libuv: this is mostly rewritten; all of the glue code/structs, in particular, are gone as they are no longer needed with uvw. - DNS: - Rename DnsHandler to DnsInterceptor to better describe what it does (this is the code that intercepts all DNS to the tun IP range for Android). - endpoint: - remove unused "isolated network" code - remove distinct (but actually always the same) variables for router/endpoint logic objects - llarp_buffer_t - make constructors type-safe against being called with points to non-size-1 values - tun packet reading: - read all available packets off the device/file descriptor; previously we were reading one packet at a time then returning to the event loop to poll again. - ReadNextPacket() now returns a 0-size packet if the read would block (so that we can implement the previous point). - ReadNextPacket() now throws on I/O error - Miscellaneous code cleanups/simplifications |
3 years ago | |
---|---|---|
.github | 5 years ago | |
android | 3 years ago | |
cmake | 3 years ago | |
contrib | 3 years ago | |
crypto | 4 years ago | |
daemon | 3 years ago | |
debian | 4 years ago | |
docs | 4 years ago | |
external | 3 years ago | |
include | 3 years ago | |
jni | 3 years ago | |
llarp | 3 years ago | |
pybind | 3 years ago | |
test | 3 years ago | |
win32-setup | 3 years ago | |
.clang-format | 4 years ago | |
.clang-tidy | 3 years ago | |
.dir-locals.el | 6 years ago | |
.dockerignore | 5 years ago | |
.drone.jsonnet | 3 years ago | |
.gitattributes | 4 years ago | |
.gitignore | 3 years ago | |
.gitmodules | 3 years ago | |
CMakeLists.txt | 3 years ago | |
CMakeSettings.json | 5 years ago | |
CONTRIBUTING.md | 5 years ago | |
CONTRIBUTING_es.md | 5 years ago | |
CROSSCOMPILE.md | 4 years ago | |
LICENSE.txt | 4 years ago | |
lokinet-bootstrap | 5 years ago | |
lokinet-docker.ini | 5 years ago | |
module.modulemap | 6 years ago | |
readme.md | 3 years ago | |
readme_es.md | 3 years ago | |
readme_ru.md | 3 years ago | |
release.md | 5 years ago | |
release_es.md | 5 years ago | |
release_ru.md | 4 years ago | |
run-lokinet.bat | 6 years ago | |
testnet_readme.md | 5 years ago |
readme.md
Lokinet
Lokinet is the reference implementation of LLARP (low latency anonymous routing protocol), a layer 3 onion routing protocol.
You can learn more about the high level design of LLARP here
And you can read the LLARP protocol specification here
You can view documentation on how to get started here .
Building
Build requirements:
- Git
- CMake
- C++ 17 capable C++ compiler
- libuv >= 1.27.0
- libsodium >= 1.0.18
- libunbound
- libzmq
- sqlite3
Linux
You do not have to build from source if you are on debian or ubuntu as we have apt repositories with pre-built lokinet packages on deb.oxen.io
.
You can install these using:
$ sudo curl -so /etc/apt/trusted.gpg.d/oxen.gpg https://deb.oxen.io/pub.gpg
$ echo "deb https://deb.oxen.io $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/oxen.list
$ sudo apt update
$ sudo apt install lokinet
if you want to build a dev build you can do the following:
$ sudo apt install build-essential cmake git libcap-dev curl libuv1-dev libsodium-dev pkg-config
$ git clone --recursive https://github.com/loki-project/loki-network
$ cd loki-network
$ mkdir build
$ cd build
$ cmake .. -DBUILD_STATIC_DEPS=ON -DBUILD_SHARED_LIBS=OFF -DSTATIC_LINK=ON
$ make -j$(nproc)
install:
$ sudo make install
macOS
You can get the latest stable macos relase from https://lokinet.org/ or check the releases page on github.
alternatively you can build from source, make sure you have cmake, libuv and xcode command line tools installed:
$ git clone --recursive https://github.com/loki-project/loki-network
$ cd loki-network
$ mkdir build
$ cd build
$ cmake .. -DBUILD_STATIC_DEPS=ON -DBUILD_SHARED_LIBS=OFF -DSTATIC_LINK=ON
$ make -j$(sysctl -n hw.ncpu)
install:
$ sudo make install
Windows
You can get the latest stable windows release from https://lokinet.org/ or check the releases page on github.
windows builds are cross compiled from debian/ubuntu linux
additional build requirements:
- nsis
- cpack
setup:
$ sudo apt install build-essential cmake git pkg-config mingw-w64 nsis ninja-build
building:
$ git clone --recursive https://github.com/loki-project/loki-network
$ cd loki-network
$ ./contrib/windows.sh
Solaris 2.10+
NOTE: Oracle Solaris users need to download/compile the TAP driver from http://www.whiteboard.ne.jp/~admin2/tuntap/
The generated binaries may work on Solaris 2.10 or earlier, you're on your own. (Recommended: -static-libstdc++ -static-libgcc
, and the TAP driver if not already installed on the target system.)
Building on a v2.10 or earlier system is unsupported, and may not even work; recent GCC releases have progressively dropped support for older system releases.
build:
$ sudo pkg install build-essential gcc8 wget tuntap cmake (optional: ninja ccache - from omnios extra) (OmniOS CE)
$ sudo pkg install base-developer-utilities developer-gnu developer-studio-utilities gcc-7 wget cmake (Oracle Solaris, see note)
$ sudo pkg install build-essential wget gcc-8 documentation/tuntap header-tun tun (optional: ninja ccache) (all other SunOS)
$ git clone --recursive https://github.com/loki-project/loki-network
$ cd loki-network
$ mkdir build
$ cd build
$ cmake ..
$ make -j$(nproc)
install:
$ sudo make install
FreeBSD
build:
$ pkg install cmake git pkgconf
$ git clone --recursive https://github.com/loki-project/loki-network
$ cd loki-network
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DSTATIC_LINK=ON -DBUILD_SHARED_DEPS=ON ..
$ make
install (root):
# make install
Usage
Debian / Ubuntu packages
When running from debian package the following steps are not needed as it is already ready to use.
Create default config
to configure as client:
$ lokinet -g
$ lokinet-bootstrap
to configure as relay:
$ lokinet -r -g
$ lokinet-bootstrap
Running on Linux
DO NOT RUN AS ROOT, run as normal user. This requires the binary to have the proper setcaps set by make install
on the binary.
to run, after you create default config:
$ lokinet
Running on macOS/UNIX/BSD
YOU HAVE TO RUN AS ROOT, run using sudo. Elevated privileges are needed to create the virtual tunnel interface.
The macOS installer places the normal binaries (lokinet
and lokinet-bootstrap
) in /usr/local/bin
which should be in your path, so you can easily use the binaries from your terminal. The installer also nukes your previous config and keys and sets up a fresh config and downloads the latest bootstrap seed.
to run, after you create default config:
$ sudo lokinet
Running on Windows
DO NOT RUN AS ELEVATED USER, run as normal user.