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 mtu configurable via UCI
[project/odhcpd.git]
/
src
/
router.c
diff --git
a/src/router.c
b/src/router.c
index
dd3f09c
..
a31bf4e
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,9
+259,12
@@
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")
;
+
uint32_t mtu = iface->ra_mtu
;
int hlim = odhcpd_get_interface_config(iface->ifname, "hop_limit");
int hlim = odhcpd_get_interface_config(iface->ifname, "hop_limit");
+ if (mtu == 0)
+ mtu = odhcpd_get_interface_config(iface->ifname, "mtu");
+
if (mtu < 1280)
mtu = 1280;
if (mtu < 1280)
mtu = 1280;
@@
-317,7
+322,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
+362,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
+620,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;