--- nono/host/netdriver_tap.cpp 2026/04/29 17:04:54 1.1.1.5 +++ nono/host/netdriver_tap.cpp 2026/04/29 17:05:11 1.1.1.6 @@ -4,10 +4,14 @@ // Licensed under nono-license.txt // +// +// ホストネットワークの tap ドライバ +// + #include "netdriver_tap.h" #include "autofd.h" +#include "hostnet.h" #include -#include #include #include #if defined(__linux__) @@ -35,9 +39,8 @@ // /dev/tapN をオープンする方式も使える。 // コンストラクタ -NetDriverTap::NetDriverTap(EthernetDevice *parent_, int loglevel_, - const std::string& devpath_) - : inherited("Tap", parent_, loglevel_) +NetDriverTap::NetDriverTap(HostDevice *hostdev_, const std::string& devpath_) + : inherited(hostdev_, "Tap") { devpath = devpath_; if (devpath.empty()) { @@ -51,7 +54,7 @@ NetDriverTap::~NetDriverTap() Close(); } -// ドライバ初期化 & オープン +// ドライバ初期化 bool NetDriverTap::InitDriver() { @@ -131,6 +134,11 @@ NetDriverTap::InitDriver() return false; } + if (hostdev->AddOuter(fd) < 0) { + putmsg(0, "AddOuter(fd=%d): %s", (int)fd, strerror(errno)); + return false; + } + return true; } @@ -177,7 +185,7 @@ NetDriverTap::OpenLinux() " ** ex) sudo setcap cap_net_admin=ep path/to/%s\n", getprogname()); } - CloseFd(); + fd.Close(); return false; } @@ -276,7 +284,7 @@ NetDriverTap::OpenCloning() errmsg = string_format("%s: %s: %s", devpath.c_str(), "TAPGIFNAME", strerror(errno)); putmsg(1, "%s: %s", __func__, errmsg.c_str()); - CloseFd(); + fd.Close(); return false; } @@ -291,23 +299,16 @@ NetDriverTap::OpenCloning() #endif } -// fd のクローズ -void -NetDriverTap::CloseFd() -{ - close(fd); - fd = -1; -} - // クローズ // (private) void NetDriverTap::Close() { - if (IsOpen()) { + if (fd.Valid()) { Run_ifdown(); - CloseFd(); + hostdev->DelOuter(fd); + fd.Close(); } } @@ -320,40 +321,33 @@ NetDriverTap::MonitorUpdateMD(TextScreen } // パケットを送信する -bool -NetDriverTap::SendPacket(const std::vector& data) +void +NetDriverTap::Write(const void *buf, int buflen) { - int n; - - assert(IsOpen()); - - putlog(2, "SendPacket %zd bytes", data.size()); - tx_pkts++; - tx_bytes += data.size(); - - n = write(fd, data.data(), data.size()); - if (n == -1) { - warn("SendPacket: write failed: fd=%d datalen=%zu", - fd, data.size()); - return false; - } + ssize_t n; - if (n < (int)data.size()) { - return false; + n = write(fd, buf, buflen); + if (n < 0) { + putmsg(0, "write: %s", strerror(errno)); + return; + } + if (n < buflen) { + putmsg(0, "write: short"); + return; } - return true; } // パケットを受信する -ssize_t -NetDriverTap::RecvPacket() +int +NetDriverTap::Read(NetPacket *p) { - uint8 buf[10240]; - ssize_t rv; + int n; - rv = read(fd, buf, sizeof(buf)); - if (rv > 0) { - RecvEnqueue(buf, rv); + n = read(fd, p->data(), p->size()); + if (n < 0) { + putmsg(0, "read: %s", strerror(errno)); + return NODATA; } - return rv; + p->length = n; + return 0; }