summaryrefslogtreecommitdiffhomepage
path: root/src/odhcpd.c
diff options
context:
space:
mode:
authorHans Dedecker <dedeckeh@gmail.com>2014-10-30 12:30:32 +0100
committerHans Dedecker <dedeckeh@gmail.com>2014-10-30 14:05:41 +0100
commitd94b406eeba27af2a6abff333dc16e82d28ed636 (patch)
tree5590f9d3345e51c1c8f6c881da30896fdc2b29fc /src/odhcpd.c
parentb461334ab277b6e8fd1622ab7c8a655363bd3f6c (diff)
Fix IPv6 DNS server adddress selection
Fix selection of IPv6 DNS address in DHCPv6 and RA overwrite as an address could be selected with preferred lifetime zero while IPv6 addresses are in use with non zero preferred lifetimes. Fix tries to pick the IPv6 address with the longest preferred lifetime now. Fixes also the issue an IPv6 address with preferred lifetime zero could be returned in DHCPv6 DNS server option while an IPv6 address with non zero preferred lifetime is returned as DNS recursive RA option for the same set of available IPv6 addresses.
Diffstat (limited to 'src/odhcpd.c')
-rw-r--r--src/odhcpd.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/odhcpd.c b/src/odhcpd.c
index 0edf63e..3c384e8 100644
--- a/src/odhcpd.c
+++ b/src/odhcpd.c
@@ -263,6 +263,25 @@ ssize_t odhcpd_get_interface_addresses(int ifindex,
return ret;
}
+int odhcpd_get_preferred_interface_address(int ifindex, struct in6_addr *addr)
+{
+ struct odhcpd_ipaddr ipaddrs[8];
+ ssize_t ip_cnt = odhcpd_get_interface_addresses(ifindex, ipaddrs, ARRAY_SIZE(ipaddrs));
+ uint32_t preferred = 0;
+ int ret = 0;
+
+ for (ssize_t i = 0; i < ip_cnt; i++) {
+ struct odhcpd_ipaddr *ipaddr = &ipaddrs[i];
+
+ if (ipaddr->preferred > preferred || !preferred) {
+ preferred = ipaddr->preferred;
+ *addr = ipaddr->addr;
+ ret = 1;
+ }
+ }
+
+ return ret;
+}
struct interface* odhcpd_get_interface_by_index(int ifindex)
{