@@ -237,6 +237,24 @@ struct dhcp_msg {
237
237
static uint32_t offer_xid ;
238
238
static uint32_t request_xid ;
239
239
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
+
240
258
#define WAIT_TIME K_SECONDS(CONFIG_NET_DHCPV4_INITIAL_DELAY_MAX + 1)
241
259
242
260
struct net_dhcpv4_context {
@@ -437,12 +455,14 @@ static int tester_send(const struct device *dev, struct net_pkt *pkt)
437
455
if (!rpkt ) {
438
456
return - EINVAL ;
439
457
}
458
+ k_event_post (& events , EVT_DHCP_OFFER );
440
459
} else if (msg .type == REQUEST ) {
441
460
/* Reply with DHCPv4 ACK message */
442
461
rpkt = prepare_dhcp_ack (net_pkt_iface (pkt ), msg .xid );
443
462
if (!rpkt ) {
444
463
return - EINVAL ;
445
464
}
465
+ k_event_post (& events , EVT_DHCP_ACK );
446
466
} else {
447
467
/* Invalid message type received */
448
468
return - EINVAL ;
@@ -484,20 +504,6 @@ static struct net_dhcpv4_option_callback opt_vs_empty_cb;
484
504
static struct net_dhcpv4_option_callback opt_vs_invalid_cb ;
485
505
#endif
486
506
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
-
501
507
static void receiver_cb (uint64_t nm_event , struct net_if * iface , void * info , size_t info_length ,
502
508
void * user_data )
503
509
{
@@ -517,6 +523,9 @@ static void receiver_cb(uint64_t nm_event, struct net_if *iface, void *info, siz
517
523
zassert_mem_equal (info , & ip_addr , sizeof (struct in_addr ));
518
524
k_event_post (& events , EVT_ADDR_ADD );
519
525
break ;
526
+ case NET_EVENT_IPV4_ADDR_DEL :
527
+ k_event_post (& events , EVT_ADDR_DEL );
528
+ break ;
520
529
case NET_EVENT_DNS_SERVER_ADD :
521
530
zassert_equal (info_length , sizeof (struct sockaddr ));
522
531
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
535
544
case NET_EVENT_IPV4_DHCP_BOUND :
536
545
k_event_post (& events , EVT_DHCP_BOUND );
537
546
break ;
547
+ case NET_EVENT_IPV4_DHCP_STOP :
548
+ k_event_post (& events , EVT_DHCP_STOP );
549
+ break ;
538
550
}
539
551
}
540
552
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 );
542
555
NET_MGMT_REGISTER_EVENT_HANDLER (dns_cb , NET_EVENT_DNS_SERVER_ADD | NET_EVENT_DNS_SERVER_DEL ,
543
556
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 ,
545
560
receiver_cb , NULL );
546
561
547
562
#ifdef CONFIG_NET_DHCPV4_OPTION_CALLBACKS
@@ -709,35 +724,70 @@ ZTEST(dhcpv4_tests, test_dhcp)
709
724
zassert_true (false, "Interface not available" );
710
725
}
711
726
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 );
713
730
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" );
716
733
717
734
#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 );
720
739
#endif
721
740
722
741
#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 );
727
747
#endif
728
748
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" );
734
763
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 );
737
769
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
+ }
741
791
}
742
792
743
793
/**test case main entry */
0 commit comments