37
37
38
38
typedef int8_t ws_pae_delete (protocol_interface_info_entry_t * interface_ptr );
39
39
typedef void ws_pae_timer (uint16_t ticks );
40
+ typedef int8_t ws_pae_br_addr_write (protocol_interface_info_entry_t * interface_ptr , const uint8_t * eui_64 );
41
+ typedef int8_t ws_pae_br_addr_read (protocol_interface_info_entry_t * interface_ptr , uint8_t * eui_64 );
42
+
40
43
41
44
typedef struct {
42
45
ns_list_link_t link ; /**< Link */
43
46
uint8_t target_eui_64 [8 ]; /**< EAPOL target */
47
+ uint16_t target_pan_id ; /**< EAPOL target PAN ID */
44
48
uint8_t br_eui_64 [8 ]; /**< Border router EUI-64 */
45
49
sec_prot_gtk_keys_t gtks ; /**< GTKs */
46
50
sec_prot_certs_t certs ; /**< Certificates */
@@ -49,6 +53,8 @@ typedef struct {
49
53
ws_pae_controller_key_insert * key_insert ; /**< Key insert callback */
50
54
ws_pae_delete * pae_delete ; /**< PAE delete callback */
51
55
ws_pae_timer * pae_timer ; /**< PAE timer callback */
56
+ ws_pae_br_addr_write * pae_br_addr_write ; /**< PAE Border router EUI-64 write callback */
57
+ ws_pae_br_addr_read * pae_br_addr_read ; /**< PAE Border router EUI-64 read callback */
52
58
} pae_controller_t ;
53
59
54
60
static void ws_pae_controller_test_keys_set (sec_prot_gtk_keys_t * gtks );
@@ -85,16 +91,7 @@ int8_t ws_pae_controller_authenticate(protocol_interface_info_entry_t *interface
85
91
return -1 ;
86
92
}
87
93
88
- if (ws_pae_supp_init (controller -> interface_ptr , & controller -> certs ) < 0 ) {
89
- return -1 ;
90
- }
91
-
92
- controller -> pae_delete = ws_pae_supp_delete ;
93
- controller -> pae_timer = ws_pae_supp_timer ;
94
-
95
- ws_pae_supp_cb_register (controller -> interface_ptr , controller -> auth_completed , controller -> key_insert );
96
-
97
- if (ws_pae_supp_authenticate (controller -> interface_ptr , controller -> target_eui_64 ) > 0 ) {
94
+ if (ws_pae_supp_authenticate (controller -> interface_ptr , controller -> target_pan_id , controller -> target_eui_64 ) == PAE_SUPP_NOT_ENABLED ) {
98
95
// Already authenticated
99
96
ws_pae_controller_test_keys_set (& controller -> gtks );
100
97
@@ -105,6 +102,14 @@ int8_t ws_pae_controller_authenticate(protocol_interface_info_entry_t *interface
105
102
controller -> auth_completed (interface_ptr , true);
106
103
}
107
104
105
+ ///////////
106
+ // For now fixed since not yet support for EA-IE
107
+ const uint8_t addr [8 ] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08 };
108
+ if (controller -> pae_br_addr_write ) {
109
+ controller -> pae_br_addr_write (interface_ptr , addr );
110
+ }
111
+ ////////////////
112
+
108
113
return 0 ;
109
114
}
110
115
@@ -124,18 +129,15 @@ int8_t ws_pae_controller_authenticator_start(protocol_interface_info_entry_t *in
124
129
125
130
ws_pae_controller_test_keys_set (& controller -> gtks );
126
131
127
- if (ws_pae_auth_init (controller -> interface_ptr , local_port , remote_addr , remote_port , & controller -> gtks , & controller -> certs ) < 0 ) {
128
- return -1 ;
129
- }
130
-
131
- controller -> pae_delete = ws_pae_auth_delete ;
132
- controller -> pae_timer = ws_pae_auth_timer ;
133
-
134
132
uint8_t index ;
135
133
uint8_t * gtk = sec_prot_keys_get_gtk_to_insert (& controller -> gtks , & index );
136
134
137
135
controller -> key_insert (controller -> interface_ptr , index , gtk );
138
136
137
+ if (ws_pae_auth_addresses_set (interface_ptr , local_port , remote_addr , remote_port ) < 0 ) {
138
+ return -1 ;
139
+ }
140
+
139
141
return 0 ;
140
142
}
141
143
@@ -156,7 +158,7 @@ int8_t ws_pae_controller_cb_register(protocol_interface_info_entry_t *interface_
156
158
return 0 ;
157
159
}
158
160
159
- int8_t ws_pae_controller_set_target (protocol_interface_info_entry_t * interface_ptr , uint8_t * dest_eui_64 )
161
+ int8_t ws_pae_controller_set_target (protocol_interface_info_entry_t * interface_ptr , uint16_t target_pan_id , uint8_t * target_eui_64 )
160
162
{
161
163
if (!interface_ptr ) {
162
164
return -1 ;
@@ -167,11 +169,43 @@ int8_t ws_pae_controller_set_target(protocol_interface_info_entry_t *interface_p
167
169
return -1 ;
168
170
}
169
171
170
- memcpy (controller -> target_eui_64 , dest_eui_64 , 8 );
172
+ controller -> target_pan_id = target_pan_id ;
173
+ memcpy (controller -> target_eui_64 , target_eui_64 , 8 );
171
174
172
175
return 0 ;
173
176
}
174
177
178
+ int8_t ws_pae_controller_nw_info_set (protocol_interface_info_entry_t * interface_ptr , uint16_t pan_id , char * network_name )
179
+ {
180
+ (void ) pan_id ;
181
+ (void ) network_name ;
182
+
183
+ if (!interface_ptr ) {
184
+ return -1 ;
185
+ }
186
+
187
+ pae_controller_t * controller = ws_pae_controller_get (interface_ptr );
188
+ if (!controller ) {
189
+ return -1 ;
190
+ }
191
+
192
+ return ws_pae_supp_nw_info_set (interface_ptr , pan_id , network_name );
193
+ }
194
+
195
+ int8_t ws_pae_controller_nw_key_valid (protocol_interface_info_entry_t * interface_ptr )
196
+ {
197
+ if (!interface_ptr ) {
198
+ return -1 ;
199
+ }
200
+
201
+ pae_controller_t * controller = ws_pae_controller_get (interface_ptr );
202
+ if (!controller ) {
203
+ return -1 ;
204
+ }
205
+
206
+ return ws_pae_supp_nw_key_valid (interface_ptr );
207
+ }
208
+
175
209
int8_t ws_pae_controller_init (protocol_interface_info_entry_t * interface_ptr )
176
210
{
177
211
if (!interface_ptr ) {
@@ -194,6 +228,8 @@ int8_t ws_pae_controller_init(protocol_interface_info_entry_t *interface_ptr)
194
228
controller -> key_insert = NULL ;
195
229
controller -> pae_delete = NULL ;
196
230
controller -> pae_timer = NULL ;
231
+ controller -> pae_br_addr_write = NULL ;
232
+ controller -> pae_br_addr_read = NULL ;
197
233
198
234
sec_prot_keys_gtks_init (& controller -> gtks );
199
235
sec_prot_certs_init (& controller -> certs );
@@ -203,6 +239,51 @@ int8_t ws_pae_controller_init(protocol_interface_info_entry_t *interface_ptr)
203
239
return 0 ;
204
240
}
205
241
242
+ int8_t ws_pae_controller_supp_init (protocol_interface_info_entry_t * interface_ptr )
243
+ {
244
+ if (!interface_ptr ) {
245
+ return -1 ;
246
+ }
247
+
248
+ pae_controller_t * controller = ws_pae_controller_get (interface_ptr );
249
+ if (!controller ) {
250
+ return -1 ;
251
+ }
252
+
253
+ if (ws_pae_supp_init (controller -> interface_ptr , & controller -> certs ) < 0 ) {
254
+ return -1 ;
255
+ }
256
+
257
+ controller -> pae_delete = ws_pae_supp_delete ;
258
+ controller -> pae_timer = ws_pae_supp_timer ;
259
+ controller -> pae_br_addr_write = ws_pae_supp_border_router_addr_write ;
260
+ controller -> pae_br_addr_read = ws_pae_supp_border_router_addr_read ;
261
+
262
+ ws_pae_supp_cb_register (controller -> interface_ptr , controller -> auth_completed , controller -> key_insert );
263
+
264
+ return 0 ;
265
+ }
266
+
267
+ int8_t ws_pae_controller_auth_init (protocol_interface_info_entry_t * interface_ptr )
268
+ {
269
+ if (!interface_ptr ) {
270
+ return -1 ;
271
+ }
272
+
273
+ pae_controller_t * controller = ws_pae_controller_get (interface_ptr );
274
+ if (!controller ) {
275
+ return -1 ;
276
+ }
277
+
278
+ if (ws_pae_auth_init (controller -> interface_ptr , & controller -> gtks , & controller -> certs ) < 0 ) {
279
+ return -1 ;
280
+ }
281
+
282
+ controller -> pae_delete = ws_pae_auth_delete ;
283
+ controller -> pae_timer = ws_pae_auth_timer ;
284
+
285
+ return 0 ;
286
+ }
206
287
int8_t ws_pae_controller_stop (protocol_interface_info_entry_t * interface_ptr )
207
288
{
208
289
if (!interface_ptr ) {
@@ -266,7 +347,7 @@ int8_t ws_pae_controller_certificate_chain_set(const arm_certificate_chain_entry
266
347
return 0 ;
267
348
}
268
349
269
- int8_t ws_pae_controller_border_router_addr_write (protocol_interface_info_entry_t * interface_ptr , uint8_t * eui_64 )
350
+ int8_t ws_pae_controller_border_router_addr_write (protocol_interface_info_entry_t * interface_ptr , const uint8_t * eui_64 )
270
351
{
271
352
if (!interface_ptr || !eui_64 ) {
272
353
return -1 ;
@@ -277,7 +358,11 @@ int8_t ws_pae_controller_border_router_addr_write(protocol_interface_info_entry_
277
358
return -1 ;
278
359
}
279
360
280
- memcpy (controller -> br_eui_64 , eui_64 , 8 );
361
+ if (controller -> pae_br_addr_write ) {
362
+ return controller -> pae_br_addr_write (interface_ptr , eui_64 );
363
+ } else {
364
+ memcpy (controller -> br_eui_64 , eui_64 , 8 );
365
+ }
281
366
282
367
return 0 ;
283
368
@@ -294,7 +379,11 @@ int8_t ws_pae_controller_border_router_addr_read(protocol_interface_info_entry_t
294
379
return -1 ;
295
380
}
296
381
297
- memcpy (eui_64 , controller -> br_eui_64 , 8 );
382
+ if (controller -> pae_br_addr_read ) {
383
+ return controller -> pae_br_addr_read (interface_ptr , eui_64 );
384
+ } else {
385
+ memcpy (eui_64 , controller -> br_eui_64 , 8 );
386
+ }
298
387
299
388
return 0 ;
300
389
}
0 commit comments