345 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			345 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/****************************************************************************
 | 
						|
 | 
						|
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 PLC_MAC_HEADER_H
 | 
						|
#define PLC_MAC_HEADER_H
 | 
						|
 | 
						|
 | 
						|
/* os shim includes */
 | 
						|
#include "iot_config.h"
 | 
						|
#include "os_types.h"
 | 
						|
#include "iot_utils.h"
 | 
						|
#include "plc_utils.h"
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
/* pack for the structures in the whole file */
 | 
						|
#pragma pack(push)  // save the pack status
 | 
						|
#pragma pack(1)     // 1 byte align
 | 
						|
 | 
						|
/* sg mac header version: mac standard frame protocol */
 | 
						|
#define MAC_HEADER_VERSION      0
 | 
						|
/* sg mac header version: mac single-hop frame protocol */
 | 
						|
#define MAC_HEADER_SHORT_VER    1
 | 
						|
 | 
						|
// MSDU content type of mac single-hop frame
 | 
						|
#define MSDU_TYPE_S_DIS_NODE    0
 | 
						|
#define MSDU_TYPE_S_APP_DATA    128
 | 
						|
#define MSDU_TYPE_S_IP          129
 | 
						|
 | 
						|
// MSDU content type
 | 
						|
#define MSDU_TYPE_MME           0       // MSDU TYPE MME
 | 
						|
#define MSDU_TYPE_AUTH          1       // MSDU TYPE AUTHENTICATION MESSAGE
 | 
						|
#define MSDU_TYPE_APP_DATA      48      // MSDU TYPE APP DATA
 | 
						|
#define MSDU_TYPE_IP            49      // MSDU TYPE IP DATA
 | 
						|
#define MSDU_TYPE_SILA_NHM      53      // MSDU TYPE SILA NHM
 | 
						|
 | 
						|
// MSDU send type
 | 
						|
#define ST_UNICAST              0
 | 
						|
#define ST_BCAST_NETWORK        1
 | 
						|
#define ST_BCAST_LOCAL          2
 | 
						|
#define ST_BCAST_PROXY          3
 | 
						|
 | 
						|
/* define local broadcast hop */
 | 
						|
#define ST_BCAST_LOCAL_HOP      1
 | 
						|
/* define connectionless whole network broadcast hop */
 | 
						|
#define ST_BCAST_NETWORK_CL_HOP 5
 | 
						|
 | 
						|
// broadcast direction
 | 
						|
#define BCAST_DIR_TWOWAY        0       // 2 way broadcast
 | 
						|
#define BCAST_DIR_DOWNLINK      1       // downlink broadcast
 | 
						|
#define BCAST_DIR_UPLINK        2       // uplink broadcast
 | 
						|
 | 
						|
/* max reboot count */
 | 
						|
#define MAC_HDR_REBOOT_CNT_MAX  15
 | 
						|
 | 
						|
#define SG_MAC_MSDU_CRC_LEN     4
 | 
						|
 | 
						|
/* define encryption key type */
 | 
						|
#define ENCRYPT_KEY_TYPE_NONE   0
 | 
						|
#define ENCRYPT_KEY_TYPE_CMK    1
 | 
						|
#define ENCRYPT_KEY_TYPE_CEK    2
 | 
						|
 | 
						|
typedef struct _mac_header {
 | 
						|
    uint16_t    version     :   4;      // version of MAC header.
 | 
						|
    uint16_t    org_src_tei :   12;     // TEI of original source STA
 | 
						|
 | 
						|
    uint16_t    org_dest_tei:   12;     // TEI of original dest STA
 | 
						|
    uint16_t    send_type   :   4;      // send type. unicast or broadcast.
 | 
						|
 | 
						|
    uint8_t     send_max_cnt:   5;      // maxmum times of sending a packet
 | 
						|
    uint8_t     _reseved1   :   3;
 | 
						|
 | 
						|
    uint16_t    msdu_sn;                // MSDU sequence number
 | 
						|
    uint8_t     msdu_type;              // type of MSDU. see MSDU_TYPE_XXX
 | 
						|
    uint16_t    msdu_len    :   11;     // length of MSDU
 | 
						|
    uint16_t    reboot_cnt  :   4;      // reboot count
 | 
						|
    uint16_t    main_path_flag: 1;      // if main path is used
 | 
						|
 | 
						|
    uint8_t     total_hop_cnt:  4;      // maxmum hop when delivery a packet
 | 
						|
    uint8_t     rest_hop_cnt:   4;      // rest hop for a packet
 | 
						|
 | 
						|
    uint16_t    bc_direction:   2;      // broadcast direction
 | 
						|
    uint16_t    path_fix_flag : 1;      // path fixing triggered
 | 
						|
    uint16_t    mac_exist_flag: 1;      // if mac address exist in the end
 | 
						|
    uint16_t    key_type      : 2;      // encryption key type
 | 
						|
    uint16_t    cek_seq       : 2;      // communication encryption key sequence
 | 
						|
    uint16_t    zero_pad_len  : 4; // length of compensation zero for encryption
 | 
						|
    uint16_t    _reserved2    : 4;
 | 
						|
 | 
						|
    uint8_t     network_sn;             // network sequence number
 | 
						|
    uint16_t    _reserved3;
 | 
						|
    uint8_t     mac[0][IOT_MAC_ADDR_LEN];// mac[0] is src. mac[1] is dest MAC.
 | 
						|
} mac_header_t;
 | 
						|
 | 
						|
/* mac short header */
 | 
						|
typedef struct _mac_short_header {
 | 
						|
    uint8_t     version     :   4,      // version of MAC header.
 | 
						|
                cek_seq     :   2,      // communication encryption key sequence
 | 
						|
                key_type    :   2;      // encryption key type
 | 
						|
    uint8_t     msg_type;               // msg type
 | 
						|
    uint16_t    msdu_len    :   11,     // length of MSDU
 | 
						|
                zero_pad_len:   4, // length of compensation zero for encryption
 | 
						|
                resv1       :   1;      // reserved
 | 
						|
} mac_short_header_t;
 | 
						|
 | 
						|
/* SPG define start */
 | 
						|
 | 
						|
/* spg mac header version: mac standard frame protocol */
 | 
						|
#define SPG_MAC_HEADER_VERSION      1
 | 
						|
/* spg mac header version: mac single-hop frame protocol */
 | 
						|
#define SPG_MAC_HEADER_SHORT_VER    2
 | 
						|
 | 
						|
// MSDU content type of mac single-hop frame
 | 
						|
#define SPG_MSDU_TYPE_S_APP_DATA    1
 | 
						|
#define SPG_MSDU_TYPE_S_DIS_NODE    2
 | 
						|
#define SPG_MSDU_TYPE_S_IP          128
 | 
						|
 | 
						|
// MSDU content type
 | 
						|
#define SPG_MSDU_TYPE_MME           0x88E1       // SPG MSDU TYPE MME
 | 
						|
#define SPG_MSDU_TYPE_DATA          0x0001       // SPG MSDU TYPE DATA
 | 
						|
#define SPG_MSDU_SFRM_VT_MAX        0x0003       // SPG short msdu frame header vlan tag maxmum
 | 
						|
#define SPG_MSDU_LFRM_VT            0x8100
 | 
						|
 | 
						|
/* MSDU send type, the whole network broadcast is same as the proxy broadcast
 | 
						|
 * for southern grid
 | 
						|
 */
 | 
						|
#define SPG_ST_UNICAST_ACK          0
 | 
						|
#define SPG_ST_BCAST_NETWORK_NOACK  1
 | 
						|
#define SPG_ST_BCAST_LOCAL_NOACK    2
 | 
						|
#define SPG_ST_BCAST_NETWORK_ACK    3
 | 
						|
#define SPG_ST_BCAST_LOCAL_ACK      4
 | 
						|
 | 
						|
// broadcast direction
 | 
						|
#define SPG_BCAST_DIR_DOWNLINK      1       // cco->sta
 | 
						|
#define SPG_BCAST_DIR_UPLINK        2       // sta->cco
 | 
						|
 | 
						|
#define SPG_MAC_MSDU_CRC_LEN    4
 | 
						|
 | 
						|
typedef struct _spg_mac_lheader_tail {
 | 
						|
    uint8_t     mac[IOT_MAC_ADDR_LEN];   // mac address
 | 
						|
    uint8_t     reseved[14];             // 14 Bytes resv for future use
 | 
						|
} spg_mac_lheader_tail_t;
 | 
						|
 | 
						|
typedef struct _spg_mac_header {
 | 
						|
    /* type of MAC header, 1 - short, 0 - long */
 | 
						|
    uint16_t    mac_hdr_type       :  1,
 | 
						|
    /* version of MAC header */
 | 
						|
                version            :  2,
 | 
						|
    /* reserved */
 | 
						|
                _reseved1          : 13;
 | 
						|
    /* length of msdu */
 | 
						|
    uint16_t    msdu_len;
 | 
						|
    /* origin dest TEI */
 | 
						|
    uint32_t    org_dest_tei       : 12,
 | 
						|
    /* origin src TEI */
 | 
						|
                org_src_tei        : 12,
 | 
						|
    /* short network identifier, range 1-15 */
 | 
						|
                snid               :  4,
 | 
						|
    /* reboot count */
 | 
						|
                reboot_cnt         :  4;
 | 
						|
    /* route hop count */
 | 
						|
    uint16_t    route_hop_cnt      :  4,
 | 
						|
    /* direction of broadcast, see SPG_BCAST_DIR_XXX */
 | 
						|
                bc_direction       :  4,
 | 
						|
    /* send type, see SPG_ST_XXX */
 | 
						|
                send_type          :  3,
 | 
						|
    /* send maxmum count */
 | 
						|
                send_max_cnt       :  5;
 | 
						|
    /* msdu sequence */
 | 
						|
    uint16_t    msdu_sn;
 | 
						|
    spg_mac_lheader_tail_t   spg_head_tail[0];
 | 
						|
} spg_mac_header_t;
 | 
						|
 | 
						|
/*
 | 
						|
**SPG MSDU frame struture define
 | 
						|
*/
 | 
						|
typedef struct _spg_msdu_long_frame {
 | 
						|
    uint8_t  org_dst_mac_addr[IOT_MAC_ADDR_LEN];
 | 
						|
    uint8_t  org_src_mac_addr[IOT_MAC_ADDR_LEN];
 | 
						|
    uint32_t vlan_tag;
 | 
						|
    uint16_t msdu_type;
 | 
						|
    uint8_t  payload[0];
 | 
						|
} spg_msdu_lfrm_t;
 | 
						|
 | 
						|
typedef struct _spg_msdu_short_frame {
 | 
						|
    uint8_t vlan_tag;
 | 
						|
    uint8_t msdu_type;
 | 
						|
    uint8_t payload[0];
 | 
						|
} spg_msdu_sfrm_t;
 | 
						|
 | 
						|
/* mac short header */
 | 
						|
typedef struct _spg_mac_short_header {
 | 
						|
    /* type of MAC header, the field is meaningless */
 | 
						|
    uint8_t     mac_hdr_type       :  1,
 | 
						|
    /* version of MAC header, see SPG_MAC_HEADER_XXX */
 | 
						|
                version            :  2,
 | 
						|
    /* reserved */
 | 
						|
                resv0              :  5;
 | 
						|
    /* msg type, see SPG_MSDU_TYPE_S_XXX */
 | 
						|
    uint8_t     msg_type;
 | 
						|
    /* length of msdu */
 | 
						|
    uint16_t    msdu_len;
 | 
						|
} spg_mac_short_header_t;
 | 
						|
 | 
						|
/* SPG define end */
 | 
						|
 | 
						|
#if SUPPORT_GREEN_PHY
 | 
						|
 | 
						|
#define GP_MAC_MSDU_CRC_LEN    4
 | 
						|
 | 
						|
typedef union _gp_ats_or_cfder {
 | 
						|
    uint32_t ats;
 | 
						|
    uint32_t cfder;
 | 
						|
}gp_ats_or_cfder_t;
 | 
						|
 | 
						|
typedef struct _gp_mac_header {
 | 
						|
    uint16_t mft : 2,
 | 
						|
        mfl : 14;
 | 
						|
} gp_mac_header_t;
 | 
						|
 | 
						|
#endif //SUPPORT_GREEN_PHY
 | 
						|
 | 
						|
/* ieee1901 define start */
 | 
						|
 | 
						|
/* ieee1901 mac header standard protocol version */
 | 
						|
#define I1901_MAC_HDR_STD_VER           0
 | 
						|
 | 
						|
/* ieee1901 msdu send type */
 | 
						|
#define I1901_ST_UNICAST                0
 | 
						|
#define I1901_ST_BCAST_NETWORK          1
 | 
						|
#define I1901_ST_BCAST_LOCAL            2
 | 
						|
#define I1901_ST_BCAST_PROXY            3
 | 
						|
#define I1901_ST_BCAST_ADAPTIVE         4
 | 
						|
 | 
						|
/* ieee1901 MSDU content type */
 | 
						|
#define I1901_MSDU_TYPE_MME             0
 | 
						|
#define I1901_MSDU_TYPE_APP_DATA        48
 | 
						|
#define I1901_MSDU_TYPE_IP              49
 | 
						|
#define I1901_MSDU_TYPE_TEST            50
 | 
						|
#define I1901_MSDU_TYPE_ETH             51
 | 
						|
 | 
						|
/* ieee1901 broadcast direction */
 | 
						|
#define I1901_BCAST_DIR_TWOWAY          0   // 2 way broadcast
 | 
						|
#define I1901_BCAST_DIR_DOWNLINK        1   // downlink broadcast
 | 
						|
#define I1901_BCAST_DIR_UPLINK          2   // uplink broadcast
 | 
						|
#define I1901_BCAST_DIR_ADAPTIVE        3   // adaptive relay
 | 
						|
 | 
						|
/* ieee1901 mac msdu frame  integrity check value */
 | 
						|
#define I1901_MAC_MSDU_CRC_LEN          4
 | 
						|
 | 
						|
/* ieee1901 mac header relay variant */
 | 
						|
typedef struct _i1901_mac_header_var {
 | 
						|
    /* TEI of original source STA */
 | 
						|
    uint32_t    org_src_tei         : 12,
 | 
						|
    /* TEI of original dest STA */
 | 
						|
                org_dest_tei        : 12,
 | 
						|
    /* maximum hop count for MAC frame forwarding */
 | 
						|
                total_hop_cnt       : 4,
 | 
						|
    /* remaining forwarding hop count */
 | 
						|
                rest_hop_cnt        : 4;
 | 
						|
    /* disable/enable proxy main path mode */
 | 
						|
    uint8_t     main_path_flag      : 1,
 | 
						|
#if PLC_SILA_NHM_ENABLE
 | 
						|
    /* transmission direction of a broadcast packet */
 | 
						|
                bc_direction        : 2,
 | 
						|
    /* if mac address exist in the end */
 | 
						|
                mac_exist_flag      : 1,
 | 
						|
    /* leave network delay  */
 | 
						|
                leave_delay         : 4;
 | 
						|
#else /* PLC_SILA_NHM_ENABLE */
 | 
						|
    /* transmission direction of a broadcast packet */
 | 
						|
                bc_direction        : 1,
 | 
						|
                rsvd                : 6;
 | 
						|
#endif /* PLC_SILA_NHM_ENABLE */
 | 
						|
    /* current networking sequence number */
 | 
						|
    uint8_t     network_sn;
 | 
						|
#if PLC_SILA_NHM_ENABLE
 | 
						|
    /* dumy code */
 | 
						|
    uint16_t     dumy;
 | 
						|
#endif
 | 
						|
} i1901_mac_header_var_t;
 | 
						|
 | 
						|
typedef struct _i1901_mac_header {
 | 
						|
    /* version of MAC header */
 | 
						|
    uint8_t     version             : 4,
 | 
						|
    /* send type. unicast or broadcast, see I1901_ST_XXX */
 | 
						|
                send_type           : 4;
 | 
						|
    /* maxmum times of sending a packet */
 | 
						|
    uint8_t     send_max_cnt        : 5,
 | 
						|
    /* reseved */
 | 
						|
                rsvd                : 3;
 | 
						|
    /* MSDU sequence number */
 | 
						|
    uint16_t    msdu_sn;
 | 
						|
    /* type of MSDU. see I1901_MSDU_TYPE_XXX */
 | 
						|
    uint8_t     msdu_type;
 | 
						|
    /* length of MSDU */
 | 
						|
    uint16_t    msdu_len            : 11,
 | 
						|
    /* reset count */
 | 
						|
                reboot_cnt          : 4,
 | 
						|
    /* indicate the type of the mac frame */
 | 
						|
                mac_frame_type      : 1;
 | 
						|
#if PLC_SILA_NHM_ENABLE
 | 
						|
    /* dumy code */
 | 
						|
    uint8_t     dumy;
 | 
						|
#endif
 | 
						|
    /* mac header relay variant */
 | 
						|
    i1901_mac_header_var_t var[0];
 | 
						|
} i1901_mac_header_t;
 | 
						|
 | 
						|
/* ieee1901 define end */
 | 
						|
 | 
						|
#if PLC_SILA_NHM_ENABLE
 | 
						|
#define i1901_mac_hdr_var_is_valid(mac_hdr)     \
 | 
						|
    ((((i1901_mac_header_t *)(mac_hdr))->mac_frame_type) == 1)
 | 
						|
#define i1901_mac_hdr_var_addr_is_valid(mac_hdr)     \
 | 
						|
    ((((i1901_mac_header_t *)(mac_hdr))->var[0].mac_exist_flag) == 1)
 | 
						|
#else
 | 
						|
#define i1901_mac_hdr_var_is_valid(mac_hdr)     \
 | 
						|
    ((((i1901_mac_header_t *)(mac_hdr))->mac_frame_type) == 0)
 | 
						|
#define i1901_mac_hdr_var_addr_is_valid(mac_hdr)  0
 | 
						|
#endif
 | 
						|
 | 
						|
#pragma pack(pop)   // restore the pack status
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* PLC_MAC_HEADER_H */
 | 
						|
 |