projects
/
project
/
odhcpd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
router: fix interface mtu read error
[project/odhcpd.git]
/
src
/
router.c
diff --git
a/src/router.c
b/src/router.c
index
ffafb94
..
f08a7b0
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))
@@
-258,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");
+ int 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;
@@
-288,6
+295,10
@@
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);
+ adv.h.nd_ra_retransmit = htonl(iface->ra_retranstime);
+
odhcpd_get_mac(iface, adv.lladdr.data);
// If not currently shutting down
odhcpd_get_mac(iface, adv.lladdr.data);
// If not currently shutting down
@@
-318,7
+329,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];
@@
-358,11
+369,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;
@@
-619,7
+627,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;