--- nono/host/hostnet.cpp 2026/04/29 17:05:26 1.1.1.4 +++ nono/host/hostnet.cpp 2026/04/29 17:05:30 1.1.1.5 @@ -55,11 +55,11 @@ HostNetDevice::GetDrivers() // コンストラクタ -HostNetDevice::HostNetDevice(Device *parent_, int n) +HostNetDevice::HostNetDevice(Device *parent_, uint n) : inherited(parent_, OBJ_HOSTNET(n)) { monitor.func = ToMonitorCallback(&HostNetDevice::MonitorUpdate); - monitor.SetSize(48, 22); + monitor.SetSize(48, 23); monitor.Regist(ID_MONITOR_HOSTNET(n)); } @@ -268,6 +268,14 @@ HostNetDevice::CreateAFPacket() bool HostNetDevice::Tx(const NetPacket& packet) { + // 長さ 0 のパケットは破棄する。バグでもないと通常は起きない。 + // runt frame はどうするか? + if (packet.length < 1) { + stat.txzero_pkts++; + putlog(1, "Tx: drop empty packet"); + return true; + } + // 送信キューに入れて.. if (txq.Enqueue(packet) == false) { stat.txqfull_pkts++; @@ -280,7 +288,7 @@ HostNetDevice::Tx(const NetPacket& packe stat.tx_bytes += packet.length; // ざっくりピーク値 - stat.txq_peak = std::max((int)txq.Length(), stat.txq_peak); + stat.txq_peak = std::max((uint)txq.Length(), stat.txq_peak); // パイプに通知 (値はダミー) return WritePipe(0); @@ -326,10 +334,10 @@ HostNetDevice::Rx(NetPacket *dst) stat.rx_pkts++; stat.rx_bytes += dst->length; if (__predict_false(loglevel >= 2)) { - putlogn("Recv %d bytes", dst->length); + putlogn("Recv %u bytes", dst->length); if (loglevel >= 3) { std::string buf; - for (int i = 0; i < dst->length; i++) { + for (uint i = 0; i < dst->length; i++) { if (i % 16 == 0) { buf += string_format("%04x:", i); } @@ -426,7 +434,7 @@ HostNetDevice::Read() // 宛先アドレスの CRC32 を計算する。 // イーサネットの CRC は zlib の crc32() と同じもの。 - ulong crc = crc32(0, Z_NULL, 0); + uint32 crc = crc32(0, Z_NULL, 0); crc = crc32(crc, &packet[0], 6); // crc の上位6ビットをとりだして検査ビット位置とする(=pos)。 @@ -469,7 +477,7 @@ HostNetDevice::Read() } while (left > 0); // ざっくりピーク値 - stat.rxq_peak = std::max((int)rxq.Length(), stat.rxq_peak); + stat.rxq_peak = std::max((uint)rxq.Length(), stat.rxq_peak); return queued; } @@ -487,10 +495,10 @@ HostNetDevice::Write(uint32 data) const NetPacket& packet = *p; if (__predict_false(loglevel >= 2)) { - putlogn("Send %d bytes", packet.length); + putlogn("Send %u bytes", packet.length); if (loglevel >= 3) { std::string buf; - for (int i = 0; i < packet.length; i++) { + for (uint i = 0; i < packet.length; i++) { if (i % 16 == 0) { buf += string_format("%04x:", i); } @@ -549,6 +557,9 @@ HostNetDevice::MonitorUpdate(Monitor *, screen.Print(0, y++, "%-17s%13s %17s", "Write to host", format_number(stat.write_pkts).c_str(), format_number(stat.write_bytes).c_str()); + screen.Print(0, y++, "%-17s%13s %17s", "Drop:Empty Frame", + format_number(stat.txzero_pkts).c_str(), + "0"); screen.Print(0, y++, "%-17s%13s %17s", "Drop:TxQ Full", format_number(stat.txqfull_pkts).c_str(), format_number(stat.txqfull_bytes).c_str()); @@ -579,8 +590,8 @@ HostNetDevice::MonitorUpdate(Monitor *, y++; screen.Print(5, y++, "Capacity Peak"); - screen.Print(0, y++, "TxQ %4d/%4d %4d", - (int)txq.Length(), (int)txq.Capacity(), stat.txq_peak); - screen.Print(0, y++, "RxQ %4d/%4d %4d", - (int)rxq.Length(), (int)rxq.Capacity(), stat.rxq_peak); + screen.Print(0, y++, "TxQ %4u/%4u %4u", + (uint)txq.Length(), (uint)txq.Capacity(), stat.txq_peak); + screen.Print(0, y++, "RxQ %4u/%4u %4u", + (uint)rxq.Length(), (uint)rxq.Capacity(), stat.rxq_peak); }