@@ -442,6 +442,9 @@ void recv_dhcp_relay_msg(void *cb_res)
442
442
443
443
msg_len = socket_recvmsg (sckt_data -> socket_id , & msghdr , NS_MSG_LEGACY0 );
444
444
445
+ // Buffer to tell additional data for the socket (such as interface ID)
446
+ uint8_t ancillary_databuffer [NS_CMSG_SPACE (sizeof (ns_in6_pktinfo_t ))];
447
+
445
448
tr_debug ("dhcp Relay recv msg" );
446
449
447
450
//Parse type
@@ -471,6 +474,25 @@ void recv_dhcp_relay_msg(void *cb_res)
471
474
msghdr .msg_iovlen = 1 ;
472
475
msg_data .iov_base = relay_msg .relay_options .msg_ptr ;
473
476
msg_data .iov_len = relay_msg .relay_options .len ;
477
+
478
+ // Append a control message to tell the socket which interface to use if option is activated
479
+ if (memcmp (src_address .address , ns_in6addr_any , 16 ) != 0 && relay_srv -> add_interface_id_option ) {
480
+ ns_cmsghdr_t * cmsg ;
481
+ ns_in6_pktinfo_t * pktinfo ;
482
+
483
+ msghdr .msg_control = ancillary_databuffer ;
484
+ msghdr .msg_controllen = sizeof (ancillary_databuffer );
485
+
486
+ cmsg = NS_CMSG_FIRSTHDR (& msghdr );
487
+ cmsg -> cmsg_type = SOCKET_IPV6_PKTINFO ;
488
+ cmsg -> cmsg_level = SOCKET_IPPROTO_IPV6 ;
489
+ cmsg -> cmsg_len = NS_CMSG_LEN (sizeof (ns_in6_pktinfo_t ));
490
+
491
+ pktinfo = (ns_in6_pktinfo_t * )NS_CMSG_DATA (cmsg );
492
+ pktinfo -> ipi6_ifindex = * relay_msg .relay_interface_id .msg_ptr ;
493
+ memset (pktinfo -> ipi6_addr , 0 , 16 ); // Don't specify address (let socket choose appropriate by routing)
494
+ }
495
+
474
496
tr_debug ("Forward Original relay msg to client" );
475
497
476
498
} else {
0 commit comments