mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2025-07-12 10:44:58 +03:00
Virtual: fix race condition in DHCP server which resulted in multiple clients receiving the same IP
A race condition in the DHCP server caused it to offer the same IP address to multiple clients when they connected at the same time, because an offered IP address was considered free until the final step (DHCP_ACK). This commit introduces a list to keep track of the pending leases created during DHCP_OFFER, so that an IP address is guaranteed to be offered to a single client.
This commit is contained in:
@ -296,6 +296,7 @@ struct VH
|
||||
UINT DhcpDns2; // DNS server address 2
|
||||
char DhcpDomain[MAX_HOST_NAME_LEN + 1]; // Assigned domain name
|
||||
LIST *DhcpLeaseList; // DHCP lease list
|
||||
LIST *DhcpPendingLeaseList; // Pending DHCP lease list
|
||||
UINT64 LastDhcpPolling; // Time which the DHCP list polled last
|
||||
bool SaveLog; // Save a log
|
||||
DHCP_CLASSLESS_ROUTE_TABLE PushRoute; // Pushing routing table
|
||||
@ -511,7 +512,9 @@ int CompareDhcpLeaseList(void *p1, void *p2);
|
||||
DHCP_LEASE *NewDhcpLease(UINT expire, UCHAR *mac_address, UINT ip, UINT mask, char *hostname);
|
||||
void FreeDhcpLease(DHCP_LEASE *d);
|
||||
DHCP_LEASE *SearchDhcpLeaseByMac(VH *v, UCHAR *mac);
|
||||
DHCP_LEASE *SearchDhcpPendingLeaseByMac(VH *v, UCHAR *mac);
|
||||
DHCP_LEASE *SearchDhcpLeaseByIp(VH *v, UINT ip);
|
||||
DHCP_LEASE *SearchDhcpPendingLeaseByIp(VH *v, UINT ip);
|
||||
UINT ServeDhcpDiscover(VH *v, UCHAR *mac, UINT request_ip);
|
||||
UINT GetFreeDhcpIpAddress(VH *v);
|
||||
UINT GetFreeDhcpIpAddressByRandom(VH *v, UCHAR *mac);
|
||||
|
Reference in New Issue
Block a user