Skip to content

Commit 33d8436

Browse files
author
jcaiMR
committed
fix dhcpv6 relay dual tor source interface selection issue
1 parent 511ef96 commit 33d8436

File tree

7 files changed

+556
-204
lines changed

7 files changed

+556
-204
lines changed

src/config_interface.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,21 @@ void handleRelayNotification(swss::SubscriberStateTable &ipHelpersTable, std::un
108108
void processRelayNotification(std::deque<swss::KeyOpFieldsValuesTuple> &entries, std::unordered_map<std::string, relay_config> &vlans)
109109
{
110110
std::vector<std::string> servers;
111+
bool option_79_default = true;
112+
bool interface_id_default = false;
113+
114+
if (dual_tor_sock) {
115+
interface_id_default = true;
116+
}
111117

112118
for (auto &entry: entries) {
113119
std::string vlan = kfvKey(entry);
114120
std::string operation = kfvOp(entry);
115121
std::vector<swss::FieldValueTuple> fieldValues = kfvFieldsValues(entry);
116122

117123
relay_config intf;
118-
intf.is_option_79 = true;
119-
intf.is_interface_id = false;
124+
intf.is_option_79 = option_79_default;
125+
intf.is_interface_id = interface_id_default;
120126
intf.interface = vlan;
121127
intf.mux_key = "";
122128
intf.state_db = nullptr;

src/config_interface.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
#include "select.h"
88
#include "relay.h"
99

10+
extern bool dual_tor_sock;
11+
1012
struct swssNotification {
1113
std::unordered_map<std::string, relay_config> vlans;
1214
swss::SubscriberStateTable *ipHelpersTable;
1315
};
16+
1417
/**
1518
* @code void initialize_swss()
1619
*

src/main.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,32 @@
44
#include "config_interface.h"
55

66
bool dual_tor_sock = false;
7+
char loopback[IF_NAMESIZE] = "Loopback0";
78

89
static void usage()
910
{
10-
printf("Usage: ./dhcp6relay {-d}\n");
11-
printf("\t-d: enable dual tor option\n");
11+
printf("Usage: ./dhcp6relay [-u <loopback interface>]\n");
12+
printf("\tloopback interface: is the loopback interface for dual tor setup\n");
1213
}
1314

1415
int main(int argc, char *argv[]) {
15-
if (argc > 1) {
16+
if (argc > 2) {
1617
switch (argv[1][1])
1718
{
18-
case 'd':
19+
case 'u':
20+
if (strlen(argv[2]) != 0 && strlen(argv[2]) < IF_NAMESIZE) {
21+
std::memset(loopback, 0, IF_NAMESIZE);
22+
std::memcpy(loopback, argv[2], strlen(argv[2]));
23+
} else {
24+
syslog(LOG_ERR, "loopback interface name over length %d.\n", IF_NAMESIZE);
25+
return 1;
26+
}
1927
dual_tor_sock = true;
2028
break;
2129
default:
2230
fprintf(stderr, "%s: Unknown option\n", basename(argv[0]));
2331
usage();
32+
return 0;
2433
}
2534
}
2635
try {

0 commit comments

Comments
 (0)