Browse Source

refactor packet logging

Fabian 1 year ago
parent
commit
1f614e831e
1 changed files with 44 additions and 4 deletions
  1. 44 4
      src/ne2k.js

+ 44 - 4
src/ne2k.js

@@ -238,6 +238,48 @@ function format_mac(mac)
     ].join(":");
 }
 
+function dump_packet(packet, prefix)
+{
+    const ethertype = packet[12] << 8 | packet[13] << 0;
+    if(ethertype === 0x0800)
+    {
+        const ipv4_packet = packet.subarray(14);
+        const ipv4_len = ipv4_packet[2] << 8 | ipv4_packet[3];
+        const ipv4_proto = ipv4_packet[9];
+        if(ipv4_proto === 0x11)
+        {
+            const udp_packet = ipv4_packet.subarray(5 * 4);
+            const source_port = udp_packet[0] << 8 | udp_packet[1];
+            const destination_port = udp_packet[2] << 8 | udp_packet[3];
+            const checksum = udp_packet[6] << 8 | udp_packet[7];
+
+            if(source_port === 67 || destination_port === 67)
+            {
+                const dhcp_packet = udp_packet.subarray(8);
+                const dhcp_chaddr = dhcp_packet.subarray(28, 28+6);
+                dbg_log(prefix + " len=" + packet.length + " ethertype=" + h(ethertype) + " ipv4.len=" + ipv4_len + " ipv4.proto=" + h(packet[14 + 9]) + " udp.srcport=" + source_port + " udp.dstport=" + destination_port + " udp.chksum=" + h(checksum, 4) + " dhcp.chaddr=" + format_mac(dhcp_chaddr));
+            }
+            else
+            {
+                dbg_log(prefix + " len=" + packet.length + " ethertype=" + h(ethertype) + " ipv4.len=" + ipv4_len + " ipv4.proto=" + h(packet[14 + 9]) + " udp.srcport=" + source_port + " udp.dstport=" + destination_port + " udp.chksum=" + h(checksum, 4));
+            }
+        }
+        else if(ipv4_proto === 0x01)
+        {
+        }
+        else
+        {
+            dbg_log(prefix + " len=" + packet.length + " ethertype=" + h(ethertype) + " ipv4.len=" + ipv4_len + " ipv4.proto=" + h(packet[14 + 9]));
+        }
+    }
+    else
+    {
+        const arp_packet = packet.subarray(14);
+        dbg_log(prefix + " len=" + packet.length + " ethertype=" + h(ethertype) + " arp");
+    }
+    dbg_log(hex_dump(packet));
+}
+
 /**
  * @constructor
  * @param {CPU} cpu
@@ -365,8 +407,7 @@ function Ne2k(cpu, bus, preserve_mac_from_state_image, mac_address_translation)
 
             if(NE2K_LOG_PACKETS)
             {
-                dbg_log("send len=" + data.length + " ethertype=" + h(data[12] << 8 | data[13] << 0, 4) + " ipv4.len=" + (data[14 + 2] << 8 | data[14 + 3]) + " ipv4.protocol=" + h(data[14 + 9]));
-                dbg_log(hex_dump(data));
+                dump_packet(data, "send");
             }
 
             if(this.mac_address_in_state)
@@ -1141,8 +1182,7 @@ Ne2k.prototype.receive = function(data)
 
     if(NE2K_LOG_PACKETS)
     {
-        dbg_log("receive len=" + data.length + " ethertype=" + h(data[12] << 8 | data[13] << 0, 4) + " ipv4.len=" + (data[14 + 2] << 8 | data[14 + 3]) + " ipv4.protocol=" + h(data[14 + 9]));
-        dbg_log(hex_dump(data));
+        dump_packet(data, "receive");
     }
 
     this.bus.send("eth-receive-end", [data.length]);