31a25da8c2
Allow user to send ICMP Echo Request message a.k.a pings. The same ICMP API and framework is used for network stack internal needs in later commits. One benefit for this new API is that it allows sending Echo Requests to offlined network devices. Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
127 lines
3.4 KiB
C
127 lines
3.4 KiB
C
/** @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_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,
|
|
int priority,
|
|
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,
|
|
int priority,
|
|
const void *data,
|
|
size_t data_size)
|
|
{
|
|
ARG_UNUSED(iface);
|
|
ARG_UNUSED(dst);
|
|
ARG_UNUSED(identifier);
|
|
ARG_UNUSED(sequence);
|
|
ARG_UNUSED(tos);
|
|
ARG_UNUSED(priority);
|
|
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 */
|