On Tue, Jan 13, 2015 at 02:02:15PM +0200, Patrik Flykt wrote:
Update MTU according to the latest value received.
---
src/libsystemd-network/sd-icmp6-nd.c | 30 ++
src/systemd/sd-icmp6-nd.h| 2 ++
2 files changed, 32 insertions(+)
diff --git a/src/libsystemd-network/sd-icmp6-nd.c
b/src/libsystemd-network/sd-icmp6-nd.c
index 35d5f5f..3501055 100644
--- a/src/libsystemd-network/sd-icmp6-nd.c
+++ b/src/libsystemd-network/sd-icmp6-nd.c
@@ -271,10 +271,24 @@ int sd_icmp6_nd_new(sd_icmp6_nd **ret) {
return 0;
}
+int sd_icmp6_ra_get_mtu(sd_icmp6_nd *nd, uint32_t *mtu) {
+assert_return(nd, -EINVAL);
+assert_return(mtu, -EINVAL);
+
+if (!nd-link || !nd-link-mtu)
+return -ENOMSG;
+
+*mtu = nd-link-mtu;
+
+return 0;
+}
+
static int icmp6_ra_parse(sd_icmp6_nd *nd, struct nd_router_advert *ra,
ssize_t len) {
void *opt;
struct nd_opt_hdr *opt_hdr;
+struct nd_opt_mtu *opt_mtu;
+uint32_t mtu;
assert_return(nd, -EINVAL);
assert_return(nd-link, -EINVAL);
@@ -293,6 +307,22 @@ static int icmp6_ra_parse(sd_icmp6_nd *nd, struct
nd_router_advert *ra,
return -ENOMSG;
switch (opt_hdr-nd_opt_type) {
+case ND_OPT_MTU:
Would be nicer to define
struct nd_opt_mtu *opt_mtu;
here.
+opt_mtu = opt;
+
+mtu = be32toh(opt_mtu-nd_opt_mtu_mtu);
+
+if (!nd-link-mtu || mtu nd-link-mtu) {
+if (mtu IP6_MIN_MTU)
+nd-link-mtu = IP6_MIN_MTU;
+else
+nd-link-mtu = mtu;
nd-link-mtu = MAX(mtu, IP6_MIN_MTU)?
+
+log_icmp6_nd(nd, Link MTU %d advertised %d,
+nd-link-mtu, mtu);
There's strange indentation and the debug message is pretty cryptic.
+}
+
+break;
}
diff --git a/src/systemd/sd-icmp6-nd.h b/src/systemd/sd-icmp6-nd.h
index 73f91aa..73ebccf 100644
--- a/src/systemd/sd-icmp6-nd.h
+++ b/src/systemd/sd-icmp6-nd.h
@@ -51,6 +51,8 @@ sd_icmp6_nd *sd_icmp6_nd_ref(sd_icmp6_nd *nd);
sd_icmp6_nd *sd_icmp6_nd_unref(sd_icmp6_nd *nd);
int sd_icmp6_nd_new(sd_icmp6_nd **ret);
+int sd_icmp6_ra_get_mtu(sd_icmp6_nd *nd, uint32_t *mtu);
+
int sd_icmp6_nd_stop(sd_icmp6_nd *nd);
int sd_icmp6_router_solicitation_start(sd_icmp6_nd *nd);
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel