From c72dca0a44212da257038a97ebf3760387a136a0 Mon Sep 17 00:00:00 2001 From: huangxin Date: Wed, 15 Mar 2023 18:20:26 +0800 Subject: [PATCH] =?UTF-8?q?OCT=201.=20=E5=A2=9E=E5=8A=A0DHCP=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E5=8C=85=E5=B9=BF=E6=92=AD=E5=9C=B0=E5=9D=80=E5=BC=80?= =?UTF-8?q?=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- srcs/opendhcp183/opendhcpd.cpp | 21 ++++++++++++++++++--- srcs/opendhcp183/opendhcpd.h | 4 ++++ srcs/opendhcp183/query.cpp | 2 ++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/srcs/opendhcp183/opendhcpd.cpp b/srcs/opendhcp183/opendhcpd.cpp index 878f1ac..2cc5233 100644 --- a/srcs/opendhcp183/opendhcpd.cpp +++ b/srcs/opendhcp183/opendhcpd.cpp @@ -1904,18 +1904,33 @@ MYDWORD sdmess(data9 *req) { req->dhcpp.header.bp_op = BOOTP_REPLY; errno = 0; +#if DISCOVER_RSP_NOT_BOARDCAST sockaddr_in cliAddr = get_cliAddr(nicif, tempbuff, req); - +#endif if (req->req_type == DHCP_MESS_DISCOVER && !req->remote.sin_addr.s_addr) { req->bytes = (int)sendto(network.dhcpConn[req->sockInd].sock, req->raw, packSize, MSG_DONTROUTE, +#if DISCOVER_RSP_NOT_BOARDCAST (sockaddr *)&cliAddr, sizeof(cliAddr)); +#else + (sockaddr *)&req->remote, + sizeof(req->remote)); +#endif } else { - req->bytes = (int) - sendto(network.dhcpConn[req->sockInd].sock, req->raw, packSize, 0, (sockaddr *)&cliAddr, sizeof(cliAddr)); + req->bytes = (int)sendto(network.dhcpConn[req->sockInd].sock, + req->raw, + packSize, + 0, +#if DISCOVER_RSP_NOT_BOARDCAST + (sockaddr *)&cliAddr, + sizeof(cliAddr)); +#else + (sockaddr *)&req->remote, + sizeof(req->remote)); +#endif } if (errno || req->bytes <= 0) { diff --git a/srcs/opendhcp183/opendhcpd.h b/srcs/opendhcp183/opendhcpd.h index 1dec740..4b43817 100644 --- a/srcs/opendhcp183/opendhcpd.h +++ b/srcs/opendhcp183/opendhcpd.h @@ -84,6 +84,8 @@ typedef struct in_pktinfo IN_PKTINFO; #define STR2INT(val) ((int)strtol((val), nullptr, 10)) +#define DISCOVER_RSP_NOT_BOARDCAST (0) + #define logDHCPMess(logBuff, logLevel) \ do { \ switch ((logLevel)) { \ @@ -775,5 +777,7 @@ int opendhcp_add_listener(); unsigned int opendhcp_set_lease_time(); int getHwAddr(char *buff, char *mac); int arpSet(const char *ifname, char *ipStr, char *mac); +#if DISCOVER_RSP_NOT_BOARDCAST sockaddr_in get_cliAddr(char *nicif, char *tempbuff, data9 *req); +#endif #pragma clang diagnostic pop \ No newline at end of file diff --git a/srcs/opendhcp183/query.cpp b/srcs/opendhcp183/query.cpp index e1ff481..10bf680 100644 --- a/srcs/opendhcp183/query.cpp +++ b/srcs/opendhcp183/query.cpp @@ -675,6 +675,7 @@ int getHwAddr(char *buff, char *mac) { #pragma clang diagnostic pop +#if DISCOVER_RSP_NOT_BOARDCAST int arpSet(const char *ifname, char *ipStr, char *mac) { if (ifname == nullptr || ipStr == nullptr || mac == nullptr) { LOG_MOD(error, ZLOG_MOD_OPENDHCPD, "para is null.\n"); @@ -724,6 +725,7 @@ sockaddr_in get_cliAddr(char *nicif, char *tempbuff, data9 *req) { cliAddr.sin_addr.s_addr = inet_addr(IP2String(tempbuff, req->dhcpp.header.bp_yiaddr)); return cliAddr; } +#endif unsigned int opendhcp_set_lease_time() { return config_get_dhcp_server_lease_time();