From 173df872b87cc3440eeae6852616e052e141ac89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20Grasb=C3=B6ck?= Date: Wed, 26 Nov 2025 13:56:29 +0100 Subject: [PATCH] Config value for dhcp discover timeout --- src/Cedar/Hub.c | 2 ++ src/Cedar/Hub.h | 4 ++++ src/Cedar/IPC.c | 4 +++- src/Cedar/IPC.h | 1 + src/Cedar/Server.c | 13 +++++++++++++ 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Cedar/Hub.c b/src/Cedar/Hub.c index 01412ddc..1677d605 100644 --- a/src/Cedar/Hub.c +++ b/src/Cedar/Hub.c @@ -630,6 +630,7 @@ void DataToHubOptionStruct(HUB_OPTION *o, RPC_ADMIN_OPTION *ao) GetHubAdminOptionDataAndSet(ao, "UseHubNameAsDhcpUserClassOption", o->UseHubNameAsDhcpUserClassOption); GetHubAdminOptionDataAndSet(ao, "UseHubNameAsRadiusNasId", o->UseHubNameAsRadiusNasId); GetHubAdminOptionDataAndSet(ao, "AllowEapMatchUserByCert", o->AllowEapMatchUserByCert); + GetHubAdminOptionDataAndSet(ao, "DhcpDiscoverTimeoutMs", o->DhcpDiscoverTimeoutMs); } // Convert the contents of the HUB_OPTION to data @@ -705,6 +706,7 @@ void HubOptionStructToData(RPC_ADMIN_OPTION *ao, HUB_OPTION *o, char *hub_name) Add(aol, NewAdminOption("UseHubNameAsDhcpUserClassOption", o->UseHubNameAsDhcpUserClassOption)); Add(aol, NewAdminOption("UseHubNameAsRadiusNasId", o->UseHubNameAsRadiusNasId)); Add(aol, NewAdminOption("AllowEapMatchUserByCert", o->AllowEapMatchUserByCert)); + Add(aol, NewAdminOption("DhcpDiscoverTimeoutMs", o->DhcpDiscoverTimeoutMs)); Zero(ao, sizeof(RPC_ADMIN_OPTION)); diff --git a/src/Cedar/Hub.h b/src/Cedar/Hub.h index e16bc66a..a47984f6 100644 --- a/src/Cedar/Hub.h +++ b/src/Cedar/Hub.h @@ -30,6 +30,9 @@ // Default flooding queue length #define DEFAULT_FLOODING_QUEUE_LENGTH (32 * 1024 * 1024) +// Default DHCP Discover Timeout +#define DEFAULT_DHCP_DISCOVER_TIMEOUT (5 * 1000) + // SoftEther link control packet struct SE_LINK { @@ -183,6 +186,7 @@ struct HUB_OPTION bool UseHubNameAsDhcpUserClassOption; // Add HubName to DHCP request as User-Class option bool UseHubNameAsRadiusNasId; // Add HubName to Radius request as NAS-Identifier attrioption bool AllowEapMatchUserByCert; // Allow matching EAP Identity with user certificate CNs + UINT DhcpDiscoverTimeoutMs; // Timeout to wait for DHCP server response on DISCOVER request }; // MAC table entry diff --git a/src/Cedar/IPC.c b/src/Cedar/IPC.c index 6cfc8369..c4f88943 100644 --- a/src/Cedar/IPC.c +++ b/src/Cedar/IPC.c @@ -493,12 +493,14 @@ IPC *NewIPC(CEDAR *cedar, char *client_name, char *postfix, char *hubname, char { UINTToIP(&ipc->DefaultGateway, hub->Option->DefaultGateway); UINTToIP(&ipc->SubnetMask, hub->Option->DefaultSubnet); + ipc->DhcpDiscoverTimeoutMs = hub->Option->DhcpDiscoverTimeoutMs; GetBroadcastAddress4(&ipc->BroadcastAddress, &ipc->DefaultGateway, &ipc->SubnetMask); } else { ZeroIP4(&ipc->DefaultGateway); ZeroIP4(&ipc->SubnetMask); + ipc->DhcpDiscoverTimeoutMs = DEFAULT_DHCP_DISCOVER_TIMEOUT; ZeroIP4(&ipc->BroadcastAddress); } @@ -793,7 +795,7 @@ bool IPCDhcpAllocateIP(IPC *ipc, DHCP_OPTION_LIST *opt, TUBE *discon_poll_tube) StrCpy(req.Hostname, sizeof(req.Hostname), ipc->ClientHostname); IPCDhcpSetConditionalUserClass(ipc, &req); - d = IPCSendDhcpRequest(ipc, NULL, tran_id, &req, DHCP_OFFER, IPC_DHCP_TIMEOUT, discon_poll_tube); + d = IPCSendDhcpRequest(ipc, NULL, tran_id, &req, DHCP_OFFER, ipc->DhcpDiscoverTimeoutMs, discon_poll_tube); if (d == NULL) { return false; diff --git a/src/Cedar/IPC.h b/src/Cedar/IPC.h index 1a341ec8..d64627a7 100644 --- a/src/Cedar/IPC.h +++ b/src/Cedar/IPC.h @@ -149,6 +149,7 @@ struct IPC SHARED_BUFFER *IpcSessionSharedBuffer; // A shared buffer between IPC and Session IPC_SESSION_SHARED_BUFFER_DATA *IpcSessionShared; // Shared data between IPC and Session UINT Layer; + UINT DhcpDiscoverTimeoutMs; // Timeut to wait for DHCP server response on DISCOVER request // IPv6 stuff QUEUE *IPv6ReceivedQueue; // IPv6 reception queue diff --git a/src/Cedar/Server.c b/src/Cedar/Server.c index 1aad0d94..08b8345b 100644 --- a/src/Cedar/Server.c +++ b/src/Cedar/Server.c @@ -2337,6 +2337,7 @@ void SiSetDefaultHubOption(HUB_OPTION *o) o->AccessListIncludeFileCacheLifetime = ACCESS_LIST_INCLUDE_FILE_CACHE_LIFETIME; o->RemoveDefGwOnDhcpForLocalhost = true; o->FloodingSendQueueBufferQuota = DEFAULT_FLOODING_QUEUE_LENGTH; + o->DhcpDiscoverTimeoutMs = DEFAULT_DHCP_DISCOVER_TIMEOUT; } // Create a default virtual HUB @@ -3942,6 +3943,11 @@ void SiLoadHubOptionCfg(FOLDER *f, HUB_OPTION *o) o->UseHubNameAsDhcpUserClassOption = CfgGetBool(f, "UseHubNameAsDhcpUserClassOption"); o->UseHubNameAsRadiusNasId = CfgGetBool(f, "UseHubNameAsRadiusNasId"); o->AllowEapMatchUserByCert = CfgGetBool(f, "AllowEapMatchUserByCert"); + o->DhcpDiscoverTimeoutMs = CfgGetInt(f, "DhcpDiscoverTimeoutMs"); + if (o->DhcpDiscoverTimeoutMs == 0) + { + o->DhcpDiscoverTimeoutMs = DEFAULT_DHCP_DISCOVER_TIMEOUT; + } // Enabled by default if (CfgIsItem(f, "ManageOnlyPrivateIP")) @@ -4048,6 +4054,7 @@ void SiWriteHubOptionCfg(FOLDER *f, HUB_OPTION *o) CfgAddBool(f, "UseHubNameAsDhcpUserClassOption", o->UseHubNameAsDhcpUserClassOption); CfgAddBool(f, "UseHubNameAsRadiusNasId", o->UseHubNameAsRadiusNasId); CfgAddBool(f, "AllowEapMatchUserByCert", o->AllowEapMatchUserByCert); + CfgAddInt(f, "DhcpDiscoverTimeoutMs", o->DhcpDiscoverTimeoutMs); } // Write the user @@ -7533,6 +7540,11 @@ void SiCalledUpdateHub(SERVER *s, PACK *p) o.UseHubNameAsDhcpUserClassOption = PackGetBool(p, "UseHubNameAsDhcpUserClassOption"); o.UseHubNameAsRadiusNasId = PackGetBool(p, "UseHubNameAsRadiusNasId"); o.AllowEapMatchUserByCert = PackGetBool(p, "AllowEapMatchUserByCert"); + o.DhcpDiscoverTimeoutMs = PackGetInt(p, "DhcpDiscoverTimeoutMs"); + if (o.DhcpDiscoverTimeoutMs == 0) + { + o.DhcpDiscoverTimeoutMs = DEFAULT_DHCP_DISCOVER_TIMEOUT; + } save_packet_log = PackGetInt(p, "SavePacketLog"); packet_log_switch_type = PackGetInt(p, "PacketLogSwitchType"); @@ -9368,6 +9380,7 @@ void SiPackAddCreateHub(PACK *p, HUB *h) PackAddBool(p, "UseHubNameAsDhcpUserClassOption", h->Option->UseHubNameAsDhcpUserClassOption); PackAddBool(p, "UseHubNameAsRadiusNasId", h->Option->UseHubNameAsRadiusNasId); PackAddBool(p, "AllowEapMatchUserByCert", h->Option->AllowEapMatchUserByCert); + PackAddInt(p, "DhcpDiscoverTimeoutMs", h->Option->DhcpDiscoverTimeoutMs); SiAccessListToPack(p, h->AccessList);