/// <summary> /// Receive data /// </summary> /// <param name="timeout">timeout value, default 5000ms</param> /// <returns>time value (-1 = timeout)</returns> /// <exception cref="InvalidOperationException">Thrown on fatal error (contact support).</exception> private int Receive(int timeout = 5000) { int second = 0; int _deltaT = 0; while (rxBuffer.Count < 1) { if (second > (timeout / 1000)) { return(-1); } if (_deltaT != RTC.Second) { second++; _deltaT = RTC.Second; } } var packet = new DHCPPacket(rxBuffer.Dequeue().RawData); if (packet.MessageType == 2) //Boot Reply { if (packet.RawData[284] == 0x02) //Offer packet received { Global.mDebugger.Send("Offer received."); return(SendRequestPacket(packet.Client)); } else if (packet.RawData[284] == 0x05 || packet.RawData[284] == 0x06) //ACK or NAK DHCP packet received { var ack = new DHCPAck(packet.RawData); if (asked) { Apply(ack, true); } else { Apply(ack); } } } return(second); }
/* * Method called to applied the differents options received in the DHCP packet ACK **/ /// <summary> /// Apply the new IP configuration received. /// </summary> /// <param name="Options">DHCPOption class using the packetData from the received dhcp packet.</param> /// <param name="message">Enable/Disable the displaying of messages about DHCP applying and conf. Disabled by default. /// </param> private void Apply(DHCPAck packet, bool message = false) { NetworkStack.RemoveAllConfigIP(); //cf. Roadmap. (have to change this, because some network interfaces are not configured in dhcp mode) [have to be done in 0.5.x] foreach (NetworkDevice networkDevice in NetworkDevice.Devices) { if (packet.Client.ToString() == null || packet.Client.ToString() == null || packet.Client.ToString() == null || packet.Client.ToString() == null) { throw new Exception("Parsing DHCP ACK Packet failed, can't apply network configuration."); } else { if (message) { Global.mDebugger.Send("[DHCP ACK][" + networkDevice.Name + "] Packet received, applying IP configuration..."); Global.mDebugger.Send(" IP Address : " + packet.Client.ToString()); Global.mDebugger.Send(" Subnet mask : " + packet.Subnet.ToString()); Global.mDebugger.Send(" Gateway : " + packet.Server.ToString()); Global.mDebugger.Send(" DNS server : " + packet.DNS.ToString()); } IPConfig.Enable(networkDevice, packet.Client, packet.Subnet, packet.Server); DNSConfig.Add(packet.DNS); if (message) { Global.mDebugger.Send("[DHCP CONFIG][" + networkDevice.Name + "] IP configuration applied."); asked = false; } } } Close(); }