'icmp6-util.c',
'lldp-neighbor.c',
'lldp-network.c',
- 'ndisc-protocol.c',
+ 'ndisc-option.c',
'network-common.c',
'network-internal.c',
'sd-dhcp-client-id.c',
--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <netinet/icmp6.h>
+
+#include "ndisc-option.h"
+
+int ndisc_option_parse(
+ ICMP6Packet *p,
+ size_t offset,
+ uint8_t *ret_type,
+ size_t *ret_len,
+ const uint8_t **ret_opt) {
+
+ assert(p);
+
+ if (offset == p->raw_size)
+ return -ESPIPE; /* end of the packet */
+
+ if (offset > p->raw_size)
+ return -EBADMSG;
+
+ if (p->raw_size - offset < sizeof(struct nd_opt_hdr))
+ return -EBADMSG;
+
+ assert_cc(alignof(struct nd_opt_hdr) == 1);
+ const struct nd_opt_hdr *hdr = (const struct nd_opt_hdr*) (p->raw_packet + offset);
+ if (hdr->nd_opt_len == 0)
+ return -EBADMSG;
+
+ size_t len = hdr->nd_opt_len * 8;
+ if (p->raw_size - offset < len)
+ return -EBADMSG;
+
+ if (ret_type)
+ *ret_type = hdr->nd_opt_type;
+ if (ret_len)
+ *ret_len = len;
+ if (ret_opt)
+ *ret_opt = p->raw_packet + offset;
+
+ return 0;
+}
+
+static const uint8_t prefix_length_code_to_prefix_length[_PREFIX_LENGTH_CODE_MAX] = {
+ [PREFIX_LENGTH_CODE_96] = 96,
+ [PREFIX_LENGTH_CODE_64] = 64,
+ [PREFIX_LENGTH_CODE_56] = 56,
+ [PREFIX_LENGTH_CODE_48] = 48,
+ [PREFIX_LENGTH_CODE_40] = 40,
+ [PREFIX_LENGTH_CODE_32] = 32,
+};
+
+int pref64_plc_to_prefix_length(uint16_t plc, uint8_t *ret) {
+ plc &= PREF64_PLC_MASK;
+ if (plc >= _PREFIX_LENGTH_CODE_MAX)
+ return -EINVAL;
+
+ if (ret)
+ *ret = prefix_length_code_to_prefix_length[plc];
+ return 0;
+}
+
+int pref64_prefix_length_to_plc(uint8_t prefixlen, uint8_t *ret) {
+ assert(ret);
+
+ for (size_t i = 0; i < ELEMENTSOF(prefix_length_code_to_prefix_length); i++)
+ if (prefix_length_code_to_prefix_length[i] == prefixlen) {
+ *ret = i;
+ return 0;
+ }
+
+ return -EINVAL;
+}
--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+#include "icmp6-packet.h"
+#include "time-util.h"
+
+/* RFC 8781: PREF64 or (NAT64 prefix) */
+#define PREF64_SCALED_LIFETIME_MASK 0xfff8
+#define PREF64_PLC_MASK 0x0007
+#define PREF64_MAX_LIFETIME_USEC (65528 * USEC_PER_SEC)
+
+typedef enum PrefixLengthCode {
+ PREFIX_LENGTH_CODE_96,
+ PREFIX_LENGTH_CODE_64,
+ PREFIX_LENGTH_CODE_56,
+ PREFIX_LENGTH_CODE_48,
+ PREFIX_LENGTH_CODE_40,
+ PREFIX_LENGTH_CODE_32,
+ _PREFIX_LENGTH_CODE_MAX,
+ _PREFIX_LENGTH_CODE_INVALID = -EINVAL,
+} PrefixLengthCode;
+
+/* rfc8781: section 4 - Scaled Lifetime: 13-bit unsigned integer. PREFIX_LEN (Prefix Length Code): 3-bit unsigned integer */
+struct nd_opt_prefix64_info {
+ uint8_t type;
+ uint8_t length;
+ uint16_t lifetime_and_plc;
+ uint8_t prefix[12];
+} _packed_;
+
+int pref64_plc_to_prefix_length(uint16_t plc, uint8_t *ret);
+int pref64_prefix_length_to_plc(uint8_t prefixlen, uint8_t *ret);
+
+int ndisc_option_parse(
+ ICMP6Packet *p,
+ size_t offset,
+ uint8_t *ret_type,
+ size_t *ret_len,
+ const uint8_t **ret_opt);
+++ /dev/null
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-
-#include <netinet/icmp6.h>
-
-#include "ndisc-protocol.h"
-
-int ndisc_option_parse(
- ICMP6Packet *p,
- size_t offset,
- uint8_t *ret_type,
- size_t *ret_len,
- const uint8_t **ret_opt) {
-
- assert(p);
-
- if (offset == p->raw_size)
- return -ESPIPE; /* end of the packet */
-
- if (offset > p->raw_size)
- return -EBADMSG;
-
- if (p->raw_size - offset < sizeof(struct nd_opt_hdr))
- return -EBADMSG;
-
- assert_cc(alignof(struct nd_opt_hdr) == 1);
- const struct nd_opt_hdr *hdr = (const struct nd_opt_hdr*) (p->raw_packet + offset);
- if (hdr->nd_opt_len == 0)
- return -EBADMSG;
-
- size_t len = hdr->nd_opt_len * 8;
- if (p->raw_size - offset < len)
- return -EBADMSG;
-
- if (ret_type)
- *ret_type = hdr->nd_opt_type;
- if (ret_len)
- *ret_len = len;
- if (ret_opt)
- *ret_opt = p->raw_packet + offset;
-
- return 0;
-}
-
-static const uint8_t prefix_length_code_to_prefix_length[_PREFIX_LENGTH_CODE_MAX] = {
- [PREFIX_LENGTH_CODE_96] = 96,
- [PREFIX_LENGTH_CODE_64] = 64,
- [PREFIX_LENGTH_CODE_56] = 56,
- [PREFIX_LENGTH_CODE_48] = 48,
- [PREFIX_LENGTH_CODE_40] = 40,
- [PREFIX_LENGTH_CODE_32] = 32,
-};
-
-int pref64_plc_to_prefix_length(uint16_t plc, uint8_t *ret) {
- plc &= PREF64_PLC_MASK;
- if (plc >= _PREFIX_LENGTH_CODE_MAX)
- return -EINVAL;
-
- if (ret)
- *ret = prefix_length_code_to_prefix_length[plc];
- return 0;
-}
-
-int pref64_prefix_length_to_plc(uint8_t prefixlen, uint8_t *ret) {
- assert(ret);
-
- for (size_t i = 0; i < ELEMENTSOF(prefix_length_code_to_prefix_length); i++)
- if (prefix_length_code_to_prefix_length[i] == prefixlen) {
- *ret = i;
- return 0;
- }
-
- return -EINVAL;
-}
+++ /dev/null
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-#pragma once
-
-#include "icmp6-packet.h"
-#include "time-util.h"
-
-/* RFC 8781: PREF64 or (NAT64 prefix) */
-#define PREF64_SCALED_LIFETIME_MASK 0xfff8
-#define PREF64_PLC_MASK 0x0007
-#define PREF64_MAX_LIFETIME_USEC (65528 * USEC_PER_SEC)
-
-typedef enum PrefixLengthCode {
- PREFIX_LENGTH_CODE_96,
- PREFIX_LENGTH_CODE_64,
- PREFIX_LENGTH_CODE_56,
- PREFIX_LENGTH_CODE_48,
- PREFIX_LENGTH_CODE_40,
- PREFIX_LENGTH_CODE_32,
- _PREFIX_LENGTH_CODE_MAX,
- _PREFIX_LENGTH_CODE_INVALID = -EINVAL,
-} PrefixLengthCode;
-
-/* rfc8781: section 4 - Scaled Lifetime: 13-bit unsigned integer. PREFIX_LEN (Prefix Length Code): 3-bit unsigned integer */
-struct nd_opt_prefix64_info {
- uint8_t type;
- uint8_t length;
- uint16_t lifetime_and_plc;
- uint8_t prefix[12];
-} _packed_;
-
-int pref64_plc_to_prefix_length(uint16_t plc, uint8_t *ret);
-int pref64_prefix_length_to_plc(uint8_t prefixlen, uint8_t *ret);
-
-int ndisc_option_parse(
- ICMP6Packet *p,
- size_t offset,
- uint8_t *ret_type,
- size_t *ret_len,
- const uint8_t **ret_opt);
#include "sd-radv.h"
#include "list.h"
-#include "ndisc-protocol.h"
+#include "ndisc-option.h"
#include "network-common.h"
#include "sparse-endian.h"
#include "time-util.h"
#include "memory-util.h"
#include "missing_network.h"
#include "ndisc-internal.h"
-#include "ndisc-protocol.h"
+#include "ndisc-option.h"
#include "ndisc-router-internal.h"
#include "strv.h"