mirror of
https://github.com/oxen-io/lokinet.git
synced 2024-11-11 07:10:36 +00:00
7caa87862e
All #ifndef guards on headers have been removed, I think, in favor of #pragma once Headers are now included as `#include "filename"` if the included file resides in the same directory as the file including it, or any subdirectory therein. Otherwise they are included as `#include <project/top/dir/relative/path/filename>` The above does not include system/os headers.
86 lines
2.5 KiB
C++
86 lines
2.5 KiB
C++
#include "network_loki_lokinet_LokinetVPN.h"
|
|
#include "lokinet_jni_vpnio.hpp"
|
|
#include "lokinet_jni_common.hpp"
|
|
#include <llarp/net/ip.hpp>
|
|
#include <llarp/net/ip_packet.hpp>
|
|
#include <string_view>
|
|
|
|
extern "C"
|
|
{
|
|
JNIEXPORT jint JNICALL
|
|
Java_network_loki_lokinet_LokinetVPN_PacketSize(JNIEnv*, jclass)
|
|
{
|
|
return llarp::net::IPPacket::MaxSize;
|
|
}
|
|
|
|
JNIEXPORT jobject JNICALL
|
|
Java_network_loki_lokinet_LokinetVPN_Alloc(JNIEnv* env, jclass)
|
|
{
|
|
lokinet_jni_vpnio* vpn = new lokinet_jni_vpnio();
|
|
return env->NewDirectByteBuffer(vpn, sizeof(lokinet_jni_vpnio));
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_network_loki_lokinet_LokinetVPN_Free(JNIEnv* env, jclass, jobject buf)
|
|
{
|
|
lokinet_jni_vpnio* vpn = FromBuffer<lokinet_jni_vpnio>(env, buf);
|
|
if (vpn == nullptr)
|
|
return;
|
|
delete vpn;
|
|
}
|
|
JNIEXPORT void JNICALL
|
|
Java_network_loki_lokinet_LokinetVPN_Stop(JNIEnv* env, jobject self)
|
|
{
|
|
lokinet_jni_vpnio* vpn = GetImpl<lokinet_jni_vpnio>(env, self);
|
|
if (vpn)
|
|
{
|
|
vpn->Close();
|
|
}
|
|
}
|
|
|
|
JNIEXPORT jint JNICALL
|
|
Java_network_loki_lokinet_LokinetVPN_ReadPkt(JNIEnv* env, jobject self, jobject pkt)
|
|
{
|
|
lokinet_jni_vpnio* vpn = GetImpl<lokinet_jni_vpnio>(env, self);
|
|
if (vpn == nullptr)
|
|
return -1;
|
|
void* pktbuf = env->GetDirectBufferAddress(pkt);
|
|
auto pktlen = env->GetDirectBufferCapacity(pkt);
|
|
if (pktbuf == nullptr)
|
|
return -1;
|
|
return vpn->ReadPacket(pktbuf, pktlen);
|
|
}
|
|
|
|
JNIEXPORT jboolean JNICALL
|
|
Java_network_loki_lokinet_LokinetVPN_WritePkt(JNIEnv* env, jobject self, jobject pkt)
|
|
{
|
|
lokinet_jni_vpnio* vpn = GetImpl<lokinet_jni_vpnio>(env, self);
|
|
if (vpn == nullptr)
|
|
return false;
|
|
void* pktbuf = env->GetDirectBufferAddress(pkt);
|
|
auto pktlen = env->GetDirectBufferCapacity(pkt);
|
|
if (pktbuf == nullptr)
|
|
return false;
|
|
return vpn->WritePacket(pktbuf, pktlen);
|
|
}
|
|
|
|
JNIEXPORT void JNICALL
|
|
Java_network_loki_lokinet_LokinetVPN_SetInfo(JNIEnv* env, jobject self, jobject info)
|
|
{
|
|
lokinet_jni_vpnio* vpn = GetImpl<lokinet_jni_vpnio>(env, self);
|
|
if (vpn == nullptr)
|
|
return;
|
|
VisitObjectMemberStringAsStringView<bool>(
|
|
env, info, "ifaddr", [vpn](std::string_view val) -> bool {
|
|
vpn->SetIfAddr(val);
|
|
return true;
|
|
});
|
|
VisitObjectMemberStringAsStringView<bool>(
|
|
env, info, "ifname", [vpn](std::string_view val) -> bool {
|
|
vpn->SetIfName(val);
|
|
return true;
|
|
});
|
|
vpn->info.netmask = GetObjectMemberAsInt<uint8_t>(env, info, "netmask");
|
|
}
|
|
}
|