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
rpl_upward.h
00001 /* 00002 * Copyright (c) 2015-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 #ifndef RPL_UPWARD_H_ 00019 #define RPL_UPWARD_H_ 00020 00021 #include "Common_Protocols/icmpv6_prefix.h" 00022 #include "rpl_control.h" 00023 00024 /* Structures are abstract for outer control layer */ 00025 typedef struct rpl_neighbour rpl_neighbour_t; 00026 typedef struct rpl_dodag_version rpl_dodag_version_t; 00027 typedef struct rpl_dodag rpl_dodag_t; 00028 typedef struct rpl_instance rpl_instance_t; 00029 00030 /* Internal flags used in prefix descriptors - disjoint from real L/A/R flags */ 00031 #define RPL_PIO_PUBLISHED 0x10 00032 #define RPL_PIO_AGE 0x08 00033 #define RPL_PIO_HOLD_MASK 0x07 00034 00035 /* Comparison functions return one of these values - as they are bits, you 00036 * can test for "greater-than-or-equal" by "if (cmp & (RPL_CMP_GREATER|RPL_CMP_EQUAL))". 00037 */ 00038 #define RPL_CMP_LESS 0x1 00039 #define RPL_CMP_EQUAL 0x2 00040 #define RPL_CMP_GREATER 0x4 00041 #define RPL_CMP_UNORDERED 0x8 00042 typedef uint_fast8_t rpl_cmp_t; 00043 00044 uint8_t rpl_seq_init(void); 00045 uint8_t rpl_seq_inc(uint8_t seq); 00046 rpl_cmp_t rpl_seq_compare(uint8_t a, uint8_t b); 00047 00048 uint16_t nrpl_dag_rank(const rpl_dodag_t *dodag, uint16_t rank); 00049 rpl_cmp_t rpl_rank_compare(const rpl_dodag_t *dodag, uint16_t a, uint16_t b); 00050 rpl_cmp_t rpl_rank_compare_dagrank_rank(const rpl_dodag_t *dodag, uint16_t dag_rank_a, uint16_t b); 00051 uint16_t rpl_rank_add(uint16_t a, uint16_t b); 00052 uint16_t rpl_rank_sub(uint16_t a, uint16_t b); 00053 uint16_t rpl_rank_next_level(const rpl_dodag_t *dodag, uint16_t a); 00054 uint16_t rpl_rank_max_at_level(const rpl_dodag_t *dodag, uint16_t a); 00055 00056 /* Internal APIs */ 00057 void rpl_upward_dio_timer(rpl_instance_t *instance, uint16_t ticks); 00058 00059 rpl_instance_t *rpl_lookup_instance(const rpl_domain_t *domain, uint8_t instance_id, const uint8_t *addr); 00060 rpl_instance_t *rpl_create_instance(rpl_domain_t *domain, uint8_t instance_id); 00061 void rpl_delete_instance(rpl_instance_t *instance); 00062 bool rpl_instance_purge(rpl_instance_t *instance); 00063 void rpl_instance_set_dodag_version(rpl_instance_t *instance, rpl_dodag_version_t *version, uint16_t rank); 00064 rpl_dodag_t *rpl_instance_current_dodag(const rpl_instance_t *instance); 00065 #ifdef HAVE_RPL_ROOT 00066 bool rpl_instance_am_root(const rpl_instance_t *instance); 00067 #else 00068 #define rpl_instance_am_root(instance) false 00069 #endif 00070 uint8_t rpl_instance_mop(const rpl_instance_t *instance); 00071 rpl_dodag_version_t *rpl_instance_current_dodag_version(const rpl_instance_t *instance); 00072 rpl_neighbour_t *rpl_instance_preferred_parent(const rpl_instance_t *instance); 00073 rpl_dodag_version_t *rpl_instance_predicate_match(rpl_instance_t *instance, uint8_t pred, uint8_t instance_id, const uint8_t *dodagid, uint8_t version_num); 00074 void rpl_instance_inconsistency(rpl_instance_t *instance); 00075 void rpl_instance_consistent_rx(rpl_instance_t *instance); 00076 void rpl_instance_increment_dtsn(rpl_instance_t *instance); 00077 void rpl_dodag_set_pref(rpl_dodag_t *dodag, uint8_t pref); 00078 void rpl_instance_poison(rpl_instance_t *instance, uint8_t count); 00079 void rpl_instance_force_leaf(rpl_instance_t *instance); 00080 void rpl_instance_trigger_parent_selection(rpl_instance_t *instance, uint16_t delay); 00081 void rpl_instance_remove_interface(rpl_instance_t *instance, int8_t if_id); 00082 void rpl_instance_dio_trigger(rpl_instance_t *instance, struct protocol_interface_info_entry *cur, const uint8_t *addr); 00083 void rpl_instance_set_local_repair(rpl_instance_t *instance, bool repair); 00084 bool rpl_instance_local_repair(const rpl_instance_t *instance); 00085 uint16_t rpl_instance_current_rank(const rpl_instance_t *instance); 00086 bool rpl_instance_address_is_parent(rpl_instance_t *instance, const uint8_t *ipv6_addr); 00087 bool rpl_instance_address_is_candidate(rpl_instance_t *instance, const uint8_t *ipv6_addr, uint16_t candidate_amount); 00088 uint16_t rpl_instance_address_candidate_count(rpl_instance_t *instance, bool selected_parents); 00089 void rpl_instance_neighbor_delete(rpl_instance_t *instance, const uint8_t *ipv6_addr); 00090 void rpl_instance_slow_timer(rpl_instance_t *instance, uint16_t seconds); 00091 00092 rpl_dodag_t *rpl_lookup_dodag(const rpl_instance_t *instance, const uint8_t *dodagid); 00093 rpl_dodag_t *rpl_create_dodag(rpl_instance_t *instance, const uint8_t *dodagid, uint8_t g_mop_prf); 00094 void rpl_delete_dodag(rpl_dodag_t *dodag); 00095 void rpl_delete_dodag_root(rpl_dodag_t *dodag); 00096 uint8_t rpl_dodag_mop(const rpl_dodag_t *dodag); 00097 void rpl_dodag_set_root(rpl_dodag_t *dodag, bool root); 00098 #ifdef HAVE_RPL_ROOT 00099 bool rpl_dodag_am_root(const rpl_dodag_t *dodag); 00100 #else 00101 #define rpl_dodag_am_root(dodag) false 00102 #endif 00103 uint8_t rpl_dodag_get_version_number_as_root(const rpl_dodag_t *dodag); 00104 void rpl_dodag_set_version_number_as_root(rpl_dodag_t *dodag, uint8_t number); 00105 void rpl_dodag_set_leaf(rpl_dodag_t *dodag, bool leaf); 00106 bool rpl_dodag_am_leaf(const rpl_dodag_t *dodag); 00107 const rpl_dodag_conf_t *rpl_dodag_get_config(const rpl_dodag_t *dodag); 00108 void rpl_dodag_inconsistency(rpl_dodag_t *dodag); 00109 void rpl_dodag_increment_dtsn(rpl_dodag_t *dodag); 00110 rpl_cmp_t rpl_dodag_pref_compare(const rpl_dodag_t *a, const rpl_dodag_t *b); 00111 void rpl_dodag_update_implicit_system_routes(rpl_dodag_t *dodag, rpl_neighbour_t *parent); 00112 00113 rpl_dio_route_t *rpl_dodag_update_dio_route(rpl_dodag_t *dodag, const uint8_t *prefix, uint8_t prefix_len, uint8_t flags, uint32_t lifetime, bool age); 00114 void rpl_dodag_delete_dio_route(rpl_dodag_t *dodag, rpl_dio_route_t *route); 00115 const rpl_dio_route_list_t *rpl_dodag_get_route_list(const rpl_dodag_t *dodag); 00116 00117 void rpl_dodag_update_unpublished_dio_prefix_start(rpl_dodag_t *dodag); 00118 void rpl_dodag_update_unpublished_dio_prefix_finish(rpl_dodag_t *dodag); 00119 prefix_entry_t *rpl_dodag_update_dio_prefix(rpl_dodag_t *dodag, const uint8_t *prefix, uint8_t prefix_len, uint8_t flags, uint32_t lifetime, uint32_t preftime, bool publish, bool age); 00120 void rpl_dodag_delete_dio_prefix(rpl_dodag_t *dodag, prefix_entry_t *prefix); 00121 const prefix_list_t *rpl_dodag_get_prefix_list(const rpl_dodag_t *dodag); 00122 00123 rpl_dodag_version_t *rpl_lookup_dodag_version(const rpl_dodag_t *dodag, uint8_t version_num); 00124 rpl_dodag_version_t *rpl_create_dodag_version(rpl_dodag_t *dodag, uint8_t version_num); 00125 void rpl_delete_dodag_version(rpl_dodag_version_t *version); 00126 bool rpl_dodag_version_possible_subdodag(const rpl_dodag_version_t *version, uint16_t rank); 00127 bool rpl_dodag_version_is_current(const rpl_dodag_version_t *version); 00128 rpl_cmp_t rpl_dodag_version_compare(const rpl_dodag_version_t *a, const rpl_dodag_version_t *b); 00129 void rpl_dodag_version_limit_greediness(rpl_dodag_version_t *version, uint16_t rank); 00130 void rpl_dodag_version_raise_greediness(rpl_dodag_version_t *version, uint16_t pref_rank); 00131 bool rpl_dodag_version_rank_indicates_possible_sub_dodag(const rpl_dodag_version_t *version, uint16_t rank); 00132 00133 rpl_neighbour_t *rpl_lookup_neighbour_by_ll_address(const rpl_instance_t *instance, const uint8_t *addr, int8_t if_id); 00134 rpl_neighbour_t *rpl_create_neighbour(rpl_dodag_version_t *instance, const uint8_t *ll_addr, int8_t if_id, uint8_t g_mop_prf, uint8_t dtsn); 00135 void rpl_delete_neighbour(rpl_instance_t *instance, rpl_neighbour_t *neighbour); 00136 bool rpl_dodag_update_config(rpl_dodag_t *dodag, const rpl_dodag_conf_t *conf, const uint8_t *src, bool *become_leaf); 00137 const uint8_t *rpl_neighbour_ll_address(const rpl_neighbour_t *neighbour); 00138 const uint8_t *rpl_neighbour_global_address(const rpl_neighbour_t *neighbour); 00139 void rpl_neighbour_update_global_address(rpl_neighbour_t *neighbour, const uint8_t *addr); 00140 void rpl_neighbour_update_dodag_version(rpl_neighbour_t *neighbour, rpl_dodag_version_t *version, uint16_t rank, uint8_t g_mop_prf); 00141 bool rpl_neighbour_update_dtsn(rpl_neighbour_t *neighbour, uint8_t dtsn); 00142 rpl_instance_t *rpl_neighbour_instance(const rpl_neighbour_t *neighbour); 00143 00144 00145 void rpl_instance_neighbours_changed(rpl_instance_t *instance, const rpl_dodag_t *dodag); 00146 void rpl_instance_run_parent_selection(rpl_instance_t *instance); 00147 00148 void rpl_upward_print_instance(rpl_instance_t *instance, route_print_fn_t *print_fn); 00149 00150 bool rpl_upward_read_dodag_info(const rpl_instance_t *instance, struct rpl_dodag_info_t *dodag_info); 00151 bool rpl_upward_accept_prefix_update(const rpl_dodag_t *dodag_info, const rpl_neighbour_t *neighbour, const rpl_neighbour_t *pref_parent); 00152 uint16_t rpl_upward_read_dao_target_list_size(const rpl_instance_t *instance, const uint8_t *target_prefix); 00153 00154 #endif /* RPL_UPWARD_H_ */
Generated on Tue Jul 12 2022 13:54:48 by
1.7.2