Skip to content

Commit c906d4a

Browse files
pdgendtkartben
authored andcommitted
tests: net: dhcpv4: client: Test restarting DHCPv4 client
Add tests that verify the behavior of stopping and starting the DHCPv4 client. Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
1 parent 1712a93 commit c906d4a

File tree

1 file changed

+85
-35
lines changed
  • tests/net/dhcpv4/client/src

1 file changed

+85
-35
lines changed

tests/net/dhcpv4/client/src/main.c

Lines changed: 85 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,24 @@ struct dhcp_msg {
237237
static uint32_t offer_xid;
238238
static uint32_t request_xid;
239239

240+
#define EVT_ADDR_ADD BIT(0)
241+
#define EVT_ADDR_DEL BIT(1)
242+
#define EVT_DNS_SERVER1_ADD BIT(2)
243+
#define EVT_DNS_SERVER2_ADD BIT(3)
244+
#define EVT_DNS_SERVER3_ADD BIT(4)
245+
#define EVT_DHCP_START BIT(5)
246+
#define EVT_DHCP_BOUND BIT(6)
247+
#define EVT_DHCP_STOP BIT(7)
248+
#define EVT_OPTION_DOMAIN BIT(8)
249+
#define EVT_OPTION_POP3 BIT(9)
250+
#define EVT_VENDOR_STRING BIT(10)
251+
#define EVT_VENDOR_BYTE BIT(11)
252+
#define EVT_VENDOR_EMPTY BIT(12)
253+
#define EVT_DHCP_OFFER BIT(13)
254+
#define EVT_DHCP_ACK BIT(14)
255+
256+
static K_EVENT_DEFINE(events);
257+
240258
#define WAIT_TIME K_SECONDS(CONFIG_NET_DHCPV4_INITIAL_DELAY_MAX + 1)
241259

242260
struct net_dhcpv4_context {
@@ -437,12 +455,14 @@ static int tester_send(const struct device *dev, struct net_pkt *pkt)
437455
if (!rpkt) {
438456
return -EINVAL;
439457
}
458+
k_event_post(&events, EVT_DHCP_OFFER);
440459
} else if (msg.type == REQUEST) {
441460
/* Reply with DHCPv4 ACK message */
442461
rpkt = prepare_dhcp_ack(net_pkt_iface(pkt), msg.xid);
443462
if (!rpkt) {
444463
return -EINVAL;
445464
}
465+
k_event_post(&events, EVT_DHCP_ACK);
446466
} else {
447467
/* Invalid message type received */
448468
return -EINVAL;
@@ -484,20 +504,6 @@ static struct net_dhcpv4_option_callback opt_vs_empty_cb;
484504
static struct net_dhcpv4_option_callback opt_vs_invalid_cb;
485505
#endif
486506

487-
#define EVT_ADDR_ADD BIT(0)
488-
#define EVT_DNS_SERVER1_ADD BIT(1)
489-
#define EVT_DNS_SERVER2_ADD BIT(2)
490-
#define EVT_DNS_SERVER3_ADD BIT(3)
491-
#define EVT_DHCP_START BIT(4)
492-
#define EVT_DHCP_BOUND BIT(5)
493-
#define EVT_OPTION_DOMAIN BIT(6)
494-
#define EVT_OPTION_POP3 BIT(7)
495-
#define EVT_VENDOR_STRING BIT(8)
496-
#define EVT_VENDOR_BYTE BIT(9)
497-
#define EVT_VENDOR_EMPTY BIT(10)
498-
499-
static K_EVENT_DEFINE(events);
500-
501507
static void receiver_cb(uint64_t nm_event, struct net_if *iface, void *info, size_t info_length,
502508
void *user_data)
503509
{
@@ -517,6 +523,9 @@ static void receiver_cb(uint64_t nm_event, struct net_if *iface, void *info, siz
517523
zassert_mem_equal(info, &ip_addr, sizeof(struct in_addr));
518524
k_event_post(&events, EVT_ADDR_ADD);
519525
break;
526+
case NET_EVENT_IPV4_ADDR_DEL:
527+
k_event_post(&events, EVT_ADDR_DEL);
528+
break;
520529
case NET_EVENT_DNS_SERVER_ADD:
521530
zassert_equal(info_length, sizeof(struct sockaddr));
522531
if (net_sin(info)->sin_addr.s_addr == dns_addrs[0].s_addr) {
@@ -535,13 +544,19 @@ static void receiver_cb(uint64_t nm_event, struct net_if *iface, void *info, siz
535544
case NET_EVENT_IPV4_DHCP_BOUND:
536545
k_event_post(&events, EVT_DHCP_BOUND);
537546
break;
547+
case NET_EVENT_IPV4_DHCP_STOP:
548+
k_event_post(&events, EVT_DHCP_STOP);
549+
break;
538550
}
539551
}
540552

541-
NET_MGMT_REGISTER_EVENT_HANDLER(rx_cb, NET_EVENT_IPV4_ADDR_ADD, receiver_cb, NULL);
553+
NET_MGMT_REGISTER_EVENT_HANDLER(rx_cb, NET_EVENT_IPV4_ADDR_ADD | NET_EVENT_IPV4_ADDR_DEL,
554+
receiver_cb, NULL);
542555
NET_MGMT_REGISTER_EVENT_HANDLER(dns_cb, NET_EVENT_DNS_SERVER_ADD | NET_EVENT_DNS_SERVER_DEL,
543556
receiver_cb, NULL);
544-
NET_MGMT_REGISTER_EVENT_HANDLER(dhcp_cb, NET_EVENT_IPV4_DHCP_START | NET_EVENT_IPV4_DHCP_BOUND,
557+
NET_MGMT_REGISTER_EVENT_HANDLER(dhcp_cb,
558+
NET_EVENT_IPV4_DHCP_START | NET_EVENT_IPV4_DHCP_BOUND |
559+
NET_EVENT_IPV4_DHCP_STOP,
545560
receiver_cb, NULL);
546561

547562
#ifdef CONFIG_NET_DHCPV4_OPTION_CALLBACKS
@@ -709,35 +724,70 @@ ZTEST(dhcpv4_tests, test_dhcp)
709724
zassert_true(false, "Interface not available");
710725
}
711726

712-
net_dhcpv4_start(iface);
727+
for (int loop = 0; loop < 2; ++loop) {
728+
LOG_DBG("Running DHCPv4 loop %d", loop);
729+
net_dhcpv4_start(iface);
713730

714-
evt = k_event_wait(&events, EVT_DHCP_START, false, WAIT_TIME);
715-
zassert_equal(evt, EVT_DHCP_START, "Missing DHCP start");
731+
evt = k_event_wait(&events, EVT_DHCP_START, false, WAIT_TIME);
732+
zassert_equal(evt, EVT_DHCP_START, "Missing DHCP start");
716733

717734
#ifdef CONFIG_NET_DHCPV4_OPTION_CALLBACKS
718-
evt = k_event_wait_all(&events, EVT_OPTION_DOMAIN | EVT_OPTION_POP3, false, WAIT_TIME);
719-
zassert_equal(evt, EVT_OPTION_DOMAIN | EVT_OPTION_POP3, "Missing DHCP option(s) %08x", evt);
735+
evt = k_event_wait_all(&events, EVT_OPTION_DOMAIN | EVT_OPTION_POP3, false,
736+
WAIT_TIME);
737+
zassert_equal(evt, EVT_OPTION_DOMAIN | EVT_OPTION_POP3,
738+
"Missing DHCP option(s) %08x", evt);
720739
#endif
721740

722741
#ifdef CONFIG_NET_DHCPV4_OPTION_CALLBACKS_VENDOR_SPECIFIC
723-
evt = k_event_wait_all(&events, EVT_VENDOR_STRING | EVT_VENDOR_BYTE | EVT_VENDOR_EMPTY,
724-
false, WAIT_TIME);
725-
zassert_equal(evt, EVT_VENDOR_STRING | EVT_VENDOR_BYTE | EVT_VENDOR_EMPTY,
726-
"Missing DHCP vendor option(s) %08x", evt);
742+
evt = k_event_wait_all(&events,
743+
EVT_VENDOR_STRING | EVT_VENDOR_BYTE | EVT_VENDOR_EMPTY,
744+
false, WAIT_TIME);
745+
zassert_equal(evt, EVT_VENDOR_STRING | EVT_VENDOR_BYTE | EVT_VENDOR_EMPTY,
746+
"Missing DHCP vendor option(s) %08x", evt);
727747
#endif
728748

729-
evt = k_event_wait_all(&events,
730-
EVT_DNS_SERVER1_ADD | EVT_DNS_SERVER2_ADD | EVT_DNS_SERVER3_ADD,
731-
false, WAIT_TIME);
732-
zassert_equal(evt, EVT_DNS_SERVER1_ADD | EVT_DNS_SERVER2_ADD | EVT_DNS_SERVER3_ADD,
733-
"Missing DNS server(s) %08x", evt);
749+
if (loop == 0) {
750+
/* Associated DNS servers aren't deleted on DHCP stop */
751+
evt = k_event_wait_all(&events,
752+
EVT_DNS_SERVER1_ADD | EVT_DNS_SERVER2_ADD |
753+
EVT_DNS_SERVER3_ADD,
754+
false, WAIT_TIME);
755+
zassert_equal(evt,
756+
EVT_DNS_SERVER1_ADD | EVT_DNS_SERVER2_ADD |
757+
EVT_DNS_SERVER3_ADD,
758+
"Missing DNS server(s) %08x", evt);
759+
}
760+
761+
evt = k_event_wait(&events, EVT_DHCP_BOUND, false, WAIT_TIME);
762+
zassert_equal(evt, EVT_DHCP_BOUND, "Missing DHCP bound");
734763

735-
evt = k_event_wait(&events, EVT_DHCP_BOUND, false, WAIT_TIME);
736-
zassert_equal(evt, EVT_DHCP_BOUND, "Missing DHCP bound");
764+
if (loop == 0 || !IS_ENABLED(CONFIG_NET_DHCPV4_INIT_REBOOT)) {
765+
evt = k_event_wait_all(&events, EVT_DHCP_OFFER | EVT_DHCP_ACK, false,
766+
WAIT_TIME);
767+
zassert_equal(evt, EVT_DHCP_OFFER | EVT_DHCP_ACK,
768+
"Missing offer or ack %08x", evt);
737769

738-
/* Verify that Request xid matched Offer xid. */
739-
zassert_equal(offer_xid, request_xid, "Offer/Request xid mismatch, "
740-
"Offer 0x%08x, Request 0x%08x", offer_xid, request_xid);
770+
/* Verify that Request xid matched Offer xid. */
771+
zassert_equal(offer_xid, request_xid,
772+
"Offer/Request xid mismatch, "
773+
"Offer 0x%08x, Request 0x%08x",
774+
offer_xid, request_xid);
775+
} else {
776+
/* An init-reboot was done */
777+
evt = k_event_wait(&events, EVT_DHCP_OFFER | EVT_DHCP_ACK, false,
778+
WAIT_TIME);
779+
zassert_equal(evt, EVT_DHCP_ACK, "Ack only expected %08x", evt);
780+
}
781+
782+
/* Clear all events */
783+
k_event_set(&events, 0U);
784+
785+
net_dhcpv4_stop(iface);
786+
787+
evt = k_event_wait_all(&events, EVT_DHCP_STOP | EVT_ADDR_DEL, false, WAIT_TIME);
788+
zassert_equal(evt, EVT_DHCP_STOP | EVT_ADDR_DEL,
789+
"Missing DHCP stop or deleted address");
790+
}
741791
}
742792

743793
/**test case main entry */

0 commit comments

Comments
 (0)