| /** @file |
| @brief ICMPv4 handler |
| |
| This is not to be included by the application. |
| */ |
| |
| /* |
| * Copyright (c) 2016 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef __ICMPV4_H |
| #define __ICMPV4_H |
| |
| #include <zephyr/types.h> |
| |
| #include <zephyr/net/net_ip.h> |
| #include <zephyr/net/net_pkt.h> |
| |
| #define NET_ICMPV4_DST_UNREACH 3 /* Destination unreachable */ |
| #define NET_ICMPV4_ECHO_REQUEST 8 |
| #define NET_ICMPV4_ECHO_REPLY 0 |
| #define NET_ICMPV4_TIME_EXCEEDED 11 /* Time exceeded */ |
| #define NET_ICMPV4_BAD_IP_HEADER 12 /* Bad IP header */ |
| |
| #define NET_ICMPV4_DST_UNREACH_NO_PROTO 2 /* Protocol not supported */ |
| #define NET_ICMPV4_DST_UNREACH_NO_PORT 3 /* Port unreachable */ |
| #define NET_ICMPV4_TIME_EXCEEDED_FRAGMENT_REASSEMBLY_TIME 1 /* Fragment reassembly time exceeded */ |
| #define NET_ICMPV4_BAD_IP_HEADER_LENGTH 2 /* Bad length field */ |
| |
| #define NET_ICMPV4_UNUSED_LEN 4 |
| |
| struct net_icmpv4_echo_req { |
| uint16_t identifier; |
| uint16_t sequence; |
| } __packed; |
| |
| typedef enum net_verdict (*icmpv4_callback_handler_t)( |
| struct net_pkt *pkt, |
| struct net_ipv4_hdr *ip_hdr, |
| struct net_icmp_hdr *icmp_hdr); |
| |
| struct net_icmpv4_handler { |
| sys_snode_t node; |
| icmpv4_callback_handler_t handler; |
| uint8_t type; |
| uint8_t code; |
| }; |
| |
| /** |
| * @brief Send ICMPv4 error message. |
| * @param pkt Network packet that this error is related to. |
| * @param type Type of the error message. |
| * @param code Code of the type of the error message. |
| * @return Return 0 if the sending succeed, <0 otherwise. |
| */ |
| int net_icmpv4_send_error(struct net_pkt *pkt, uint8_t type, uint8_t code); |
| |
| /** |
| * @brief Send ICMPv4 echo request message. |
| * |
| * @param iface Network interface. |
| * @param dst IPv4 address of the target host. |
| * @param identifier An identifier to aid in matching Echo Replies |
| * to this Echo Request. May be zero. |
| * @param sequence A sequence number to aid in matching Echo Replies |
| * to this Echo Request. May be zero. |
| * @param tos IPv4 Type-of-service field value. Represents combined DSCP and ECN |
| * values. |
| * @param data Arbitrary payload data that will be included in the |
| * Echo Reply verbatim. May be NULL. |
| * @param data_size Size of the Payload Data in bytes. May be zero. In case data |
| * pointer is NULL, the function will generate the payload up to the requested |
| * size. |
| * |
| * @return Return 0 if the sending succeed, <0 otherwise. |
| */ |
| #if defined(CONFIG_NET_NATIVE_IPV4) |
| int net_icmpv4_send_echo_request(struct net_if *iface, |
| struct in_addr *dst, |
| uint16_t identifier, |
| uint16_t sequence, |
| uint8_t tos, |
| const void *data, |
| size_t data_size); |
| #else |
| static inline int net_icmpv4_send_echo_request(struct net_if *iface, |
| struct in_addr *dst, |
| uint16_t identifier, |
| uint16_t sequence, |
| uint8_t tos, |
| const void *data, |
| size_t data_size) |
| { |
| ARG_UNUSED(iface); |
| ARG_UNUSED(dst); |
| ARG_UNUSED(identifier); |
| ARG_UNUSED(sequence); |
| ARG_UNUSED(tos); |
| ARG_UNUSED(data); |
| ARG_UNUSED(data_size); |
| |
| return -ENOTSUP; |
| } |
| #endif |
| |
| #if defined(CONFIG_NET_NATIVE_IPV4) |
| void net_icmpv4_register_handler(struct net_icmpv4_handler *handler); |
| |
| void net_icmpv4_unregister_handler(struct net_icmpv4_handler *handler); |
| |
| enum net_verdict net_icmpv4_input(struct net_pkt *pkt, |
| struct net_ipv4_hdr *ip_hdr); |
| |
| int net_icmpv4_finalize(struct net_pkt *pkt); |
| |
| void net_icmpv4_init(void); |
| #else |
| #define net_icmpv4_init(...) |
| #define net_icmpv4_register_handler(...) |
| #define net_icmpv4_unregister_handler(...) |
| #endif |
| |
| #endif /* __ICMPV4_H */ |