--- nono/vm/ethernet.h 2026/04/29 17:04:28 1.1 +++ nono/vm/ethernet.h 2026/04/29 17:05:10 1.1.1.8 @@ -1,17 +1,12 @@ // // nono -// Copyright (C) 2019 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // -#pragma once - -#include -#include -#include -#include -#include "device.h" -#include "mystring.h" -#include "qvector.h" +// +// Ethernet 基本クラス +// // IODevice // | @@ -22,79 +17,41 @@ // v v // LanceDevice RTL8019Device // (LUNA, AM7990) (X68000, RTL8019) -// -// これ自体は IODevice である必要はないが、LanceDevice などの親になるため -// IODevice にしてある。(多重継承はしない) -class NetDriver; +#pragma once -// MAC アドレス格納用のクラス -class macaddr_t : public std::array -{ - typedef std::array inherited; - public: - // この MAC アドレスが 00:00:00:00:00:00 なら true - bool empty() const { - for (const auto& v : *this) { - if (v != 0) { - return false; - } - } - return true; - } +#include "device.h" +#include "macaddr.h" - // 文字列形式を返す - std::string to_string() const { - std::string buf; - for (const auto& v : *this) { - buf += string_format("%02x:", v); - } - buf.pop_back(); - return buf; - } -}; +class HostNetDevice; class EthernetDevice : public IODevice { - typedef IODevice inherited; + using inherited = IODevice; protected: - EthernetDevice(); + EthernetDevice(const std::string& objname_); public: - virtual ~EthernetDevice(); + virtual ~EthernetDevice() override; + + bool Create() override; - virtual bool Create(); - virtual bool Init(); + // MAC アドレスを取得 + macaddr_t GetMacAddr() const { + return macaddr; + } - // パケットを受信した。 - // ホストネットワークドライバから呼ばれる。 - // ホストネットワークスレッドで mtx 取得状態で呼ばれるので、 - // バッファをコピーしてこちらのスレッドに処理を引き渡すところまでを行う。 - // buf はプリアンブルを含まず、イーサネットフレームヘッダ(14バイト)、 - // データ(46-1500バイト)、FCS(CRC) (4バイト) からなる。 - virtual bool RecvPacket(qvector& buf) = 0; - - // パケット受信許可。 - // true の場合のみホストドライバは RecvPacket() をコールしてよい。 - bool RecvEnabled = false; - - // このデバイスと継承デバイスのメンバ変数を読み書きする場合は - // 必ずこのロックを取得する。? - // cv もこのロックを使う。 - std::mutex mtx {}; - // ワーカスレッドへ指示を出すための条件変数 - std::condition_variable cv {}; - // ワーカスレッドへのリクエストフラグ - uint32 request = 0; + // ホストデバイスを取得する。Create() 完了後から使用可能。 + // (ステータスパネルが呼び出す) + HostNetDevice *GetHostNet() const { return hostnet.get(); } protected: - // MAC アドレスを生成する - static void GenerateMacAddr(macaddr_t *addr); + // ホストスレッドからの受信通知 + void HostRxCallback(); - // MAC アドレス文字列をバイナリに変換する - static bool ParseMacAddr(macaddr_t& dst, const std::string& src); + // MAC アドレス + macaddr_t macaddr {}; - // パケットを送信する - bool SendPacket(const std::vector& buf); + std::unique_ptr hostnet /*{}*/; }; extern EthernetDevice *gEthernet;