Files
kunlun/plc/cvg/common/inc/cvg_app.h
2024-09-28 14:24:04 +08:00

367 lines
13 KiB
C

/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#ifndef CVG_APP_H
#define CVG_APP_H
/* os shim includes */
#include "os_types.h"
#include "os_task.h"
#include "os_event.h"
/* common includes */
#include "iot_pkt_api.h"
#include "iot_ipc.h"
#include "iot_config.h"
/* public api includes */
#include "plc_mac_header.h"
#include "plc_conn_less.h"
/* cvg layer includes */
#include "cvg.h"
#include "cvg_prm.h"
#include "iot_plc_msg_api.h"
#include "iot_plc_msg_sta_api.h"
#ifdef __cplusplus
extern "C" {
#endif
/* record the appid and msdu type map */
typedef struct _cvg_app_record {
/* msdu type is the same as app id */
uint8_t msdu_type;
/* default priority */
uint8_t default_prio;
/* flasg mark to if app sniffer enables */
uint8_t app_sniffer_en : 1,
/* reserved for further use */
rsvd : 7;
/* app ipc address */
iot_ipc_addr_t addr;
} cvg_app_record_t;
extern iot_ipc_h ipc_h;
extern iot_ipc_addr_t plc_lib_bcast;
/**
* @brief cvg_find_app_record() - find the app slot by msdu type
* @param msdu_type: msdu type
*
* @retval: NULL -- failure case
* @retval: otherwise -- the corresponding slot of the msdu type
*/
cvg_app_record_t* cvg_find_app_record(uint8_t msdu_type);
/**
* @brief cvg_find_available_app_record() - try to find an available slot
* @brief for new app
*
* @retval: NULL -- failure case
* @retval: otherwise -- slot for new app
*/
cvg_app_record_t* cvg_find_available_app_record();
/**
* @brief cvg_cvg_get_default_vdev() - get default vdev to opearte on.
*
* @retval: NULL -- error case
* @retval: otherwise -- pointer to vdev
*/
cvg_vdev_t* cvg_get_default_vdev();
/**
* @brief cvg_app_set_msdu_mac_and_sr() - set src mac, dest mac and
communication successful ratio to MSDU packet.
* this implement support both CCO role and
* STA role.
* @param msdu: the msdu packet
* @param vdev: pointer to current vdev
* @param src_tei: tei of source device.
* @param dst_tei: tei of original destination device.
*/
void cvg_app_set_msdu_mac_and_sr(iot_plc_msdu_recv_t *msdu, cvg_vdev_t *vdev,
tei_t src_tei, tei_t dst_tei);
/* @brief report msdu to app layer
* @param buf: buf containing msdu packet
* @param mac: mac header of the msdu
* @param app_id application id of this msdu
*/
void cvg_app_report_msdu_to_app(iot_pkt_t *buf, void *mac, uint8_t app_id);
/* @brief cvg_app_report_msdu_capture_to_app - report captured msdu to app layer
* @param mac: mac header of the msdu
* @param data: app data of the msdu
* @param len: app data len of the msdu
* @param app_id: application id of the msdu
*/
void cvg_app_report_msdu_capture_to_app(uint8_t *mac, uint8_t *data, uint32_t len,
uint8_t app_id);
/* @brief cvg_app_report_conn_less_data_to_app - report a connectionless data
* message to app.
* @param buf: - buf containing connectionless data
* @param mac: - mac header of the msdu.
* @param cl_hdr: - header of connectionless data
* @param app_id: - application id of this msdu
*/
void cvg_app_report_conn_less_data_to_app(iot_pkt_t *buf,
void *mac, plc_conn_less_hdr_t *cl_hdr, uint8_t app_id);
/* @brief cvg_app_report_ctrl_proto_msdu_to_app() - report the data defined by
* the controller protocol to app.
* @param buf: - buf containing msdu packet
* @param mac: - mac header of the msdu.
* @paran data: - pointer to the start position of the app data.
* @param app_id: - application id of this msdu
*/
void cvg_app_report_ctrl_proto_msdu_to_app(iot_pkt_t *buf, void *mac,
uint8_t *data, uint8_t app_id);
/* @brief cvg_app_bcast_ctrl_proto_state_rpt() - report state of connection of
* controller protocol.
* Note: this connection behavior is defined in the controller protocol.
* @param vdev: - vdev pointer
* @param addr: - remote dev addr connected to it.
* @param role: - remote dev role connected to it, see IOT_PLC_DEV_ROLE_XXX.
* @param state: - state, see IOT_PLC_CTRL_PROTO_STATE_XXXX.
* @param reason: - reasons of change state change.
* see IOT_PLC_CTRL_PROTO_DISCONN_REASON_XXX and
* IOT_PLC_CTRL_PROTO_CONN_REASON_XXX.
* @param sn: remote dev sn.
*/
void cvg_app_bcast_ctrl_proto_state_rpt(cvg_vdev_t *vdev,
uint8_t *addr, uint8_t role, uint8_t state, uint8_t reason, uint8_t sn);
/* cvg_app_bcast_dev_state_change() - broadcast when device state changed
* cvg layer broadcast this info when state of cvg layer state changed:
* 1. CCo enter started state. CCo is ready to serve app.
* 2. CCo leave started state. CCo cannot serve app.
* 3. STA associated with CCo. STA is ready to serve app.
* 4. STA disassociated with CCo. STA cannot serve app.
*
* @vdev: point to the vdev whose state changed
*/
void cvg_app_bcast_dev_state_change(cvg_vdev_t *vdev);
/**
* @brief cvg_app_bcast_invalid_mac() - broadcast notification to app
* layer MAC address is invalid.
* @param vdev: pointer to vdev
* @param nid: network id.
* @param cco_addr: reject cco mac addr.
* @param reason: the reasons for the invalid MAC addr,
* see IOT_PLC_INVD_MAC_XXX.
*/
void cvg_app_bcast_invalid_mac(cvg_vdev_t *vdev, uint32_t nid,
uint8_t *cco_addr, uint8_t reason);
/* @brief cvg_app_bcast_local_phase_updated() - broadcast to all apps when phase
* of the local device state changed.
* @param vdev: pointer to vdev
*/
void cvg_app_bcast_local_phase_updated(cvg_vdev_t *vdev);
/* @brief cvg_app_bcast_alloc_lid() - broadcast allocated lid to application
* @param vdev: pointer to vdev
* @param dcsma_lid: allocated dcsma lid
* @param tdma_lid: allocated tdma lid
*/
void cvg_app_bcast_alloc_lid(cvg_vdev_t *vdev, uint8_t dcsma_lid,
uint8_t tdma_lid);
/*
* @brief - convert band scan table to bitmap.
* @param scan_band: band scan table to be converted
* @param band_cnt: band count in scan table
* @param band_bm: pointer to buffer of band bitmap
* @param bm_size: size of band bitmap
* @return: none
*/
void cvg_app_convert_scan_tbl_to_bitmap(plc_scan_band_t *scan_band,
uint8_t band_cnt, uint8_t *band_bm, uint8_t bm_size);
#if HPLC_RF_DEV_SUPPORT
/* @brief report single hop msdu to app layer
* @param buf: buf containing msdu packet
* @param s_mac: mac header of the msdu
* @param app_id application id of this msdu
* @param stei: source tei come from fc
* @param dtei: destination tei come from fc
* @param is_bcast: flag to mark if this packet is broadcast packet
*/
void cvg_app_report_single_hop_msdu_to_app(iot_pkt_t *buf,
void *s_mac, uint8_t app_id, tei_t stei,
tei_t dtei, uint8_t is_bcast);
#endif /* HPLC_RF_DEV_SUPPORT */
#if (PLC_SUPPORT_CCO_ROLE)
/* @brief: add info of STA leaving to iot_pkt
* @param pkt: the iot_pkt to store STA info
* @param tei: tei of the STA leaving
* @param proxy: proxy tei of the STA leaving
* @param mac_addr: mac address of the STA leaving
*
* @return:
* 0: pkt can stored more STA info.
* otherwise: pkt cannot stored more STA info. cvg_app_bcast_sta_leave_info
* shall be called for the pkt.
*/
uint8_t cvg_app_add_leave_sta_info(iot_pkt_t *pkt, uint16_t tei,
uint16_t proxy, uint8_t *mac_addr);
/* @brief: add info STA that state is offline to iot_pkt
* @param pkt: the iot_pkt to store STA info
* @param tei: tei of the offline STA
* @param proxy: proxy tei of the offline STA
* @param mac_addr: mac address of the offline STA
*
* @return:
* 0: pkt can stored more STA info.
* otherwise: pkt cannot stored more STA info. cvg_app_bcast_sta_offline_info
* shall be called for the pkt.
*/
uint8_t cvg_app_add_offline_sta_info(iot_pkt_t *pkt, uint16_t tei,
uint16_t proxy, uint8_t *mac_addr);
/* @brief: add info of STA phase update to iot_pkt
* @param pkt: the iot_pkt to store STA info
* @param peer: pointer to the peer of STA
*
* @return:
* 0: pkt can stored more STA info.
* otherwise: pkt cannot stored more STA info. cvg_app_bcast_sta_phase_info
* shall be called for the pkt.
*/
uint8_t cvg_app_add_sta_phase_info(iot_pkt_t *pkt, cvg_peer_info_t *peer);
/* @brief: broadcast device joining msg to apps
* @param vdev: vdev pointer
* @param peer: peer of the associated device
*/
void cvg_app_bcast_sta_join_info(cvg_vdev_t *vdev, cvg_peer_info_t *peer);
/* @brief: broadcast device online msg to apps
* @param vdev: vdev pointer
* @param peer: peer of the off-line to on-line device
*/
void cvg_app_bcast_sta_online_info(cvg_vdev_t *vdev, cvg_peer_info_t *peer);
/*
* @brief: bcast to all apps when STA's phase info updated
* @param vdev: vdev pointer
* @param peer: peer of the associated device
*/
void cvg_app_bcast_sta_phase_updated(cvg_vdev_t *vdev, cvg_peer_info_t *peer);
/* cvg_app_bcast_sta_leave_info() - broadcast device leaving msg to apps
* @pkt: the pkt contains the device leaving messages to be broadcast to apps
* @reason: reason of leave this network
*/
void cvg_app_bcast_sta_leave_info(iot_pkt_t *pkt, uint8_t reason);
/* cvg_app_bcast_sta_offline_info() - broadcast device offline state msg to apps
* @pkt: the pkt contains the device offline messages to be broadcast to apps
*/
void cvg_app_bcast_sta_offline_info(iot_pkt_t *pkt);
/* cvg_app_bcast_sta_phase_info() - broadcast device phase msg to apps
* @pkt: the pkt contains the device phase messages to be broadcast to apps
*/
void cvg_app_bcast_sta_phase_info(iot_pkt_t *pkt);
/*
* @brief: bcast to all apps when STA join request rejected
* @param vdev: vdev pointer
* @param addr: mac address of the sta. big endian.
* @param addr_type: mac address type of the sta.
* see IOT_PLC_MAC_ADDR_TYPE_XXX
* @param dev_type: device type of the sta. see IOT_PLC_DEV_TYPE_XXX
* @param vendor_id: vendor id of the sta
* @param reason: rejected reason. see IOT_PLC_REASON_XXX.
*/
void cvg_app_bcast_sta_join_rejected(cvg_vdev_t *vdev, uint8_t *addr,
uint8_t addr_type, uint8_t dev_type, uint16_t vendor_id, uint8_t reason);
/*
* @brief: bcast to all apps when STA proxy changed
* @param vdev: vdev pointer
* @param peer: peer of the proxy changed device
*/
void cvg_app_bcast_sta_proxy_changed(cvg_vdev_t *vdev, cvg_peer_info_t *peer);
/* @brief: broadcast to all apps when apps load updated
* @param vdev: vdev pointer
*/
void cvg_app_bcast_app_load_updated(cvg_vdev_t *vdev);
#endif /* PLC_SUPPORT_CCO_ROLE */
#if PLC_SUPPORT_STA_ROLE
/* @brief broadcast beacon data to application
* @param vdev: pointer to vdev that received the beacon
* @param data: pointer to the beacon data
* @param len: length of the beacon data
*/
void cvg_app_bcast_beacon_data(cvg_vdev_t *vdev, uint8_t *data, uint8_t len);
/* @brief broadcast discovered node to application
* @param vdev: pointer to vdev
* @param rpt: pointer to the node info to be reported
*/
void cvg_app_bcast_discovered_node(cvg_vdev_t *vdev,
iot_plc_discovery_node_rpt_t *rpt);
/* @brief broadcast rtc update to application
* @param vdev: pointer to vdev
* @param cco_date: stand for the delta between cco rtc and
the base timer 2000.1.1 00:00:00
* @param cco_ntb: cco ntb of corresponding date, unit is 1NTB
*/
void cvg_app_bcast_rtc_update(cvg_vdev_t *vdev,
uint32_t cco_date, uint32_t cco_ntb);
#endif /* PLC_SUPPORT_STA_ROLE */
/* cvg_app_handle_msg() - handle request from app
* @addr: addr of the app sending the request
* @pkt: iot_pkt containing the app request
*/
void cvg_app_handle_msg(iot_ipc_addr_t *addr, iot_pkt_t *pkt);
/* iot_ipc_register_cvg() - register cvg to ipc module
*/
void iot_ipc_register_cvg();
/* iot_ipc_deregister_cvg() - deregister cvg from ipc module
*/
void iot_ipc_deregister_cvg();
/* cvg_app_get_link_statistics() - get plc link statistics
*/
void cvg_app_get_link_statistics(iot_plc_link_statistics_t *stat);
#ifdef __cplusplus
}
#endif
#endif /* CVG_APP_H */