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);
            }
        }
Exemple #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));
        }
        public int WriteDataTo(IPv4 remoteAddress,
                               ushort remotePort,
                               byte[] !data)
        {
            if (!IsSessionValidForUserWrite())
            {
                DebugPrint("WriteDataTo on closed UDP session");
                return(-1);
            }

            int headerSize = EthernetFormat.Size + IPFormat.Size + UdpFormat.Size;

            byte[] packet  = new byte [headerSize + data.Length];
            int    ipStart = EthernetFormat.Size;

            if (this.LocalAddress == IPv4.Any)
            {
                this.SetLocalEndPoint(this.LocalAddress, this.LocalPort);
            }

            UdpFormat.WriteUdpPacket(packet, ipStart,
                                     this.LocalAddress, this.LocalPort,
                                     remoteAddress, remotePort,
                                     data, 0, data.Length);

            NetPacket netPacket = new NetPacket(packet);

            if (base.PutPacket(outQueue, netPacket, blocking) == false)
            {
                Core.Log("Failed to enqueue packet for {0}/{1}",
                         remoteAddress, remotePort);
                String msg = String.Format("Failed to enqueue packet for {0}/{1}",
                                           remoteAddress, remotePort);
                Tracing.Log(Tracing.Debug, msg);
                return(0);
            }

            return(data.Length);
        }
Exemple #4
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);
        }
        /// <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);
        }