/// <summary> /// Log a new ethernet packet. /// </summary> /// <param name="packet"> /// The packet to log. /// </param> public void LogPacket (Ethernet802_3 packet) { lock (m_logger.XmlWriter) { // <EthernetHeader> m_logger.XmlWriter.WriteStartElement ("EthernetHeader"); m_logger.XmlWriter.WriteElementString ("SourceMAC", packet.SourceMACAddress.ToString('-')); m_logger.XmlWriter.WriteElementString ("DestinationMAC", packet.DestinationMACAddress.ToString('-')); m_logger.XmlWriter.WriteElementString ("NetworkProtocol", packet.NetworkProtocol.ToString()); m_logger.XmlWriter.WriteEndElement (); // </EthernetHeader> } }
/// <summary> /// Resolve a physical address to an IP address. /// </summary> /// <param name="address"> /// The physical address to resolve. /// </param> /// <returns> /// Returns the IP address belonging to the physical address. /// </returns> /// <exception cref="ObjectDisposedException"> /// If the object has already been disposed then an ObjectDisposedException /// will be thrown /// </exception> /// <exception cref="Exception"> /// If the driver failed to start or was not bound, an exception will be thrown. /// </exception> public IPAddress ResolveMACAddress(MACAddress address) { if (m_disposed) { throw new ObjectDisposedException (this.ToString()); } if (!m_driver.DriverStarted) { throw new Exception ("The driver has not been started."); } if (!m_driver.DriverBound) { throw new Exception ("The driver has not yet been bound to a device."); } Ethernet802_3 ethernet = new Ethernet802_3 (); // construct the ethernet header ethernet.SourceMACAddress = m_driver.BoundAdapter.MediaAccessControlAddress; ethernet.DestinationMACAddress = MACAddress.BroadcastAddress; ethernet.NetworkProtocol = NetworkLayerProtocol.ARP; ArpPacket arp = new ArpPacket (); // construct the ARP header arp.Type = ArpOpcode.ReverseRequest; arp.Protocol = NetworkLayerProtocol.IP; arp.MediaType = MediaType.Ethernet; arp.SourceMACAddress = ethernet.SourceMACAddress; arp.SourceIPAddress = m_driver.BoundAdapter.Interfaces[0].Address; arp.DestinationMACAddress = address; // serialize and send the packet ethernet.Data = arp.Serialize (); m_driver.SendPacket (ethernet.Serialize ()); m_querying = true; // wait for the reply while (m_querying) { byte[] packet = m_driver.RecievePacket (); Ethernet802_3 ethReply = new Ethernet802_3 (packet); // if this is an ARP packet if (ethReply.NetworkProtocol == NetworkLayerProtocol.ARP) { ArpPacket arpReply = new ArpPacket (ethReply.Data); // if this is an ARP reply if (arpReply.Type == ArpOpcode.Reply) { // if the address matches the one we requested if (arpReply.DestinationIPAddress.Equals (address)) { // return the IP address return arpReply.DestinationIPAddress; } } } } return IPAddress.Any; }