@@ -115,12 +115,29 @@ int DHCPv6_server_respond_client(dhcpv6_gua_server_entry_s *serverBase, dhcpv6_r
115115 }
116116
117117 response -> responseLength = libdhcpv6_address_reply_message_len (replyPacket -> clientDUID .duid_length , replyPacket -> serverDUID .duid_length , 0 , replyPacket -> rapidCommit , address_allocated );
118+ //Calculate DNS LIST and Vendor data lengths here
119+ response -> responseLength += libdhcpv6_dns_server_message_sizes (serverBase );
120+ response -> responseLength += libdhcpv6_vendor_data_message_sizes (serverBase );
121+
118122 response -> responsePtr = ns_dyn_mem_temporary_alloc (response -> responseLength );
119123 if (response -> responsePtr ) {
124+ uint8_t * ptr = response -> responsePtr ;
125+ //Write Generic data at beginning
126+ ptr = libdhcpv6_header_write (ptr , DHCPV6_REPLY_TYPE , replyPacket -> transaction_ID );
127+ ptr = libdhcpv6_duid_option_write (ptr , DHCPV6_SERVER_ID_OPTION , & replyPacket -> serverDUID ); //16
128+ ptr = libdhcpv6_duid_option_write (ptr , DHCPV6_CLIENT_ID_OPTION , & replyPacket -> clientDUID ); //16
120129 if (address_allocated ) {
121- libdhcpv6_reply_message_write (response -> responsePtr , replyPacket , & nonTemporalAddress , NULL );
130+ ptr = libdhcpv6_identity_association_option_write (ptr , replyPacket -> iaId , replyPacket -> T0 , replyPacket -> T1 , true);
131+ ptr = libdhcpv6_ia_address_option_write (ptr , nonTemporalAddress .requestedAddress , nonTemporalAddress .preferredLifeTime , nonTemporalAddress .validLifeTime );
132+ //Write DNS LIST and Vendor data here
133+ ptr = libdhcpv6_dns_server_message_writes (serverBase , ptr );
134+ ptr = libdhcpv6_vendor_data_message_writes (serverBase , ptr );
122135 } else {
123- libdhcpv6_reply_message_write (response -> responsePtr , replyPacket , NULL , NULL );
136+ ptr = libdhcpv6_identity_association_option_write_with_status (ptr , replyPacket -> iaId , replyPacket -> T0 , replyPacket -> T1 , DHCPV6_STATUS_NO_ADDR_AVAILABLE_CODE );
137+ }
138+
139+ if (replyPacket -> rapidCommit ) {
140+ ptr = libdhcpv6_rapid_commit_option_write (ptr );
124141 }
125142 return 0 ;
126143 }
@@ -407,6 +424,71 @@ int DHCPv6_server_service_set_address_validlifetime(int8_t interface, uint8_t gu
407424
408425 return 0 ;
409426}
427+
428+ int DHCPv6_server_service_set_dns_server (int8_t interface , uint8_t guaPrefix [static 16 ], uint8_t dns_server_address [static 16 ], uint8_t * dns_search_list_ptr , uint8_t dns_search_list_len )
429+ {
430+ dhcpv6_gua_server_entry_s * serverInfo = libdhcpv6_server_data_get_by_prefix_and_interfaceid (interface , guaPrefix );
431+ if (!serverInfo ) {
432+ return -1 ;
433+ }
434+
435+ dhcpv6_dns_server_data_t * dns_entry = libdhcpv6_dns_server_allocate (serverInfo , dns_server_address );
436+ if (!dns_entry ) {
437+ return -1 ;
438+ }
439+
440+ if (dns_entry -> search_list_length != dns_search_list_len ) {
441+ ns_dyn_mem_free (dns_entry -> search_list );
442+ dns_entry -> search_list = NULL ;
443+ dns_entry -> search_list_length = 0 ;
444+ if (dns_search_list_len ) {
445+ dns_entry -> search_list = ns_dyn_mem_alloc (dns_search_list_len );
446+ if (dns_entry -> search_list ) {
447+ dns_entry -> search_list_length = dns_search_list_len ;
448+ }
449+ }
450+ }
451+
452+ if (dns_entry -> search_list_length ) {
453+ //Copy Search List to allocated buffer
454+ memcpy (dns_entry -> search_list , dns_search_list_ptr , dns_entry -> search_list_length );
455+ }
456+
457+ return 0 ;
458+ }
459+
460+ int DHCPv6_server_service_set_vendor_data (int8_t interface , uint8_t guaPrefix [static 16 ], uint32_t enterprise_number , uint8_t * dhcp_vendor_data_ptr , uint8_t dhcp_vendor_data_len )
461+ {
462+ dhcpv6_gua_server_entry_s * serverInfo = libdhcpv6_server_data_get_by_prefix_and_interfaceid (interface , guaPrefix );
463+ if (!serverInfo ) {
464+ return -1 ;
465+ }
466+
467+ dhcpv6_vendor_data_t * vendor_data_entry = libdhcpv6_vendor_data_allocate (serverInfo , enterprise_number );
468+
469+ if (!vendor_data_entry ) {
470+ return -1 ;
471+ }
472+
473+ if (vendor_data_entry -> vendor_data_length != dhcp_vendor_data_len ) {
474+ ns_dyn_mem_free (vendor_data_entry -> vendor_data );
475+ vendor_data_entry -> vendor_data = NULL ;
476+ vendor_data_entry -> vendor_data_length = 0 ;
477+ if (dhcp_vendor_data_len ) {
478+ vendor_data_entry -> vendor_data = ns_dyn_mem_alloc (dhcp_vendor_data_len );
479+ if (vendor_data_entry -> vendor_data ) {
480+ vendor_data_entry -> vendor_data_length = dhcp_vendor_data_len ;
481+ }
482+ }
483+ }
484+
485+ if (vendor_data_entry -> vendor_data_length ) {
486+ //Copy Venfor Data to allocated buffer
487+ memcpy (vendor_data_entry -> vendor_data , dhcp_vendor_data_ptr , vendor_data_entry -> vendor_data_length );
488+ }
489+ return 0 ;
490+ }
491+
410492#else
411493
412494int DHCPv6_server_service_init (int8_t interface , uint8_t guaPrefix [static 16 ], uint8_t serverDUID [static 8 ], uint16_t serverDUIDType )
0 commit comments