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);
            }
        }
Example #2
0
        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));
        }
Example #3
0
        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);
        }