
The dhcp server is systemd-networkd, and the dhcp plugin can request an ip but can not renew it. The systemd-networkd just ignore the renew request. ``` 2024/09/14 21:46:00 no DHCP packet received within 10s 2024/09/14 21:46:00 retrying in 31.529038 seconds 2024/09/14 21:46:42 no DHCP packet received within 10s 2024/09/14 21:46:42 retrying in 63.150490 seconds 2024/09/14 21:47:45 98184616c91f15419f5cacd012697f85afaa2daeb5d3233e28b0ec21589fb45a/iot/eth1: no more tries 2024/09/14 21:47:45 98184616c91f15419f5cacd012697f85afaa2daeb5d3233e28b0ec21589fb45a/iot/eth1: renewal time expired, rebinding 2024/09/14 21:47:45 Link "eth1" down. Attempting to set up 2024/09/14 21:47:45 98184616c91f15419f5cacd012697f85afaa2daeb5d3233e28b0ec21589fb45a/iot/eth1: lease rebound, expiration is 2024-09-14 22:47:45.309270751 +0800 CST m=+11730.048516519 ``` Follow the https://datatracker.ietf.org/doc/html/rfc2131#section-4.3.6, following options must not be sent in renew - Requested IP Address - Server Identifier Since the upstream code has been inactive for 6 years, we should switch to another dhcpv4 library. The new selected one is https://github.com/insomniacslk/dhcp. Signed-off-by: Songmin Li <lisongmin@protonmail.com>
63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package dhcpv4
|
|
|
|
import (
|
|
"net"
|
|
|
|
"github.com/u-root/uio/uio"
|
|
)
|
|
|
|
// IP implements DHCPv4 IP option marshaling and unmarshaling as described by
|
|
// RFC 2132, Sections 5.3, 9.1, 9.7, and others.
|
|
type IP net.IP
|
|
|
|
// FromBytes parses an IP from data in binary form.
|
|
func (i *IP) FromBytes(data []byte) error {
|
|
buf := uio.NewBigEndianBuffer(data)
|
|
*i = IP(buf.CopyN(net.IPv4len))
|
|
return buf.FinError()
|
|
}
|
|
|
|
// ToBytes returns a serialized stream of bytes for this option.
|
|
func (i IP) ToBytes() []byte {
|
|
return []byte(net.IP(i).To4())
|
|
}
|
|
|
|
// String returns a human-readable IP.
|
|
func (i IP) String() string {
|
|
return net.IP(i).String()
|
|
}
|
|
|
|
// GetIP returns code out of o parsed as an IP.
|
|
func GetIP(code OptionCode, o Options) net.IP {
|
|
v := o.Get(code)
|
|
if v == nil {
|
|
return nil
|
|
}
|
|
var ip IP
|
|
if err := ip.FromBytes(v); err != nil {
|
|
return nil
|
|
}
|
|
return net.IP(ip)
|
|
}
|
|
|
|
// OptBroadcastAddress returns a new DHCPv4 Broadcast Address option.
|
|
//
|
|
// The broadcast address option is described in RFC 2132, Section 5.3.
|
|
func OptBroadcastAddress(ip net.IP) Option {
|
|
return Option{Code: OptionBroadcastAddress, Value: IP(ip)}
|
|
}
|
|
|
|
// OptRequestedIPAddress returns a new DHCPv4 Requested IP Address option.
|
|
//
|
|
// The requested IP address option is described by RFC 2132, Section 9.1.
|
|
func OptRequestedIPAddress(ip net.IP) Option {
|
|
return Option{Code: OptionRequestedIPAddress, Value: IP(ip)}
|
|
}
|
|
|
|
// OptServerIdentifier returns a new DHCPv4 Server Identifier option.
|
|
//
|
|
// The server identifier option is described by RFC 2132, Section 9.7.
|
|
func OptServerIdentifier(ip net.IP) Option {
|
|
return Option{Code: OptionServerIdentifier, Value: IP(ip)}
|
|
}
|