private void FillOptions(DhcpFormat request, DhcpFormat response) { SortedList requestOptions = request.GetOptions(); response.AddOption(DhcpServerID.Create(ServerAddress)); response.AddOption(DhcpRenewalTime.Create(RenewalTime)); response.AddOption(DhcpRebindingTime.Create(RebindingTime)); foreach (IDhcpOption option in requestOptions.Values) { byte optionCode = option.OptionCode; Console.WriteLine("({0}) {1}", optionCode, DhcpOptionParser.GetOptionName(optionCode)); } DhcpMultiByteOption parameters = requestOptions[DhcpParameterRequest.OptionCode] as DhcpMultiByteOption; if (parameters == null) { return; } foreach (byte parameter in parameters.Values) { switch (parameter) { case DhcpSubnetMask.OptionCode: response.AddOption(DhcpSubnetMask.Create(NetMask)); break; case DhcpDomainName.OptionCode: response.AddOption( DhcpDomainName.Create(DomainName.ToCharArray()) ); break; case DhcpRouter.OptionCode: response.AddOption(DhcpRouter.Create(Routers)); break; case DhcpDomainNameServer.OptionCode: response.AddOption( DhcpDomainNameServer.Create(DnsServers) ); break; } } }
public void Receive(NetPacket packet) { packet.Reset(); Console.WriteLine("Received {0} bytes", packet.Length); if (ValidHeaders(packet) == false) { SetState(ServerState.Failed); return; } try { DhcpFormat dhcp = DhcpFormat.Parse(packet); SortedList options = dhcp.GetOptions(); DhcpByteOption message = options[DhcpMessageType.OptionCode] as DhcpByteOption; if (message == null) { Console.WriteLine("MessageType option not found"); SetState(ServerState.Failed); return; } DhcpFormat.MessageType messageType = (DhcpFormat.MessageType)message.Value; if (DhcpFormat.IsRequestMessage(messageType) == false) { Console.WriteLine("Inappropriate message type: {0}", message.Value); SetState(ServerState.Failed); return; } DhcpFormat.MessageType expected = expectActions[expectIndex, 0]; DhcpFormat.MessageType action = expectActions[expectIndex, 1]; expectIndex++; if (messageType != expected) { Console.WriteLine("Unexpected message type: {0} != {1}", messageType, expected); SetState(ServerState.Failed); return; } if (DhcpFormat.IsResponseMessage(action)) { Respond(dhcp, action); } if (expectIndex == expectActions.Length / expectActions.Rank) { SetState(ServerState.Finished); } } catch (Exception e) { Console.WriteLine("Bad Dhcp packet: {0}", e); SetState(ServerState.Failed); } }