Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
 /// <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);
 }
Esempio n. 3
0
        /// <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);
        }