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)); }
public NetStatus OnProtocolReceive(NetPacket !packet) { DebugPrint("Received UDP packet!\n"); UdpFormat.UdpHeader udpHeader = new UdpFormat.UdpHeader(); if (UdpFormat.ReadUdpHeader(packet, out udpHeader) == false) { DebugPrint("UDP session received unreadable packet.\n"); return(NetStatus.Code.PROTOCOL_DROP_ERROR); } IPFormat.IPHeader !ipHeader = (IPFormat.IPHeader !)packet.OverlapContext; if (udpHeader.checksum != 0 && UdpFormat.IsChecksumValid(ipHeader, udpHeader, packet) == false) { DebugPrint("UDP checksum failed. NO cigar and NO packet!"); return(NetStatus.Code.PROTOCOL_DROP_CHKSUM); } packet.OverlapContext = ipHeader; ArrayList udpSessions = Core.Instance().GetSessions(this); if (udpSessions == null) { DebugPrint("No UDP Sessions\n"); return(NetStatus.Code.PROTOCOL_DROP_ERROR); } DebugPrint("Packet : Source {0}:{1} Destination {2}:{3}\n", ipHeader.Source, udpHeader.srcPort, ipHeader.Destination, udpHeader.dstPort); lock (udpSessions.SyncRoot) { foreach (UdpSession !u in udpSessions) { DebugPrint("Session : Source {0}:{1} Destination {2}:{3}\n", u.RemoteAddress, u.RemotePort, u.LocalAddress, u.LocalPort); // Match conditions // // Bound remote port is zero (not-specified) // or matches exactly Bound remote IP is Any // (not-specified) or matches exactly if ((u.RemoteAddress == IPv4.Any || u.RemoteAddress == ipHeader.Source) && (u.RemotePort == 0 || u.RemotePort == udpHeader.srcPort) && (u.LocalAddress == IPv4.Any || u.LocalAddress == ipHeader.Destination) && (u.LocalPort == udpHeader.dstPort)) { DebugPrint("Delivered to UDP session\n"); return(u.OnReceive(this, packet, udpHeader)); } } } return(NetStatus.Code.PROTOCOL_DROP_ERROR); }