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

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Tue Jan 13 16:15:17 PST 2015


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);
>  


More information about the systemd-devel mailing list