projects
/
project
/
odhcpd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
config: make RA reachableTime configurable via uci
[project/odhcpd.git]
/
src
/
router.c
diff --git
a/src/router.c
b/src/router.c
index
dd3f09c
..
7600e2f
100644
(file)
--- a/
src/router.c
+++ b/
src/router.c
@@
-120,6
+120,7
@@
int setup_router_interface(struct interface *iface, bool enable)
} else if (iface->ra == RELAYD_SERVER && !iface->master) {
iface->timer_rs.cb = trigger_router_advert;
uloop_timeout_set(&iface->timer_rs, 1000);
} else if (iface->ra == RELAYD_SERVER && !iface->master) {
iface->timer_rs.cb = trigger_router_advert;
uloop_timeout_set(&iface->timer_rs, 1000);
+ ndp_rqs_addr6_dump();
}
if (iface->ra == RELAYD_RELAY || (iface->ra == RELAYD_SERVER && !iface->master))
}
if (iface->ra == RELAYD_RELAY || (iface->ra == RELAYD_SERVER && !iface->master))
@@
-233,7
+234,8
@@
static int calc_adv_interval(struct interface *iface, uint32_t minvalid,
minival = (*maxival >= 9 ? *maxival/3 : *maxival);
odhcpd_urandom(&msecs, sizeof(msecs));
minival = (*maxival >= 9 ? *maxival/3 : *maxival);
odhcpd_urandom(&msecs, sizeof(msecs));
- msecs = (labs(msecs) % ((*maxival - minival)*1000)) + minival*1000;
+ msecs = (labs(msecs) % ((*maxival != minival) ? (*maxival - minival)*1000 : 500)) +
+ minival*1000;
return msecs;
}
return msecs;
}
@@
-257,12
+259,18
@@
static uint16_t calc_ra_lifetime(struct interface *iface, uint32_t maxival)
static uint64_t send_router_advert(struct interface *iface, const struct in6_addr *from)
{
time_t now = odhcpd_time();
static uint64_t send_router_advert(struct interface *iface, const struct in6_addr *from)
{
time_t now = odhcpd_time();
- int mtu = odhcpd_get_interface_config(iface->ifname, "mtu");
- int hlim = odhcpd_get_interface_config(iface->ifname, "hop_limit");
+ uint32_t mtu = iface->ra_mtu;
+ int hlim = iface->ra_hoplimit;
+
+ if (mtu == 0)
+ mtu = odhcpd_get_interface_config(iface->ifname, "mtu");
if (mtu < 1280)
mtu = 1280;
if (mtu < 1280)
mtu = 1280;
+ if (hlim == 0)
+ hlim = odhcpd_get_interface_config(iface->ifname, "hop_limit");
+
struct {
struct nd_router_advert h;
struct icmpv6_opt lladdr;
struct {
struct nd_router_advert h;
struct icmpv6_opt lladdr;
@@
-287,6
+295,9
@@
static uint64_t send_router_advert(struct interface *iface, const struct in6_add
adv.h.nd_ra_flags_reserved |= ND_RA_PREF_LOW;
else if (iface->route_preference > 0)
adv.h.nd_ra_flags_reserved |= ND_RA_PREF_HIGH;
adv.h.nd_ra_flags_reserved |= ND_RA_PREF_LOW;
else if (iface->route_preference > 0)
adv.h.nd_ra_flags_reserved |= ND_RA_PREF_HIGH;
+
+ adv.h.nd_ra_reachable = htonl(iface->ra_reachabletime);
+
odhcpd_get_mac(iface, adv.lladdr.data);
// If not currently shutting down
odhcpd_get_mac(iface, adv.lladdr.data);
// If not currently shutting down
@@
-317,7
+328,7
@@
static uint64_t send_router_advert(struct interface *iface, const struct in6_add
struct in6_addr dns_pref, *dns_addr = &dns_pref;
size_t dns_cnt = 1;
struct in6_addr dns_pref, *dns_addr = &dns_pref;
size_t dns_cnt = 1;
- odhcpd_get_
linklocal_interface_address(iface->ifindex
, &dns_pref);
+ odhcpd_get_
interface_dns_addr(iface
, &dns_pref);
for (ssize_t i = 0; i < ipcnt; ++i) {
struct odhcpd_ipaddr *addr = &addrs[i];
for (ssize_t i = 0; i < ipcnt; ++i) {
struct odhcpd_ipaddr *addr = &addrs[i];
@@
-357,11
+368,8
@@
static uint64_t send_router_advert(struct interface *iface, const struct in6_add
}
valid = TIME_LEFT(addr->valid, now);
}
valid = TIME_LEFT(addr->valid, now);
- if (iface->ra_useleasetime) {
- if (valid > iface->dhcpv4_leasetime)
- valid = iface->dhcpv4_leasetime;
- } else if (!preferred && valid < 7200)
- valid = 0;
+ if (iface->ra_useleasetime && valid > iface->dhcpv4_leasetime)
+ valid = iface->dhcpv4_leasetime;
if (minvalid > valid)
minvalid = valid;
if (minvalid > valid)
minvalid = valid;
@@
-618,7
+626,7
@@
static void forward_router_advertisement(uint8_t *data, size_t len)
size_t rewrite_cnt = iface->dns_cnt;
if (rewrite_cnt == 0) {
size_t rewrite_cnt = iface->dns_cnt;
if (rewrite_cnt == 0) {
- if (odhcpd_get_
linklocal_interface_address(iface->ifindex
, &addr))
+ if (odhcpd_get_
interface_dns_addr(iface
, &addr))
continue; // Unable to comply
rewrite = &addr;
continue; // Unable to comply
rewrite = &addr;