@@ -18,6 +18,7 @@ struct event *server_listen_event;
18
18
struct event_base *base;
19
19
struct event *ev_sigint;
20
20
struct event *ev_sigterm;
21
+ static std::string counter_table = " DHCPv6_COUNTER_TABLE|" ;
21
22
22
23
/* DHCPv6 filter */
23
24
/* sudo tcpdump -dd "ip6 dst ff02::1:2 && udp dst port 547" */
@@ -325,12 +326,12 @@ int sock_open(int ifindex, const struct sock_fprog *fprog)
325
326
*
326
327
* @return none
327
328
*/
328
- void prepare_relay_config (relay_config *interface_config, int local_sock, int filter) {
329
+ void prepare_relay_config (relay_config *interface_config, int * local_sock, int filter) {
329
330
struct ifaddrs *ifa, *ifa_tmp;
330
331
sockaddr_in6 non_link_local;
331
332
sockaddr_in6 link_local;
332
333
333
- interface_config->local_sock = local_sock;
334
+ interface_config->local_sock = * local_sock;
334
335
interface_config->filter = filter;
335
336
336
337
for (auto server: interface_config->servers ) {
@@ -376,22 +377,20 @@ void prepare_relay_config(relay_config *interface_config, int local_sock, int fi
376
377
}
377
378
378
379
/* *
379
- * @code prepare_socket(int *local_sock, relay_config *config );
380
+ * @code prepare_socket(int *local_sock);
380
381
*
381
382
* @brief prepare L3 socket for sending
382
383
*
383
384
* @param local_sock pointer to socket to be prepared
384
- * @param config relay config that contains strings of server and interface addresses
385
385
*
386
386
* @return none
387
387
*/
388
- void prepare_socket (int *local_sock, relay_config *config, int index ) {
388
+ void prepare_socket (int *local_sock) {
389
389
int flag = 1 ;
390
390
sockaddr_in6 addr;
391
391
memset (&addr, 0 , sizeof (addr));
392
392
addr.sin6_family = AF_INET6;
393
393
addr.sin6_addr = in6addr_any;
394
- addr.sin6_scope_id = index ;
395
394
addr.sin6_port = htons (RELAY_PORT);
396
395
397
396
if ((*local_sock = socket (AF_INET6, SOCK_DGRAM, 0 )) == -1 ) {
@@ -434,11 +433,6 @@ void relay_client(int sock, const uint8_t *msg, int32_t len, const ip6_hdr *ip_h
434
433
memcpy (current_buffer_position, &new_message, sizeof (dhcpv6_relay_msg));
435
434
current_buffer_position += sizeof (dhcpv6_relay_msg);
436
435
437
-
438
- auto dhcp_message_length = len;
439
- relay_forward (current_buffer_position, parse_dhcpv6_hdr (msg), dhcp_message_length);
440
- current_buffer_position += dhcp_message_length + sizeof (dhcpv6_option);
441
-
442
436
if (config->is_option_79 ) {
443
437
linklayer_addr_option option79;
444
438
option79.link_layer_type = htons (1 );
@@ -447,10 +441,14 @@ void relay_client(int sock, const uint8_t *msg, int32_t len, const ip6_hdr *ip_h
447
441
448
442
memcpy (current_buffer_position, &option79, sizeof (linklayer_addr_option));
449
443
current_buffer_position += sizeof (linklayer_addr_option);
444
+
445
+ memcpy (current_buffer_position, ðer_hdr->ether_shost , sizeof (ether_hdr->ether_shost ));
446
+ current_buffer_position += sizeof (ether_hdr->ether_shost );
450
447
}
451
448
452
- memcpy (current_buffer_position, ðer_hdr->ether_shost , sizeof (ether_hdr->ether_shost ));
453
- current_buffer_position += sizeof (ether_hdr->ether_shost );
449
+ auto dhcp_message_length = len;
450
+ relay_forward (current_buffer_position, parse_dhcpv6_hdr (msg), dhcp_message_length);
451
+ current_buffer_position += dhcp_message_length + sizeof (dhcpv6_option);
454
452
455
453
for (auto server: config->servers_sock ) {
456
454
send_udp (sock, buffer, server, current_buffer_position - buffer);
@@ -546,11 +544,23 @@ void callback(evutil_socket_t fd, short event, void *arg) {
546
544
547
545
auto msg = parse_dhcpv6_hdr (current_position);
548
546
counters[msg->msg_type ]++;
549
- update_counter (config->db , config->counterVlan , msg->msg_type );
547
+ std::string counterVlan = counter_table;
548
+ update_counter (config->db , counterVlan.append (config->interface ), msg->msg_type );
550
549
551
550
relay_client (config->local_sock , current_position, ntohs (udp_header->len ) - sizeof (udphdr), ip_header, ether_header, config);
552
551
}
553
552
553
+ /* *
554
+ * @code void server_callback(evutil_socket_t fd, short event, void *arg);
555
+ *
556
+ * @brief callback for libevent that is called everytime data is received at the server socket
557
+ *
558
+ * @param fd filter socket
559
+ * @param event libevent triggered event
560
+ * @param arg callback argument provided by user
561
+ *
562
+ * @return none
563
+ */
554
564
void server_callback (evutil_socket_t fd, short event, void *arg) {
555
565
struct relay_config *config = (struct relay_config *)arg;
556
566
sockaddr_in6 from;
@@ -563,9 +573,9 @@ void server_callback(evutil_socket_t fd, short event, void *arg) {
563
573
}
564
574
565
575
auto msg = parse_dhcpv6_hdr (message_buffer);
566
-
567
576
counters[msg->msg_type ]++;
568
- update_counter (config->db , config->counterVlan , msg->msg_type );
577
+ std::string counterVlan = counter_table;
578
+ update_counter (config->db , counterVlan.append (config->interface ), msg->msg_type );
569
579
if (msg->msg_type == DHCPv6_MESSAGE_TYPE_RELAY_REPL) {
570
580
relay_relay_reply (config->local_sock , message_buffer, data, config);
571
581
}
@@ -673,17 +683,16 @@ void loop_relay(std::vector<relay_config> *vlans, swss::DBConnector *db) {
673
683
int index = if_nametoindex (ifname);
674
684
config.db = db;
675
685
676
- config.counterVlan = " DHCPv6_COUNTER_TABLE|" ;
677
- config.counterVlan .append (ifname);
678
- initialize_counter (config.db , config.counterVlan );
686
+ std::string counterVlan = counter_table;
687
+ initialize_counter (config.db , counterVlan.append (config.interface ));
679
688
680
689
filter = sock_open (index , ðer_relay_fprog);
681
690
682
- prepare_socket (&local_sock, &config, index );
691
+ prepare_socket (&local_sock);
683
692
sockets.push_back (filter);
684
693
sockets.push_back (local_sock);
685
694
686
- prepare_relay_config (&config, local_sock, filter);
695
+ prepare_relay_config (&config, & local_sock, filter);
687
696
688
697
evutil_make_listen_socket_reuseable (filter);
689
698
evutil_make_socket_nonblocking (filter);
0 commit comments