diff options
author | Hans Dedecker <dedeckeh@gmail.com> | 2017-05-11 15:34:27 +0200 |
---|---|---|
committer | Hans Dedecker <dedeckeh@gmail.com> | 2017-05-11 16:11:55 +0200 |
commit | 9dd5316deae6402de68ddc8a08d1a6b496101828 (patch) | |
tree | a10a9ece2eab499fa61c0369fa15c8fa536b0bc1 /src | |
parent | 29cb2ff9ebce36884ee517cbe39b440d5eb57914 (diff) |
config: make RA mtu configurable via UCI
Allow to specify the router advertisement mtu via the uci parameter
ra_mtu. In case the config parameter is not set the MTU is taken from
the interface as before.
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/config.c | 8 | ||||
-rw-r--r-- | src/odhcpd.h | 1 | ||||
-rw-r--r-- | src/router.c | 5 |
3 files changed, 13 insertions, 1 deletions
diff --git a/src/config.c b/src/config.c index acf30de..d6b4e81 100644 --- a/src/config.c +++ b/src/config.c @@ -50,6 +50,7 @@ enum { IFACE_ATTR_RA_MAXINTERVAL, IFACE_ATTR_RA_LIFETIME, IFACE_ATTR_RA_USELEASETIME, + IFACE_ATTR_RA_MTU, IFACE_ATTR_PD_MANAGER, IFACE_ATTR_PD_CER, IFACE_ATTR_NDPROXY_ROUTING, @@ -88,6 +89,7 @@ static const struct blobmsg_policy iface_attrs[IFACE_ATTR_MAX] = { [IFACE_ATTR_RA_MAXINTERVAL] = { .name = "ra_maxinterval", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_RA_LIFETIME] = { .name = "ra_lifetime", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_RA_USELEASETIME] = { .name = "ra_useleasetime", .type = BLOBMSG_TYPE_BOOL }, + [IFACE_ATTR_RA_MTU] = { .name = "ra_mtu", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_NDPROXY_ROUTING] = { .name = "ndproxy_routing", .type = BLOBMSG_TYPE_BOOL }, [IFACE_ATTR_NDPROXY_SLAVE] = { .name = "ndproxy_slave", .type = BLOBMSG_TYPE_BOOL }, }; @@ -594,6 +596,12 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr if ((c = tb[IFACE_ATTR_RA_MANAGEMENT])) iface->managed = blobmsg_get_u32(c); + if ((c = tb[IFACE_ATTR_RA_MTU])) { + iface->ra_mtu = blobmsg_get_u32(c); + if (iface->ra_mtu < 1280) + goto err; + } + if ((c = tb[IFACE_ATTR_RA_OFFLINK])) iface->ra_not_onlink = blobmsg_get_bool(c); diff --git a/src/odhcpd.h b/src/odhcpd.h index 334276e..50827a4 100644 --- a/src/odhcpd.h +++ b/src/odhcpd.h @@ -162,6 +162,7 @@ struct interface { int ra_maxinterval; int ra_mininterval; int ra_lifetime; + uint32_t ra_mtu; // DHCPv4 struct in_addr dhcpv4_start; diff --git a/src/router.c b/src/router.c index feae5c7..a31bf4e 100644 --- a/src/router.c +++ b/src/router.c @@ -259,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(); - 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"); + if (mtu == 0) + mtu = odhcpd_get_interface_config(iface->ifname, "mtu"); + if (mtu < 1280) mtu = 1280; |