From 48f1fa91037af5908d6f38ca03b7c1d793a8087e Mon Sep 17 00:00:00 2001 From: soypat Date: Fri, 20 Jun 2025 13:51:10 -0300 Subject: [PATCH] fix DHCP client and finish tests --- dhcpv4/client.go | 4 ++-- dhcpv4/dhcp_test.go | 24 +++++++++++++++++++----- dhcpv4/server.go | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/dhcpv4/client.go b/dhcpv4/client.go index 2bdf3e3..4c4c4be 100644 --- a/dhcpv4/client.go +++ b/dhcpv4/client.go @@ -246,8 +246,8 @@ func (c *Client) setHeader(frm Frame) { frm.SetXID(c.currentXID) frm.SetHardware(1, 6, 0) frm.SetSecs(1) - if c.state == StateBound { - // copy(frm.CIAddr()[:], c.offer[:]) + if c.state == StateRequesting || c.state == StateSelecting || c.state == StateBound || c.state == StateRenewing { + copy(frm.CIAddr()[:], c.offer[:]) } copy(frm.SIAddr()[:], c.svip[:]) copy(frm.YIAddr()[:], c.offer[:]) diff --git a/dhcpv4/dhcp_test.go b/dhcpv4/dhcp_test.go index a291f3c..d76f31e 100644 --- a/dhcpv4/dhcp_test.go +++ b/dhcpv4/dhcp_test.go @@ -32,7 +32,7 @@ func TestClientServer(t *testing.T) { if err != nil { t.Fatal(err) } else if n == 0 { - t.Fatal("no data exchanged") + t.Fatal("no client discover") } assertClState(StateSelecting) err = sv.Demux(buf[:n], 0) @@ -44,23 +44,37 @@ func TestClientServer(t *testing.T) { if err != nil { t.Fatal(err) } else if n == 0 { - t.Fatal("no data exchanged") + t.Fatal("no server offer") } err = cl.Demux(buf[:n], 0) if err != nil { t.Fatal(err) } - assertClState(StateRequesting) + assertClState(StateSelecting) - // CLIENT SEND OUT ACK. + // CLIENT SEND OUT REQUEST. n, err = cl.Encapsulate(buf[:], 0) if err != nil { t.Fatal(err) } else if n == 0 { - t.Fatal("no data exchanged") + t.Fatal("no client request") } + assertClState(StateRequesting) err = sv.Demux(buf[:n], 0) if err != nil { t.Fatal(err) } + + // SERVER REPLIES WITH ACK. + n, err = sv.Encapsulate(buf[:], 0) + if err != nil { + t.Fatal(err) + } else if n == 0 { + t.Fatal("no server reply") + } + err = cl.Demux(buf[:n], 0) + if err != nil { + t.Fatal(err) + } + assertClState(StateBound) } diff --git a/dhcpv4/server.go b/dhcpv4/server.go index 8c80202..a0e0b43 100644 --- a/dhcpv4/server.go +++ b/dhcpv4/server.go @@ -140,7 +140,7 @@ func (sv *Server) Demux(carrierData []byte, frameOffset int) error { err = errors.New("DHCP request unexpected state") break } - client.state = StateBound + client.state = StateRequesting sv.pending++ default: