[PATCH 09/17] net: ipv6: Incorporate IPv6 support into u-boot net subsystem

Ramon Fried rfried.dev at gmail.com
Mon Sep 12 09:00:21 CEST 2022


On Tue, Sep 6, 2022 at 6:10 PM Viacheslav Mitrofanov
<v.v.mitrofanov at yadro.com> wrote:
>
> Add net_ip6_handler (an IPv6 packet handler) into net_loop. Add
> neighbor discovery mechanism into network init process. That is the
> main step to run IPv6 in u-boot. Now u-boot is capable to use NDP and
> handle IPv6 packets.
>
> Signed-off-by: Viacheslav Mitrofanov <v.v.mitrofanov at yadro.com>
> ---
>  net/net.c | 23 ++++++++++++++++++++++-
>  1 file changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/net/net.c b/net/net.c
> index 81905f6315..f818170930 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -91,6 +91,8 @@
>  #include <image.h>
>  #include <log.h>
>  #include <net.h>
> +#include <net6.h>
> +#include <ndisc.h>
>  #include <net/fastboot.h>
>  #include <net/tftp.h>
>  #if defined(CONFIG_CMD_PCAP)
> @@ -340,8 +342,17 @@ void net_auto_load(void)
>
>  static int net_init_loop(void)
>  {
> -       if (eth_get_dev())
> +       if (eth_get_dev()) {
>                 memcpy(net_ethaddr, eth_get_ethaddr(), 6);
> +
> +               if (IS_ENABLED(CONFIG_IPV6)) {
> +                       ip6_make_lladdr(&net_link_local_ip6, net_ethaddr);
> +                       if (!memcmp(&net_ip6, &net_null_addr_ip6,
> +                                   sizeof(struct in6_addr)))
> +                               memcpy(&net_ip6, &net_link_local_ip6,
> +                                      sizeof(struct in6_addr));
> +               }
> +       }
>         else
>                 /*
>                  * Not ideal, but there's no way to get the actual error, and I
> @@ -382,6 +393,7 @@ int net_init(void)
>                                 (i + 1) * PKTSIZE_ALIGN;
>                 }
>                 arp_init();
> +               ndisc_init();
>                 net_clear_handlers();
>
>                 /* Only need to setup buffer pointers once. */
> @@ -563,6 +575,10 @@ restart:
>                 if (arp_timeout_check() > 0)
>                         time_start = get_timer(0);
>
> +               if (IS_ENABLED(CONFIG_IPV6)) {
> +                       if (use_ip6 && (ndisc_timeout_check() > 0))
> +                               time_start = get_timer(0);
> +               }
>                 /*
>                  *      Check the ethernet for a new packet.  The ethernet
>                  *      receive routine will process it.
> @@ -1187,6 +1203,11 @@ void net_process_received_packet(uchar *in_packet, int len)
>         case PROT_RARP:
>                 rarp_receive(ip, len);
>                 break;
> +#endif
> +#if IS_ENABLED(CONFIG_IPV6)
> +       case PROT_IP6:
> +               net_ip6_handler(et, (struct ip6_hdr *)ip, len);
> +               break;
>  #endif
>         case PROT_IP:
>                 debug_cond(DEBUG_NET_PKT, "Got IP\n");
> --
> 2.25.1
>
Reviewed-by: Ramon Fried <rfried.dev at gmail.com>


More information about the U-Boot mailing list