dhcp: set hostname for renewal packets as well
Otherwise, router restarts might result in the hostname getting lost (observed using dnsmasq on OpenWrt).
This commit is contained in:
parent
3999a60a05
commit
13173460da
@ -34,9 +34,7 @@ var (
|
|||||||
defaultNetmask = net.IPMask([]byte{0, 0, 0, 0})
|
defaultNetmask = net.IPMask([]byte{0, 0, 0, 0})
|
||||||
)
|
)
|
||||||
|
|
||||||
// dhcpRequest is a copy of (dhcp4client/Client).Request which
|
func addHostname(p *dhcp4.Packet) {
|
||||||
// includes the hostname.
|
|
||||||
func dhcpRequest(c *dhcp4client.Client) (bool, dhcp4.Packet, error) {
|
|
||||||
var utsname unix.Utsname
|
var utsname unix.Utsname
|
||||||
if err := unix.Uname(&utsname); err != nil {
|
if err := unix.Uname(&utsname); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
@ -49,8 +47,14 @@ func dhcpRequest(c *dhcp4client.Client) (bool, dhcp4.Packet, error) {
|
|||||||
nnb = append(nnb, byte(i))
|
nnb = append(nnb, byte(i))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p.AddOption(dhcp4.OptionHostName, nnb)
|
||||||
|
}
|
||||||
|
|
||||||
|
// dhcpRequest is a copy of (dhcp4client/Client).Request which
|
||||||
|
// includes the hostname.
|
||||||
|
func dhcpRequest(c *dhcp4client.Client) (bool, dhcp4.Packet, error) {
|
||||||
discoveryPacket := c.DiscoverPacket()
|
discoveryPacket := c.DiscoverPacket()
|
||||||
discoveryPacket.AddOption(dhcp4.OptionHostName, nnb)
|
addHostname(&discoveryPacket)
|
||||||
discoveryPacket.PadToMinSize()
|
discoveryPacket.PadToMinSize()
|
||||||
|
|
||||||
if err := c.SendPacket(discoveryPacket); err != nil {
|
if err := c.SendPacket(discoveryPacket); err != nil {
|
||||||
@ -63,7 +67,7 @@ func dhcpRequest(c *dhcp4client.Client) (bool, dhcp4.Packet, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
requestPacket := c.RequestPacket(&offerPacket)
|
requestPacket := c.RequestPacket(&offerPacket)
|
||||||
requestPacket.AddOption(dhcp4.OptionHostName, nnb)
|
addHostname(&requestPacket)
|
||||||
requestPacket.PadToMinSize()
|
requestPacket.PadToMinSize()
|
||||||
|
|
||||||
if err := c.SendPacket(requestPacket); err != nil {
|
if err := c.SendPacket(requestPacket); err != nil {
|
||||||
@ -83,6 +87,29 @@ func dhcpRequest(c *dhcp4client.Client) (bool, dhcp4.Packet, error) {
|
|||||||
return true, acknowledgement, nil
|
return true, acknowledgement, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// dhcpRenew is a copy of (dhcp4client/Client).Renew which
|
||||||
|
// includes the hostname.
|
||||||
|
func dhcpRenew(c *dhcp4client.Client, packet dhcp4.Packet) (bool, dhcp4.Packet, error) {
|
||||||
|
addHostname(&packet)
|
||||||
|
packet.PadToMinSize()
|
||||||
|
|
||||||
|
if err := c.SendPacket(packet); err != nil {
|
||||||
|
return false, packet, err
|
||||||
|
}
|
||||||
|
|
||||||
|
acknowledgement, err := c.GetAcknowledgement(&packet)
|
||||||
|
if err != nil {
|
||||||
|
return false, acknowledgement, err
|
||||||
|
}
|
||||||
|
|
||||||
|
acknowledgementOptions := acknowledgement.ParseOptions()
|
||||||
|
if dhcp4.MessageType(acknowledgementOptions[dhcp4.OptionDHCPMessageType][0]) != dhcp4.ACK {
|
||||||
|
return false, acknowledgement, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, acknowledgement, nil
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
||||||
|
|
||||||
@ -228,6 +255,6 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(renewalTime)
|
time.Sleep(renewalTime)
|
||||||
ok, ack, err = dhcp.Renew(ack)
|
ok, ack, err = dhcpRenew(dhcp, dhcp.RenewalRequestPacket(&ack))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user