43#define EHOSTUNREACH_ROUTE \
44 __einfo_error ( EINFO_EHOSTUNREACH_ROUTE )
45#define EINFO_EHOSTUNREACH_ROUTE \
46 __einfo_uniqify ( EINFO_EHOSTUNREACH, 0, \
47 "No route to destination" )
48#define EHOSTUNREACH_PROHIBITED \
49 __einfo_error ( EINFO_EHOSTUNREACH_PROHIBITED )
50#define EINFO_EHOSTUNREACH_PROHIBITED \
51 __einfo_uniqify ( EINFO_EHOSTUNREACH, 1, \
52 "Communication administratively prohibited" )
53#define EHOSTUNREACH_ADDRESS \
54 __einfo_error ( EINFO_EHOSTUNREACH_ADDRESS )
55#define EINFO_EHOSTUNREACH_ADDRESS \
56 __einfo_uniqify ( EINFO_EHOSTUNREACH, 3, \
57 "Address unreachable" )
58#define EHOSTUNREACH_PORT \
59 __einfo_error ( EINFO_EHOSTUNREACH_PORT )
60#define EINFO_EHOSTUNREACH_PORT \
61 __einfo_uniqify ( EINFO_EHOSTUNREACH, 4, \
63#define EHOSTUNREACH_CODE( code ) \
64 EUNIQ ( EINFO_EHOSTUNREACH, ( (code) & 0x1f ), \
65 EHOSTUNREACH_ROUTE, EHOSTUNREACH_PROHIBITED, \
66 EHOSTUNREACH_ADDRESS, EHOSTUNREACH_PORT )
68#define ETIMEDOUT_HOP \
69 __einfo_error ( EINFO_ETIMEDOUT_HOP )
70#define EINFO_ETIMEDOUT_HOP \
71 __einfo_uniqify ( EINFO_ETIMEDOUT, 0, \
72 "Hop limit exceeded in transit" )
73#define ETIMEDOUT_REASSEMBLY \
74 __einfo_error ( EINFO_ETIMEDOUT_REASSEMBLY )
75#define EINFO_ETIMEDOUT_REASSEMBLY \
76 __einfo_uniqify ( EINFO_ETIMEDOUT, 1, \
77 "Fragment reassembly time exceeded" )
78#define ETIMEDOUT_CODE( code ) \
79 EUNIQ ( EINFO_ETIMEDOUT, ( (code) & 0x1f ), \
80 ETIMEDOUT_HOP, ETIMEDOUT_REASSEMBLY )
82#define EPROTO_BAD_HEADER \
83 __einfo_error ( EINFO_EPROTO_BAD_HEADER )
84#define EINFO_EPROTO_BAD_HEADER \
85 __einfo_uniqify ( EINFO_EPROTO, 0, \
86 "Erroneous header field" )
87#define EPROTO_NEXT_HEADER \
88 __einfo_error ( EINFO_EPROTO_NEXT_HEADER )
89#define EINFO_EPROTO_NEXT_HEADER \
90 __einfo_uniqify ( EINFO_EPROTO, 1, \
91 "Unrecognised next header type" )
92#define EPROTO_OPTION \
93 __einfo_error ( EINFO_EPROTO_OPTION )
94#define EINFO_EPROTO_OPTION \
95 __einfo_uniqify ( EINFO_EPROTO, 2, \
96 "Unrecognised IPv6 option" )
97#define EPROTO_CODE( code ) \
98 EUNIQ ( EINFO_EPROTO, ( (code) & 0x1f ), \
99 EPROTO_BAD_HEADER, EPROTO_NEXT_HEADER, EPROTO_OPTION )
191 if (
len <
sizeof ( *icmp ) ) {
192 DBGC (
netdev,
"ICMPv6 packet too short at %zd bytes (min %zd "
193 "bytes)\n",
len,
sizeof ( *icmp ) );
201 DBGC (
netdev,
"ICMPv6 checksum incorrect (is %04x, should be "
211 switch ( icmp->
type ) {
225 DBGC (
netdev,
"ICMPv6 unrecognised type %d code %d\n",
235 sin6_dest ) ) != 0 ) {
236 DBGC (
netdev,
"ICMPv6 could not handle type %d: %s\n",
258 .tcpip_protocol = &icmpv6_protocol,
#define NULL
NULL pointer (VOID *)
struct arbelprm_rc_send_wqe rc
struct bofm_section_header done
uint32_t type
Operating system type.
static struct net_device * netdev
#define AF_INET6
IPv6 Internet addresses.
#define __unused
Declare a variable or data structure as unused.
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
#define EINVAL
Invalid argument.
#define ENOTSUP
Operation not supported.
#define ERANGE
Result too large.
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
int icmp_rx_echo_request(struct io_buffer *iobuf, struct sockaddr_tcpip *st_src, struct icmp_echo_protocol *echo_protocol)
Process a received ICMP echo request.
int icmp_rx_echo_reply(struct io_buffer *iobuf, struct sockaddr_tcpip *st_src)
Process a received ICMP echo request.
#define __icmp_echo_protocol
Declare an ICMP echo protocol.
static int icmpv6_rx(struct io_buffer *iobuf, struct net_device *netdev, struct sockaddr_tcpip *st_src, struct sockaddr_tcpip *st_dest, uint16_t pshdr_csum)
Process a received packet.
#define EHOSTUNREACH_CODE(code)
static struct icmpv6_handler * icmpv6_handler(unsigned int type)
Identify ICMPv6 handler.
static int icmpv6_rx_echo_reply(struct io_buffer *iobuf, struct net_device *netdev __unused, struct sockaddr_in6 *sin6_src, struct sockaddr_in6 *sin6_dest __unused)
Process received ICMPv6 echo reply packet.
#define ETIMEDOUT_CODE(code)
static int icmpv6_rx_echo_request(struct io_buffer *iobuf, struct net_device *netdev __unused, struct sockaddr_in6 *sin6_src, struct sockaddr_in6 *sin6_dest __unused)
Process received ICMPv6 echo request packet.
#define EPROTO_CODE(code)
#define ICMPV6_PACKET_TOO_BIG
ICMPv6 packet too big.
#define __icmpv6_handler
Declare an ICMPv6 handler.
#define ICMPV6_DESTINATION_UNREACHABLE
ICMPv6 destination unreachable.
#define ICMPV6_TIME_EXCEEDED
ICMPv6 time exceeded.
#define ICMPV6_ECHO_REQUEST
ICMPv6 echo request.
#define ICMPV6_ECHO_REPLY
ICMPv6 echo reply.
#define ICMPV6_HANDLERS
ICMPv6 handler table.
#define ICMPV6_PARAMETER_PROBLEM
ICMPv6 parameter problem.
Transport-network layer interface.
#define __tcpip_protocol
Declare a TCP/IP transport-layer protocol.
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
#define iob_disown(iobuf)
Disown an I/O buffer.
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
char * strerror(int errno)
Retrieve string representation of error number.
int(* rx)(struct io_buffer *iobuf, struct net_device *netdev, struct sockaddr_in6 *sin6_src, struct sockaddr_in6 *sin6_dest)
Process received packet.
void * data
Start of data.
A transport-layer protocol of the TCP/IP stack (eg.
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
uint16_t tcpip_continue_chksum(uint16_t partial, const void *data, size_t len)
Calculate continued TCP/IP checkum.