/* (non-Javadoc) * @see com.jagornet.dhcpv6.server.request.BaseDhcpProcessor#process() */ public override bool Process() { bool sendReply = true; byte[] chAddr = _requestMsg.GetChAddr(); lock (_lock) { V4AddrBindingManager bindingMgr = _dhcpServerConfig.GetV4AddrBindingMgr(); if (bindingMgr != null) { log.Info("Processing " + type + " from chAddr=" + Util.ToHexString(chAddr) + " ciAddr=" + _requestMsg.GetCiAddr().ToString() + " requestedIpAddrOption=" + requestedIpAddrOption); if (!AddrOnLink(requestedIpAddrOption, _clientLink)) { log.Info("Client requested IP is off-link, returning NAK"); _replyMsg.SetMessageType((short)DhcpConstants.V4MESSAGE_TYPE_NAK); return(sendReply); } else { Binding binding = bindingMgr.FindCurrentBinding(_clientLink, chAddr, _requestMsg); if (binding != null) { binding = bindingMgr.UpdateBinding(binding, _clientLink, chAddr, _requestMsg, IdentityAssoc.COMMITTED); if (binding != null) { AddBindingToReply(_clientLink, binding); _bindings.Add(binding); } else { log.Error("Failed to update binding for client: " + Util.ToHexString(chAddr)); sendReply = false; } } else { log.Error("No Binding available for client: " + Util.ToHexString(chAddr)); sendReply = false; } } } else { log.Error("Unable to process V4 Request:" + " No V4AddrBindingManager available"); } if (sendReply) { _replyMsg.SetMessageType((short)DhcpConstants.V4MESSAGE_TYPE_ACK); if (_bindings.Count > 0) { ProcessDdnsUpdates(true); } } } return(sendReply); }
public override bool Process() { bool sendReply = true; lock (_lock) { bool rapidCommit = IsRapidCommit(_requestMsg, _clientLink.GetLink()); byte state = rapidCommit ? IaAddress.COMMITTED : IaAddress.ADVERTISED; byte[] chAddr = _requestMsg.GetChAddr(); V4AddrBindingManager bindingMgr = _dhcpServerConfig.GetV4AddrBindingMgr(); if (bindingMgr != null) { log.Info("Processing Discover from: chAddr=" + Util.ToHexString(chAddr)); Binding binding = bindingMgr.FindCurrentBinding(_clientLink, chAddr, _requestMsg); if (binding == null) { // no current binding for this MAC, create a new one binding = bindingMgr.CreateDiscoverBinding(_clientLink, chAddr, _requestMsg, state); } else { binding = bindingMgr.UpdateBinding(binding, _clientLink, chAddr, _requestMsg, state); } if (binding != null) { // have a good binding, put it in the reply with options AddBindingToReply(_clientLink, binding); _bindings.Add(binding); } else { log.Error("Failed to create binding for Discover from: " + Util.ToHexString(chAddr)); sendReply = false; } } else { log.Error("Unable to process V4 Discover:" + " No V4AddrBindingManager available"); sendReply = false; } if (sendReply) { if (rapidCommit) { _replyMsg.SetMessageType((short)DhcpConstants.V4MESSAGE_TYPE_ACK); } else { _replyMsg.SetMessageType((short)DhcpConstants.V4MESSAGE_TYPE_OFFER); } if (_bindings.Count != 0) { if (rapidCommit) { ProcessDdnsUpdates(true); } else { ProcessDdnsUpdates(false); } } } } return(sendReply); }