Skip to content

Fix: accept DHCP Request when running in proxy mode on port 4011 #84

@seeker89

Description

@seeker89

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:

Image

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)")

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions