mirror of https://github.com/ARMmbed/mbed-os.git
185 lines
6.4 KiB
C
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_ */
|