public void ArpRequest(IPv4 sourceIP, IPv4 targetIP, Multiplexer !targetMux, ArpRequestCallback callback, object cookie, TimeSpan timeout) { // //XXXX Check pending request does not already exist! // EthernetAddress localMac = targetMux.Adapter.HardwareAddress; AddPendingRequest(targetIP, callback, cookie, timeout); // initiate an arp request... DebugPrint("Initiating request " + "({0},{1}) --> ({2},{3})\n", sourceIP, localMac, targetIP, EthernetAddress.Zero); byte[] data = new byte[ArpFormat.Size + EthernetFormat.Size]; int pos = EthernetFormat.Write(data, 0, localMac, EthernetAddress.Broadcast, EthernetFormat.PROTOCOL_ARP); ArpFormat.Write(data, pos, localMac, sourceIP, ArpFormat.Type.ARP_REQUEST, EthernetAddress.Zero, targetIP); NetPacket pkt = new NetPacket(data); pkt.Mux = targetMux; OnProtocolSend(pkt); }
private void SendResponsePacket(DhcpFormat dhcp) { int packetSize = dhcp.Size + UdpFormat.Size + IPFormat.Size + EthernetFormat.Size; byte [] packet = new byte [packetSize]; // Write out DHCP packet int dhcpSize = dhcp.Size; int dhcpOffset = packet.Length - dhcpSize; dhcp.Write(packet, dhcpOffset); // Create UDP Header UdpFormat.UdpHeader udpHeader = new UdpFormat.UdpHeader(); udpHeader.srcPort = DhcpFormat.ServerPort; udpHeader.dstPort = DhcpFormat.ClientPort; udpHeader.length = (ushort)(UdpFormat.Size + dhcpSize); // Create IP Header IPFormat.IPHeader ipHeader = new NetStack.Protocols.IPFormat.IPHeader(); ipHeader.SetDefaults(IPFormat.Protocol.UDP); IPFormat.SetDontFragBit(ipHeader); ipHeader.Source = ServerAddress; ipHeader.Destination = IPv4.Broadcast; ipHeader.totalLength = (ushort)(IPFormat.Size + UdpFormat.Size + dhcpSize); // Write out IP and Header int udpOffset = packet.Length - dhcp.Size - UdpFormat.Size; int ipOffset = udpOffset - IPFormat.Size; UdpFormat.WriteUdpPacket(packet, ipOffset, ref ipHeader, ref udpHeader, packet, dhcpOffset, dhcpSize); // Add Ethernet Header EthernetFormat.Write(packet, 0, ServerMac, EthernetAddress.Broadcast, EthernetFormat.Protocol.IP); NetPacket np = new NetPacket(packet); if (adapter.ReceivePacket(np) == false) { Console.WriteLine("Failed to send packet"); SetState(ServerState.Failed); } }
internal bool Send(EthernetAddress dstAddr, DhcpFormat !dhcp) { int packetSize = dhcp.Size + UdpFormat.Size + IPFormat.Size + EthernetFormat.Size; byte [] packet = new byte [packetSize]; // Write out DHCP packet int dhcpSize = dhcp.Size; int dhcpOffset = packet.Length - dhcpSize; dhcp.Write(packet, dhcpOffset); // Create UDP Header UdpFormat.UdpHeader udpHeader = new UdpFormat.UdpHeader(); udpHeader.srcPort = DhcpFormat.ClientPort; udpHeader.dstPort = DhcpFormat.ServerPort; udpHeader.length = (ushort)(UdpFormat.Size + dhcpSize); // Create IP Header IPFormat.IPHeader ipHeader = new NetStack.Protocols.IPFormat.IPHeader(); ipHeader.SetDefaults(IPFormat.Protocol.UDP); IPFormat.SetDontFragBit(ipHeader); ipHeader.Source = IPv4.Any; ipHeader.Destination = IPv4.Broadcast; ipHeader.totalLength = (ushort)(IPFormat.Size + UdpFormat.Size + dhcpSize); // Write out IP and Header int udpOffset = packet.Length - dhcp.Size - UdpFormat.Size; int ipOffset = udpOffset - IPFormat.Size; UdpFormat.WriteUdpPacket(packet, ipOffset, ipHeader, ref udpHeader, packet, dhcpOffset, dhcpSize); // Add Ethernet Header EthernetFormat.Write(packet, 0, adapter.HardwareAddress, dstAddr, EthernetFormat.PROTOCOL_IP); NetPacket np = new NetPacket(packet); return(udpSession.WritePacket(np)); }
/// <summary> /// Check Ethernet, IP, and UDP headers match those expected. /// </summary> private bool ValidHeaders(NetPacket packet) { if (packet.Length < NonDhcpHeaderSize) { Console.WriteLine("Packet too short"); return(false); } // // Check EthernetHeader // EthernetAddress originMac; EthernetAddress targetMac; EthernetFormat.Protocol protocol; EthernetFormat.Read(packet, out originMac, out targetMac, out protocol); if (originMac != adapter.HardwareAddress) { Console.WriteLine("Bad origin mac: {0}", originMac); return(false); } else if (targetMac != EthernetAddress.Broadcast && targetMac != ServerMac) { Console.WriteLine("Bad target mac: {0}", targetMac); return(false); } else if (protocol != EthernetFormat.Protocol.IP) { Console.WriteLine("Bad encapsulated protocol: {0}", protocol); return(false); } // // Check IP Header // IPFormat.IPHeader ipHeader; if (IPFormat.ReadIPHeader(packet, out ipHeader) == false) { Console.WriteLine("Failed to read IP Header"); return(false); } else if (ipHeader.Protocol != IPFormat.Protocol.UDP) { Console.WriteLine("Bad encapsulated IP protocol: {0}", ipHeader.Protocol); return(false); } else if (ipHeader.Source != IPv4.Zero && ipHeader.Source != assignedAddress) { Console.WriteLine("Bad IP source address: {0}", ipHeader.Source); return(false); } else if (ipHeader.Destination != IPv4.AllOnes && ipHeader.Destination != ServerAddress) { Console.WriteLine("Bad IP destination address: {0}", ipHeader.Destination); return(false); } Console.WriteLine("{0} {1}", ipHeader.Source, ipHeader.Destination); // // Check UDP Header // UdpFormat.UdpHeader udpHeader; if (UdpFormat.ReadUdpHeader(packet, out udpHeader) == false) { Console.WriteLine("Failed to read UDP Header"); return(false); } else if (udpHeader.srcPort != 68) { Console.WriteLine("Bad UDP source port: {0}", udpHeader.srcPort); return(false); } else if (udpHeader.dstPort != 67) { Console.WriteLine("Bad UDP destination port: {0}", udpHeader.dstPort); return(false); } return(true); }