--- nono/vm/ethernet.h 2026/04/29 17:04:55 1.1.1.7 +++ nono/vm/ethernet.h 2026/04/29 17:05:10 1.1.1.8 @@ -4,14 +4,9 @@ // Licensed under nono-license.txt // -#pragma once - -#include "device.h" -#include "qvector.h" -#include -#include -#include -#include +// +// Ethernet 基本クラス +// // IODevice // | @@ -22,53 +17,13 @@ // v v // LanceDevice RTL8019Device // (LUNA, AM7990) (X68000, RTL8019) -// -// これ自体は IODevice である必要はないが、LanceDevice などの親になるため -// IODevice にしてある。(多重継承はしない) - -class NetDriver; - -// MAC アドレス格納用のクラス -class macaddr_t : public std::array -{ - using inherited = std::array; - public: - // この MAC アドレスが 00:00:00:00:00:00 なら true - bool empty() const { - for (const auto& v : *this) { - if (v != 0) { - return false; - } - } - return true; - } - // 区切り文字なしの文字列形式を返す。主に ROM 埋め込み用で英字は大文字。 - // 01:23:AB なら "0123AB" のような感じ。 - std::string to_string() const { - std::string buf; - for (const auto& v : *this) { - buf += string_format("%02X", v); - } - return buf; - } +#pragma once - // sep を区切り文字とする文字列形式を返す。主に表示用で英字は小文字。 - // 01:23:AB で sep = ":" なら "01:23:ab" のような感じ。 - std::string to_string(char sep) const { - std::string buf; - for (const auto& v : *this) { - buf += string_format("%02x%c", v, sep); - } - buf.pop_back(); - return buf; - } -}; +#include "device.h" +#include "macaddr.h" -// 受信パケット -using RXPacket = std::unique_ptr>; -// 受信パケットキュー用 -using RXPacketQueue = std::queue; +class HostNetDevice; class EthernetDevice : public IODevice { @@ -80,61 +35,23 @@ class EthernetDevice : public IODevice bool Create() override; - // パケットを受信した。 - // ホストネットワークドライバから呼ばれる。 - // バッファをコピーしてこちらのスレッドに処理を引き渡すところまでを行う。 - // packet はプリアンブルを含まず、イーサネットフレームヘッダ(14バイト)、 - // データ(46-1500バイト)、FCS(CRC) (4バイト) からなる。 - // 渡されたパケットの所有権はこちらで引き取る。 - bool RecvPacket(RXPacket packet); - // MAC アドレスを取得 macaddr_t GetMacAddr() const { return macaddr; } - // 統計情報の取得 - uint64 GetTXPkts() const { return tx_pkts; } - uint64 GetRXPkts() const { return rx_pkts; } + // ホストデバイスを取得する。Create() 完了後から使用可能。 + // (ステータスパネルが呼び出す) + HostNetDevice *GetHostNet() const { return hostnet.get(); } protected: - // このデバイスと継承デバイスのメンバ変数を読み書きする場合は - // 必ずこのロックを取得する。? - std::mutex mtx {}; - - // パケット受信許可。 - bool RecvEnabled {}; - - // MAC アドレスを生成する - static void GenerateMacAddr(macaddr_t *addr); - - // MAC アドレス文字列をバイナリに変換する - static bool ParseMacAddr(macaddr_t& dst, const std::string& src); - - // パケットを送信する - bool SendPacket(const std::vector& buf); - - // 継承クラスはこのメソッドをオーバーライドして、受信に対する処理を行う。 - // パケットを受信してキューに投入した後に呼び出される。 - virtual void NotifyRecvPacket() = 0; + // ホストスレッドからの受信通知 + void HostRxCallback(); // MAC アドレス macaddr_t macaddr {}; - // 受信パケットキュー - // VMとホストの通信速度調停のためキューが必要。 - RXPacketQueue rxq {}; - - // 統計情報 - uint64 tx_pkts {}; - uint64 rx_pkts {}; - - private: - // Create() の下請け - bool CreateNone(); - bool CreateAFPacket(); - bool CreateTap(); - bool CreateBPF(); + std::unique_ptr hostnet /*{}*/; }; -extern std::unique_ptr gEthernet; +extern EthernetDevice *gEthernet;