/// <summary> /// Processes the discover. /// </summary> /// <param name="dhcpMessage">The DHCP message.</param> /// <returns>DhcpMessageProcessed.</returns> /// <autogeneratedoc /> public DhcpMessageProcessed ProcessDiscover(IDhcpMessage dhcpMessage) { _dhcpSessionResult.UpdateSessionState(dhcpMessage.SessionId, DhcpSessionState.Discover, dhcpMessage.ClientHardwareAddress); UpdateTimestamp(); return(DhcpMessageProcessed.Success); }
/// <summary> /// Processes the ack. /// </summary> /// <param name="dhcpMessage">The DHCP message.</param> /// <returns>DhcpMessageProcessed.</returns> /// <autogeneratedoc /> public DhcpMessageProcessed ProcessAck(IDhcpMessage dhcpMessage) { UpdateTimestamp(); return(DhcpMessageProcessed.Ignored); }
/// <summary> /// Processes the request. /// </summary> /// <param name="dhcpMessage">The DHCP message.</param> /// <returns>DhcpMessageProcessed.</returns> /// <autogeneratedoc /> public DhcpMessageProcessed ProcessRequest(IDhcpMessage dhcpMessage) { if (_dhcpSessionResult.IsDuplicateRequest(dhcpMessage)) { return(DhcpMessageProcessed.Duplicate); } // Update Session State _dhcpSessionResult.UpdateSessionState(dhcpMessage.SessionId, DhcpSessionState.Request, dhcpMessage.ClientHardwareAddress); var addressRequest = dhcpMessage.GetOptionData(DhcpOption.RequestedIpAddr); RequestState requestState; // RequestState.Unknown #region Pre-Processing // Start pre-process validation //--------------------------------------------------------------------- //| |INIT-REBOOT |SELECTING |RENEWING |REBINDING | //--------------------------------------------------------------------- //|broad/unicast |broadcast |broadcast |unicast |broadcast | //|server-ip |MUST NOT |MUST |MUST NOT |MUST NOT | //|requested-ip |MUST |MUST |MUST NOT |MUST NOT | //|ciaddr |zero |zero |IP address |IP address| //--------------------------------------------------------------------- // first determine what KIND of request we are dealing with if (dhcpMessage.ClientAddress.Equals(InternetAddress.Any)) { // the ciAddr MUST be 0.0.0.0 for Init-Reboot and Selecting requestState = addressRequest == null ? RequestState.InitReboot : RequestState.Selecting; } else { // the ciAddr MUST NOT be 0.0.0.0 for Renew and Rebind if (!dhcpMessage.IsBroadcast) { // renew is unicast // NOTE: this will not happen if the v4 broadcast interface used at startup, // but handling of DHCPv4 renew/rebind is the same anyway requestState = RequestState.Renewing; } else { // rebind is broadcast requestState = RequestState.Rebinding; } } if (requestState == RequestState.InitReboot || requestState == RequestState.Selecting) { if (addressRequest == null) { Logger.LogDebug( "Ignoring {DhcpMessageType} {DhcpRequestState} message: Requested IP option is null", MessageType.Request, RequestStateString.GetName(requestState)); //return; // if processing should not continue } } else { // type == Renewing or Rebinding if (addressRequest != null) { Logger.LogDebug( "Ignoring {DhcpMessageType} {DhcpRequestState} message: Requested IP option is not null", MessageType.Request, RequestStateString.GetName(requestState)); //return; // if processing should not continue } } // End pre-process validation #endregion Pre-Processing Logger.LogTrace("Processing {DhcpMessageType} {DhcpRequestState} message", MessageType.Request, RequestStateString.GetName(requestState)); DhcpSessionState = DhcpSessionState.Request; RequestState = requestState; if (!dhcpMessage.ClientHardwareAddress.Equals(PhysicalAddress)) { Logger.LogError( "ClientHardwareAddress {ClientHardwareAddress} does not equal PhysicalAddress {PhysicalAddress}", dhcpMessage.ClientHardwareAddress, PhysicalAddress); } // Update Hostname _dhcpSessionResult.HostName = ByteUtility.GetStringNullIfEmpty(dhcpMessage.GetOptionData(DhcpOption.Hostname)); _dhcpSessionResult.VendorClassId = ByteUtility.GetStringNullIfEmpty(dhcpMessage.GetOptionData(DhcpOption.VendorClassId)); bool routerDiscoveryParamExists = dhcpMessage.ParamOptionExists(DhcpOption.RouterDiscovery); // Figure out INetworkDeviceInfo if (routerDiscoveryParamExists) { } // TODO: Handle DhcpRequest UpdateTimestamp(); return(DhcpMessageProcessed.Success); }