Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ns_address_internal.h Source File

ns_address_internal.h

Go to the documentation of this file.
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*/