367 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			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 */
 |