Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
debian/*
!debian/changelog
!debian/compat
!debian/control
!debian/rules
dhcp6relay/debian/*
!dhcp6relay/debian/changelog
!dhcp6relay/debian/compat
!dhcp6relay/debian/control
!dhcp6relay/debian/rules
dhcp4relay/debian/*
!dhcp4relay/debian/changelog
!dhcp4relay/debian/compat
!dhcp4relay/debian/control
!dhcp4relay/debian/rules
4 changes: 2 additions & 2 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[submodule "gmock_global"]
path = gmock_global
[submodule "dhcp6relay/gmock_global"]
path = dhcp6relay/gmock_global
url = https://github.com/apriorit/gmock-global.git
88 changes: 88 additions & 0 deletions dhcp4relay/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
.ONESHELL:
SHELL = /bin/bash

RM := rm -rf
WORKING_DIR := $(abspath .)
BUILD_DIR := build
BUILD_TEST_DIR := build-test
DHCP4RELAY_TARGET := $(BUILD_DIR)/dhcp4relay
DHCP4RELAY_TEST_TARGET := $(BUILD_TEST_DIR)/dhcp4relay-test
CP := cp
MKDIR := mkdir
MV := mv
FIND := find
GCOVR := gcovr

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

#pcap plus plus zip file pcappp_v24.09.zip
PCAPPPVAR := 24.09
PCAPPP_URL = https://github.com/seladb/PcapPlusPlus/releases/download/v${PCAPPPVAR}/pcapplusplus-${PCAPPPVAR}-ubuntu-20.04-gcc-9.4.0-x86_64.tar.gz
PCAPPLUSPLUS_DIR := $(WORKING_DIR)/pcapplusplus-$(PCAPPPVAR)-ubuntu-20.04-gcc-9.4.0-x86_64
PCAPPP_DONE = $(WORKING_DIR)/pcappp.stamp
INCLUDE_DIR = $(PCAPPLUSPLUS_DIR)/include
LIB_DIR = $(PCAPPLUSPLUS_DIR)/lib

override LDLIBS += -levent -lhiredis -lswsscommon -pthread -lboost_thread -lboost_system $(LD_PCAPPLUSPLUS_LIB) -lpcap
override CPPFLAGS += -Wall -std=c++17 -fPIE -I/usr/include/swss -I$(INCLUDE_DIR)
override CPPFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)"
override LDFLAGS += -L$(LIB_DIR) -Wl,-rpath=$(abspath $(LIB_DIR))
CPPFLAGS_TEST := --coverage -fprofile-arcs -ftest-coverage -fprofile-generate -fsanitize=address -DUNIT_TEST
LDLIBS_TEST := --coverage -lgtest -lgmock -pthread -lstdc++fs -fsanitize=address
PWD := $(shell pwd)

.PHONY: $(PCAPPP_DONE)
$(PCAPPP_DONE):
wget $(PCAPPP_URL) -O pcapplusplus.tar.gz
tar -xzf pcapplusplus.tar.gz
touch $@

all: $(DHCP4RELAY_TARGET) $(DHCP4RELAY_TEST_TARGET)

-include src/subdir.mk
-include test/subdir.mk

# Use different build directories based on whether it's a regular build or a
# test build. This is because in the test build, code coverage is enabled,
# which means the object files that get built will be different
OBJS = $(SRCS:%.cpp=$(BUILD_DIR)/%.o)
TEST_OBJS = $(TEST_SRCS:%.cpp=$(BUILD_TEST_DIR)/%.o)

ifneq ($(MAKECMDGOALS),clean)
-include $(OBJS:%.o=%.d)
-include $(TEST_OBJS:%.o=%.d)
endif

$(BUILD_DIR)/%.o: %.cpp
@mkdir -p $(@D)
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<

$(DHCP4RELAY_TARGET): $(PCAPPP_DONE) $(OBJS)
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(BUILD_TEST_DIR)/%.o: %.cpp
@mkdir -p $(@D)
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(CPPFLAGS_TEST) $(LDLIBS) -c -o $@ $<

$(DHCP4RELAY_TEST_TARGET): $(TEST_OBJS)
$(CXX) $(LDFLAGS) $^ $(LDLIBS) $(LDLIBS_TEST) -o $@

test: $(DHCP4RELAY_TEST_TARGET)
sudo ASAN_OPTIONS=detect_leaks=0 ./$(DHCP4RELAY_TEST_TARGET) --gtest_output=xml:$(DHCP4RELAY_TEST_TARGET)-test-result.xml || true
$(GCOVR) -r ./ --html --html-details -o $(DHCP4RELAY_TEST_TARGET)-code-coverage.html
$(GCOVR) -r ./ --xml-pretty -o $(DHCP4RELAY_TEST_TARGET)-code-coverage.xml

install: $(DHCP4RELAY_TARGET)
install -D $(DHCP4RELAY_TARGET) $(DESTDIR)/usr/sbin/$(notdir $(DHCP4RELAY_TARGET))

uninstall:
$(RM) $(DESTDIR)/usr/sbin/$(notdir $(DHCP4RELAY_TARGET))

clean:
-$(RM) $(BUILD_DIR) $(BUILD_TEST_DIR) *.html *.xml pcap*
$(FIND) . -name *.gcda -exec rm -f {} \;
$(FIND) . -name *.gcno -exec rm -f {} \;
$(FIND) . -name *.gcov -exec rm -f {} \;
-@echo ' '

.PHONY: all clean test install uninstall
5 changes: 5 additions & 0 deletions dhcp4relay/debian/changelog
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
sonic-dhcp4relay (1.0.0-0) UNRELEASED; urgency=medium

* Initial release.

-- Ashutosh Agrawal <ashu@cisco.com> Thu, 16 Jan 2025 09:11:40 -0700
File renamed without changes.
14 changes: 14 additions & 0 deletions dhcp4relay/debian/control
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Source: sonic-dhcp4relay
Section: devel
Priority: optional
Maintainer: Ashutosh Agrawal <ashu@cisco.com>
Build-Depends: debhelper (>= 12.0.0), libevent-dev, libboost-thread-dev, libboost-system-dev, libswsscommon-dev
Standards-Version: 3.9.3
Homepage: https://github.com/Azure/sonic-buildimage
XS-Go-Import-Path: github.com/Azure/sonic-buildimage

Package: sonic-dhcp4relay
Architecture: any
Built-Using: ${misc:Built-Using}
Depends: ${shlibs:Depends}
Description: SONiC DHCPv4 Relay
File renamed without changes.
39 changes: 39 additions & 0 deletions dhcp4relay/src/dhcp4_sender.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#include "dhcp4_sender.h"

#include <arpa/inet.h>
#include <errno.h>
#include <syslog.h>

#include <cstring>

/**
* @code bool send_udp(int sock, uint8_t *buffer, struct sockaddr_in target, uint32_t len);
*
* @brief send udp packet and return true if successful
*
* @param *buffer message buffer
* @param sockaddr_in target target socket
* @param len length of message
* @param relay_config *config pointer to relay_config
* @param uint8_t msg_type message type of dhcpv6 option of relayed message
*
* @return boolean True if packet successfully sent
*/
#ifndef UNIT_TEST
bool send_udp(int sock, uint8_t *buffer, struct sockaddr_in target, uint32_t len) {
/* Pad additional bytes if length is lesser than 300
* to make DHCP packet length to minimum of 300 bytes */
if (len < BOOTP_MIN_LEN) {
auto pad_len = BOOTP_MIN_LEN - len;
memset(buffer+len, 0, pad_len);
len = BOOTP_MIN_LEN;
}
if (sendto(sock, buffer, len, 0, (const struct sockaddr *)&target, sizeof(target)) == -1) {
char server_addr[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(target.sin_addr), server_addr, INET_ADDRSTRLEN);
syslog(LOG_ERR, "sendto: Failed to send to target address: %s, error: %s\n", server_addr, strerror(errno));
return false;
}
return true;
}
#endif
22 changes: 22 additions & 0 deletions dhcp4relay/src/dhcp4_sender.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#include <netinet/in.h>
#include <sys/socket.h>

#include <string>

#define BOOTP_MIN_LEN 300
/**
* @code bool send_udp(int sock, uint8_t *buffer, struct sockaddr_in target, uint32_t len);
*
* @brief send udp packet and return true if successful
*
* @param *buffer message buffer
* @param sockaddr_in target target socket
* @param len length of message
* @param relay_config *config pointer to relay_config
* @param uint8_t msg_type message type of dhcpv6 option of relayed message
*
* @return boolean True if packet successfully sent
*/
bool send_udp(int sock, uint8_t *buffer, struct sockaddr_in target, uint32_t len);
Loading