dhcp: set client id (option 61), some routers need it
E.g. /etc/kresd/dhcp_host_domain_ng.sh on a turris omnia incorrectly deletes DHCP hostname mappings when more than one client does not send a client id.
This commit is contained in:
parent
3ed1e381b5
commit
6127f9566e
@ -32,6 +32,8 @@ func parseDHCPDuration(b []byte) time.Duration {
|
||||
var (
|
||||
defaultDst = net.IP([]byte{0, 0, 0, 0})
|
||||
defaultNetmask = net.IPMask([]byte{0, 0, 0, 0})
|
||||
|
||||
hardwareAddr net.HardwareAddr
|
||||
)
|
||||
|
||||
func addHostname(p *dhcp4.Packet) {
|
||||
@ -50,11 +52,19 @@ func addHostname(p *dhcp4.Packet) {
|
||||
p.AddOption(dhcp4.OptionHostName, nnb)
|
||||
}
|
||||
|
||||
func addClientId(p *dhcp4.Packet) {
|
||||
id := make([]byte, len(hardwareAddr)+1)
|
||||
id[0] = 1 // hardware type ethernet, https://tools.ietf.org/html/rfc1700
|
||||
copy(id[1:], hardwareAddr)
|
||||
p.AddOption(dhcp4.OptionClientIdentifier, id)
|
||||
}
|
||||
|
||||
// dhcpRequest is a copy of (dhcp4client/Client).Request which
|
||||
// includes the hostname.
|
||||
func dhcpRequest(c *dhcp4client.Client) (bool, dhcp4.Packet, error) {
|
||||
discoveryPacket := c.DiscoverPacket()
|
||||
addHostname(&discoveryPacket)
|
||||
addClientId(&discoveryPacket)
|
||||
discoveryPacket.PadToMinSize()
|
||||
|
||||
if err := c.SendPacket(discoveryPacket); err != nil {
|
||||
@ -68,6 +78,7 @@ func dhcpRequest(c *dhcp4client.Client) (bool, dhcp4.Packet, error) {
|
||||
|
||||
requestPacket := c.RequestPacket(&offerPacket)
|
||||
addHostname(&requestPacket)
|
||||
addClientId(&requestPacket)
|
||||
requestPacket.PadToMinSize()
|
||||
|
||||
if err := c.SendPacket(requestPacket); err != nil {
|
||||
@ -91,6 +102,7 @@ func dhcpRequest(c *dhcp4client.Client) (bool, dhcp4.Packet, error) {
|
||||
// includes the hostname.
|
||||
func dhcpRenew(c *dhcp4client.Client, packet dhcp4.Packet) (bool, dhcp4.Packet, error) {
|
||||
addHostname(&packet)
|
||||
addClientId(&packet)
|
||||
packet.PadToMinSize()
|
||||
|
||||
if err := c.SendPacket(packet); err != nil {
|
||||
@ -139,6 +151,8 @@ func main() {
|
||||
time.Sleep(1 * time.Second)
|
||||
}
|
||||
|
||||
hardwareAddr = eth0.HardwareAddr
|
||||
|
||||
pktsock, err := dhcp4client.NewPacketSock(eth0.Index)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
|
Loading…
x
Reference in New Issue
Block a user