summaryrefslogtreecommitdiff
path: root/cp/msg/inc/msg_const.h
blob: c393d63df896f910232d3c28992ccb798ffbb6d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
/* Cesar project {{{
 *
 * Copyright (C) 2007 Spidcom
 *
 * <<<Licence>>>
 *
 * }}} */
/**
 * \file    cp/msg/inc/msg_const.h
 * \brief   constants of msg module
 * \ingroup cp_msg
 */
#ifndef MSG_CONST_H_
#define MSG_CONST_H_

#include "mac/sar/inc/sar_mf.h"
#include "cp/cp_types.h"
#include "cp/secu/inc/secu_types.h"

/*
 * Homeplug AV constantes
 */
#define MSG_VLAN_TAG             0       // TBD
#define MSG_VLAN_TAG_IEEE_802_1Q 0x8100  // 11.1.3
#define MSG_MTYPE                0x88E1  // 11.1
#define MSG_MTYPE_IEEE_ETHERTYPE MSG_MTYPE
#define MSG_MME_HEADER_SIZE      19
#define MSG_MM_VERSION           0x01    // 11.1.5

/* physical min & max length of MME header (refer to Table 11-178 in HP_AV spec) */
#define MME_HEADER_MINSIZE       19      // physical min length of MME message header (MME header having no "VLAN Tag" field)
#define MME_HEADER_MAXSIZE       23      // physical max length of MME message header (MME header having a "VLAN Tag" field)

/*
 * other constants
 */

// 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 mm_type_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
} __attribute__ ((packed)) mm_type_t;

/*
 * types of messages
 */
typedef struct msg_fmi_t // Table 11-178
{
    u8 nf_mi :4;    // Number of fragments for message
    u8 fn_mi :4;    // fragment number
    u8 fmsn;        // fragmentation message sequence number 
} msg_fmi_t;

typedef struct msg_mme_t // Table 11-178
{
    mac_address_t oda;      // original destination adress
    mac_address_t osa;      // original source adress
    u16 m_type;             // const = 0x88E1
    u8 mmv;                 // management message version
    mm_type_t mm_type;      // management message type
    msg_fmi_t fmi;
    u8 mm_entry[ETH_PACKET_MAX_SIZE - MSG_MME_HEADER_SIZE];
} __attribute__ ((packed)) msg_mme_t;

// the same, with vlan tag
typedef struct msg_mme_b_t // Table 11-178
{
    mac_address_t oda;      // original destination adress
    mac_address_t osa;      // original source adress
    u32 v_lan_tag;          // ieee 802.1 tag (optional)
    u16 m_type;             // const = 0x88E1
    u8 mmv;                 // management message version
    mm_type_t mm_type;      // management message type
    msg_fmi_t fmi;
    u8 mm_entry[ETH_PACKET_MAX_SIZE - MSG_MME_HEADER_SIZE - 4];
} __attribute__ ((packed)) msg_mme_b_t;

/*
 * MME header
 * 
 * here, it is not the MME header format on phy but internal software format
 * avoiding memory-alignment questions, thus more easy & suitable
 * to manage MME header info 
 */
struct mme_header_type {
    bool vlan_tag_flag;
    union {
        u8                 b[8];
        unsigned long long u64;
    } un_osa;
    union {
        u8                 b[8];
        unsigned long long u64;
    } un_oda;
    union {
        u8                 b[4];
        unsigned long      u32;
    } un_vlan_tag;
    union {
        u8                 b[4];
        unsigned long      u32;
    } un_mtype;
    union {
        u8                 b[4];
        unsigned long      u32;
    } un_mmv;
    union {
        u8                 b[4];
        unsigned long      u32;
    } un_mmtype;
    union {
        u8                 b[4];
        unsigned long      u32;
    } un_fmi;
};
typedef struct mme_header_type mme_header_type;

typedef struct msg_list_mme_t
{
    mm_type_t mm_type; // HP_AV Message type identifier
    //void (*msg_func) (const msg_mme_t *msg); // Function processing the message
    int msg_num; // FSM transition identifier (see FSM data & constants generated by VisualState from FSM model designed with VisualState)
} msg_list_mme_t;

typedef enum encryption_type_t
{
    NOT_ENCRYPTED,
    HARDWARE_ENCRYPTED,
    SOFTWARE_ENCRYPTED    
} encryption_type_t;


typedef struct msg_param_t
{
    bool mnbf;      // multi-network broadcast flag
    encryption_type_t encryption;
    peks_t peks;    // if the message is soft encrypted, set the peks 
} msg_param_t;

/**
 * \brief Get DRV-MME .REQ message name
 *  
 * \param  cnf  the REQ message type identifier 
 * \return the .REQ message name string constant
 */
char *
get_str_drv_mme_req(int req);

/**
 * \brief Get DRV-MME .CNF message name
 *  
 * \param  cnf  the CNF message type identifier 
 * \return the .CNF message name string constant
 */
char *
get_str_drv_mme_cnf(int cnf);

#endif /*MSG_CONST_H_*/