Gleb Klochkov / Mbed OS Climatcontroll_Main

Dependencies:   esp8266-driver

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers rpl_upward.h Source File

rpl_upward.h

00001 /*
00002  * Copyright (c) 2015-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 #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 void rpl_instance_slow_timer(rpl_instance_t *instance, uint16_t seconds);
00087 
00088 rpl_dodag_t *rpl_lookup_dodag(const rpl_instance_t *instance, const uint8_t *dodagid);
00089 rpl_dodag_t *rpl_create_dodag(rpl_instance_t *instance, const uint8_t *dodagid, uint8_t g_mop_prf);
00090 void rpl_delete_dodag(rpl_dodag_t *dodag);
00091 uint8_t rpl_dodag_mop(const rpl_dodag_t *dodag);
00092 void rpl_dodag_set_root(rpl_dodag_t *dodag, bool root);
00093 #ifdef HAVE_RPL_ROOT
00094 bool rpl_dodag_am_root(const rpl_dodag_t *dodag);
00095 #else
00096 #define rpl_dodag_am_root(dodag) false
00097 #endif
00098 uint8_t rpl_dodag_get_version_number_as_root(const rpl_dodag_t *dodag);
00099 void rpl_dodag_set_version_number_as_root(rpl_dodag_t *dodag, uint8_t number);
00100 void rpl_dodag_set_leaf(rpl_dodag_t *dodag, bool leaf);
00101 bool rpl_dodag_am_leaf(const rpl_dodag_t *dodag);
00102 const rpl_dodag_conf_t *rpl_dodag_get_config(const rpl_dodag_t *dodag);
00103 void rpl_dodag_inconsistency(rpl_dodag_t *dodag);
00104 void rpl_dodag_increment_dtsn(rpl_dodag_t *dodag);
00105 rpl_cmp_t rpl_dodag_pref_compare(const rpl_dodag_t *a, const rpl_dodag_t *b);
00106 void rpl_dodag_update_implicit_system_routes(rpl_dodag_t *dodag, rpl_neighbour_t *parent);
00107 
00108 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);
00109 void rpl_dodag_delete_dio_route(rpl_dodag_t *dodag, rpl_dio_route_t *route);
00110 const rpl_dio_route_list_t *rpl_dodag_get_route_list(const rpl_dodag_t *dodag);
00111 
00112 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);
00113 void rpl_dodag_delete_dio_prefix(rpl_dodag_t *dodag, prefix_entry_t *prefix);
00114 const prefix_list_t *rpl_dodag_get_prefix_list(const rpl_dodag_t *dodag);
00115 
00116 rpl_dodag_version_t *rpl_lookup_dodag_version(const rpl_dodag_t *dodag, uint8_t version_num);
00117 rpl_dodag_version_t *rpl_create_dodag_version(rpl_dodag_t *dodag, uint8_t version_num);
00118 void rpl_delete_dodag_version(rpl_dodag_version_t *version);
00119 bool rpl_dodag_version_possible_subdodag(const rpl_dodag_version_t *version, uint16_t rank);
00120 bool rpl_dodag_version_is_current(const rpl_dodag_version_t *version);
00121 rpl_cmp_t rpl_dodag_version_compare(const rpl_dodag_version_t *a, const rpl_dodag_version_t *b);
00122 void rpl_dodag_version_limit_greediness(rpl_dodag_version_t *version, uint16_t rank);
00123 void rpl_dodag_version_raise_greediness(rpl_dodag_version_t *version, uint16_t pref_rank);
00124 bool rpl_dodag_version_rank_indicates_possible_sub_dodag(const rpl_dodag_version_t *version, uint16_t rank);
00125 
00126 rpl_neighbour_t *rpl_lookup_neighbour_by_ll_address(const rpl_instance_t *instance, const uint8_t *addr, int8_t if_id);
00127 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);
00128 void rpl_delete_neighbour(rpl_instance_t *instance, rpl_neighbour_t *neighbour);
00129 bool rpl_dodag_update_config(rpl_dodag_t *dodag, const rpl_dodag_conf_t *conf, const uint8_t *src, bool *become_leaf);
00130 const uint8_t *rpl_neighbour_ll_address(const rpl_neighbour_t *neighbour);
00131 const uint8_t *rpl_neighbour_global_address(const rpl_neighbour_t *neighbour);
00132 void rpl_neighbour_update_global_address(rpl_neighbour_t *neighbour, const uint8_t *addr);
00133 void rpl_neighbour_update_dodag_version(rpl_neighbour_t *neighbour, rpl_dodag_version_t *version, uint16_t rank, uint8_t g_mop_prf);
00134 bool rpl_neighbour_update_dtsn(rpl_neighbour_t *neighbour, uint8_t dtsn);
00135 rpl_instance_t *rpl_neighbour_instance(const rpl_neighbour_t *neighbour);
00136 
00137 void rpl_instance_neighbours_changed(rpl_instance_t *instance);
00138 void rpl_instance_run_parent_selection(rpl_instance_t *instance);
00139 
00140 void rpl_upward_print_instance(rpl_instance_t *instance, route_print_fn_t *print_fn);
00141 
00142 bool rpl_upward_read_dodag_info(const rpl_instance_t *instance, struct rpl_dodag_info_t *dodag_info);
00143 uint16_t rpl_upward_read_dao_target_list_size(const rpl_instance_t *instance);
00144 #endif /* RPL_UPWARD_H_ */