-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ng_icmpv6: Initial import #2555
Merged
Merged
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same question here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So |
||
* | ||
* @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.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do we need this in the public header?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So an application (I'm thinking test applications specifically here) can build it easily.