Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
ns_address_internal.h
00001 /* 00002 * Copyright (c) 2008, 2010-2019, Arm Limited and affiliates. 00003 * SPDX-License-Identifier: Apache-2.0 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 */ 00017 /** 00018 * 00019 * \file ns_address_internal.h 00020 * \brief address type definitions. 00021 * 00022 * nanoStack: supported address types and associated data structures. 00023 * 00024 * 00025 */ 00026 00027 00028 #ifndef _NS_ADDRESS_H 00029 #define _NS_ADDRESS_H 00030 00031 #include "ns_list.h" 00032 00033 #define ADDR_MULTICAST_MAX 3 00034 #define ADDR_SIZE 16 00035 #define PAN_ID_LEN 2 00036 /** Address types */ 00037 typedef enum { 00038 ADDR_NONE = 0, /*!< No address */ 00039 ADDR_802_15_4_SHORT = 2, /*!< 16-bit PAN with 16-bit 802.15.4 address */ 00040 ADDR_802_15_4_LONG = 3, /*!< 16-bit PAN with 64-bit 802.15.4 address */ 00041 ADDR_IPV6 = 4, /*!< 128 bit IPv6 address containing both Prefix (high 64 bits) and Interface identifier (low 64 bits) */ 00042 //ADDR_DATA=5, /*!< Attribute-based data-centric query */ 00043 ADDR_BROADCAST = 6, /*!< Broadcast (inc RFC 4944 multicast) address (obsolescent) */ 00044 ADDR_EUI_48 = 7, /*!< 48-bit Extended Unique Identifier (eg Ethernet) */ 00045 } addrtype_t; /*!< Address types in the stack */ 00046 00047 /** Address field */ 00048 typedef uint8_t address_t[ADDR_SIZE]; 00049 00050 /** Address structure */ 00051 typedef struct ns_sockaddr { 00052 addrtype_t addr_type ; /*!< Type of address */ 00053 address_t address ; /*!< Source or destination address */ 00054 uint16_t port ; /*!< Source or destination port */ 00055 } sockaddr_t; 00056 00057 struct protocol_interface_info_entry; 00058 struct if_address_entry; 00059 struct socket; 00060 00061 typedef struct addr_multicast_fwd { 00062 uint8_t group[16]; 00063 ns_list_link_t link; 00064 } addr_multicast_fwd_t; 00065 00066 typedef enum if_address_source_e { 00067 ADDR_SOURCE_UNKNOWN, 00068 ADDR_SOURCE_SLAAC, 00069 ADDR_SOURCE_DHCP, 00070 ADDR_SOURCE_STATIC, 00071 ADDR_SOURCE_THREAD_ALOC, 00072 ADDR_SOURCE_THREAD_DOMAIN 00073 } if_address_source_t; 00074 00075 typedef enum if_address_callback_e { 00076 ADDR_CALLBACK_DAD_COMPLETE, // Duplicate Address Detection complete - address now valid 00077 ADDR_CALLBACK_DAD_FAILED, // Duplicate Address Detection failed - address is a duplicate, about to be deleted 00078 ADDR_CALLBACK_PARENT_FULL, // Neighbour Cache full at parent or 6LBR - couldn't register address, about to be deleted 00079 ADDR_CALLBACK_TIMER, // state_timer reached 0 00080 ADDR_CALLBACK_DEPRECATED, // preferred lifetime reached 0 00081 ADDR_CALLBACK_INVALIDATED, // valid lifetime reached 0 - about to be deleted, unless callback increases lifetime 00082 ADDR_CALLBACK_REFRESHED, // valid lifetime updated (up or down, aside from usual expiry) 00083 ADDR_CALLBACK_DELETED, // address is deleted (no longer on interface at point of call) 00084 } if_address_callback_t; 00085 00086 typedef void if_address_callback_fn(struct protocol_interface_info_entry *interface, struct if_address_entry *addr, if_address_callback_t reason); 00087 typedef void if_address_notification_fn(struct protocol_interface_info_entry *interface, const struct if_address_entry *addr, if_address_callback_t reason); 00088 00089 typedef struct if_address_entry { 00090 uint8_t address[16]; // IPv6 (or IPv4-mapped IPv6 in future) 00091 uint8_t prefix_len; // length of prefix part 00092 uint32_t valid_lifetime; // seconds remaining; 0xffffffff = infinite 00093 uint32_t preferred_lifetime; // seconds remaining; 0 if deprecated, 0xffffffff = infinite 00094 uint32_t state_timer; // ticks to state change - used by DAD, then can be used by protocol 00095 uint8_t count; // general count field - used by DAD, then can be used by protocol 00096 bool temporary: 1; // RFC 4941 temporary address 00097 bool tentative: 1; // Tentative address (Duplicate Address Detection running) 00098 bool group_added: 1; // Solicited-Node group added 00099 if_address_source_t source; // 00100 if_address_callback_fn *cb; // Address protocol callback function 00101 void *data; // Address protocol data 00102 ns_list_link_t link; 00103 } if_address_entry_t; 00104 00105 typedef NS_LIST_HEAD (if_address_entry_t, link) if_address_list_t; 00106 00107 /* Groups we are a member of on an interface */ 00108 typedef struct if_group_entry { 00109 uint8_t group[16]; 00110 bool mld_last_reporter: 1; 00111 uint16_t mld_timer; // Or used by MLD alternative, eg Thread registration 00112 uint16_t ref_count; 00113 ns_list_link_t link; 00114 } if_group_entry_t; 00115 00116 typedef NS_LIST_HEAD (if_group_entry_t, link) if_group_list_t; 00117 00118 /* Groups we will forward onto an interface */ 00119 typedef struct if_group_fwd_entry { 00120 uint8_t group[16]; 00121 uint32_t lifetime; 00122 ns_list_link_t link; 00123 } if_group_fwd_entry_t; 00124 00125 typedef NS_LIST_HEAD (if_group_fwd_entry_t, link) if_group_fwd_list_t; 00126 00127 extern uint32_t addr_preferences_default; // default SOCKET_IPV6_ADDR_PREFERENCES 00128 00129 extern const uint8_t ADDR_SHORT_ADR_SUFFIC[6]; // 0000:00ff:fe00 00130 extern const uint8_t ADDR_LINK_LOCAL_PREFIX[8]; // fe80::/64 00131 extern const uint8_t ADDR_MULTICAST_SOLICITED[13]; // ff02::1:ffxx:xxxx/104 00132 extern const uint8_t ADDR_IF_LOCAL_ALL_NODES[16]; // ff01::1 00133 extern const uint8_t ADDR_IF_LOCAL_ALL_ROUTERS[16]; // ff01::2 00134 extern const uint8_t ADDR_LINK_LOCAL_ALL_NODES[16]; // ff02::1 00135 extern const uint8_t ADDR_LINK_LOCAL_ALL_ROUTERS[16]; // ff02::2 00136 extern const uint8_t ADDR_LINK_LOCAL_ALL_MLDV2_ROUTERS[16]; // ff02::16 00137 extern const uint8_t ADDR_LINK_LOCAL_MDNS[16]; // ff02::fb 00138 extern const uint8_t ADDR_REALM_LOCAL_ALL_NODES[16]; // ff03::1 00139 extern const uint8_t ADDR_REALM_LOCAL_ALL_ROUTERS[16]; // ff03::2 00140 extern const uint8_t ADDR_SITE_LOCAL_ALL_ROUTERS[16]; // ff05::2 00141 extern const uint8_t ADDR_ALL_MPL_FORWARDERS[16]; // ff03::fc 00142 extern const uint8_t ADDR_ALL_DHCP_RELAY_AGENTS_AND_SERVERS[16]; // ff02::1:2 00143 extern const uint8_t ADDR_LOOPBACK[16]; // ::1 00144 extern const uint8_t ADDR_UNSPECIFIED[16]; // :: 00145 00146 /* Don't bother having another 8 zero bytes for this - reuse ADDR_UNSPECIFIED */ 00147 #define ADDR_EUI64_ZERO ADDR_UNSPECIFIED 00148 00149 /** Functions provided by address.c */ 00150 uint8_t addr_check_broadcast(const address_t addr, addrtype_t addr_type); 00151 00152 void address_module_init(void); 00153 void addr_fast_timer(struct protocol_interface_info_entry *cur, uint_fast16_t ticks); 00154 void addr_slow_timer(struct protocol_interface_info_entry *cur, uint_fast16_t seconds); 00155 struct if_address_entry *addr_add(struct protocol_interface_info_entry *cur, const uint8_t address[__static 16], uint_fast8_t prefix_len, if_address_source_t source, uint32_t valid_lifetime, uint32_t preferred_lifetime, bool skip_dad); 00156 int_fast8_t addr_delete(struct protocol_interface_info_entry *cur, const uint8_t address[__static 16]); 00157 int_fast8_t addr_deprecate(struct protocol_interface_info_entry *cur, const uint8_t address[__static 16]); 00158 void addr_delete_matching(struct protocol_interface_info_entry *cur, const uint8_t *prefix, uint8_t prefix_len, if_address_source_t source); 00159 void addr_delete_entry(struct protocol_interface_info_entry *cur, if_address_entry_t *addr); 00160 void addr_set_non_preferred(struct protocol_interface_info_entry *cur, if_address_source_t source); 00161 void addr_max_slaac_entries_set(struct protocol_interface_info_entry *cur, uint8_t max_slaac_entries); 00162 00163 void addr_notification_register(if_address_notification_fn fn); 00164 void addr_cb(struct protocol_interface_info_entry *interface, if_address_entry_t *addr, if_address_callback_t reason); 00165 void addr_set_valid_lifetime(struct protocol_interface_info_entry *interface, if_address_entry_t *entry, uint32_t valid_lifetime); 00166 void addr_set_preferred_lifetime(struct protocol_interface_info_entry *interface, if_address_entry_t *entry, uint32_t preferred_lifetime); 00167 00168 void addr_lifetime_update(struct protocol_interface_info_entry *interface, if_address_entry_t *address, uint32_t valid_lifetime, uint32_t preferred_lifetime, uint32_t threshold); 00169 00170 int_fast8_t addr_policy_table_add_entry(const uint8_t *prefix, uint8_t len, uint8_t precedence, uint8_t label); 00171 int_fast8_t addr_policy_table_delete_entry(const uint8_t *prefix, uint8_t len); 00172 uint8_t addr_len_from_type(addrtype_t addr_type); 00173 char *trace_sockaddr(const sockaddr_t *addr, bool panid_prefix); 00174 00175 const uint8_t *addr_select_source(struct protocol_interface_info_entry *interface, const uint8_t dest[__static 16], uint32_t addr_preferences); 00176 const uint8_t *addr_select_with_prefix(struct protocol_interface_info_entry *cur, const uint8_t *prefix, uint8_t prefix_len, uint32_t addr_preferences); 00177 int8_t addr_interface_select_source(struct protocol_interface_info_entry *cur, uint8_t *src_ptr, const uint8_t *dest, uint32_t addr_preferences); 00178 struct if_address_entry *addr_get_entry(const struct protocol_interface_info_entry *interface, const uint8_t addr[__static 16]); 00179 bool addr_is_assigned_to_interface(const struct protocol_interface_info_entry *interface, const uint8_t addr[__static 16]); 00180 bool addr_is_tentative_for_interface(const struct protocol_interface_info_entry *interface, const uint8_t addr[__static 16]); 00181 00182 void addr_policy_remove_by_label(uint8_t label); 00183 00184 void addr_duplicate_detected(struct protocol_interface_info_entry *interface, const uint8_t addr[__static 16]); 00185 00186 struct if_group_entry *addr_add_group(struct protocol_interface_info_entry *interface, const uint8_t group[__static 16]); 00187 void addr_remove_group(struct protocol_interface_info_entry *interface, const uint8_t group[__static 16]); 00188 bool addr_am_group_member_on_interface(const struct protocol_interface_info_entry *interface, const uint8_t group[__static 16]); 00189 struct if_group_entry *addr_get_group_entry(const struct protocol_interface_info_entry *interface, const uint8_t group[__static 16]); 00190 void addr_delete_group(struct protocol_interface_info_entry *interface, const uint8_t group[__static 16]); 00191 void addr_delete_group_entry(struct protocol_interface_info_entry *interface, if_group_entry_t *entry); 00192 00193 void addr_add_router_groups(struct protocol_interface_info_entry *interface); 00194 00195 bool addr_multicast_fwd_add(struct protocol_interface_info_entry *interface, const uint8_t group[16], uint32_t lifetime); 00196 bool addr_multicast_fwd_remove(struct protocol_interface_info_entry *interface, const uint8_t group[16]); 00197 bool addr_multicast_fwd_check(struct protocol_interface_info_entry *interface, const uint8_t group[16]); 00198 void addr_multicast_fwd_adjust_upstream_full(struct protocol_interface_info_entry *upstream, bool add); 00199 void addr_multicast_fwd_set_forwarding(struct protocol_interface_info_entry *interface, bool enable); 00200 00201 #define addr_is_ipv6_unspecified(addr) (memcmp(addr, ADDR_UNSPECIFIED, 16) == 0) 00202 #define addr_is_ipv6_loopback(addr) (memcmp(addr, ADDR_LOOPBACK, 16) == 0) 00203 bool addr_is_ipv6_link_local(const uint8_t addr[__static 16]); 00204 #define addr_is_ipv6_multicast(addr) (*(addr) == 0xFF) 00205 uint_fast8_t addr_ipv6_scope(const uint8_t addr[__static 16], const struct protocol_interface_info_entry *interface); 00206 #define addr_ipv6_multicast_scope(addr) ((addr)[1] & 0x0F) 00207 bool addr_ipv6_equal(const uint8_t a[__static 16], const uint8_t b[__static 16]); 00208 bool addr_iid_matches_eui64(const uint8_t iid[__static 8], const uint8_t eui64[__static 8]); 00209 bool addr_iid_matches_lowpan_short(const uint8_t iid[__static 8], uint16_t short_addr); 00210 bool addr_iid_reserved(const uint8_t iid[__static 8]); 00211 int_fast8_t addr_opaque_iid_key_set(const void *secret_key, uint8_t key_len); 00212 int_fast8_t addr_opaque_initial_iid_set(const void *iid); 00213 bool addr_opaque_iid_key_is_set(void); 00214 void addr_generate_opaque_iid(struct protocol_interface_info_entry *cur, uint8_t addr[__static 16]); 00215 bool addr_iid_from_outer(uint8_t iid_out[__static 8], const sockaddr_t *addr_in); 00216 00217 uint8_t *addr_ipv6_write_from_lowpan_short(uint8_t dst[__static 16], const uint8_t prefix[__static 8], uint16_t short_addr); 00218 00219 void memswap(uint8_t *restrict a, uint8_t *restrict b, uint_fast8_t len); 00220 00221 int addr_interface_set_ll64(struct protocol_interface_info_entry *cur, if_address_callback_fn *cb); 00222 bool addr_interface_all_address_ready(struct protocol_interface_info_entry *cur); 00223 00224 /* address_type 0 means "any" address - we return short by preference */ 00225 /* address_type 1 means long address - we ignore short addresses */ 00226 int8_t addr_interface_get_ll_address(struct protocol_interface_info_entry *cur, uint8_t *address_ptr, uint8_t address_type); 00227 int8_t addr_interface_gp_prefix_compare(struct protocol_interface_info_entry *cur, const uint8_t *prefix); 00228 int8_t addr_interface_address_compare(struct protocol_interface_info_entry *cur, const uint8_t *addr); 00229 #endif /*_NS_ADDRESS_H*/
Generated on Tue Jul 12 2022 13:54:38 by
