62 lines
1.8 KiB
C++
62 lines
1.8 KiB
C++
|
|
extern "C" {
|
|
#include <netinet/ip.h>
|
|
#include <arpa/inet.h>
|
|
}
|
|
|
|
#include <expected>
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <format>
|
|
|
|
|
|
#include <interface.hpp>
|
|
#include <tunclient.hpp>
|
|
|
|
|
|
std::expected<void, std::string> TClient::Create(const std::string name, const std::string addr, const int prefix) {
|
|
auto createRes = iface.Create(name);
|
|
if (!createRes) {
|
|
return std::unexpected(createRes.error());
|
|
}
|
|
auto setaddrRes = iface.SetIP4Address(addr);
|
|
if (!setaddrRes) {
|
|
return std::unexpected(setaddrRes.error());
|
|
}
|
|
auto setprefixRes = iface.SetIP4Netmask(24);
|
|
if (!setprefixRes) {
|
|
return std::unexpected(setprefixRes.error());
|
|
}
|
|
auto setmtuRes = iface.SetMTU(1240);
|
|
if (!setmtuRes) {
|
|
return std::unexpected(setmtuRes.error());
|
|
}
|
|
auto upRes = iface.Up();
|
|
if (!upRes) {
|
|
return std::unexpected(upRes.error());
|
|
}
|
|
return {};
|
|
}
|
|
|
|
std::expected<void, std::string> TClient::Run() {
|
|
while (true) {
|
|
auto readRes = iface.Read();
|
|
if (!readRes) {
|
|
std::cerr << std::format("Error: {}\n", readRes.error());
|
|
}
|
|
auto value = readRes.value();
|
|
std::cerr << std::format("Packet size: {}\n", value.size());
|
|
struct iphdr* iphdr = (struct iphdr*)(value.data());
|
|
|
|
struct in_addr src, dest;
|
|
src.s_addr = iphdr->saddr;
|
|
dest.s_addr = iphdr->daddr;
|
|
|
|
std::cout << "Source IP: " << inet_ntoa(src) << std::endl;
|
|
std::cout << "Dest IP: " << inet_ntoa(dest) << std::endl;
|
|
std::cout << "Protocol: " << (int)iphdr->protocol << std::endl;
|
|
|
|
}
|
|
return {};
|
|
}
|