#ifndef cp_mme_h #define cp_mme_h /* Cesar project {{{ * * Copyright (C) 2008 Spidcom * * <<>> * * }}} */ /** * \file cp/mme.h * \brief Definition of the MME types. * \ingroup cp */ #include "lib/bitstream.h" #include "lib/blk.h" #include "cp/types.h" #include "cp/secu/secu.h" #include #include "mac/common/defs.h" /* Get the MMtype base from the MMTYPE. */ #define CP_MSG_MMTYPE_BASE(mmtype) ((mmtype) & 0xFFFC) /* MMTYPE base values for HomePlug AV messages. */ #define CC_CCO_APPOINT 0x0000 #define CC_BACKUP_APPOINT 0x0004 #define CC_LINK_INFO 0x0008 #define CC_HANDOVER 0x000C #define CC_HANDOVER_INFO 0x0010 #define CC_DISCOVER_LIST 0x0014 #define CC_LINK_NEW 0x0018 #define CC_LINK_MOD 0x001C #define CC_LINK_SQZ 0x0020 #define CC_LINK_REL 0x0024 #define CC_DETECT_REPORT 0x0028 #define CC_WHO_RU 0x002C #define CC_ASSOC 0x0030 #define CC_LEAVE 0x0034 #define CC_SET_TEI_MAP 0x0038 #define CC_RELAY 0x003C #define CC_BEACON_RELIABILITY 0x0040 #define CC_ALLOC_MOVE 0x0044 #define CC_ACCESS_NEW 0x0048 #define CC_ACCESS_REL 0x004C #define CC_DCPPC 0x0050 #define CC_HP1_DET 0x0054 #define CC_BLE_UPDATE 0x0058 #define CC_RSVD_MIN 0x005C #define CC_RSVD_MAX 0x1FFC #define CP_PROXY_APPOINT 0x2000 #define PH_PROXY_APPOINT 0x2004 #define CP_PROXY_WAKE 0x2008 #define CP_RSVD_MIN 0x200C #define CP_RSVD_MAX 0x3FFC #define NN_INL 0x4000 #define NN_NEW_NET 0x4004 #define NN_ADD_ALLOC 0x4008 #define NN_REL_ALLOC 0x400C #define NN_REL_NET 0x4010 #define NN_RSVD_MIN 0x4014 #define NN_RSVD_MAX 0x5FFC #define CM_UNASSOCIATED_STA 0x6000 #define CM_ENCRYPTED_PAYLOAD 0x6004 #define CM_SET_KEY 0x6008 #define CM_GET_KEY 0x600C #define CM_SC_JOIN 0x6010 #define CM_CHAN_EST 0x6014 #define CM_TM_UPDATE 0x6018 #define CM_AMP_MAP 0x601C #define CM_BRG_INFO 0x6020 #define CM_CONN_NEW 0x6024 #define CM_CONN_REL 0x6028 #define CM_CONN_MOD 0x602C #define CM_CONN_INFO 0x6030 #define CM_STA_CAP 0x6034 #define CM_NW_INFO 0x6038 #define CM_GET_BEACON 0x603C #define CM_HFID 0x6040 #define CM_MME_ERROR 0x6044 #define CM_NW_STATS 0x6048 #define CM_LINK_STATS 0x604C #define CM_RSVD_MIN 0x6050 #define CM_RSVD_MAX 0x7FFC /* MMTYPE base values for DRV MME messages. */ #define DRV_STA_SET_MAC_ADDR 0xB000 #define DRV_STA_SET_CCO_PREF 0xB004 #define DRV_STA_SET_WAS_CCO 0xB008 #define DRV_STA_SET_NPW 0xB00C /* TODO to be removed #465*/ #define DRV_STA_SET_DPW 0xB010 /* TODO to be removed #465*/ #define DRV_STA_SET_SL 0xB014 #define DRV_STA_SET_M_STA_HFID 0xB018 #define DRV_STA_SET_U_STA_HFID 0xB01C #define DRV_STA_SET_AVLN_HFID 0xB020 #define DRV_STA_SET_TONEMASK 0xB024 #define DRV_STA_MAC_START 0xB028 #define DRV_STA_MAC_STOP 0xB02C #define DRV_STA_SET_NID 0xB030 #define DRV_STA_SC 0xB034 #define DRV_STA_STATUS 0xB03C #define DRV_STA_SET_KEY 0xB040 #define DRV_STA_GET_KEY 0xB044 #define DRV_STA_SET_DAK 0xB048 #define DRV_STA_SET_CONFIG 0xB04C #define DRV_MCAST_SET_LIST 0xB054 #define DRV_MIN 0xB000 #define DRV_MAX 0xBFFF /* MMTYPE base values for VS MME messages. */ #define VS_GET_VERSION 0xA000 #define VS_RESET 0xA008 #define VS_GET_MFG_INFO 0xA00C #define VS_GET_NVRAM 0xA010 #define VS_GET_LOOPBACK 0xA014 #define VS_SET_LOOPBACK 0xA018 #define VS_GET_TONEMASK 0xA01C #define VS_GET_ETH_PHY 0xA020 #define VS_ETH_STATS 0xA024 #define VS_PLC_STATS 0xA028 #define VS_SNIFFER 0xA02C #define VS_GET_STATUS 0xA030 #define VS_GET_TONEMAP 0xA034 #define VS_GET_SNR 0xA038 #define VS_GET_SPECTRUM 0xA03C #define VS_GET_LINK_STATS 0xA040 #define VS_GET_AMP_MAP 0xA044 #define VS_GET_STATS 0xA048 #define VS_GET_CE_STATS 0xA074 #define VS_GET_PB_STATS 0xA0D8 #define VS_GET_MACTOTEI 0xA0DC #define IMAC_GET_DISCOVER_LIST 0xA800 #define VS_MIN 0xA000 #define VS_MAX (DRV_MIN - 1) /* MMTYPE sub-values for MMEs (REQ, CNF, IND or RSP). */ #define CP_MME_REQ 0x00 #define CP_MME_CNF 0x01 #define CP_MME_IND 0x02 #define CP_MME_RSP 0x03 /** MMTYPE constants. */ enum cp_mmtype_t { CC_CCO_APPOINT_REQ = CC_CCO_APPOINT + CP_MME_REQ, CC_CCO_APPOINT_CNF = CC_CCO_APPOINT + CP_MME_CNF, CC_BACKUP_APPOINT_REQ = CC_BACKUP_APPOINT + CP_MME_REQ, CC_BACKUP_APPOINT_CNF = CC_BACKUP_APPOINT + CP_MME_CNF, CC_LINK_INFO_REQ = CC_LINK_INFO + CP_MME_REQ, CC_LINK_INFO_CNF = CC_LINK_INFO + CP_MME_CNF, CC_LINK_INFO_IND = CC_LINK_INFO + CP_MME_IND, CC_LINK_INFO_RSP = CC_LINK_INFO + CP_MME_RSP, CC_HANDOVER_REQ = CC_HANDOVER + CP_MME_REQ, CC_HANDOVER_CNF = CC_HANDOVER + CP_MME_CNF, CC_HANDOVER_INFO_IND = CC_HANDOVER_INFO + CP_MME_IND, CC_HANDOVER_INFO_RSP = CC_HANDOVER_INFO + CP_MME_RSP, CC_DISCOVER_LIST_REQ = CC_DISCOVER_LIST + CP_MME_REQ, CC_DISCOVER_LIST_CNF = CC_DISCOVER_LIST + CP_MME_CNF, CC_DISCOVER_LIST_IND = CC_DISCOVER_LIST + CP_MME_IND, CC_LINK_NEW_REQ = CC_LINK_NEW + CP_MME_REQ, CC_LINK_NEW_CNF = CC_LINK_NEW + CP_MME_CNF, CC_LINK_MOD_REQ = CC_LINK_MOD + CP_MME_REQ, CC_LINK_MOD_CNF = CC_LINK_MOD + CP_MME_CNF, CC_LINK_SQZ_REQ = CC_LINK_SQZ + CP_MME_REQ, CC_LINK_SQZ_CNF = CC_LINK_SQZ + CP_MME_CNF, CC_LINK_REL_REQ = CC_LINK_REL + CP_MME_REQ, CC_LINK_REL_IND = CC_LINK_REL + CP_MME_IND, CC_DETECT_REPORT_REQ = CC_DETECT_REPORT + CP_MME_REQ, CC_DETECT_REPORT_CNF = CC_DETECT_REPORT + CP_MME_CNF, CC_WHO_RU_REQ = CC_WHO_RU + CP_MME_REQ, CC_WHO_RU_CNF = CC_WHO_RU + CP_MME_CNF, CC_ASSOC_REQ = CC_ASSOC + CP_MME_REQ, CC_ASSOC_CNF = CC_ASSOC + CP_MME_CNF, CC_LEAVE_REQ = CC_LEAVE + CP_MME_REQ, CC_LEAVE_CNF = CC_LEAVE + CP_MME_CNF, CC_LEAVE_IND = CC_LEAVE + CP_MME_IND, CC_LEAVE_RSP = CC_LEAVE + CP_MME_RSP, CC_SET_TEI_MAP_REQ = CC_SET_TEI_MAP + CP_MME_REQ, CC_SET_TEI_MAP_IND = CC_SET_TEI_MAP + CP_MME_IND, CC_RELAY_REQ = CC_RELAY + CP_MME_REQ, CC_RELAY_IND = CC_RELAY + CP_MME_IND, CC_BEACON_RELIABILITY_REQ = CC_BEACON_RELIABILITY + CP_MME_REQ, CC_BEACON_RELIABILITY_CNF = CC_BEACON_RELIABILITY + CP_MME_CNF, CC_ALLOC_MOVE_REQ = CC_ALLOC_MOVE + CP_MME_REQ, CC_ALLOC_MOVE_CNF = CC_ALLOC_MOVE + CP_MME_CNF, CC_ACCESS_NEW_REQ = CC_ACCESS_NEW + CP_MME_REQ, CC_ACCESS_NEW_CNF = CC_ACCESS_NEW + CP_MME_CNF, CC_ACCESS_NEW_IND = CC_ACCESS_NEW + CP_MME_IND, CC_ACCESS_NEW_RSP = CC_ACCESS_NEW + CP_MME_RSP, CC_ACCESS_REL_REQ = CC_ACCESS_REL + CP_MME_REQ, CC_ACCESS_REL_CNF = CC_ACCESS_REL + CP_MME_CNF, CC_ACCESS_REL_IND = CC_ACCESS_REL + CP_MME_IND, CC_ACCESS_REL_RSP = CC_ACCESS_REL + CP_MME_RSP, CC_DCPPC_IND = CC_DCPPC + CP_MME_IND, CC_DCPPC_RSP = CC_DCPPC + CP_MME_RSP, CC_HP1_DET_REQ = CC_HP1_DET + CP_MME_REQ, CC_HP1_DET_CNF = CC_HP1_DET + CP_MME_CNF, CC_BLE_UPDATE_IND = CC_BLE_UPDATE + CP_MME_IND, CP_PROXY_APPOINT_REQ = CP_PROXY_APPOINT + CP_MME_REQ, CP_PROXY_APPOINT_CNF = CP_PROXY_APPOINT + CP_MME_CNF, PH_PROXY_APPOINT_IND = PH_PROXY_APPOINT + CP_MME_IND, CP_PROXY_WAKE_REQ = CP_PROXY_WAKE + CP_MME_REQ, NN_INL_REQ = NN_INL + CP_MME_REQ, NN_INL_CNF = NN_INL + CP_MME_CNF, NN_NEW_NET_REQ = NN_NEW_NET + CP_MME_REQ, NN_NEW_NET_CNF = NN_NEW_NET + CP_MME_CNF, NN_NEW_NET_IND = NN_NEW_NET + CP_MME_IND, NN_ADD_ALLOC_REQ = NN_ADD_ALLOC + CP_MME_REQ, NN_ADD_ALLOC_CNF = NN_ADD_ALLOC + CP_MME_CNF, NN_ADD_ALLOC_IND = NN_ADD_ALLOC + CP_MME_IND, NN_REL_ALLOC_REQ = NN_REL_ALLOC + CP_MME_REQ, NN_REL_ALLOC_CNF = NN_REL_ALLOC + CP_MME_CNF, NN_REL_NET_IND = NN_REL_NET + CP_MME_IND, CM_UNASSOCIATED_STA_IND = CM_UNASSOCIATED_STA + CP_MME_IND, CM_ENCRYPTED_PAYLOAD_IND = CM_ENCRYPTED_PAYLOAD + CP_MME_IND, CM_ENCRYPTED_PAYLOAD_RSP = CM_ENCRYPTED_PAYLOAD + CP_MME_RSP, CM_SET_KEY_REQ = CM_SET_KEY + CP_MME_REQ, CM_SET_KEY_CNF = CM_SET_KEY + CP_MME_CNF, CM_GET_KEY_REQ = CM_GET_KEY + CP_MME_REQ, CM_GET_KEY_CNF = CM_GET_KEY + CP_MME_CNF, CM_SC_JOIN_REQ = CM_SC_JOIN + CP_MME_REQ, CM_SC_JOIN_CNF = CM_SC_JOIN + CP_MME_CNF, CM_CHAN_EST_IND = CM_CHAN_EST + CP_MME_IND, CM_TM_UPDATE_IND = CM_TM_UPDATE + CP_MME_IND, CM_AMP_MAP_REQ = CM_AMP_MAP + CP_MME_REQ, CM_AMP_MAP_CNF = CM_AMP_MAP + CP_MME_CNF, CM_BRG_INFO_REQ = CM_BRG_INFO + CP_MME_REQ, CM_BRG_INFO_CNF = CM_BRG_INFO + CP_MME_CNF, CM_CONN_NEW_REQ = CM_CONN_NEW + CP_MME_REQ, CM_CONN_NEW_CNF = CM_CONN_NEW + CP_MME_CNF, CM_CONN_REL_IND = CM_CONN_REL + CP_MME_IND, CM_CONN_REL_RSP = CM_CONN_REL + CP_MME_RSP, CM_CONN_MOD_REQ = CM_CONN_MOD + CP_MME_REQ, CM_CONN_MOD_CNF = CM_CONN_MOD + CP_MME_CNF, CM_CONN_INFO_REQ = CM_CONN_INFO + CP_MME_REQ, CM_CONN_INFO_CNF = CM_CONN_INFO + CP_MME_CNF, CM_STA_CAP_REQ = CM_STA_CAP + CP_MME_REQ, CM_STA_CAP_CNF = CM_STA_CAP + CP_MME_CNF, CM_NW_INFO_REQ = CM_NW_INFO + CP_MME_REQ, CM_NW_INFO_CNF = CM_NW_INFO + CP_MME_CNF, CM_GET_BEACON_REQ = CM_GET_BEACON + CP_MME_REQ, CM_GET_BEACON_CNF = CM_GET_BEACON + CP_MME_CNF, CM_HFID_REQ = CM_HFID + CP_MME_REQ, CM_HFID_CNF = CM_HFID + CP_MME_CNF, CM_MME_ERROR_IND = CM_MME_ERROR + CP_MME_IND, CM_NW_STATS_REQ = CM_NW_STATS + CP_MME_REQ, CM_NW_STATS_CNF = CM_NW_STATS + CP_MME_CNF, CM_LINK_STATS_REQ = CM_LINK_STATS + CP_MME_REQ, CM_LINK_STATS_CNF = CM_LINK_STATS + CP_MME_CNF, DRV_STA_SET_MAC_ADDR_REQ = DRV_STA_SET_MAC_ADDR + CP_MME_REQ, DRV_STA_SET_MAC_ADDR_CNF = DRV_STA_SET_MAC_ADDR + CP_MME_CNF, DRV_STA_SET_CCO_PREF_REQ = DRV_STA_SET_CCO_PREF + CP_MME_REQ, DRV_STA_SET_CCO_PREF_CNF = DRV_STA_SET_CCO_PREF + CP_MME_CNF, DRV_STA_SET_WAS_CCO_REQ = DRV_STA_SET_WAS_CCO + CP_MME_REQ, DRV_STA_SET_WAS_CCO_CNF = DRV_STA_SET_WAS_CCO + CP_MME_CNF, DRV_STA_SET_WAS_CCO_IND = DRV_STA_SET_WAS_CCO + CP_MME_IND, DRV_STA_SET_WAS_CCO_RSP = DRV_STA_SET_WAS_CCO + CP_MME_RSP, DRV_STA_SET_NPW_REQ = DRV_STA_SET_NPW + CP_MME_REQ, DRV_STA_SET_NPW_CNF = DRV_STA_SET_NPW + CP_MME_CNF, DRV_STA_SET_DPW_REQ = DRV_STA_SET_DPW + CP_MME_REQ, DRV_STA_SET_DPW_CNF = DRV_STA_SET_DPW + CP_MME_CNF, DRV_STA_SET_SL_REQ = DRV_STA_SET_SL + CP_MME_REQ, DRV_STA_SET_SL_CNF = DRV_STA_SET_SL + CP_MME_CNF, DRV_STA_SET_M_STA_HFID_REQ = DRV_STA_SET_M_STA_HFID + CP_MME_REQ, DRV_STA_SET_M_STA_HFID_CNF = DRV_STA_SET_M_STA_HFID + CP_MME_CNF, DRV_STA_SET_U_STA_HFID_REQ = DRV_STA_SET_U_STA_HFID + CP_MME_REQ, DRV_STA_SET_U_STA_HFID_CNF = DRV_STA_SET_U_STA_HFID + CP_MME_CNF, DRV_STA_SET_U_STA_HFID_IND = DRV_STA_SET_U_STA_HFID + CP_MME_IND, DRV_STA_SET_AVLN_HFID_REQ = DRV_STA_SET_AVLN_HFID + CP_MME_REQ, DRV_STA_SET_AVLN_HFID_CNF = DRV_STA_SET_AVLN_HFID + CP_MME_CNF, DRV_STA_SET_AVLN_HFID_IND = DRV_STA_SET_AVLN_HFID + CP_MME_IND, DRV_STA_SET_TONEMASK_REQ = DRV_STA_SET_TONEMASK + CP_MME_REQ, DRV_STA_SET_TONEMASK_CNF = DRV_STA_SET_TONEMASK + CP_MME_CNF, DRV_STA_MAC_START_REQ = DRV_STA_MAC_START + CP_MME_REQ, DRV_STA_MAC_START_CNF = DRV_STA_MAC_START + CP_MME_CNF, DRV_STA_MAC_STOP_REQ = DRV_STA_MAC_STOP + CP_MME_REQ, DRV_STA_MAC_STOP_CNF = DRV_STA_MAC_STOP + CP_MME_CNF, DRV_STA_SET_NID_REQ = DRV_STA_SET_NID + CP_MME_REQ, DRV_STA_SET_NID_CNF = DRV_STA_SET_NID + CP_MME_CNF, DRV_STA_SC_REQ = DRV_STA_SC + CP_MME_REQ, DRV_STA_SC_CNF = DRV_STA_SC + CP_MME_CNF, DRV_STA_STATUS_REQ = DRV_STA_STATUS + CP_MME_REQ, DRV_STA_STATUS_CNF = DRV_STA_STATUS + CP_MME_CNF, DRV_STA_STATUS_IND = DRV_STA_STATUS + CP_MME_IND, DRV_STA_SET_KEY_REQ = DRV_STA_SET_KEY + CP_MME_REQ, DRV_STA_SET_KEY_CNF = DRV_STA_SET_KEY + CP_MME_CNF, DRV_STA_SET_KEY_IND = DRV_STA_SET_KEY + CP_MME_IND, DRV_STA_GET_KEY_REQ = DRV_STA_GET_KEY + CP_MME_REQ, DRV_STA_GET_KEY_CNF = DRV_STA_GET_KEY + CP_MME_CNF, DRV_STA_SET_DAK_REQ = DRV_STA_SET_DAK + CP_MME_REQ, DRV_STA_SET_DAK_CNF = DRV_STA_SET_DAK + CP_MME_CNF, DRV_STA_SET_CONFIG_REQ = DRV_STA_SET_CONFIG + CP_MME_REQ, DRV_STA_SET_CONFIG_CNF = DRV_STA_SET_CONFIG + CP_MME_CNF, DRV_MCAST_SET_LIST_REQ = DRV_MCAST_SET_LIST + CP_MME_REQ, DRV_MCAST_SET_LIST_CNF = DRV_MCAST_SET_LIST + CP_MME_CNF, VS_GET_TONEMAP_REQ = VS_GET_TONEMAP + CP_MME_REQ, VS_GET_TONEMAP_CNF = VS_GET_TONEMAP + CP_MME_CNF, VS_GET_SNR_REQ = VS_GET_SNR + CP_MME_REQ, VS_GET_SNR_CNF = VS_GET_SNR + CP_MME_CNF, VS_GET_SPECTRUM_REQ = VS_GET_SPECTRUM + CP_MME_REQ, VS_GET_SPECTRUM_CNF = VS_GET_SPECTRUM + CP_MME_CNF, VS_GET_LINK_STATS_REQ = VS_GET_LINK_STATS + CP_MME_REQ, VS_GET_LINK_STATS_CNF = VS_GET_LINK_STATS + CP_MME_CNF, VS_GET_AMP_MAP_REQ = VS_GET_AMP_MAP + CP_MME_REQ, VS_GET_AMP_MAP_CNF = VS_GET_AMP_MAP + CP_MME_CNF, VS_GET_STATS_REQ = VS_GET_STATS + CP_MME_REQ, VS_GET_STATS_CNF = VS_GET_STATS + CP_MME_CNF, VS_GET_CE_STATS_REQ = VS_GET_CE_STATS + CP_MME_REQ, VS_GET_CE_STATS_CNF = VS_GET_CE_STATS + CP_MME_CNF, VS_GET_PB_STATS_REQ = VS_GET_PB_STATS + CP_MME_REQ, VS_GET_PB_STATS_CNF = VS_GET_PB_STATS + CP_MME_CNF, VS_GET_MACTOTEI_REQ = VS_GET_MACTOTEI + CP_MME_REQ, VS_GET_MACTOTEI_CNF = VS_GET_MACTOTEI + CP_MME_CNF, IMAC_GET_DISCOVER_LIST_REQ = IMAC_GET_DISCOVER_LIST + CP_MME_REQ, IMAC_GET_DISCOVER_LIST_CNF = IMAC_GET_DISCOVER_LIST + CP_MME_CNF, }; typedef enum cp_mmtype_t cp_mmtype_t; /** Payload encryption key select. */ enum cp_mme_peks_t { /** Encrypted using destination station DAK. */ CP_MME_PEKS_DAK, /** Encrypted using NMK known to station. */ CP_MME_PEKS_NMK, /** First TEK identifier. */ CP_MME_PEKS_TEK_MIN, /** Last TEK identifier. */ CP_MME_PEKS_TEK_MAX = 0xe, /** Number of TEK identifiers. */ CP_MME_PEKS_TEK_NB = CP_MME_PEKS_TEK_MAX - CP_MME_PEKS_TEK_MIN + 1, /** No encryption. */ CP_MME_PEKS_NONE = 0xf, /** Number of valid PEKS in a MME. */ CP_MME_PEKS_NB, /** Special value meaning no encapsulation in a * CM_ENCRYPTED_PAYLOAD.IND. */ CP_MME_PEKS_SPC_NOT_EMBEDDED = 0x100, }; typedef enum cp_mme_peks_t cp_mme_peks_t; /** MME peer (sender or recipient, depending of the MME direction). * * This structure contains information needed to send a MME to the right * destination. It is contained in the RX MME handle in order to respond to a * received MME. */ struct cp_mme_peer_t { /** Peer MAC address. */ mac_t mac; /** VLAN tag or 0 if none. */ u32 vlan_tag; /** Peer TEI, or 0xff if not TEI based. */ cp_tei_t tei; }; typedef struct cp_mme_peer_t cp_mme_peer_t; /** Relay information for the MME relay. */ struct cp_mme_relay_t { /** Mac address corresponding to the Final destination in the REQ and the * Original source for the IND. */ mac_t mac_fa; /** Final TEI. */ cp_tei_t ftei; }; typedef struct cp_mme_relay_t cp_mme_relay_t; /** Provide how the MME is encrypted. */ enum cp_mme_encrypt_t { CP_MME_RX_NOT_ENCRYPTED, CP_MME_RX_NEK_ENCRYPTED, CP_MME_RX_SOFT_ENCRYPTED, CP_MME_RX_NB }; /** MME handle for RX. */ struct cp_mme_rx_t { /** pointer to the received MME. */ u8 *p_mme; /** pointer to the MME's fragments. */ blk_t *p_frag; /** Pointer to the current frag. */ blk_t *p_frag_current; /** MMType the type of MME. */ uint mmtype; /** MMV of the message. Use for the CM_MME_ERROR.IND. */ uint mmv; /** size of the MME (including header). */ uint length; /** Peer information. */ cp_mme_peer_t peer; /** Payload encryption. */ cp_mme_peks_t peks; /** Protocol run information if present. */ cp_secu_protocol_run_t prun; /** Bitstream context. */ bitstream_t bitstream; /** Data used by the CL. */ bool cl_data; /** CP context used by the destructor of the MME_rx_t message. */ cp_t *cp; /** IV or UUID. */ cp_key_t iv_uuid; /** Relay information. */ cp_mme_relay_t relay; /** Encrypt, True if the MME is encrypted.*/ enum cp_mme_encrypt_t encrypt; /** Jump environment. */ jmp_buf jump_env; }; typedef struct cp_mme_rx_t cp_mme_rx_t; /** MME handle for TX. */ struct cp_mme_tx_t { /** pointer to the Tx buffer. */ u8 *p_mme; /** Indicate if the MME is a relay. */ bool relay; /** size of the mme (including header). */ uint length; /** MMtype use to trace the MMe. */ uint mmtype; /** Peer information. */ cp_mme_peer_t peer; /** Final destination peer. Used only if the MME is relayed. */ cp_mme_peer_t final_peer; /** Payload encryption. */ cp_mme_peks_t peks; /** Protocol run information if present. */ cp_secu_protocol_run_t prun; /** use the correct bitstream. */ bitstream_t bitstream; /** CP context used by the destructor of the MME_tx_t message. */ cp_t *cp; /** Offset of the payload. */ uint payload_offset; /** RF Len. */ uint rf_len; /** IV or UUID. */ cp_key_t iv_uuid; /* FMI number of fragments. */ uint fmi_nbfrag; /* FMI Fn mi. */ uint fmi_nb; /* Fragment Messager Sequence Number. */ uint fmi_fmsn; }; typedef struct cp_mme_tx_t cp_mme_tx_t; /** Construct a cp_mme_peer_t for unicast to all STA. */ #define CP_MME_PEER_ALL_STA \ ((cp_mme_peer_t) { .mac = MAC_BROADCAST, .tei = MAC_TEI_MULTI_UNICAST }) /** Construct a cp_mme_peer_t from a MAC address and a TEI. */ #define CP_MME_PEER(mac_, tei_) \ ((cp_mme_peer_t) { .mac = mac_, .vlan_tag = 0, .tei = tei_ }) /** * Compare two cp_mme_peer_t. * \param p1 first structure * \param p2 second structure * \return true if they match. * * This only works for MAC or MAC+TEI peer structures, ignoring VLAN tag. */ extern inline bool cp_mme_peer_cmp (cp_mme_peer_t *p1, cp_mme_peer_t *p2) { /* Check parameters. */ dbg_assert (p1); dbg_assert (p2); return p1->mac == p2->mac && p1->tei == p2->tei; } #endif /* cp_mme_h */