grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] send router solicitation for ipv6 address autoconf


From: Michael Chang
Subject: Re: [PATCH] send router solicitation for ipv6 address autoconf
Date: Tue, 18 Nov 2014 15:56:03 +0800
User-agent: Mutt/1.5.21 (2010-09-15)

On Sat, Nov 15, 2014 at 07:54:42PM +0300, Andrei Borzenkov wrote:
> В Thu, 13 Nov 2014 17:42:23 +0800
> Michael Chang <address@hidden> пишет:
> 
> > Many routers have long router advertisment interval configured by
> > default. The Neighbor Discovery protocol (RFC4861) has defined default
> > MaxRtrAdvInterval value as 600 seconds and
> > MinRtrAdvInterval as 0.33*MaxRtrAdvInterval. This makes
> > net_ipv6_autoconf fails more often than not as currently it passively
> > listens the RA message to perfom address autoconfiguration.
> > 
> > This patch tries to send router solicitation to overcome the problem of
> > long RA interval.
> > ---
> >  grub-core/net/icmp6.c |   81 
> > +++++++++++++++++++++++++++++++++++++++++++++++++
> >  grub-core/net/net.c   |    4 ++-
> >  include/grub/net/ip.h |    2 +
> >  3 files changed, 86 insertions(+), 1 deletions(-)
> > 
> > diff --git a/grub-core/net/icmp6.c b/grub-core/net/icmp6.c
> > index 796d549..87b264f 100644
> > --- a/grub-core/net/icmp6.c
> > +++ b/grub-core/net/icmp6.c
> > @@ -72,6 +72,11 @@ struct neighbour_advertise
> >    grub_uint64_t target[2];
> >  } GRUB_PACKED;
> >  
> > +struct router_solicit
> > +{
> > +  grub_uint32_t reserved;
> > +} GRUB_PACKED;
> > +
> >  enum
> >    {
> >      FLAG_SLAAC = 0x40
> > @@ -81,6 +86,7 @@ enum
> >    {
> >      ICMP6_ECHO = 128,
> >      ICMP6_ECHO_REPLY = 129,
> > +    ICMP6_ROUTER_SOLICIT = 133,
> >      ICMP6_ROUTER_ADVERTISE = 134,
> >      ICMP6_NEIGHBOUR_SOLICIT = 135,
> >      ICMP6_NEIGHBOUR_ADVERTISE = 136,
> > @@ -533,3 +539,78 @@ grub_net_icmp6_send_request (struct 
> > grub_net_network_level_interface *inf,
> >    grub_netbuff_free (nb);
> >    return err;
> >  }
> > +
> > +grub_err_t
> > +grub_net_icmp6_send_router_solicit (struct 
> > grub_net_network_level_interface *inf)
> > +{
> > +  struct grub_net_buff *nb;
> > +  grub_err_t err = GRUB_ERR_NONE;
> > +  grub_net_network_level_address_t multicast;
> > +  grub_net_link_level_address_t ll_multicast;
> > +  struct option_header *ohdr;
> > +  struct router_solicit *sol;
> > +  struct icmp_header *icmphr;
> > +
> > +  multicast.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6;
> > +  multicast.ipv6[0] = grub_be_to_cpu64_compile_time (0xff02ULL << 48);
> > +  multicast.ipv6[1] = grub_be_to_cpu64_compile_time (0x02ULL);
> > +
> 
> Could you use cpu_to_be variant; it makes it less confusing (that is
> what we do here).

Agreed. But how about to define hton and ntoh family ?

> 
> > +  err = grub_net_link_layer_resolve (inf, &multicast, &ll_multicast);
> > +  if (err)
> > +    return err;
> > +
> > +  nb = grub_netbuff_alloc (sizeof (struct router_solicit)
> > +                      + sizeof (struct option_header)
> > +                      + 6
> > +                      + sizeof (struct icmp_header)
> > +                      + GRUB_NET_OUR_IPV6_HEADER_SIZE
> > +                      + GRUB_NET_MAX_LINK_HEADER_SIZE);
> > +  if (!nb)
> > +    return grub_errno;
> > +  err = grub_netbuff_reserve (nb,
> > +                         sizeof (struct router_solicit)
> > +                         + sizeof (struct option_header)
> > +                         + 6
> > +                         + sizeof (struct icmp_header)
> > +                         + GRUB_NET_OUR_IPV6_HEADER_SIZE
> > +                         + GRUB_NET_MAX_LINK_HEADER_SIZE);
> > +
> 
> Error check?

OK. I'll add it.

> 
> Otherwise personally I'm fine with it.

Thanks for review, I'll submit second version soon.

Regards,
Michael



reply via email to

[Prev in Thread] Current Thread [Next in Thread]