#ifndef MME_H_ #define MME_H_ /* Cesar project {{{ * * Copyright (C) 2008 Spidcom * * <<>> * * }}} */ /** * \file Cesare/cp/mme.h * \brief definition of the mme types * \ingroup cp/ * */ #include "lib/bitstream.h" #include "lib/blk.h" #include "mac/common/mfs.h" // MMTYPE base-values for DRV-MME messages #define DRV_STA_SET_MAC_ADDR 0xA000 #define DRV_STA_SET_CCO_PREF 0xA004 #define DRV_STA_SET_WAS_CCO 0xA008 #define DRV_STA_SET_NPW 0xA00C #define DRV_STA_SET_DPW 0xA010 #define DRV_STA_SET_SL 0xA014 #define DRV_STA_SET_M_STA_HFID 0xA018 #define DRV_STA_SET_U_STA_HFID 0xA01C #define DRV_STA_SET_AVLN_HFID 0xA020 #define DRV_STA_SET_TONEMASK 0xA024 #define DRV_STA_START 0xA028 #define DRV_STA_STOP 0xA02C // MMTYPE sub-values for MMEs (REQ, CNF, IND or RSP) #define REQ 0x00 #define CNF 0x01 #define IND 0x02 #define RSP 0x03 /* * mm type constants * take care of the following : * according to Intellon technical reference manual of Homeplug AV firmware p9, * the two LSB value of messages should be : * 0b00 for REQ * 0b01 for CNF * 0b10 for IND * 0b11 for RSP * this is very unclear in the Homeplug AV specification v1.0.10 */ typedef enum cp_mmtype_t { CC_CCO_APPOINT_REQ = 0x0000, CC_CCO_APPOINT_CNF = 0x0001, CC_BACKUP_APPOINT_REQ = 0x0004, CC_BACKUP_APPOINT_CNF = 0x0005, CC_LINK_INFO_REQ = 0x0008, CC_LINK_INFO_CNF = 0x0009, CC_LINK_INFO_IND = 0x000A, CC_LINK_INFO_RSP = 0x000B, CC_HANDOVER_REQ = 0x000C, CC_HANDOVER_CNF = 0x000D, CC_HANDOVER_INFO_IND = 0x0012, CC_HANDOVER_INFO_RSP = 0x0013, CC_DISCOVER_LIST_REQ = 0x0014, CC_DISCOVER_LIST_CNF = 0x0015, CC_DISCOVER_LIST_IND = 0x0016, CC_LINK_NEW_REQ = 0x0018, CC_LINK_NEW_CNF = 0x0019, CC_LINK_MOD_REQ = 0x001C, CC_LINK_MOD_CNF = 0x001D, CC_LINK_SQZ_REQ = 0x0020, CC_LINK_SQZ_CNF = 0x0021, CC_LINK_REL_REQ = 0x0024, CC_LINK_REL_IND = 0x0025, CC_DETECT_REPORT_REQ = 0x0028, CC_DETECT_REPORT_CNF = 0x0029, CC_WHO_RU_REQ = 0x002C, CC_WHO_RU_CNF = 0x002D, CC_ASSOC_REQ = 0x0030, CC_ASSOC_CNF = 0x0031, CC_LEAVE_REQ = 0x0034, CC_LEAVE_CNF = 0x0035, CC_LEAVE_IND = 0x0036, CC_LEAVE_RSP = 0x0037, CC_SET_TEI_MAP_REQ = 0x0038, CC_SET_TEI_MAP_IND = 0x0039, CC_RELAY_REQ = 0x003C, CC_RELAY_IND = 0x003D, CC_BEACON_RELIABILITY_REQ = 0x0040, CC_BEACON_RELIABILITY_CNF = 0x0041, CC_ALLOC_MOVE_REQ = 0x0044, CC_ALLOC_MOVE_CNF = 0x0045, CC_ACCESS_NEW_REQ = 0x0048, CC_ACCESS_NEW_CNF = 0x0049, CC_ACCESS_NEW_IND = 0x004A, CC_ACCESS_NEW_RSP = 0x004B, CC_ACCESS_REL_REQ = 0x004C, CC_ACCESS_REL_CNF = 0x004D, CC_ACCESS_REL_IND = 0x004E, CC_ACCESS_REL_RSP = 0x004F, CC_DCPPC_IND = 0x0052, CC_DCPPC_RSP = 0x0053, CC_HP1_DET_REQ = 0x0054, CC_HP1_DET_CNF = 0x0055, CC_BLE_UPDATE_IND = 0x005A, CP_PROXY_APPOINT_REQ = 0x2000, CP_PROXY_APPOINT_CNF = 0x2001, PH_PROXY_APPOINT_IND = 0x2006, CP_PROXY_WAKE_REQ = 0x2008, NN_INL_REQ = 0x4000, NN_INL_CNF = 0x4001, NN_NEW_REQ = 0x4004, NN_NEW_CNF = 0x4005, NN_NEW_IND = 0x4006, NN_ADD_ALLOC_REQ = 0x4008, NN_ADD_ALLOC_CNF = 0x4009, NN_ADD_ALLOC_IND = 0x400A, NN_REL_ALLOC_REQ = 0x400C, NN_REL_ALLOC_CNF = 0x400D, NN_REL_NET_IND = 0x4012, CM_UNASSOCIATED_STA_IND = 0x6002, CM_ENCRYPTED_PAYLOAD_IND = 0x6006, CM_ENCRYPTED_PAYLOAD_RSP = 0x6007, CM_SET_KEY_REQ = 0x6008, CM_SET_KEY_CNF = 0x6009, CM_GET_KEY_REQ = 0x600C, CM_GET_KEY_CNF = 0x600D, CM_SC_JOIN_REQ = 0x6010, CM_SC_JOIN_CNF = 0x6011, CM_CHAN_EST_IND = 0x6016, CM_TM_UPDATE_IND = 0x601A, CM_AMP_MAP_REQ = 0x601C, CM_AMP_MAP_CNF = 0x601D, CM_BRG_INFO_REQ = 0x6020, CM_BRG_INFO_CNF = 0x6021, CM_CONN_NEW_REQ = 0x6024, CM_CONN_NEW_CNF = 0x6025, CM_CONN_REL_IND = 0x602A, CM_CONN_REL_RSP = 0x602B, CM_CONN_MOD_REQ = 0x602C, CM_CONN_MOD_CNF = 0x602D, CM_CONN_INFO_REQ = 0x6030, CM_CONN_INFO_CNF = 0x6031, CM_STA_CAP_REQ = 0x6034, CM_STA_CAP_CNF = 0x6035, CM_NW_INFO_REQ = 0x6038, CM_NW_INFO_CNF = 0x6039, CM_GET_BEACON_REQ = 0x603C, CM_GET_BEACON_CNF = 0x603D, CM_HFID_REQ = 0x6040, CM_HFID_CNF = 0x6041, CM_MME_ERROR_IND = 0x6046, CM_NW_STATS_REQ = 0x6048, CM_NW_STATS_CNF = 0x6049, CM_LINK_STATS_REQ = 0x604C, CM_LINK_STATS_CNF = 0x604D, DRV_STA_SET_MAC_ADDR_REQ = DRV_STA_SET_MAC_ADDR + REQ, DRV_STA_SET_MAC_ADDR_CNF = DRV_STA_SET_MAC_ADDR + CNF, DRV_STA_SET_CCO_PREF_REQ = DRV_STA_SET_CCO_PREF + REQ, DRV_STA_SET_CCO_PREF_CNF = DRV_STA_SET_CCO_PREF + CNF, DRV_STA_SET_WAS_CCO_REQ = DRV_STA_SET_WAS_CCO + REQ, DRV_STA_SET_WAS_CCO_CNF = DRV_STA_SET_WAS_CCO + CNF, DRV_STA_SET_WAS_CCO_IND = DRV_STA_SET_WAS_CCO + IND, DRV_STA_SET_WAS_CCO_RSP = DRV_STA_SET_WAS_CCO + RSP, DRV_STA_SET_NPW_REQ = DRV_STA_SET_NPW + REQ, DRV_STA_SET_NPW_CNF = DRV_STA_SET_NPW + CNF, DRV_STA_SET_DPW_REQ = DRV_STA_SET_DPW + REQ, DRV_STA_SET_DPW_CNF = DRV_STA_SET_DPW + CNF, DRV_STA_SET_SL_REQ = DRV_STA_SET_SL + REQ, DRV_STA_SET_SL_CNF = DRV_STA_SET_SL + CNF, DRV_STA_SET_M_STA_HFID_REQ = DRV_STA_SET_M_STA_HFID + REQ, DRV_STA_SET_M_STA_HFID_CNF = DRV_STA_SET_M_STA_HFID + CNF, DRV_STA_SET_U_STA_HFID_REQ = DRV_STA_SET_U_STA_HFID + REQ, DRV_STA_SET_U_STA_HFID_CNF = DRV_STA_SET_U_STA_HFID + CNF, DRV_STA_SET_AVLN_HFID_REQ = DRV_STA_SET_AVLN_HFID + REQ, DRV_STA_SET_AVLN_HFID_CNF = DRV_STA_SET_AVLN_HFID + CNF, DRV_STA_SET_TONEMASK_REQ = DRV_STA_SET_TONEMASK + REQ, DRV_STA_SET_TONEMASK_CNF = DRV_STA_SET_TONEMASK + CNF, DRV_STA_START_REQ = DRV_STA_START + REQ, DRV_STA_START_CNF = DRV_STA_START + CNF, DRV_STA_STOP_REQ = DRV_STA_STOP + REQ, DRV_STA_STOP_CNF = DRV_STA_STOP + CNF, TEST_MSG_NUM, MSG_UNKNOW = 0xFFFF } cp_mmtype_t; typedef struct cp_mme_header_t // Table 11-178 { mac_t oda; // original destination adress mac_t osa; // original source adress u32 v_lan_tag; // ieee 802.1 tag (optional) u16 m_type; // const = 0x88E1 u8 mmv; // management message version cp_mmtype_t mmtype; // management message type u8 nf_mi; // Number of fragments for message u8 fn_mi; // fragment number u8 fmsn; // fragmentation message sequence number } cp_mme_header_t; typedef struct cp_mme_rx_t { /** pointer to the received MME. */ u8 *p_mme; /** pointer to the MME's fragments. */ blk_t *p_frag; /** size of the MME (including header). */ uint length; /** pointer to the RX MFS. */ mfs_rx_t *mfs; /** header read. */ cp_mme_header_t header; /** \TODO use the correct bitstream. */ bitstream_t bitstream; } cp_mme_rx_t; typedef struct cp_mme_tx_t { /** pointer to the Tx buffer. */ u8 *p_mme; /** size of the mme (including header). */ uint length; /** pointer to the rx mfs. */ mfs_rx_t *mfs; /** true if the message is encapsulated in cc_relay. */ bool relay; /** read header. */ cp_mme_header_t header; /** \TODO use the correct bitstream. */ bitstream_t bitstream; } cp_mme_tx_t; typedef struct cp_mme_peer_info_t { mac_t peer_address; u32 v_lan_tag; // ieee 802.1 tag (optional) u16 m_type; // const = 0x88E1 } cp_mme_peer_info_t; #endif /*MME_H_*/