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 (
|
var (
|
||||||
defaultDst = net.IP([]byte{0, 0, 0, 0})
|
defaultDst = net.IP([]byte{0, 0, 0, 0})
|
||||||
defaultNetmask = net.IPMask([]byte{0, 0, 0, 0})
|
defaultNetmask = net.IPMask([]byte{0, 0, 0, 0})
|
||||||
|
|
||||||
|
hardwareAddr net.HardwareAddr
|
||||||
)
|
)
|
||||||
|
|
||||||
func addHostname(p *dhcp4.Packet) {
|
func addHostname(p *dhcp4.Packet) {
|
||||||
@ -50,11 +52,19 @@ func addHostname(p *dhcp4.Packet) {
|
|||||||
p.AddOption(dhcp4.OptionHostName, nnb)
|
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
|
// dhcpRequest is a copy of (dhcp4client/Client).Request which
|
||||||
// includes the hostname.
|
// includes the hostname.
|
||||||
func dhcpRequest(c *dhcp4client.Client) (bool, dhcp4.Packet, error) {
|
func dhcpRequest(c *dhcp4client.Client) (bool, dhcp4.Packet, error) {
|
||||||
discoveryPacket := c.DiscoverPacket()
|
discoveryPacket := c.DiscoverPacket()
|
||||||
addHostname(&discoveryPacket)
|
addHostname(&discoveryPacket)
|
||||||
|
addClientId(&discoveryPacket)
|
||||||
discoveryPacket.PadToMinSize()
|
discoveryPacket.PadToMinSize()
|
||||||
|
|
||||||
if err := c.SendPacket(discoveryPacket); err != nil {
|
if err := c.SendPacket(discoveryPacket); err != nil {
|
||||||
@ -68,6 +78,7 @@ func dhcpRequest(c *dhcp4client.Client) (bool, dhcp4.Packet, error) {
|
|||||||
|
|
||||||
requestPacket := c.RequestPacket(&offerPacket)
|
requestPacket := c.RequestPacket(&offerPacket)
|
||||||
addHostname(&requestPacket)
|
addHostname(&requestPacket)
|
||||||
|
addClientId(&requestPacket)
|
||||||
requestPacket.PadToMinSize()
|
requestPacket.PadToMinSize()
|
||||||
|
|
||||||
if err := c.SendPacket(requestPacket); err != nil {
|
if err := c.SendPacket(requestPacket); err != nil {
|
||||||
@ -91,6 +102,7 @@ func dhcpRequest(c *dhcp4client.Client) (bool, dhcp4.Packet, error) {
|
|||||||
// includes the hostname.
|
// includes the hostname.
|
||||||
func dhcpRenew(c *dhcp4client.Client, packet dhcp4.Packet) (bool, dhcp4.Packet, error) {
|
func dhcpRenew(c *dhcp4client.Client, packet dhcp4.Packet) (bool, dhcp4.Packet, error) {
|
||||||
addHostname(&packet)
|
addHostname(&packet)
|
||||||
|
addClientId(&packet)
|
||||||
packet.PadToMinSize()
|
packet.PadToMinSize()
|
||||||
|
|
||||||
if err := c.SendPacket(packet); err != nil {
|
if err := c.SendPacket(packet); err != nil {
|
||||||
@ -139,6 +151,8 @@ func main() {
|
|||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hardwareAddr = eth0.HardwareAddr
|
||||||
|
|
||||||
pktsock, err := dhcp4client.NewPacketSock(eth0.Index)
|
pktsock, err := dhcp4client.NewPacketSock(eth0.Index)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user