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.
address.h
00001 /* 00002 * Copyright (c) 2008, 2010-2017, 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 address.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 void addr_delete_matching(struct protocol_interface_info_entry *cur, const uint8_t *prefix, uint8_t prefix_len, if_address_source_t source); 00158 void addr_delete_entry(struct protocol_interface_info_entry *cur, if_address_entry_t *addr); 00159 void addr_set_non_preferred(struct protocol_interface_info_entry *cur, if_address_source_t source); 00160 void addr_max_slaac_entries_set(struct protocol_interface_info_entry *cur, uint8_t max_slaac_entries); 00161 00162 void addr_notification_register(if_address_notification_fn fn); 00163 void addr_cb(struct protocol_interface_info_entry *interface, if_address_entry_t *addr, if_address_callback_t reason); 00164 void addr_set_valid_lifetime(struct protocol_interface_info_entry *interface, if_address_entry_t *entry, uint32_t valid_lifetime); 00165 void addr_set_preferred_lifetime(struct protocol_interface_info_entry *interface, if_address_entry_t *entry, uint32_t preferred_lifetime); 00166 00167 int_fast8_t addr_policy_table_add_entry(const uint8_t *prefix, uint8_t len, uint8_t precedence, uint8_t label); 00168 int_fast8_t addr_policy_table_delete_entry(const uint8_t *prefix, uint8_t len); 00169 uint8_t addr_len_from_type(addrtype_t addr_type); 00170 char* trace_sockaddr(const sockaddr_t* addr, bool panid_prefix); 00171 00172 const uint8_t *addr_select_source(struct protocol_interface_info_entry *interface, const uint8_t dest[__static 16], uint32_t addr_preferences); 00173 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); 00174 int8_t addr_interface_select_source(struct protocol_interface_info_entry *cur, uint8_t *src_ptr, const uint8_t *dest, uint32_t addr_preferences); 00175 struct if_address_entry *addr_get_entry(const struct protocol_interface_info_entry *interface, const uint8_t addr[__static 16]); 00176 bool addr_is_assigned_to_interface(const struct protocol_interface_info_entry *interface, const uint8_t addr[__static 16]); 00177 bool addr_is_tentative_for_interface(const struct protocol_interface_info_entry *interface, const uint8_t addr[__static 16]); 00178 00179 void addr_duplicate_detected(struct protocol_interface_info_entry *interface, const uint8_t addr[__static 16]); 00180 00181 struct if_group_entry *addr_add_group(struct protocol_interface_info_entry *interface, const uint8_t group[__static 16]); 00182 void addr_remove_group(struct protocol_interface_info_entry *interface, const uint8_t group[__static 16]); 00183 bool addr_am_group_member_on_interface(const struct protocol_interface_info_entry *interface, const uint8_t group[__static 16]); 00184 struct if_group_entry *addr_get_group_entry(const struct protocol_interface_info_entry *interface, const uint8_t group[__static 16]); 00185 void addr_delete_group(struct protocol_interface_info_entry *interface, const uint8_t group[__static 16]); 00186 void addr_delete_group_entry(struct protocol_interface_info_entry *interface, if_group_entry_t *entry); 00187 00188 void addr_add_router_groups(struct protocol_interface_info_entry *interface); 00189 00190 bool addr_multicast_fwd_add(struct protocol_interface_info_entry *interface, const uint8_t group[16], uint32_t lifetime); 00191 bool addr_multicast_fwd_remove(struct protocol_interface_info_entry *interface, const uint8_t group[16]); 00192 bool addr_multicast_fwd_check(struct protocol_interface_info_entry *interface, const uint8_t group[16]); 00193 void addr_multicast_fwd_adjust_upstream_full(struct protocol_interface_info_entry *upstream, bool add); 00194 void addr_multicast_fwd_set_forwarding(struct protocol_interface_info_entry *interface, bool enable); 00195 00196 #define addr_is_ipv6_unspecified(addr) (memcmp(addr, ADDR_UNSPECIFIED, 16) == 0) 00197 #define addr_is_ipv6_loopback(addr) (memcmp(addr, ADDR_LOOPBACK, 16) == 0) 00198 bool addr_is_ipv6_link_local(const uint8_t addr[__static 16]); 00199 #define addr_is_ipv6_multicast(addr) (*(addr) == 0xFF) 00200 uint_fast8_t addr_ipv6_scope(const uint8_t addr[__static 16], const struct protocol_interface_info_entry *interface); 00201 #define addr_ipv6_multicast_scope(addr) ((addr)[1] & 0x0F) 00202 bool addr_ipv6_equal(const uint8_t a[__static 16], const uint8_t b[__static 16]); 00203 bool addr_iid_matches_eui64(const uint8_t iid[__static 8], const uint8_t eui64[__static 8]); 00204 bool addr_iid_matches_lowpan_short(const uint8_t iid[__static 8], uint16_t short_addr); 00205 bool addr_iid_reserved(const uint8_t iid[__static 8]); 00206 int_fast8_t addr_opaque_iid_key_set(const void *secret_key, uint8_t key_len); 00207 int_fast8_t addr_opaque_initial_iid_set(const void *iid); 00208 bool addr_opaque_iid_key_is_set(void); 00209 void addr_generate_opaque_iid(struct protocol_interface_info_entry *cur, uint8_t addr[__static 16]); 00210 bool addr_iid_from_outer(uint8_t iid_out[__static 8], const sockaddr_t *addr_in); 00211 00212 uint8_t *addr_ipv6_write_from_lowpan_short(uint8_t dst[__static 16], const uint8_t prefix[__static 8], uint16_t short_addr); 00213 00214 void memswap(uint8_t *restrict a, uint8_t *restrict b, uint_fast8_t len); 00215 00216 int addr_interface_set_ll64(struct protocol_interface_info_entry *cur, if_address_callback_fn *cb); 00217 bool addr_interface_all_address_ready(struct protocol_interface_info_entry *cur); 00218 00219 /* address_type 0 means "any" address - we return short by preference */ 00220 /* address_type 1 means long address - we ignore short addresses */ 00221 int8_t addr_interface_get_ll_address(struct protocol_interface_info_entry *cur, uint8_t *address_ptr, uint8_t address_type); 00222 int8_t addr_interface_gp_prefix_compare(struct protocol_interface_info_entry *cur, const uint8_t *prefix); 00223 int8_t addr_interface_address_compare(struct protocol_interface_info_entry *cur, const uint8_t *addr); 00224 #endif /*_NS_ADDRESS_H*/
Generated on Tue Jul 12 2022 12:43:27 by
