diff options
author | Tom Rini <trini@konsulko.com> | 2022-12-05 13:28:22 -0500 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2022-12-05 13:28:22 -0500 |
commit | 6616ddb0f09c4ef3e8a79b76b146dbbd9c8f8c3d (patch) | |
tree | 9df20918981d508e1c9f8b27533abce955073889 /include/ndisc.h | |
parent | a50622d78c5c6babd1853ae913f339df54fe532c (diff) | |
parent | a72926257c1dbc456d1cd02fc6bd5ef6147e143f (diff) |
Merge branch '2022-12-05-add-IPv6-support'
To quote the author:
This patch set adds basic IPv6 support to U-boot.
It is based on Chris's Packham patches
(https://lists.denx.de/pipermail/u-boot/2017-January/279366.html)
Chris's patches were taken as base. There were efforts to launch it on
HiFive SiFive Unmatched board but the board didn't work well. The code was
refactored, fixed some bugs as CRC for little-endian, some parts were implemented in
our own way, something was taken from Linux. Finally we did manual tests and the
board worked well.
Testing was done on HiFive SiFive Unmatched board (RISC-V)
Diffstat (limited to 'include/ndisc.h')
-rw-r--r-- | include/ndisc.h | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/include/ndisc.h b/include/ndisc.h new file mode 100644 index 00000000000..f6f8eb6507c --- /dev/null +++ b/include/ndisc.h @@ -0,0 +1,102 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (C) 2013 Allied Telesis Labs NZ + * Chris Packham, <judge.packham@gmail.com> + * + * Copyright (C) 2022 YADRO + * Viacheslav Mitrofanov <v.v.mitrofanov@yadro.com> + */ + +#ifndef __NDISC_H__ +#define __NDISC_H__ + +#include <ndisc.h> + +/* struct nd_msg - ICMPv6 Neighbour Discovery message format */ +struct nd_msg { + struct icmp6hdr icmph; + struct in6_addr target; + __u8 opt[0]; +}; + +/* struct echo_msg - ICMPv6 echo request/reply message format */ +struct echo_msg { + struct icmp6hdr icmph; + __u16 id; + __u16 sequence; +}; + +/* Neigbour Discovery option types */ +enum { + __ND_OPT_PREFIX_INFO_END = 0, + ND_OPT_SOURCE_LL_ADDR = 1, + ND_OPT_TARGET_LL_ADDR = 2, + ND_OPT_PREFIX_INFO = 3, + ND_OPT_REDIRECT_HDR = 4, + ND_OPT_MTU = 5, + __ND_OPT_MAX +}; + +/* IPv6 destination address of packet waiting for ND */ +extern struct in6_addr net_nd_sol_packet_ip6; +/* MAC destination address of packet waiting for ND */ +extern uchar *net_nd_packet_mac; +/* pointer to packet waiting to be transmitted after ND is resolved */ +extern uchar *net_nd_tx_packet; +/* size of packet waiting to be transmitted */ +extern int net_nd_tx_packet_size; +/* the timer for ND resolution */ +extern ulong net_nd_timer_start; +/* the number of requests we have sent so far */ +extern int net_nd_try; + +#ifdef CONFIG_IPV6 +/** + * ndisc_init() - Make initial steps for ND state machine. + * Usually move variables into initial state. + */ +void ndisc_init(void); + +/** + * ndisc_receive() - Handle ND packet + * + * @et: pointer to incoming packet + * @ip6: pointer to IPv6 header + * @len: incoming packet length + * Return: 0 if handle successfully, -1 if unsupported/unknown ND packet type + */ +int ndisc_receive(struct ethernet_hdr *et, struct ip6_hdr *ip6, int len); + +/** + * ndisc_request() - Send ND request + */ +void ndisc_request(void); + +/** + * ndisc_init() - Check ND response timeout + * + * Return: 0 if no timeout, -1 otherwise + */ +int ndisc_timeout_check(void); +#else +static inline void ndisc_init(void) +{ +} + +static inline int +ndisc_receive(struct ethernet_hdr *et, struct ip6_hdr *ip6, int len) +{ + return -1; +} + +static inline void ndisc_request(void) +{ +} + +static inline int ndisc_timeout_check(void) +{ + return 0; +} +#endif + +#endif /* __NDISC_H__ */ |