@@ -237,6 +237,24 @@ struct dhcp_msg {
237237static uint32_t offer_xid ;
238238static 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
242260struct 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;
484504static 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-
501507static 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 );
542555NET_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