From 719ef16b93e149d18558401aa87a7544b2b1cd31 Mon Sep 17 00:00:00 2001 From: Simon Zolin Date: Mon, 24 Aug 2020 13:01:55 +0300 Subject: [PATCH] * 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))