mbed-os/source/6LoWPAN/ws/ws_neighbor_class.h

185 lines
6.4 KiB
C

/*
* Copyright (c) 2018-2019, Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef WS_NEIGHBOR_CLASS_H_
#define WS_NEIGHBOR_CLASS_H_
#include "fhss_ws_extension.h"
#include "6LoWPAN/ws/ws_common_defines.h"
#define RSL_UNITITIALIZED 0x7fff
typedef struct ws_neighbor_class_entry {
fhss_ws_neighbor_timing_info_t fhss_data;
uint16_t rsl_in; /*!< RSL EWMA heard from neighbour*/
uint16_t rsl_out; /*!< RSL EWMA heard by neighbour*/
uint16_t routing_cost; /*!< ETX to border Router. */
bool candidate_parent: 1;
bool broadcast_timing_info_stored: 1;
bool broadcast_shedule_info_stored: 1;
bool synch_done : 1;
bool negative_aro_send : 1;
bool unicast_data_rx : 1;
} ws_neighbor_class_entry_t;
/**
* Neighbor hopping info data base
*/
typedef struct ws_neighbor_class_s {
ws_neighbor_class_entry_t *neigh_info_list; /*!< Allocated hopping info array*/
uint8_t list_size; /*!< List size*/
} ws_neighbor_class_t;
/**
* ws_neighbor_class_alloc a function for allocate giving list size
*
* \param class_data pointer to structure which will be initialized by this function
* \param list_size define list size
*
* \return true Allocate Ok
* \return false Allocate Fail
*
*/
bool ws_neighbor_class_alloc(ws_neighbor_class_t *class_data, uint8_t list_size);
/**
* ws_neighbor_class_dealloc a function for free allocated neighbor hopping info
*
* \param class_data pointer to structure which will be initialized by this function
*
*/
void ws_neighbor_class_dealloc(ws_neighbor_class_t *class_data);
/**
* ws_neighbor_class_entry_t a function for search hopping info for giving neighbor attribut
*
* \param class_data pointer to structure which will be initialized by this function
* \param attribute_index define pointer to storage info
*
* \return NULL when Attribute is not correct
* \return Pointer to neighbor hopping info
*
*/
ws_neighbor_class_entry_t *ws_neighbor_class_entry_get(ws_neighbor_class_t *class_data, uint8_t attribute_index);
/**
* ws_neighbor_class_entry_t a function for search hopping info for giving neighbor attribute index
*
* \param class_data pointer to structure which will be initialized by this function
* \param entry which attribute index is counted.
*
* \return Attribute index of entry
*
*/
uint8_t ws_neighbor_class_entry_index_get(ws_neighbor_class_t *class_data, ws_neighbor_class_entry_t *entry);
/**
* ws_neighbor_class_entry_remove a function for clean information should be call when neighbor is removed
*
* \param class_data pointer to structure which will be initialized by this function
* \param attribute_index define pointer to storage info
*
*/
void ws_neighbor_class_entry_remove(ws_neighbor_class_t *class_data, uint8_t attribute_index);
/**
* ws_neighbor_class_neighbor_unicast_time_info_update a function for update neighbor unicast time information
*
* \param ws_neighbor pointer to neighbor
* \param ws_utt Unicast time IE data
* \param timestamp timestamp for received data
*
*/
void ws_neighbor_class_neighbor_unicast_time_info_update(ws_neighbor_class_entry_t *ws_neighbor, ws_utt_ie_t *ws_utt, uint32_t timestamp);
/**
* ws_neighbor_class_neighbor_unicast_schedule_set a function for update neighbor unicast shedule information
*
* \param ws_neighbor pointer to neighbor
* \param ws_us Unicast schedule IE data
*
*/
void ws_neighbor_class_neighbor_unicast_schedule_set(ws_neighbor_class_entry_t *ws_neighbor, ws_us_ie_t *ws_us);
/**
* ws_neighbor_class_neighbor_broadcast_time_info_update a function for update neighbor broadcast time information
*
* \param ws_neighbor pointer to neighbor
* \param ws_bt_ie Broadcast time IE data
* \param timestamp timestamp for received data
*
*/
void ws_neighbor_class_neighbor_broadcast_time_info_update(ws_neighbor_class_entry_t *ws_neighbor, ws_bt_ie_t *ws_bt_ie, uint32_t timestamp);
/**
* ws_neighbor_class_neighbor_broadcast_schedule_set a function for update neighbor broadcast shedule information
*
* \param ws_neighbor pointer to neighbor
* \param ws_bs_ie Broadcast schedule IE data
*
*/
void ws_neighbor_class_neighbor_broadcast_schedule_set(ws_neighbor_class_entry_t *ws_neighbor, ws_bs_ie_t *ws_bs_ie);
/**
* ws_neighbor_class_rf_sensitivity_calculate
*
* Calculates minimum heard RSL value from all packets.
* This will dynamically adjusts min sensitivity if value is not properly set
*
* \param rsl_heard; rsl_heard heard from Radio
*
*/
void ws_neighbor_class_rf_sensitivity_calculate(uint8_t rsl_heard);
/**
* ws_neighbor_class_rsl_from_dbm_calculate
*
* Calculates rsl value from dbm heard.
* This provides a range of -174 (0) to +80 (254) dBm.
*
* \param dbm_heard; dbm heard from the neighbour
*
*/
uint8_t ws_neighbor_class_rsl_from_dbm_calculate(int8_t dbm_heard);
/** Helper macros to read RSL values from neighbour class.
*
*/
#define ws_neighbor_class_rsl_in_get(ws_neighbour) (ws_neighbour->rsl_in >> WS_RSL_SCALING)
#define ws_neighbor_class_rsl_out_get(ws_neighbour) (ws_neighbour->rsl_out >> WS_RSL_SCALING)
/**
* ws_neighbor_class_neighbor_broadcast_schedule_set a function for update neighbor broadcast shedule information
*
* \param ws_neighbor pointer to neighbor
* \param dbm_heard; dbm heard from the neighbour
*
*/
void ws_neighbor_class_rsl_in_calculate(ws_neighbor_class_entry_t *ws_neighbor, int8_t dbm_heard);
/**
* ws_neighbor_class_neighbor_broadcast_schedule_set a function for update neighbor broadcast shedule information
*
* \param ws_neighbor pointer to neighbor
* \param rsl_reported; rsl value reported by neighbour in packet from RSL-IE
*
*/
void ws_neighbor_class_rsl_out_calculate(ws_neighbor_class_entry_t *ws_neighbor, uint8_t rsl_reported);
#endif /* WS_NEIGHBOR_CLASS_H_ */