From 719ef16b93e149d18558401aa87a7544b2b1cd31 Mon Sep 17 00:00:00 2001 From: Simon Zolin Date: Mon, 24 Aug 2020 13:01:55 +0300 Subject: [PATCH 1/2] * DHCP: don't replace the host name from static lease When a static lease contains a host name and client sends its own host name: 1. don't replace the host name from static lease with it 2. send option FQDN to the client in Ack response packet --- dhcpd/dhcpd.go | 1 - dhcpd/v4.go | 51 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/dhcpd/dhcpd.go b/dhcpd/dhcpd.go index f6e19d5a..ad109b2f 100644 --- a/dhcpd/dhcpd.go +++ b/dhcpd/dhcpd.go @@ -51,7 +51,6 @@ const ( LeaseChangedAdded = iota LeaseChangedAddedStatic LeaseChangedRemovedStatic - LeaseChangedBlacklisted LeaseChangedDBStore ) diff --git a/dhcpd/v4.go b/dhcpd/v4.go index ac0f9808..b283079a 100644 --- a/dhcpd/v4.go +++ b/dhcpd/v4.go @@ -365,8 +365,6 @@ func (s *v4Server) processDiscover(req *dhcpv4.DHCPv4, resp *dhcpv4.DHCPv4) *Lea s.conf.notify(LeaseChangedDBStore) - // s.conf.notify(LeaseChangedBlacklisted) - } else { reqIP := req.Options.Get(dhcpv4.OptionRequestedIPAddress) if len(reqIP) != 0 && @@ -375,13 +373,40 @@ func (s *v4Server) processDiscover(req *dhcpv4.DHCPv4, resp *dhcpv4.DHCPv4) *Lea } } - hostname := req.Options.Get(dhcpv4.OptionHostName) - lease.Hostname = string(hostname) - resp.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeOffer)) return lease } +type optFQDN struct { + name string +} + +func (o *optFQDN) String() string { + return "optFQDN" +} + +// flags[1] +// A-RR[1] +// PTR-RR[1] +// name[] +func (o *optFQDN) ToBytes() []byte { + b := make([]byte, 3+len(o.name)) + i := 0 + + b[i] = 0x03 // f_server_overrides | f_server + i++ + + b[i] = 255 // A-RR + i++ + + b[i] = 255 // PTR-RR + i++ + + copy(b[i:], []byte(o.name)) + return b + +} + // Process Request request and return lease // Return false if we don't need to reply func (s *v4Server) processRequest(req *dhcpv4.DHCPv4, resp *dhcpv4.DHCPv4) (*Lease, bool) { @@ -414,12 +439,6 @@ func (s *v4Server) processRequest(req *dhcpv4.DHCPv4, resp *dhcpv4.DHCPv4) (*Lea return nil, true } - if !bytes.Equal([]byte(l.Hostname), hostname) { - s.leasesLock.Unlock() - log.Debug("DHCPv4: Mismatched OptionHostName in Request message for %s", mac) - return nil, true - } - lease = l break } @@ -432,7 +451,17 @@ func (s *v4Server) processRequest(req *dhcpv4.DHCPv4, resp *dhcpv4.DHCPv4) (*Lea } if lease.Expiry.Unix() != leaseExpireStatic { + lease.Hostname = string(hostname) s.commitLease(lease) + } else if len(lease.Hostname) != 0 { + o := &optFQDN{ + name: string(lease.Hostname), + } + fqdn := dhcpv4.Option{ + Code: dhcpv4.OptionFQDN, + Value: o, + } + resp.UpdateOption(fqdn) } resp.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeAck)) From 06af130bb7c042d8a44720cc9423b3fc76deadee Mon Sep 17 00:00:00 2001 From: Simon Zolin Date: Tue, 25 Aug 2020 13:38:52 +0300 Subject: [PATCH 2/2] - DHCP: fix crash after adding static lease which replaces the dynamic one --- dhcpd/v4.go | 3 +++ dhcpd/v6.go | 3 +++ 2 files changed, 6 insertions(+) diff --git a/dhcpd/v4.go b/dhcpd/v4.go index b283079a..997b69f8 100644 --- a/dhcpd/v4.go +++ b/dhcpd/v4.go @@ -146,6 +146,9 @@ func (s *v4Server) rmDynamicLease(lease Lease) error { } s.leaseRemoveSwapByIndex(i) + if i == len(s.leases) { + break + } l = s.leases[i] } diff --git a/dhcpd/v6.go b/dhcpd/v6.go index 8f042e25..5259777a 100644 --- a/dhcpd/v6.go +++ b/dhcpd/v6.go @@ -134,6 +134,9 @@ func (s *v6Server) rmDynamicLease(lease Lease) error { } s.leaseRemoveSwapByIndex(i) + if i == len(s.leases) { + break + } l = s.leases[i] }