-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2555 from authmillenon/ng_icmpv6/feat/initial
ng_icmpv6: Initial import
- Loading branch information
Showing
15 changed files
with
1,035 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
/* | ||
* Copyright (C) 2015 Martine Lenders <mlenders@inf.fu-berlin.de> | ||
* | ||
* This file is subject to the terms and conditions of the GNU Lesser General | ||
* Public License v2.1. See the file LICENSE in the top level directory for | ||
* more details. | ||
*/ | ||
|
||
/** | ||
* @defgroup net_ng_icmpv6 Internet Control Message Protocol for IPv6 | ||
* @ingroup net_ng_ipv6 | ||
* @brief Basic implementation of ICMPv6 | ||
* | ||
* @see <a href="https://tools.ietf.org/html/rfc4443"> | ||
* RFC 4443 | ||
* </a> | ||
* @{ | ||
* | ||
* @file | ||
* @brief Definitions for ICMPv6 | ||
* | ||
* @author Martine Lenders <mlenders@inf.fu-berlin.de> | ||
*/ | ||
|
||
#ifndef NG_ICMPV6_H_ | ||
#define NG_ICMPV6_H_ | ||
|
||
#include <inttypes.h> | ||
|
||
#include "byteorder.h" | ||
#include "kernel_types.h" | ||
#include "net/ng_ipv6/hdr.h" | ||
#include "net/ng_nettype.h" | ||
#include "net/ng_nettype.h" | ||
#include "net/ng_pkt.h" | ||
|
||
#include "net/ng_icmpv6/echo.h" | ||
#include "net/ng_icmpv6/error.h" | ||
#include "net/ng_icmpv6/types.h" | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/** | ||
* @brief General ICMPv6 message format. | ||
* | ||
* @see <a href="https://tools.ietf.org/html/rfc4443#section-2.1"> | ||
* RFC 4443, section 2.1 | ||
* </a> | ||
*/ | ||
typedef struct __attribute__((packed)) { | ||
uint8_t type; /**< message type */ | ||
uint8_t code; /**< message code */ | ||
network_uint16_t csum; /**< checksum */ | ||
} ng_icmpv6_hdr_t; | ||
|
||
/** | ||
* @brief Demultiplexes a received ICMPv6 packet according to its type field. | ||
* | ||
* @param[in] iface The receiving interface | ||
* @param[in] pkt The packet to demultiplex. | ||
*/ | ||
void ng_icmpv6_demux(kernel_pid_t iface, ng_pktsnip_t *pkt); | ||
|
||
/** | ||
* @brief Builds an ICMPv6 message for sending. | ||
* | ||
* @param[in] type Type for the ICMPv6 message. | ||
* @param[in] code Code for the ICMPv6 message. | ||
* @param[in] size Size of the ICMPv6 message (needs do be > | ||
* `sizeof(ng_icmpv6_hdr_t)`). | ||
* | ||
* @return The ICMPv6 message on success | ||
* @return NULL, on failure | ||
*/ | ||
ng_pktsnip_t *ng_icmpv6_build(uint8_t type, uint8_t code, size_t size); | ||
|
||
/* TODO: build error messages */ | ||
|
||
/** | ||
* @brief Calculates the checksum for an ICMPv6 packet. | ||
* | ||
* @param[in] hdr The header the checksum should be calculated | ||
* for. | ||
* @param[in] pseudo_hdr The header the pseudo header shall be generated | ||
* from. NULL if none is needed. | ||
* | ||
* @return 0, on success. | ||
* @return -EINVAL, if ng_pktsnip_t::type of @p pkt was not NG_NETTYPE_ICMPV6 | ||
* @return -ENOENT, if ng_pktsnip_t::type of @p pseudo_hdr was not | ||
* NG_NETTYPE_IPV6 | ||
*/ | ||
int ng_icmpv6_calc_csum(ng_pktsnip_t *hdr, ng_pktsnip_t *pseudo_hdr); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* NG_ICMPV6_H_ */ | ||
/** | ||
* @} | ||
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
/* | ||
* Copyright (C) 2015 Martine Lenders <mlenders@inf.fu-berlin.de> | ||
* | ||
* This file is subject to the terms and conditions of the GNU Lesser | ||
* General Public License v2.1. See the file LICENSE in the top level | ||
* directory for more details. | ||
*/ | ||
|
||
/** | ||
* @defgroup net_ng_icmpv6_echo ICMPv6 echo messages | ||
* @ingroup net_ng_icmpv6 | ||
* @brief ICMPv6 echo request and reply | ||
* @{ | ||
* | ||
* @file | ||
* @brief ICMPv6 echo message definitions | ||
* | ||
* @author Martine Lenders <mlenders@inf.fu-berlin.de> | ||
*/ | ||
#ifndef NG_ICMPV6_ECHO_H_ | ||
#define NG_ICMPV6_ECHO_H_ | ||
|
||
#include <inttypes.h> | ||
|
||
#include "byteorder.h" | ||
#include "kernel_types.h" | ||
#include "net/ng_icmpv6/types.h" | ||
#include "net/ng_ipv6/hdr.h" | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/** | ||
* @brief Echo request and response message format. | ||
* @extends ng_icmpv6_hdr_t | ||
* | ||
* @see <a href="https://tools.ietf.org/html/rfc4443#section-4.1"> | ||
* RFC 4443, section 4.1 | ||
* </a> | ||
* @see <a href="https://tools.ietf.org/html/rfc4443#section-4.2"> | ||
* RFC 4443, section 4.2 | ||
* </a> | ||
*/ | ||
typedef struct __attribute__((packed)) { | ||
uint8_t type; /**< message type */ | ||
uint8_t code; /**< message code */ | ||
network_uint16_t csum; /**< checksum */ | ||
network_uint16_t id; /**< identifier */ | ||
network_uint16_t seq; /**< Sequence number */ | ||
} ng_icmpv6_echo_t; | ||
|
||
/** | ||
* @brief Builds an ICMPv6 echo message of type @p type for sending. | ||
* | ||
* @param[in] type Type of the echo message. Expected to be either | ||
* NG_ICMPV6_ECHO_REQ or NG_ICMPV6_ECHO_REP. | ||
* @param[in] id ID for the echo message in host byte-order | ||
* @param[in] seq Sequence number for the echo message in host byte-order | ||
* @param[in] data Payload for the echo message | ||
* @param[in] data_len Length of @p data | ||
* | ||
* @return The echo message on success | ||
* @return NULL, on failure | ||
*/ | ||
ng_pktsnip_t *ng_icmpv6_echo_build(uint8_t type, uint16_t id, uint16_t seq, | ||
uint8_t *data, size_t data_len); | ||
|
||
/** | ||
* @brief Builds an ICMPv6 echo request for sending. | ||
* | ||
* @see <a href="https://tools.ietf.org/html/rfc4443#section-4.1"> | ||
* RFC 4443, section 4.1 | ||
* </a> | ||
* | ||
* @param[in] id ID for the echo request in host byte-order | ||
* @param[in] seq Sequence number for the echo request in host byte-order | ||
* @param[in] data Payload for the echo request | ||
* @param[in] data_len Length of @p data | ||
* | ||
* @return The echo request message on success | ||
* @return NULL, on failure | ||
*/ | ||
static inline ng_pktsnip_t *ng_icmpv6_echo_req_build(uint16_t id, uint16_t seq, | ||
uint8_t *data, size_t data_len) | ||
{ | ||
return ng_icmpv6_echo_build(NG_ICMPV6_ECHO_REQ, id, seq, data, data_len); | ||
} | ||
|
||
/** | ||
* @brief Builds an ICMPv6 echo reply for sending. | ||
* | ||
* @see <a href="https://tools.ietf.org/html/rfc4443#section-4.2"> | ||
* RFC 4443, section 4.2 | ||
* </a> | ||
* | ||
* @param[in] id ID for the echo reply in host byte-order | ||
* @param[in] seq Sequence number for the echo reply in host byte-order | ||
* @param[in] data Payload for the echo reply | ||
* @param[in] data_len Length of @p data | ||
* | ||
* @return The echo reply message on success | ||
* @return NULL, on failure | ||
*/ | ||
static inline ng_pktsnip_t *ng_icmpv6_echo_rep_build(uint16_t id, uint16_t seq, | ||
uint8_t *data, size_t data_len) | ||
{ | ||
return ng_icmpv6_echo_build(NG_ICMPV6_ECHO_REP, id, seq, data, data_len); | ||
} | ||
|
||
|
||
/** | ||
* @brief ICMPv6 echo request handler | ||
* | ||
* @param[in] iface The interface the echo requuest was received on. | ||
* @param[in] ipv6_hdr The IPv6 header of the echo request. | ||
* @param[in] echo The Echo Request message. | ||
* @param[in] len Length of the echo request message (ng_ipv6_hdr_t::len | ||
* of @p ipv6_hdr minus length of extension headers). | ||
*/ | ||
void ng_icmpv6_echo_req_handle(kernel_pid_t iface, ng_ipv6_hdr_t *ipv6_hdr, | ||
ng_icmpv6_echo_t *echo, uint16_t len); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* NG_ICMPV6_ECHO_H_ */ | ||
/** @} */ |
Oops, something went wrong.