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 */
 | |
| 
 |