mirror of
http://thekelleys.org.uk/git/dnsmasq.git
synced 2026-11-13 17:00:49 +00:00
Compare commits
11
Commits
v2.66test3
...
v2.66test4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3b43646a08 | ||
|
|
3bc0d932d0 | ||
|
|
60225f4e75 | ||
|
|
1962446269 | ||
|
|
be37986a0f | ||
|
|
d7346a1e8c | ||
|
|
87d346f6a7 | ||
|
|
f0dd7f807d | ||
|
|
0c0502426f | ||
|
|
7f035f58c6 | ||
|
|
81e84f8dac |
No files matched your search
+17
-1
@@ -46,6 +46,21 @@ static struct subnet *filter_zone(struct auth_zone *zone, int flag, struct all_a
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int filter_constructed_dhcp(int flag, struct all_addr *addr_u)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_DHCP6
|
||||||
|
struct dhcp_context *context;
|
||||||
|
|
||||||
|
if (flag | F_IPV6)
|
||||||
|
for (context = daemon->dhcp6; context; context = context->next)
|
||||||
|
if ((context->flags & CONTEXT_CONSTRUCTED) &&
|
||||||
|
is_same_net6(&(addr_u->addr.addr6), &context->start6, context->prefix))
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int in_zone(struct auth_zone *zone, char *name, char **cut)
|
static int in_zone(struct auth_zone *zone, char *name, char **cut)
|
||||||
{
|
{
|
||||||
size_t namelen = strlen(name);
|
size_t namelen = strlen(name);
|
||||||
@@ -415,7 +430,8 @@ size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t n
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
nxdomain = 0;
|
nxdomain = 0;
|
||||||
if ((crecp->flags & flag) && filter_zone(zone, flag, &(crecp->addr.addr)))
|
if ((crecp->flags & flag) &&
|
||||||
|
(filter_zone(zone, flag, &(crecp->addr.addr)) || filter_constructed_dhcp(flag, &(crecp->addr.addr))))
|
||||||
{
|
{
|
||||||
*cut = '.'; /* restore domain part */
|
*cut = '.'; /* restore domain part */
|
||||||
log_query(crecp->flags, name, &crecp->addr.addr, record_source(crecp->uid));
|
log_query(crecp->flags, name, &crecp->addr.addr, record_source(crecp->uid));
|
||||||
|
|||||||
@@ -147,7 +147,8 @@ int iface_enumerate(int family, void *parm, int (*callback)())
|
|||||||
addr->s6_addr[3] = 0;
|
addr->s6_addr[3] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!((*callback)(addr, prefix, scope_id, iface_index, 0, 0, 0, parm)))
|
/* preferred and valid times == forever until we known how to dtermine them. */
|
||||||
|
if (!((*callback)(addr, prefix, scope_id, iface_index, 0, -1, -1, parm)))
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+40
-13
@@ -26,7 +26,7 @@ struct iface_param {
|
|||||||
|
|
||||||
static int complete_context6(struct in6_addr *local, int prefix,
|
static int complete_context6(struct in6_addr *local, int prefix,
|
||||||
int scope, int if_index, int flags,
|
int scope, int if_index, int flags,
|
||||||
int preferred, int valid, void *vparam);
|
unsigned int preferred, unsigned int valid, void *vparam);
|
||||||
|
|
||||||
static int make_duid1(int index, unsigned int type, char *mac, size_t maclen, void *parm);
|
static int make_duid1(int index, unsigned int type, char *mac, size_t maclen, void *parm);
|
||||||
|
|
||||||
@@ -182,17 +182,14 @@ void dhcp6_packet(time_t now)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int complete_context6(struct in6_addr *local, int prefix,
|
static int complete_context6(struct in6_addr *local, int prefix,
|
||||||
int scope, int if_index, int flags, int preferred,
|
int scope, int if_index, int flags, unsigned int preferred,
|
||||||
int valid, void *vparam)
|
unsigned int valid, void *vparam)
|
||||||
{
|
{
|
||||||
struct dhcp_context *context;
|
struct dhcp_context *context;
|
||||||
struct iface_param *param = vparam;
|
struct iface_param *param = vparam;
|
||||||
struct iname *tmp;
|
struct iname *tmp;
|
||||||
|
|
||||||
(void)scope; /* warning */
|
(void)scope; /* warning */
|
||||||
(void)flags;
|
|
||||||
(void)preferred;
|
|
||||||
(void)valid;
|
|
||||||
|
|
||||||
if (if_index == param->ind &&
|
if (if_index == param->ind &&
|
||||||
!IN6_IS_ADDR_LOOPBACK(local) &&
|
!IN6_IS_ADDR_LOOPBACK(local) &&
|
||||||
@@ -219,12 +216,32 @@ static int complete_context6(struct in6_addr *local, int prefix,
|
|||||||
is_same_net6(local, &context->start6, prefix) &&
|
is_same_net6(local, &context->start6, prefix) &&
|
||||||
is_same_net6(local, &context->end6, prefix))
|
is_same_net6(local, &context->end6, prefix))
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
/* link it onto the current chain if we've not seen it before */
|
/* link it onto the current chain if we've not seen it before */
|
||||||
if (context->current == context)
|
if (context->current == context)
|
||||||
{
|
{
|
||||||
context->current = param->current;
|
struct dhcp_context *tmp, **up;
|
||||||
param->current = context;
|
|
||||||
|
/* use interface values only for contructed contexts */
|
||||||
|
if (!(context->flags & CONTEXT_CONSTRUCTED))
|
||||||
|
preferred = valid = 0xffffffff;
|
||||||
|
else if (flags & IFACE_DEPRECATED)
|
||||||
|
preferred = 0;
|
||||||
|
|
||||||
|
if (context->flags & CONTEXT_DEPRECATE)
|
||||||
|
preferred = 0;
|
||||||
|
|
||||||
|
/* order chain, longest preferred time first */
|
||||||
|
for (up = ¶m->current, tmp = param->current; tmp; tmp = tmp->current)
|
||||||
|
if (tmp->preferred <= preferred)
|
||||||
|
break;
|
||||||
|
|
||||||
|
context->current = *up;
|
||||||
|
*up = context;
|
||||||
context->local6 = *local;
|
context->local6 = *local;
|
||||||
|
context->preferred = preferred;
|
||||||
|
context->valid = valid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -475,7 +492,7 @@ static int make_duid1(int index, unsigned int type, char *mac, size_t maclen, vo
|
|||||||
|
|
||||||
struct cparam {
|
struct cparam {
|
||||||
time_t now;
|
time_t now;
|
||||||
int newone;
|
int newone, newname;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int construct_worker(struct in6_addr *local, int prefix,
|
static int construct_worker(struct in6_addr *local, int prefix,
|
||||||
@@ -549,6 +566,10 @@ static int construct_worker(struct in6_addr *local, int prefix,
|
|||||||
lease_update_file to get periodic functions called */
|
lease_update_file to get periodic functions called */
|
||||||
param->newone = 1;
|
param->newone = 1;
|
||||||
|
|
||||||
|
/* Will need to add new putative SLAAC addresses to existing leases */
|
||||||
|
if (context->flags & CONTEXT_RA_NAME)
|
||||||
|
param->newname = 1;
|
||||||
|
|
||||||
log_context(AF_INET6, context);
|
log_context(AF_INET6, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -561,13 +582,14 @@ void dhcp_construct_contexts(time_t now)
|
|||||||
struct dhcp_context *tmp, *context, **up;
|
struct dhcp_context *tmp, *context, **up;
|
||||||
struct cparam param;
|
struct cparam param;
|
||||||
param.newone = 0;
|
param.newone = 0;
|
||||||
|
param.newname = 0;
|
||||||
param.now = now;
|
param.now = now;
|
||||||
|
|
||||||
for (context = daemon->dhcp6; context; context = context->next)
|
for (context = daemon->dhcp6; context; context = context->next)
|
||||||
if (context->flags & CONTEXT_CONSTRUCTED)
|
|
||||||
{
|
{
|
||||||
context->flags |= CONTEXT_GC;
|
|
||||||
context->if_index = 0;
|
context->if_index = 0;
|
||||||
|
if (context->flags & CONTEXT_CONSTRUCTED)
|
||||||
|
context->flags |= CONTEXT_GC;
|
||||||
}
|
}
|
||||||
|
|
||||||
iface_enumerate(AF_INET6, ¶m, construct_worker);
|
iface_enumerate(AF_INET6, ¶m, construct_worker);
|
||||||
@@ -578,10 +600,11 @@ void dhcp_construct_contexts(time_t now)
|
|||||||
|
|
||||||
if (context->flags & CONTEXT_GC)
|
if (context->flags & CONTEXT_GC)
|
||||||
{
|
{
|
||||||
if (daemon->dhcp6 == context)
|
|
||||||
daemon->dhcp6 = context->next;
|
|
||||||
*up = context->next;
|
*up = context->next;
|
||||||
free(context);
|
free(context);
|
||||||
|
param.newone = 1; /* include deletion */
|
||||||
|
if (context->flags & CONTEXT_RA_NAME)
|
||||||
|
param.newname = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
up = &context->next;
|
up = &context->next;
|
||||||
@@ -590,7 +613,11 @@ void dhcp_construct_contexts(time_t now)
|
|||||||
if (param.newone)
|
if (param.newone)
|
||||||
{
|
{
|
||||||
if (daemon->dhcp || daemon->doing_dhcp6)
|
if (daemon->dhcp || daemon->doing_dhcp6)
|
||||||
|
{
|
||||||
|
if (param.newname)
|
||||||
|
lease_update_slaac(now);
|
||||||
lease_update_file(now);
|
lease_update_file(now);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
/* Not doing DHCP, so no lease system, manage alarms for ra only */
|
/* Not doing DHCP, so no lease system, manage alarms for ra only */
|
||||||
send_alarm(periodic_ra(now), now);
|
send_alarm(periodic_ra(now), now);
|
||||||
|
|||||||
@@ -683,6 +683,7 @@ struct dhcp_context {
|
|||||||
struct in6_addr start6, end6; /* range of available addresses */
|
struct in6_addr start6, end6; /* range of available addresses */
|
||||||
struct in6_addr local6;
|
struct in6_addr local6;
|
||||||
int prefix, if_index;
|
int prefix, if_index;
|
||||||
|
unsigned int valid, preferred;
|
||||||
time_t ra_time, ra_short_period_start;
|
time_t ra_time, ra_short_period_start;
|
||||||
char *template_interface;
|
char *template_interface;
|
||||||
#endif
|
#endif
|
||||||
@@ -1047,6 +1048,7 @@ void lease6_filter(int lease_type, int iaid, struct dhcp_context *context);
|
|||||||
struct dhcp_lease *lease6_find_by_addr(struct in6_addr *net, int prefix, u64 addr);
|
struct dhcp_lease *lease6_find_by_addr(struct in6_addr *net, int prefix, u64 addr);
|
||||||
u64 lease_find_max_addr6(struct dhcp_context *context);
|
u64 lease_find_max_addr6(struct dhcp_context *context);
|
||||||
void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface);
|
void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface);
|
||||||
|
void lease_update_slaac(time_t now);
|
||||||
#endif
|
#endif
|
||||||
void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
|
void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr,
|
||||||
unsigned char *clid, int hw_len, int hw_type, int clid_len, time_t now, int force);
|
unsigned char *clid, int hw_len, int hw_type, int clid_len, time_t now, int force);
|
||||||
|
|||||||
+12
@@ -389,6 +389,18 @@ void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *inte
|
|||||||
slaac_ping_reply(sender, packet, interface, leases);
|
slaac_ping_reply(sender, packet, interface, leases);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lease_update_slaac(time_t now)
|
||||||
|
{
|
||||||
|
/* Called when we contruct a new RA-names context, to add putative
|
||||||
|
new SLAAC addresses to existing leases. */
|
||||||
|
|
||||||
|
struct dhcp_lease *lease;
|
||||||
|
|
||||||
|
if (daemon->dhcp)
|
||||||
|
for (lease = leases; lease; lease = lease->next)
|
||||||
|
slaac_add_addrs(lease, now, 0);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+8
-8
@@ -39,7 +39,7 @@ static struct iovec iov;
|
|||||||
static u32 netlink_pid;
|
static u32 netlink_pid;
|
||||||
|
|
||||||
static int nl_async(struct nlmsghdr *h);
|
static int nl_async(struct nlmsghdr *h);
|
||||||
static void nl_newinterface(time_t now);
|
static void nl_newaddress(time_t now);
|
||||||
|
|
||||||
void netlink_init(void)
|
void netlink_init(void)
|
||||||
{
|
{
|
||||||
@@ -200,7 +200,7 @@ int iface_enumerate(int family, void *parm, int (*callback)())
|
|||||||
/* handle async new interface address arrivals, these have to be done
|
/* handle async new interface address arrivals, these have to be done
|
||||||
after we complete as we're not re-entrant */
|
after we complete as we're not re-entrant */
|
||||||
if (newaddr)
|
if (newaddr)
|
||||||
nl_newinterface(dnsmasq_time());
|
nl_newaddress(dnsmasq_time());
|
||||||
|
|
||||||
return callback_ok;
|
return callback_ok;
|
||||||
}
|
}
|
||||||
@@ -342,7 +342,7 @@ void netlink_multicast(time_t now)
|
|||||||
fcntl(daemon->netlinkfd, F_SETFL, flags);
|
fcntl(daemon->netlinkfd, F_SETFL, flags);
|
||||||
|
|
||||||
if (newaddr)
|
if (newaddr)
|
||||||
nl_newinterface(now);
|
nl_newaddress(now);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nl_async(struct nlmsghdr *h)
|
static int nl_async(struct nlmsghdr *h)
|
||||||
@@ -391,19 +391,19 @@ static int nl_async(struct nlmsghdr *h)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nl_newinterface(time_t now)
|
static void nl_newaddress(time_t now)
|
||||||
{
|
{
|
||||||
if (option_bool(OPT_CLEVERBIND))
|
if (option_bool(OPT_CLEVERBIND) || daemon->doing_dhcp6 || daemon->doing_ra)
|
||||||
{
|
|
||||||
enumerate_interfaces();
|
enumerate_interfaces();
|
||||||
|
|
||||||
|
if (option_bool(OPT_CLEVERBIND))
|
||||||
create_bound_listeners(0);
|
create_bound_listeners(0);
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_DHCP6
|
#ifdef HAVE_DHCP6
|
||||||
if (daemon->doing_dhcp6 || daemon->doing_ra)
|
if (daemon->doing_dhcp6 || daemon->doing_ra)
|
||||||
{
|
{
|
||||||
dhcp_construct_contexts(now);
|
|
||||||
join_multicast(0);
|
join_multicast(0);
|
||||||
|
dhcp_construct_contexts(now);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (daemon->doing_dhcp6)
|
if (daemon->doing_dhcp6)
|
||||||
|
|||||||
+1
-1
@@ -596,7 +596,7 @@ void join_multicast(int dienow)
|
|||||||
struct irec *iface, *tmp;
|
struct irec *iface, *tmp;
|
||||||
|
|
||||||
for (iface = daemon->interfaces; iface; iface = iface->next)
|
for (iface = daemon->interfaces; iface; iface = iface->next)
|
||||||
if (iface->dhcp_ok && !iface->multicast_done)
|
if (iface->addr.sa.sa_family == AF_INET6 && iface->dhcp_ok && !iface->multicast_done)
|
||||||
{
|
{
|
||||||
/* There's an irec per address but we only want to join for multicast
|
/* There's an irec per address but we only want to join for multicast
|
||||||
once per interface. Weed out duplicates. */
|
once per interface. Weed out duplicates. */
|
||||||
|
|||||||
@@ -2371,6 +2371,13 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
|
|||||||
a[leasepos][strlen(a[leasepos]) - 1] = 0;
|
a[leasepos][strlen(a[leasepos]) - 1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (cp = a[leasepos]; *cp; cp++)
|
||||||
|
if (!(*cp >= '0' && *cp <= '9'))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!cp || (leasepos+1 < k))
|
||||||
|
ret_err(_("bad dhcp-range"));
|
||||||
|
|
||||||
new->lease_time = atoi(a[leasepos]) * fac;
|
new->lease_time = atoi(a[leasepos]) * fac;
|
||||||
/* Leases of a minute or less confuse
|
/* Leases of a minute or less confuse
|
||||||
some clients, notably Apple's */
|
some clients, notably Apple's */
|
||||||
|
|||||||
+31
-9
@@ -193,6 +193,9 @@ static void send_ra(time_t now, int iface, char *iface_name, struct in6_addr *de
|
|||||||
struct dhcp_netid iface_id;
|
struct dhcp_netid iface_id;
|
||||||
struct dhcp_opt *opt_cfg;
|
struct dhcp_opt *opt_cfg;
|
||||||
int done_dns = 0;
|
int done_dns = 0;
|
||||||
|
#ifdef HAVE_LINUX_NETWORK
|
||||||
|
FILE *f;
|
||||||
|
#endif
|
||||||
|
|
||||||
save_counter(0);
|
save_counter(0);
|
||||||
ra = expand(sizeof(struct ra_packet));
|
ra = expand(sizeof(struct ra_packet));
|
||||||
@@ -231,13 +234,22 @@ static void send_ra(time_t now, int iface, char *iface_name, struct in6_addr *de
|
|||||||
|
|
||||||
strncpy(ifr.ifr_name, iface_name, IF_NAMESIZE);
|
strncpy(ifr.ifr_name, iface_name, IF_NAMESIZE);
|
||||||
|
|
||||||
if (ioctl(daemon->icmp6fd, SIOCGIFMTU, &ifr) != -1)
|
#ifdef HAVE_LINUX_NETWORK
|
||||||
|
/* Note that IPv6 MTU is not necessarilly the same as the IPv4 MTU
|
||||||
|
available from SIOCGIFMTU */
|
||||||
|
sprintf(daemon->namebuff, "/proc/sys/net/ipv6/conf/%s/mtu", iface_name);
|
||||||
|
if ((f = fopen(daemon->namebuff, "r")))
|
||||||
|
{
|
||||||
|
if (fgets(daemon->namebuff, MAXDNAME, f))
|
||||||
{
|
{
|
||||||
put_opt6_char(ICMP6_OPT_MTU);
|
put_opt6_char(ICMP6_OPT_MTU);
|
||||||
put_opt6_char(1);
|
put_opt6_char(1);
|
||||||
put_opt6_short(0);
|
put_opt6_short(0);
|
||||||
put_opt6_long(ifr.ifr_mtu);
|
put_opt6_long(atoi(daemon->namebuff));
|
||||||
}
|
}
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
iface_enumerate(AF_LOCAL, &iface, add_lla);
|
iface_enumerate(AF_LOCAL, &iface, add_lla);
|
||||||
|
|
||||||
@@ -344,6 +356,7 @@ static int add_prefixes(struct in6_addr *local, int prefix,
|
|||||||
int do_prefix = 0;
|
int do_prefix = 0;
|
||||||
int do_slaac = 0;
|
int do_slaac = 0;
|
||||||
int deprecate = 0;
|
int deprecate = 0;
|
||||||
|
int constructed = 0;
|
||||||
unsigned int time = 0xffffffff;
|
unsigned int time = 0xffffffff;
|
||||||
struct dhcp_context *context;
|
struct dhcp_context *context;
|
||||||
|
|
||||||
@@ -373,13 +386,21 @@ static int add_prefixes(struct in6_addr *local, int prefix,
|
|||||||
param->other = 1;
|
param->other = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* find floor time */
|
/* find floor time, don't reduce below RA interval. */
|
||||||
if (time > context->lease_time)
|
if (time > context->lease_time)
|
||||||
|
{
|
||||||
time = context->lease_time;
|
time = context->lease_time;
|
||||||
|
if (time < 600u)
|
||||||
|
time = 600;
|
||||||
|
}
|
||||||
|
|
||||||
if (context->flags & CONTEXT_DEPRECATE)
|
if (context->flags & CONTEXT_DEPRECATE)
|
||||||
deprecate = 1;
|
deprecate = 1;
|
||||||
|
|
||||||
|
if (context->flags & CONTEXT_CONSTRUCTED)
|
||||||
|
constructed = 1;
|
||||||
|
|
||||||
|
|
||||||
/* collect dhcp-range tags */
|
/* collect dhcp-range tags */
|
||||||
if (context->netid.next == &context->netid && context->netid.net)
|
if (context->netid.next == &context->netid && context->netid.net)
|
||||||
{
|
{
|
||||||
@@ -404,17 +425,18 @@ static int add_prefixes(struct in6_addr *local, int prefix,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* configured time is ceiling */
|
/* configured time is ceiling */
|
||||||
if (valid > time)
|
if (!constructed || valid > time)
|
||||||
valid = time;
|
valid = time;
|
||||||
|
|
||||||
if ((flags & IFACE_DEPRECATED) || deprecate)
|
if (flags & IFACE_DEPRECATED)
|
||||||
preferred = 0;
|
preferred = 0;
|
||||||
else
|
|
||||||
{
|
if (deprecate)
|
||||||
|
time = 0;
|
||||||
|
|
||||||
/* configured time is ceiling */
|
/* configured time is ceiling */
|
||||||
if (preferred > time)
|
if (!constructed || preferred > time)
|
||||||
preferred = time;
|
preferred = time;
|
||||||
}
|
|
||||||
|
|
||||||
if (preferred > param->pref_time)
|
if (preferred > param->pref_time)
|
||||||
{
|
{
|
||||||
|
|||||||
+9
-2
@@ -626,7 +626,13 @@ static int dhcp6_no_relay(int msg_type, struct in6_addr *link_address, struct dh
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lease_time = have_config(valid_config, CONFIG_TIME) ? valid_config->lease_time : this_context->lease_time;
|
if (have_config(valid_config, CONFIG_TIME))
|
||||||
|
lease_time = valid_config->lease_time;
|
||||||
|
else
|
||||||
|
lease_time = this_context->lease_time;
|
||||||
|
|
||||||
|
if (this_context->valid < lease_time)
|
||||||
|
lease_time = this_context->valid;
|
||||||
|
|
||||||
if (ia_option)
|
if (ia_option)
|
||||||
{
|
{
|
||||||
@@ -740,7 +746,8 @@ static int dhcp6_no_relay(int msg_type, struct in6_addr *link_address, struct dh
|
|||||||
o1 = new_opt6(OPTION6_IAADDR);
|
o1 = new_opt6(OPTION6_IAADDR);
|
||||||
put_opt6(addrp, sizeof(*addrp));
|
put_opt6(addrp, sizeof(*addrp));
|
||||||
/* preferred lifetime */
|
/* preferred lifetime */
|
||||||
put_opt6_long(this_context && (this_context->flags & CONTEXT_DEPRECATE) ? 0 : lease_time);
|
put_opt6_long(this_context && (this_context->preferred < lease_time) ?
|
||||||
|
this_context->preferred : lease_time);
|
||||||
put_opt6_long(lease_time); /* valid lifetime */
|
put_opt6_long(lease_time); /* valid lifetime */
|
||||||
end_opt6(o1);
|
end_opt6(o1);
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user