* 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
This commit is contained in:
Simon Zolin 2020-08-24 13:01:55 +03:00
parent cb6ca3b0c4
commit 719ef16b93
2 changed files with 40 additions and 12 deletions

View File

@ -51,7 +51,6 @@ const (
LeaseChangedAdded = iota LeaseChangedAdded = iota
LeaseChangedAddedStatic LeaseChangedAddedStatic
LeaseChangedRemovedStatic LeaseChangedRemovedStatic
LeaseChangedBlacklisted
LeaseChangedDBStore LeaseChangedDBStore
) )

View File

@ -365,8 +365,6 @@ func (s *v4Server) processDiscover(req *dhcpv4.DHCPv4, resp *dhcpv4.DHCPv4) *Lea
s.conf.notify(LeaseChangedDBStore) s.conf.notify(LeaseChangedDBStore)
// s.conf.notify(LeaseChangedBlacklisted)
} else { } else {
reqIP := req.Options.Get(dhcpv4.OptionRequestedIPAddress) reqIP := req.Options.Get(dhcpv4.OptionRequestedIPAddress)
if len(reqIP) != 0 && 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)) resp.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeOffer))
return lease 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 // Process Request request and return lease
// Return false if we don't need to reply // Return false if we don't need to reply
func (s *v4Server) processRequest(req *dhcpv4.DHCPv4, resp *dhcpv4.DHCPv4) (*Lease, bool) { 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 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 lease = l
break break
} }
@ -432,7 +451,17 @@ func (s *v4Server) processRequest(req *dhcpv4.DHCPv4, resp *dhcpv4.DHCPv4) (*Lea
} }
if lease.Expiry.Unix() != leaseExpireStatic { if lease.Expiry.Unix() != leaseExpireStatic {
lease.Hostname = string(hostname)
s.commitLease(lease) 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)) resp.UpdateOption(dhcpv4.OptMessageType(dhcpv4.MessageTypeAck))