lokinet/llarp/vpn/android.hpp
Thomas Winget 7caa87862e standardize include format and pragma once
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.
2021-03-09 19:01:41 -05:00

79 lines
1.6 KiB
C++

#pragma once
#include <stdio.h>
#include <unistd.h>
#include <llarp/ev/vpn.hpp>
#include "common.hpp"
#include <llarp.hpp>
namespace llarp::vpn
{
class AndroidInterface : public NetworkInterface
{
const int m_fd;
const InterfaceInfo m_Info; // likely 100% ignored on android, at least for now
public:
AndroidInterface(InterfaceInfo info, int fd) : m_fd(fd), m_Info(info)
{
if (m_fd == -1)
throw std::runtime_error(
"Error opening AndroidVPN layer FD: " + std::string{strerror(errno)});
}
virtual ~AndroidInterface()
{
if (m_fd != -1)
::close(m_fd);
}
int
PollFD() const override
{
return m_fd;
}
net::IPPacket
ReadNextPacket() override
{
net::IPPacket pkt{};
const auto sz = read(m_fd, pkt.buf, sizeof(pkt.buf));
if (sz >= 0)
pkt.sz = std::min(sz, ssize_t{sizeof(pkt.buf)});
return pkt;
}
bool
WritePacket(net::IPPacket pkt) override
{
const auto sz = write(m_fd, pkt.buf, pkt.sz);
if (sz <= 0)
return false;
return sz == static_cast<ssize_t>(pkt.sz);
}
std::string
IfName() const override
{
return m_Info.ifname;
}
};
class AndroidPlatform : public Platform
{
const int fd;
public:
AndroidPlatform(llarp::Context* ctx) : fd(ctx->androidFD)
{}
std::shared_ptr<NetworkInterface>
ObtainInterface(InterfaceInfo info) override
{
return std::make_shared<AndroidInterface>(std::move(info), fd);
}
};
} // namespace llarp::vpn