[systemd-devel] [PATCH 05/11] sd-icmp6-nd: Add helper function to get the IPv6 link MTU

2015-01-13 Thread Patrik Flykt
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:
+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;
+
+log_icmp6_nd(nd, Link MTU %d advertised %d,
+nd-link-mtu, mtu);
+}
+
+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);
 
-- 
2.1.4

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


Re: [systemd-devel] [PATCH 05/11] sd-icmp6-nd: Add helper function to get the IPv6 link MTU

2015-01-13 Thread Zbigniew Jędrzejewski-Szmek
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