-
Notifications
You must be signed in to change notification settings - Fork 10
Open
Description
Context
In #79 we added support for running in proxyDHCP mode on port 4011. So far so good.
The problem
However, the expected behaviour is slightly different in this scenario, in that when running on 4011, it's not getting a DHCPDISCOVER any more, it's getting DHCPREQUEST directly.
As per the specs:
Hence, we need to account for that in the code.
The solution
This is simply fixed by accepting discover or request depending on which port is used, for example:
diff --git a/internal/provider/dhcp/proxy.go b/internal/provider/dhcp/proxy.go
index 3c2ab3b..5ec8eab 100644
--- a/internal/provider/dhcp/proxy.go
+++ b/internal/provider/dhcp/proxy.go
@@ -126,7 +126,7 @@ func (p *Proxy) handlePacket() func(conn net.PacketConn, peer net.Addr, m *dhcpv
return func(conn net.PacketConn, peer net.Addr, m *dhcpv4.DHCPv4) {
logger := p.logger.With(zap.String("source", m.ClientHWAddr.String()))
- if err := isBootDHCP(m); err != nil {
+ if err := isBootDHCP(m, p.proxyPort == 4011); err != nil {
logger.Debug("ignoring packet", zap.Error(err))
return
@@ -155,10 +155,16 @@ func (p *Proxy) handlePacket() func(conn net.PacketConn, peer net.Addr, m *dhcpv
}
}
-func isBootDHCP(pkt *dhcpv4.DHCPv4) error {
- if pkt.MessageType() != dhcpv4.MessageTypeDiscover {
+func isBootDHCP(pkt *dhcpv4.DHCPv4, isSeparateServer bool) error {
+ // see page 17 of the spec https://people.dsv.su.se/~icss-jpc/exjobb/pxespec.pdf
+ // if running on 67, should respond to Discover
+ // if running on 4011, should responsd to Request
+ if !isSeparateServer && pkt.MessageType() != dhcpv4.MessageTypeDiscover {
return fmt.Errorf("packet is %s, not %s", pkt.MessageType(), dhcpv4.MessageTypeDiscover)
}
+ if isSeparateServer && pkt.MessageType() != dhcpv4.MessageTypeRequest {
+ return fmt.Errorf("packet is %s, not %s", pkt.MessageType(), dhcpv4.MessageTypeRequest)
+ }
if pkt.Options[93] == nil {
return errors.New("not a PXE boot request (missing option 93)")
logaritmisk
Metadata
Metadata
Assignees
Labels
No labels