public void dispatch_packet(ref RawCapture rawPacket) { byte[] src_mac = new byte[6]; byte[] dst_mac = new byte[6]; byte[] packet_data = rawPacket.Data; // copy source and destination MAC addresses from sniffed packet Buffer.BlockCopy(rawPacket.Data, 0, dst_mac, 0, 6); PhysicalAddress dstMAC = new PhysicalAddress(dst_mac); Buffer.BlockCopy(rawPacket.Data, 6, src_mac, 0, 6); PhysicalAddress srcMAC = new PhysicalAddress(src_mac); #if DEBUG xbs_messages.addDebugMessage("s> " + srcMAC + "=>" + dstMAC + "Len:" + rawPacket.Data.Length, xbs_message_sender.SNIFFER); Packet p = Packet.ParsePacket(rawPacket.LinkLayerType, rawPacket.Data); xbs_messages.addDebugMessage("s> " + p, xbs_message_sender.SNIFFER); #endif // if sniffed packet has MAC of packet we injected, discard bool is_injected_packet = false; lock (injected_macs_hash) is_injected_packet = injected_macs_hash.Contains(srcMAC.GetHashCode()); if (is_injected_packet) { return; } if (NAT.NAT_enabled) { #if DEBUG System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); #endif EthernetPacketType p_type = NAT.deNAT_outgoing_packet_PacketDotNet(ref packet_data, dstMAC, srcMAC); #if DEBUG stopWatch.Stop(); if (p_type == EthernetPacketType.IpV4) { xbs_sniffer_statistics.deNAT_callCount++; if (xbs_sniffer_statistics.deNAT_callCount > 1) { xbs_sniffer_statistics.deNAT_timeInCode += (UInt64)stopWatch.ElapsedTicks; UInt32 average = (UInt32)(xbs_sniffer_statistics.deNAT_timeInCode / (xbs_sniffer_statistics.deNAT_callCount - 1)); double average_ms = new TimeSpan(average).TotalMilliseconds; xbs_messages.addDebugMessage("- deNAT time: " + stopWatch.ElapsedTicks + " deNAT count: " + (xbs_sniffer_statistics.deNAT_callCount - 1) + " Total Time: " + xbs_sniffer_statistics.deNAT_timeInCode + "=> " + average + " / " + average_ms + "ms", xbs_message_sender.SNIFFER); } } p = Packet.ParsePacket(rawPacket.LinkLayerType, packet_data); xbs_messages.addDebugMessage("s> " + p, xbs_message_sender.SNIFFER); #endif } // count the sniffed packets from local xboxs xbs_sniffer_statistics.packet_count++; // find node with destination MAC Address in network and send packet xbs_node node = node_list.distributeDataPacket(dstMAC, packet_data); int srcMac_hash = srcMAC.GetHashCode(); bool pdevfilter_needs_change = false; lock (sniffed_macs_hash) { if (!sniffed_macs_hash.Contains(srcMac_hash)) { sniffed_macs_hash.Add(srcMac_hash); lock (sniffed_macs) sniffed_macs.Add(srcMAC); pdevfilter_needs_change = true; } } if (pdevfilter_needs_change) { setPdevFilter(); } }