Skip to content

Commit f908c85

Browse files
[dhcp4relay] Smart switch support, defect fixes (#84)
* [sonic-dhcp4relay]: Defect fixes Below sonic-mgmt issues are fixed: 1. Random source port 2. Padding issues 3. DHCP Server fixes Signed-off-by: Shivashankar CR <shivashankar.c.r@gmail.com> * [sonic-dhcp4relay] Smart switch support Signed-off-by: Shivashankar CR <shivashankar.c.r@gmail.com> * Remove binary zip file and download PcapPlusPlus during build - Replace 17MB pcappp_v24.09.zip binary with wget download from GitHub - Download from official release: github.com/seladb/PcapPlusPlus/archive/refs/tags/v24.09.tar.gz - Add SHA256 checksum verification (b14998ecf5718c2bfb6f709060e53f7ef67639b98bf2222a3cd23d820d70acdc) - Fix patch file paths to apply cleanly (remove PcapPlusPlus-24.09/ prefix) - Add .gitignore to exclude downloaded artifacts Addresses review comment from saiarcot895 on PR #67 --------- Signed-off-by: Shivashankar CR <shivashankar.c.r@gmail.com> Co-authored-by: Ashutosh Agrawal <ashu@cisco.com>
1 parent d7fd4ed commit f908c85

File tree

10 files changed

+125
-29
lines changed

10 files changed

+125
-29
lines changed

dhcp4relay/.gitignore

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Build artifacts
2+
build/
3+
build-test/
4+
*.o
5+
*.d
6+
*.gcda
7+
*.gcno
8+
*.gcov
9+
*.html
10+
*.xml
11+
12+
# PcapPlusPlus downloaded files
13+
PcapPlusPlus-*/
14+
PcapPlusPlus-*.tar.gz
15+
pcappp.stamp

dhcp4relay/Makefile

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ GCOVR := gcovr
1515

1616
LD_PCAPPLUSPLUS_LIB := -lPcap++ -lPacket++ -lCommon++
1717

18-
#pcap plus plus zip file pcappp_v24.09.zip
18+
# PcapPlusPlus library configuration
1919
PCAPPPVAR := 24.09
20-
PCAPPPZIP_FILE := pcappp_v${PCAPPPVAR}.zip
20+
PCAPPP_URL := https://github.com/seladb/PcapPlusPlus/archive/refs/tags/v$(PCAPPPVAR).tar.gz
21+
PCAPPP_TARBALL := PcapPlusPlus-$(PCAPPPVAR).tar.gz
22+
PCAPPP_SHA256 := b14998ecf5718c2bfb6f709060e53f7ef67639b98bf2222a3cd23d820d70acdc
2123
PCAPPLUSPLUS_DIR := $(WORKING_DIR)/PcapPlusPlus-$(PCAPPPVAR)
2224
PCAPPP_DONE = $(WORKING_DIR)/pcappp.stamp
2325
INCLUDE_DIR = $(PCAPPLUSPLUS_DIR)/include
@@ -34,10 +36,20 @@ PWD := $(shell pwd)
3436
.PHONY: $(PCAPPP_DONE)
3537
$(PCAPPP_DONE):
3638

39+
# Download PcapPlusPlus from official GitHub release if not already present
40+
if [ ! -f $(PCAPPP_TARBALL) ]; then \
41+
echo "Downloading PcapPlusPlus v$(PCAPPPVAR)..."; \
42+
wget -O $(PCAPPP_TARBALL) $(PCAPPP_URL); \
43+
fi
44+
45+
# Verify checksum
46+
echo "$(PCAPPP_SHA256) $(PCAPPP_TARBALL)" | sha256sum -c -
47+
3748
# Remove stale files
3849
rm -rf $(PCAPPLUSPLUS_DIR)
3950

40-
unzip ${PCAPPPZIP_FILE}
51+
# Extract tarball (GitHub tarball extracts to PcapPlusPlus-<version> without 'v' prefix)
52+
tar xzf $(PCAPPP_TARBALL)
4153
pushd $(PCAPPLUSPLUS_DIR)
4254

4355
# Create a git repository here for stg to apply patches
@@ -98,6 +110,7 @@ uninstall:
98110

99111
clean:
100112
-$(RM) $(BUILD_DIR) $(BUILD_TEST_DIR) *.html *.xml
113+
-$(RM) $(PCAPPLUSPLUS_DIR) $(PCAPPP_TARBALL) $(PCAPPP_DONE)
101114
$(FIND) . -name *.gcda -exec rm -f {} \;
102115
$(FIND) . -name *.gcno -exec rm -f {} \;
103116
$(FIND) . -name *.gcov -exec rm -f {} \;

dhcp4relay/patch/0001-dhcpv4-relay-accept-random-src-port.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
diff --git a/PcapPlusPlus-24.09/Packet++/header/DhcpLayer.h b/PcapPlusPlus-24.09/Packet++/header/DhcpLayer.h
1+
diff --git a/Packet++/header/DhcpLayer.h b/Packet++/header/DhcpLayer.h
22
index 435becb..282d739 100644
3-
--- a/PcapPlusPlus-24.09/Packet++/header/DhcpLayer.h
4-
+++ b/PcapPlusPlus-24.09/Packet++/header/DhcpLayer.h
3+
--- a/Packet++/header/DhcpLayer.h
4+
+++ b/Packet++/header/DhcpLayer.h
55
@@ -881,8 +881,8 @@ namespace pcpp
66

77
bool DhcpLayer::isDhcpPorts(uint16_t portSrc, uint16_t portDst)

dhcp4relay/pcappp_v24.09.zip

-16.2 MB
Binary file not shown.

dhcp4relay/src/dhcp4_sender.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@
1616
* @param len length of message
1717
* @param src_ip source IP address as string (optional)
1818
* @param use_src_ip if true, use src_ip as source address
19+
* @param pad if true, do padding
1920
*
2021
* @return boolean True if packet successfully sent
2122
*/
2223
#ifndef UNIT_TEST
23-
bool send_udp(int sock, uint8_t *buffer, struct sockaddr_in target, uint32_t len, in_addr src_ip, bool use_src_ip) {
24+
bool send_udp(int sock, uint8_t *buffer, struct sockaddr_in target, uint32_t len, in_addr src_ip, bool use_src_ip, bool pad) {
2425
/* Pad additional bytes if length is lesser than 300
2526
* to make DHCP packet length to minimum of 300 bytes */
26-
if (len < BOOTP_MIN_LEN) {
27+
if (pad && len < BOOTP_MIN_LEN) {
2728
auto pad_len = BOOTP_MIN_LEN - len;
2829
memset(buffer+len, 0, pad_len);
2930
len = BOOTP_MIN_LEN;

dhcp4relay/src/dhcp4_sender.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
* @param len length of message
1717
* @param src_ip source IP address as string (optional)
1818
* @param use_src_ip if true, use src_ip as source address
19+
* @param pad if true, do padding
1920
*
2021
* @return boolean True if packet successfully sent
2122
*/
22-
bool send_udp(int sock, uint8_t *buffer, struct sockaddr_in target, uint32_t len, in_addr src_ip, bool use_src_ip);
23+
bool send_udp(int sock, uint8_t *buffer, struct sockaddr_in target, uint32_t len, in_addr src_ip, bool use_src_ip, bool pad);

dhcp4relay/src/dhcp4relay.cpp

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <pcapplusplus/UdpLayer.h>
1212
#include <signal.h>
1313
#include <unistd.h>
14+
#include <fstream>
1415

1516
#include "configdb.h"
1617
#include "dhcp4_sender.h"
@@ -430,9 +431,22 @@ uint8_t encode_tlv(uint8_t *buf, uint8_t t, uint8_t l, uint8_t *v) {
430431
return (l + DHCP_SUB_OPT_TLV_HEADER_LEN);
431432
}
432433

434+
std::string get_mac_address(const std::string &ifname) {
435+
std::string path = "/sys/class/net/" + ifname + "/address";
436+
std::ifstream file(path);
437+
if (!file.is_open()) {
438+
syslog(LOG_ERR, "Fetching mac address for interface %s", ifname.c_str());
439+
return "";
440+
}
441+
std::string mac;
442+
std::getline(file, mac);
443+
return mac;
444+
}
445+
433446
void encode_relay_option(pcpp::DhcpLayer *dhcp_pkt, relay_config *config) {
434447
uint8_t buf[256] = {0};
435448
uint8_t buf_offset = 0;
449+
std::string bm_mac;
436450

437451
auto vrf = vlan_vrf_map[config->vlan.c_str()];
438452

@@ -454,11 +468,22 @@ void encode_relay_option(pcpp::DhcpLayer *dhcp_pkt, relay_config *config) {
454468
(uint8_t *)circuit_id.c_str());
455469
buf_offset += offset;
456470

471+
if (!m_config.midplane_bridge.empty()) {
472+
bm_mac = get_mac_address(m_config.midplane_bridge);
473+
}
474+
457475
/* Encode remote ID sub-option */
458476
/* | 2 | 6 | my_mac| */
459-
offset = encode_tlv((buf + buf_offset), OPTION82_SUBOPT_REMOTE_ID,
460-
MAC_ADDR_STR_LEN, (uint8_t *)(m_config.host_mac_addr.c_str()));
461-
buf_offset += offset;
477+
/* if its SmartSwitch we need to fetch mac of bridge-midplane */
478+
if ((m_config.is_SmartSwitch) && (!bm_mac.empty())) {
479+
offset = encode_tlv((buf + buf_offset), OPTION82_SUBOPT_REMOTE_ID,
480+
MAC_ADDR_STR_LEN, (uint8_t *)(bm_mac.c_str()));
481+
buf_offset += offset;
482+
} else {
483+
offset = encode_tlv((buf + buf_offset), OPTION82_SUBOPT_REMOTE_ID,
484+
MAC_ADDR_STR_LEN, (uint8_t *)(m_config.host_mac_addr.c_str()));
485+
buf_offset += offset;
486+
}
462487

463488
/* TODO: this sub-option should be set if source interface selection is enabled */
464489
/* | 5 | 4 | ipv4 | */
@@ -577,7 +602,7 @@ void from_client(pcpp::DhcpLayer *dhcp_pkt, relay_config &config) {
577602
}
578603

579604
for (auto server : config.servers_sock) {
580-
if (send_udp(sock, (uint8_t *)dhcp_pkt->getDhcpHeader(), server, dhcp_pkt->getHeaderLen(), src_ip, use_intf_ip_as_src_ip)) {
605+
if (send_udp(sock, (uint8_t *)dhcp_pkt->getDhcpHeader(), server, dhcp_pkt->getHeaderLen(), src_ip, use_intf_ip_as_src_ip, true)) {
581606
syslog(LOG_INFO, "[DHCPV4_RELAY] DHCP packet is sent to configured server: %s, interface: %s",
582607
config.servers[index].c_str(), config.vlan.c_str());
583608
dhcp_cntr_table.increment_counter(config.vlan, "TX", (int)dhcp_pkt->getMessageType());
@@ -635,6 +660,7 @@ void to_client(pcpp::DhcpLayer *dhcp_pkt, std::unordered_map<std::string, relay_
635660
struct sockaddr_in target_addr = {0};
636661
uint32_t giaddr = dhcp_pkt->getDhcpHeader()->gatewayIpAddress;
637662
uint32_t broadcast_addr = DHCP_BROADCAST_IPADDR;
663+
bool pad = false;
638664
std::unordered_map<std::string, relay_config>::iterator config_itr = vlans->end();
639665

640666
if (getifaddrs(&ifa) == -1) {
@@ -731,8 +757,13 @@ void to_client(pcpp::DhcpLayer *dhcp_pkt, std::unordered_map<std::string, relay_
731757
in_addr ip_zero = {0};
732758
/* TODO: Send unicast message to client if BOOTP flag from client is set to unicast */
733759

734-
dhcp_pkt->removeOption(pcpp::DHCPOPT_DHCP_AGENT_OPTIONS);
735-
if (send_udp(config.client_sock, (uint8_t *)dhcp_pkt->getDhcpHeader(), target_addr, dhcp_pkt->getHeaderLen(), ip_zero, false)) {
760+
/* Perform padding only when DHCP relay (Option 82) information has been stripped from the packet */
761+
if(dhcp_pkt->removeOption(pcpp::DHCPOPT_DHCP_AGENT_OPTIONS)) {
762+
syslog(LOG_NOTICE, "Packet is stripped");
763+
pad = true;
764+
}
765+
766+
if (send_udp(config.client_sock, (uint8_t *)dhcp_pkt->getDhcpHeader(), target_addr, dhcp_pkt->getHeaderLen(), ip_zero, false, pad)) {
736767
syslog(LOG_INFO, "[DHCPV4_RELAY] dhcp relay message is broadcast to client %s from server %s",
737768
config.vlan.c_str(), src_ip.c_str());
738769
dhcp_cntr_table.increment_counter(config.vlan, "TX", (int)dhcp_pkt->getMessageType());
@@ -896,8 +927,8 @@ void pkt_in_callback(evutil_socket_t fd, short event, void *arg) {
896927
std::string intf(interface_name);
897928
auto itr = std::find(interface_list.begin(), interface_list.end(), intf);
898929
/* To avoid duplicate packets, we are only processing packets from
899-
interface in PORT_TABLE and packets from VXLAN interface */
900-
if ((itr == interface_list.end()) && (intf.rfind("VXLAN", 0) != 0)) {
930+
interface in PORT_TABLE and packets from VXLAN interface and docker0 interfaces */
931+
if ((itr == interface_list.end()) && (intf.rfind("VXLAN", 0) != 0) && (intf.rfind("docker0", 0) != 0)) {
901932
continue;
902933
}
903934

@@ -908,6 +939,9 @@ void pkt_in_callback(evutil_socket_t fd, short event, void *arg) {
908939
if (vlan == vlan_map.end()) {
909940
if (intf.find(CLIENT_IF_PREFIX) != std::string::npos) {
910941
syslog(LOG_WARNING, "[DHCPV4_RELAY] Invalid input interface %s\n", interface_name);
942+
} else if ((m_config.is_SmartSwitch) && (intf.rfind("dpu", 0) == 0) && !m_config.midplane_bridge.empty()) {
943+
// if its SmartSwitch, we need to check for bridge_midplane interface
944+
vlan_str = m_config.midplane_bridge;
911945
}
912946
} else {
913947
vlan_str = vlan->second;

dhcp4relay/src/dhcp4relay.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ struct metadata_config {
162162
std::string hostname = "sonic";
163163
uint32_t deployment_id;
164164
bool is_dualTor;
165+
bool is_SmartSwitch;
166+
std::string midplane_bridge;
165167
};
166168

167169
/**

dhcp4relay/src/dhcp4relay_mgr.cpp

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,13 @@ void DHCPMgr::handle_swss_notification() {
5959
swss::SubscriberStateTable config_db_portchannel_table(config_db_ptr.get(), "PORTCHANNEL_INTERFACE");
6060
swss::SubscriberStateTable config_db_device_metadata_table(config_db_ptr.get(), "DEVICE_METADATA");
6161
swss::SubscriberStateTable config_db_vlan_member_table(config_db_ptr.get(), "VLAN_MEMBER");
62-
swss::SubscriberStateTable config_db_vlan_interface_table(config_db_ptr.get(), "VLAN_INTERFACE");
6362
swss::SubscriberStateTable config_db_feature_table(config_db_ptr.get(), "FEATURE");
6463
swss::SubscriberStateTable config_db_vlan_table(config_db_ptr.get(), "VLAN");
6564
config_db_dhcp_server_ipv4_ptr = std::make_shared<swss::SubscriberStateTable>(config_db_ptr.get(), "DHCP_SERVER_IPV4");
6665
state_db_dhcp_server_ipv4_ip_ptr = std::make_shared<swss::SubscriberStateTable>(state_db_ptr.get(), "DHCP_SERVER_IPV4_SERVER_IP");
6766
swss::SubscriberStateTable config_db_port_table(config_db_ptr.get(), "PORT");
67+
swss::SubscriberStateTable config_db_dpu_table(config_db_ptr.get(), "DPUS");
68+
swss::SubscriberStateTable state_db_interface_table(state_db_ptr.get(), "INTERFACE_TABLE");
6869

6970
std::deque<swss::KeyOpFieldsValuesTuple> entries;
7071
swss::Select swss_select;
@@ -74,12 +75,13 @@ void DHCPMgr::handle_swss_notification() {
7475
swss_select.addSelectable(&config_db_portchannel_table);
7576
swss_select.addSelectable(&config_db_device_metadata_table);
7677
swss_select.addSelectable(&config_db_vlan_member_table);
77-
swss_select.addSelectable(&config_db_vlan_interface_table);
7878
swss_select.addSelectable(&config_db_feature_table);
7979
swss_select.addSelectable(&config_db_vlan_table);
8080
swss_select.addSelectable(config_db_dhcp_server_ipv4_ptr.get());
8181
swss_select.addSelectable(state_db_dhcp_server_ipv4_ip_ptr.get());
8282
swss_select.addSelectable(&config_db_port_table);
83+
swss_select.addSelectable(&config_db_dpu_table);
84+
swss_select.addSelectable(&state_db_interface_table);
8385

8486
while (!stop_thread) {
8587
swss::Selectable *selectable;
@@ -125,8 +127,8 @@ void DHCPMgr::handle_swss_notification() {
125127
} else if (selectable == static_cast<swss::Selectable *>(&config_db_vlan_member_table)) {
126128
config_db_vlan_member_table.pops(entries);
127129
process_vlan_member_notification(entries);
128-
} else if (selectable == static_cast<swss::Selectable *>(&config_db_vlan_interface_table)) {
129-
config_db_vlan_interface_table.pops(entries);
130+
} else if (selectable == static_cast<swss::Selectable *>(&state_db_interface_table)) {
131+
state_db_interface_table.pops(entries);
130132
process_vlan_interface_notification(entries);
131133
} else if (selectable == static_cast<swss::Selectable *>(&config_db_feature_table)) {
132134
config_db_feature_table.pops(entries);
@@ -137,6 +139,9 @@ void DHCPMgr::handle_swss_notification() {
137139
} else if (selectable == static_cast<swss::Selectable *>(&config_db_port_table)) {
138140
config_db_port_table.pops(entries);
139141
process_port_notification(entries);
142+
} else if (selectable == static_cast<swss::Selectable *>(&config_db_dpu_table)) {
143+
config_db_dpu_table.pops(entries);
144+
process_port_notification(entries);
140145
}
141146
}
142147
}
@@ -157,6 +162,8 @@ void DHCPMgr::process_device_metadata_notification(std::deque<swss::KeyOpFieldsV
157162
std::string key = kfvKey(entry);
158163
std::vector<swss::FieldValueTuple> field_values = kfvFieldsValues(entry);
159164
std::string operation = kfvOp(entry);
165+
std::shared_ptr<swss::DBConnector> config_db = std::make_shared<swss::DBConnector>("CONFIG_DB", 0);
166+
swss::Table midplane_tbl(config_db.get(), "MID_PLANE_BRIDGE");
160167

161168
if (key != "localhost") {
162169
continue;
@@ -191,6 +198,20 @@ void DHCPMgr::process_device_metadata_notification(std::deque<swss::KeyOpFieldsV
191198
send_dualTor_event = true;
192199
}
193200

201+
// Handle is_SmartSwitch logic
202+
if (subtype_found && subtype_value == "SmartSwitch") {
203+
m_config.is_SmartSwitch = true;
204+
std::string bridge_name;
205+
bool ok = midplane_tbl.hget("GLOBAL", "bridge", bridge_name);
206+
if (ok) {
207+
m_config.midplane_bridge = bridge_name;
208+
} else {
209+
syslog(LOG_ERR, "Failed to read midplane bridge name\n");
210+
}
211+
} else if (m_config.is_SmartSwitch) {
212+
m_config.is_SmartSwitch = false;
213+
}
214+
194215
if (send_dualTor_event) {
195216
relay_config *relay_msg = nullptr;
196217
try {
@@ -599,7 +620,11 @@ void DHCPMgr::process_vlan_member_notification(std::deque<swss::KeyOpFieldsValue
599620

600621
void DHCPMgr::process_vlan_interface_notification(std::deque<swss::KeyOpFieldsValuesTuple> &entries) {
601622
for (auto &entry : entries) {
602-
std::string key = kfvKey(entry);
623+
std::string key = kfvKey(entry);
624+
// Only process VLAN interfaces (keys starting with "Vlan" and Vlan with IP suffix)
625+
if (key.rfind("Vlan", 0) != 0) {
626+
continue;
627+
}
603628

604629
std::string vlan;
605630
std::string vrf;
@@ -608,7 +633,7 @@ void DHCPMgr::process_vlan_interface_notification(std::deque<swss::KeyOpFieldsVa
608633
vlan = key;
609634
vrf = "default";
610635
for (auto &fv : kfvFieldsValues(entry)) {
611-
if (fvField(fv) == "vrf_name") {
636+
if (fvField(fv) == "vrf") {
612637
vrf = fvValue(fv);
613638
break;
614639
}
@@ -720,8 +745,10 @@ void DHCPMgr::process_dhcp_server_ipv4_notification(std::deque<swss::KeyOpFields
720745
}
721746

722747
/*Validation to check vlan is present in VLAN table or not */
748+
/*If its a smartswitch, we are checking midplane_bridge details */
723749
std::string value;
724-
if (!vlan_tbl.hget(vlan, "vlanid", value)) {
750+
if ((!vlan_tbl.hget(vlan, "vlanid", value))
751+
&& (!m_config.is_SmartSwitch || (!m_config.midplane_bridge.empty() && m_config.midplane_bridge != vlan))) {
725752
delete relay_msg;
726753
continue;
727754
}
@@ -808,6 +835,9 @@ void DHCPMgr::process_port_notification(std::deque<swss::KeyOpFieldsValuesTuple>
808835
if (fvField(fv) == "alias") {
809836
port_msg->alias = fvValue(fv);
810837
break;
838+
} else if (fvField(fv) == "midplane_interface") {
839+
port_msg->alias = fvValue(fv);
840+
break;
811841
}
812842
}
813843
} else {

dhcp4relay/test/mock_relay.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ using namespace swss;
2424
MOCK_GLOBAL_FUNC1(getifaddrs, int(struct ifaddrs **));
2525
MOCK_GLOBAL_FUNC1(freeifaddrs, void(struct ifaddrs *));
2626
MOCK_GLOBAL_FUNC3(write, ssize_t(int, const void*, size_t));
27-
MOCK_GLOBAL_FUNC6(send_udp, bool(int, uint8_t *, struct sockaddr_in, uint32_t, in_addr, bool));
27+
MOCK_GLOBAL_FUNC7(send_udp, bool(int, uint8_t *, struct sockaddr_in, uint32_t, in_addr, bool, bool));
2828

2929
void encode_relay_option(pcpp::DhcpLayer *dhcp_pkt, relay_config *config);
3030
void to_client(pcpp::DhcpLayer* dhcp_pkt, std::unordered_map<std::string, relay_config > *vlans,
@@ -851,8 +851,8 @@ TEST(DHCPRelayTest, to_client) {
851851
struct ifaddrs *mock_ifaddrs = CreateMockIfaddrs("192.168.1.1", "255.255.255.0", "Vlan100", "192.168.1.2", "Ethernet4");
852852
EXPECT_GLOBAL_CALL(getifaddrs, getifaddrs(_)).WillOnce(DoAll(testing::SetArgPointee<0>(mock_ifaddrs), Return(0)));
853853
EXPECT_GLOBAL_CALL(freeifaddrs, freeifaddrs(_)).Times(1);
854-
EXPECT_GLOBAL_CALL(send_udp, send_udp(_, _, _, _, _, _)).WillOnce([]
855-
(int sock, uint8_t* hdr, struct sockaddr_in target, uint32_t len, in_addr src_ip, bool use_src_ip) {
854+
EXPECT_GLOBAL_CALL(send_udp, send_udp(_, _, _, _, _, _, _)).WillOnce([]
855+
(int sock, uint8_t* hdr, struct sockaddr_in target, uint32_t len, in_addr src_ip, bool use_src_ip, bool pad) {
856856
pcpp::dhcp_header* dhcp_hdr = (pcpp::dhcp_header*)hdr;
857857
EXPECT_EQ((dhcp_hdr->opCode), 1);
858858
EXPECT_EQ((dhcp_hdr->hops), 1);
@@ -891,8 +891,8 @@ TEST(DHCPRelayTest, from_client) {
891891
m_config.host_mac_addr = "12:32:54:24:95:36";
892892
encode_relay_option(&dhcpLayer, &config);
893893

894-
EXPECT_GLOBAL_CALL(send_udp, send_udp(_, _, _, _, _, _)).WillOnce([]
895-
(int sock, uint8_t* hdr, struct sockaddr_in target, uint32_t len, in_addr src_ip, bool use_src_ip) {
894+
EXPECT_GLOBAL_CALL(send_udp, send_udp(_, _, _, _, _, _, _)).WillOnce([]
895+
(int sock, uint8_t* hdr, struct sockaddr_in target, uint32_t len, in_addr src_ip, bool use_src_ip, bool pad) {
896896
pcpp::dhcp_header* dhcp_hdr = (pcpp::dhcp_header*)hdr;
897897
EXPECT_EQ((dhcp_hdr->opCode), 0);
898898
EXPECT_EQ((dhcp_hdr->hops), 1);

0 commit comments

Comments
 (0)