2019-10-08 14:52:01 +00:00
|
|
|
#include "network_loki_lokinet_LokinetVPN.h"
|
|
|
|
#include "lokinet_jni_vpnio.hpp"
|
|
|
|
#include "lokinet_jni_common.hpp"
|
|
|
|
#include <net/ip.hpp>
|
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
2019-10-09 12:40:40 +00:00
|
|
|
lokinet_jni_vpnio *vpn = GetImpl< lokinet_jni_vpnio >(env, self);
|
2019-10-08 14:52:01 +00:00
|
|
|
if(vpn)
|
|
|
|
{
|
|
|
|
vpn->Close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
JNIEXPORT jint JNICALL
|
|
|
|
Java_network_loki_lokinet_LokinetVPN_ReadPkt(JNIEnv *env, jobject self,
|
|
|
|
jobject pkt)
|
|
|
|
{
|
2019-10-09 12:40:40 +00:00
|
|
|
lokinet_jni_vpnio *vpn = GetImpl< lokinet_jni_vpnio >(env, self);
|
2019-10-08 14:52:01 +00:00
|
|
|
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)
|
|
|
|
{
|
2019-10-09 12:40:40 +00:00
|
|
|
lokinet_jni_vpnio *vpn = GetImpl< lokinet_jni_vpnio >(env, self);
|
2019-10-08 14:52:01 +00:00
|
|
|
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)
|
|
|
|
{
|
2019-10-09 12:40:40 +00:00
|
|
|
lokinet_jni_vpnio *vpn = GetImpl< lokinet_jni_vpnio >(env, self);
|
2019-10-08 14:52:01 +00:00
|
|
|
if(vpn == nullptr)
|
|
|
|
return;
|
|
|
|
VisitObjectMemberStringAsStringView< bool >(
|
|
|
|
env, info, "ifaddr", [vpn](llarp::string_view val) -> bool {
|
|
|
|
vpn->SetIfAddr(val);
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
VisitObjectMemberStringAsStringView< bool >(
|
|
|
|
env, info, "ifname", [vpn](llarp::string_view val) -> bool {
|
|
|
|
vpn->SetIfName(val);
|
|
|
|
return true;
|
|
|
|
});
|
2019-10-09 12:40:40 +00:00
|
|
|
vpn->info.netmask = GetObjectMemberAsInt< uint8_t >(env, info, "netmask");
|
2019-10-08 14:52:01 +00:00
|
|
|
}
|
|
|
|
}
|