diff --git a/dhcpd/dhcpd.go b/dhcpd/dhcpd.go index 86aa6fa9..27233965 100644 --- a/dhcpd/dhcpd.go +++ b/dhcpd/dhcpd.go @@ -369,7 +369,6 @@ func (s *Server) handleDiscover(p dhcp4.Packet, options dhcp4.Options) dhcp4.Pac func (s *Server) handleDHCP4Request(p dhcp4.Packet, options dhcp4.Options) dhcp4.Packet { var lease *Lease - var err error reqIP := net.IP(options[dhcp4.OptionRequestedIPAddress]) log.Tracef("Message from client: Request. IP: %s ReqIP: %s HW: %s", @@ -395,12 +394,8 @@ func (s *Server) handleDHCP4Request(p dhcp4.Packet, options dhcp4.Options) dhcp4 lease = s.findLease(p) if lease == nil { - lease, err = s.reserveLease(p) - if err != nil { - log.Tracef("Couldn't find free lease: %s", err) - // couldn't find lease, don't respond - return nil - } + log.Tracef("Lease for %s isn't found", p.CHAddr()) + return dhcp4.ReplyPacket(p, dhcp4.NAK, s.ipnet.IP, nil, 0, nil) } if !lease.IP.Equal(reqIP) { diff --git a/dhcpd/dhcpd_test.go b/dhcpd/dhcpd_test.go index 2d675ed9..366606d4 100644 --- a/dhcpd/dhcpd_test.go +++ b/dhcpd/dhcpd_test.go @@ -43,11 +43,7 @@ func TestDHCP(t *testing.T) { lease, _ = s.reserveLease(p) check(t, bytes.Equal(lease.HWAddr, hw), "lease.HWAddr") check(t, bytes.Equal(lease.IP, []byte{1, 1, 1, 1}), "lease.IP") - - // Try to reserve another IP for the same machine - no new IP must be reserved - hw = []byte{1, 2, 3, 4, 5, 6} - p.SetCHAddr(hw) - lease, _ = s.reserveLease(p) + lease = s.findLease(p) check(t, bytes.Equal(lease.HWAddr, hw), "lease.HWAddr") check(t, bytes.Equal(lease.IP, []byte{1, 1, 1, 1}), "lease.IP") @@ -100,7 +96,7 @@ func misc(t *testing.T, s *Server) { p = make(dhcp4.Packet, 241) - // Commit a lease for an IP without prior Discover-Offer packets + // Try to commit a lease for an IP without prior Discover-Offer packets hw = []byte{2, 2, 3, 4, 5, 6} p.SetCHAddr(hw) p.SetCIAddr([]byte{0, 0, 0, 0}) @@ -108,11 +104,7 @@ func misc(t *testing.T, s *Server) { opt[dhcp4.OptionRequestedIPAddress] = []byte{1, 1, 1, 1} p2 = s.handleDHCP4Request(p, opt) opt = p2.ParseOptions() - check(t, bytes.Equal(opt[dhcp4.OptionDHCPMessageType], []byte{byte(dhcp4.ACK)}), "dhcp4.ACK") - check(t, bytes.Equal(p2.YIAddr(), []byte{1, 1, 1, 1}), "p2.YIAddr") - check(t, bytes.Equal(p2.CHAddr(), hw), "p2.CHAddr") - check(t, bytes.Equal(opt[dhcp4.OptionIPAddressLeaseTime], dhcp4.OptionsLeaseTime(5*time.Second)), "OptionIPAddressLeaseTime") - check(t, bytes.Equal(opt[dhcp4.OptionServerIdentifier], s.ipnet.IP), "OptionServerIdentifier") + check(t, bytes.Equal(opt[dhcp4.OptionDHCPMessageType], []byte{byte(dhcp4.NAK)}), "dhcp4.NAK") } // Leases database store/load