Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
eap_protocol.c
00001 /* 00002 * Copyright (c) 2017-2019, Arm Limited and affiliates. 00003 * SPDX-License-Identifier: Apache-2.0 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 */ 00017 00018 00019 #include "nsconfig.h" 00020 00021 #include "ns_types.h" 00022 #include "eventOS_event.h" 00023 #include "ns_trace.h" 00024 #include "string.h" 00025 #include "Core/include/ns_socket.h" 00026 #include "NWK_INTERFACE/Include/protocol.h" 00027 #include "6LoWPAN/Bootstraps/protocol_6lowpan.h" 00028 #include "6LoWPAN/Bootstraps/protocol_6lowpan_bootstrap.h" 00029 #ifdef ECC 00030 #include "libX509_V3.h" 00031 #include "ecc.h" 00032 #endif 00033 #include "Security/Common/sec_lib.h" 00034 #include "net_nvm_api.h" 00035 #include "Security/PANA/pana.h" 00036 00037 #include "common_functions.h" 00038 #include "Security/PANA/pana_eap_header.h" 00039 #ifdef PANA 00040 00041 #define TRACE_GROUP "eap" 00042 00043 const uint8_t EAP_ANYMOUS[9] = {'a', 'n', 'o', 'n', 'y', 'm', 'o', 'u', 's'}; 00044 00045 static bool force_frag_last_retry = false; 00046 00047 static bool force_frag_start_fail = false; 00048 00049 static bool force_frag_timeout = false; 00050 00051 static void eap_seq_back_to_accept(sec_suite_t *suite) 00052 { 00053 if (suite->pana_session.eap_id_seq == 0) { 00054 suite->pana_session.eap_id_seq = 0xff; 00055 } else { 00056 suite->pana_session.eap_id_seq--; 00057 } 00058 } 00059 00060 void pana_eap_fragmetation_start_filter(bool state) 00061 { 00062 tr_debug("Set start state %u", state); 00063 force_frag_start_fail = state; 00064 } 00065 00066 void pana_eap_fragmetation_force_timeout(bool state) 00067 { 00068 force_frag_timeout = state; 00069 } 00070 00071 void pana_eap_fragmetation_force_retry(bool state) 00072 { 00073 force_frag_last_retry = state; 00074 } 00075 00076 static buffer_t *eap_common_headroom_get_to_buffer(buffer_t *buf, uint16_t header_size) 00077 { 00078 if ((buf = buffer_headroom(buf, header_size)) == 0) { 00079 return NULL; 00080 } 00081 buffer_data_reserve_header(buf, header_size); 00082 return buf; 00083 } 00084 00085 void pana_eap_identity_build(buffer_t *buf, sec_suite_t *suite) 00086 { 00087 uint8_t *ptr; 00088 uint8_t eap_code; 00089 buf->buf_ptr = 0; 00090 const uint8_t *nonce_ptr; 00091 if (suite->pana_session.user_server) { 00092 buf->buf_end = 0; 00093 eap_code = EAP_REQ; 00094 nonce_ptr = suite->pana_session.pana_heap->agent_nonce; 00095 } else { 00096 00097 buf->buf_end = 9; 00098 ptr = buf->buf ; 00099 memcpy(ptr, EAP_ANYMOUS, 9); 00100 eap_code = EAP_RESPONSE; 00101 nonce_ptr = suite->pana_session.pana_heap->client_nonce; 00102 } 00103 00104 buf = eap_common_headroom_get_to_buffer(buf, eap_header_size(eap_code)); 00105 if (!buf) { 00106 return; 00107 } 00108 00109 eap_header_build(buffer_data_pointer(buf), buffer_data_length(buf), eap_code, suite->pana_session.eap_id_seq, EAP_IDENTITY); 00110 00111 pana_eap_payload_down(buf, nonce_ptr, suite); 00112 tr_warn("TX EAP Identity!"); 00113 } 00114 00115 void pana_eap_tls_start_build(buffer_t *buf, sec_suite_t *suite) 00116 { 00117 buf->buf_ptr = 0; 00118 buf->buf_end = 0; 00119 if (suite->tls_session->tls_heap) { 00120 tls_heap_t *tls_heap = suite->tls_session->tls_heap; 00121 tls_heap->tls_handshake_h_len = 0; 00122 } 00123 00124 uint8_t header_size = eap_header_size(EAP_REQ); 00125 header_size += eap_tls_header_size(EAP_TLS_START); 00126 00127 buf = eap_common_headroom_get_to_buffer(buf, header_size); 00128 if (!buf) { 00129 return; 00130 } 00131 00132 uint8_t *ptr = eap_header_build(buffer_data_pointer(buf), buffer_data_length(buf), EAP_REQ, suite->pana_session.eap_id_seq, EAP_TLS); 00133 00134 eap_tls_header_build(ptr, EAP_TLS_START, 0); 00135 00136 pana_eap_payload_down(buf, NULL, suite); 00137 00138 } 00139 00140 00141 void pana_eap_tls_finnish_build(buffer_t *buf, sec_suite_t *suite) 00142 { 00143 buffer_data_clear(buf); 00144 uint8_t eap_code; 00145 if (suite->state == TLS_ALERT) { 00146 eap_code = EAP_FAILURE; 00147 } else { 00148 eap_code = EAP_RESPONSE; 00149 } 00150 00151 00152 uint8_t header_size = eap_header_size(eap_code); 00153 header_size += eap_tls_header_size(0); 00154 00155 buf = eap_common_headroom_get_to_buffer(buf, header_size); 00156 if (!buf) { 00157 return; 00158 } 00159 00160 uint8_t *ptr = eap_header_build(buffer_data_pointer(buf), buffer_data_length(buf), eap_code, suite->pana_session.eap_id_seq, EAP_TLS); 00161 00162 eap_tls_header_build(ptr, 0, 0); 00163 00164 pana_eap_payload_down(buf, NULL, suite); 00165 } 00166 00167 bool pana_eap_frag_re_tx(sec_suite_t *suite) 00168 { 00169 buffer_t *f_buf; 00170 if (suite->pana_session.eap_assy_buf) { 00171 buffer_t *buf = 0; 00172 f_buf = buffer_get(suite->pana_session.last_assy_size + 50); 00173 buf = suite->pana_session.eap_assy_buf; 00174 if (f_buf) { 00175 memcpy(buffer_data_pointer(f_buf), buffer_data_pointer(buf) + suite->pana_session.assy_off_set, suite->pana_session.last_assy_size); 00176 buffer_data_length_set(f_buf, suite->pana_session.last_assy_size); 00177 goto success_push; 00178 } 00179 } else if (suite->pana_session.eap_frag_buf || suite->pana_session.packet_delivered) { 00180 f_buf = buffer_get(127); 00181 if (f_buf) { 00182 00183 //tr_debug("EAP assembly re REQ timer"); 00184 f_buf->buf_ptr = f_buf->buf_end ; 00185 goto success_push; 00186 } 00187 } 00188 return false; 00189 success_push: 00190 f_buf->interface = suite->interface; 00191 memcpy(f_buf->dst_sa .address , suite->session_address, 16); 00192 f_buf->src_sa .addr_type = ADDR_NONE ; 00193 pana_eap_down(f_buf, suite); 00194 return true; 00195 } 00196 00197 buffer_t *eap_down(buffer_t *buf, sec_suite_t *suite) 00198 { 00199 //tr_debug("EAP Down"); 00200 uint16_t tls_payload_len = 0; 00201 uint8_t eap_code; 00202 uint8_t eap_tls_flags = 0; 00203 tls_payload_len = buffer_data_length(buf); 00204 if (tls_payload_len > EAP_MTU_SIZE) { 00205 //Check Fragmentation 00206 if (suite->pana_session.assy_length) { 00207 tr_debug("Already Fragmentation"); 00208 buffer_free(buf); 00209 buf = (buffer_t *)0; 00210 return buf; 00211 } else { 00212 pana_lib_parameters_s *parameters = pana_parameters_get(); 00213 00214 buffer_t *f_buf = buffer_get(parameters->EAP_FRAGMENT_SIZE + 50); 00215 buf->seq = suite->pana_session.eap_id_seq; 00216 suite->pana_session.eap_assy_buf = buf; 00217 suite->pana_session.assy_length = tls_payload_len; 00218 suite->pana_session.assy_off_set = 0; 00219 suite->pana_session.last_assy_size = parameters->EAP_FRAGMENT_SIZE; 00220 if (suite->pana_session.user_server) { 00221 //tr_debug("Set Re Tx Timer"); 00222 pana_timeout_timer_set(suite, suite->state); 00223 } else { 00224 sec_set_auth_timeout(suite, TLS_KEY_CHANGE); 00225 } 00226 if (f_buf) { 00227 f_buf->interface = suite->interface; 00228 eap_tls_flags = EAP_TLS_FRAGMENT_LENGTH | EAP_TLS_MORE_FRAGMENTS; 00229 memcpy(buffer_data_pointer(f_buf), buffer_data_pointer(buf), parameters->EAP_FRAGMENT_SIZE); 00230 memcpy(f_buf->dst_sa .address , buf->src_sa .address , 16); 00231 buf->src_sa .addr_type = ADDR_NONE ; 00232 f_buf->src_sa .addr_type = ADDR_NONE ; 00233 buffer_data_length_set(f_buf, parameters->EAP_FRAGMENT_SIZE); 00234 buf = f_buf; 00235 00236 } else { 00237 return NULL; 00238 } 00239 } 00240 } else { 00241 if (suite->pana_session.assy_length) { 00242 if (suite->pana_session.assy_length > (suite->pana_session.assy_off_set + suite->pana_session.last_assy_size)) { 00243 eap_tls_flags = EAP_TLS_MORE_FRAGMENTS; 00244 if (suite->pana_session.assy_off_set == 0) { 00245 eap_tls_flags |= EAP_TLS_FRAGMENT_LENGTH; 00246 //tr_debug("Retry First"); 00247 } 00248 } 00249 } 00250 } 00251 00252 if (suite->pana_session.user_server) { 00253 eap_code = EAP_REQ; 00254 } else { 00255 eap_code = EAP_RESPONSE; 00256 } 00257 00258 uint8_t header_size = eap_header_size(eap_code); 00259 header_size += eap_tls_header_size(eap_tls_flags); 00260 00261 buf = eap_common_headroom_get_to_buffer(buf, header_size); 00262 if (!buf) { 00263 return NULL; 00264 } 00265 00266 uint8_t *ptr = eap_header_build(buffer_data_pointer(buf), buffer_data_length(buf), eap_code, suite->pana_session.eap_id_seq, EAP_TLS); 00267 00268 eap_tls_header_build(ptr, eap_tls_flags, suite->pana_session.assy_length); 00269 00270 return (buf); 00271 } 00272 00273 buffer_t *eap_up(buffer_t *buf, sec_suite_t *suite) 00274 { 00275 eap_header_t header; 00276 uint8_t *ptr = buffer_data_pointer(buf); 00277 uint16_t payload_length = buffer_data_length(buf); 00278 uint8_t response_counter = suite->retry_counter; 00279 if (!eap_header_parse(ptr, payload_length, &header)) { 00280 return buffer_free(buf); 00281 } 00282 00283 if (header.eap_code == EAP_RESPONSE) { 00284 if (header.id_seq != suite->pana_session.eap_id_seq) { 00285 tr_warn("EAP:Drop Packet by ID"); 00286 suite->timer = 65; 00287 return buffer_free(buf); 00288 } 00289 //tr_debug("EAP RES"); 00290 suite->pana_session.eap_id_seq++; 00291 suite->retry_counter = 0; 00292 } else if (header.eap_code == EAP_REQ) { 00293 00294 if (header.type == EAP_IDENTITY) { 00295 suite->pana_session.eap_id_seq = header.id_seq; 00296 } else { 00297 00298 uint8_t eap_seq = suite->pana_session.eap_id_seq; 00299 if (eap_seq == 0xff) { 00300 eap_seq = 0; 00301 } else { 00302 eap_seq++; 00303 } 00304 00305 if (eap_seq != header.id_seq) { 00306 if (suite->pana_session.eap_id_seq == header.id_seq) { 00307 //tr_debug("EAP:Same SEQ"); 00308 if (suite->pana_session.assy_length) { 00309 tr_debug("SEND ACK. Should send same packet again"); 00310 } else if (suite->pana_session.frag_length) { 00311 tr_debug("SEND ACK. Should send same packet again"); 00312 buf->buf_ptr = buf->buf_end ; 00313 buf = buffer_turnaround(buf); 00314 memcpy(buf->dst_sa .address , buf->src_sa .address , 16); 00315 buf->src_sa .addr_type = ADDR_NONE ; 00316 return buf; 00317 } else { 00318 tr_debug("REQ but Frag ready"); 00319 return buffer_free(buf); 00320 } 00321 } else { 00322 tr_debug("EAP:Drop unknown Req ID. MSG: %x, ses: %x", header.id_seq, suite->pana_session.eap_id_seq); 00323 return buffer_free(buf); 00324 } 00325 } else { 00326 suite->pana_session.eap_id_seq = header.id_seq; 00327 } 00328 } 00329 } 00330 00331 switch (header.type) { 00332 case EAP_IDENTITY: 00333 if (header.eap_code == EAP_REQ) { 00334 sec_lib_state_machine_trig(suite, EAP_IDENTITY_RES); 00335 } else { 00336 #ifdef PANA_SERVER_API 00337 if (suite->pana_session.user_server) { 00338 sec_lib_state_machine_trig(suite, TLS_START); 00339 } 00340 #endif 00341 } 00342 return buffer_free(buf); 00343 00344 case EAP_TLS: 00345 case EAP_TTLS: { 00346 eap_tls_header_t eap_tls_header; 00347 if (!eap_tls_header_parse(header.data_ptr, header.length - 5, &eap_tls_header)) { 00348 return buffer_free(buf); 00349 } 00350 00351 if (eap_tls_header.eap_tls_flags & EAP_TLS_START) { 00352 suite->pana_session.eap_id_seq = header.id_seq; 00353 sec_lib_state_machine_trig(suite, TLS_INIT); 00354 return buffer_free(buf); 00355 } 00356 buffer_data_pointer_set(buf, eap_tls_header.data_ptr); 00357 00358 if (header.eap_code == EAP_RESPONSE) { 00359 if (eap_tls_header.eap_tls_flags) { 00360 if (suite->pana_session.assy_length) { 00361 suite->pana_session.assy_off_set += suite->pana_session.last_assy_size; 00362 if (suite->pana_session.assy_off_set < suite->pana_session.assy_length) { 00363 tr_warn("Packet TX process fail"); 00364 } else { 00365 tr_debug("EAP Frag TX Done & Start RX frag"); 00366 00367 } 00368 //tr_debug("Free Frag Buf"); 00369 if (suite->pana_session.eap_assy_buf) { 00370 tr_debug("Free Frag Buf"); 00371 buffer_free(suite->pana_session.eap_assy_buf); 00372 suite->pana_session.eap_assy_buf = NULL; 00373 } 00374 suite->pana_session.assy_length = 0; 00375 suite->pana_session.assy_off_set = 0; 00376 suite->pana_session.last_assy_size = 0; 00377 suite->pana_session.packet_delivered = true; 00378 suite->retry_counter = 0; 00379 } 00380 } 00381 } 00382 00383 if ((eap_tls_header.eap_tls_flags & EAP_TLS_MORE_FRAGMENTS) == 0) { 00384 if (suite->pana_session.frag_length) { 00385 if (force_frag_last_retry || force_frag_timeout) { 00386 force_frag_last_retry = false; 00387 if (header.eap_code == EAP_RESPONSE) { 00388 suite->retry_counter = response_counter; 00389 } 00390 eap_seq_back_to_accept(suite); 00391 return buffer_free(buf); 00392 } 00393 buffer_t *t_buf = suite->pana_session.eap_frag_buf; 00394 00395 uint16_t check_len = suite->pana_session.frag_off_set; 00396 check_len += eap_tls_header.tls_frame_length; 00397 suite->pana_session.eap_frag_buf = NULL; 00398 suite->pana_session.frag_length = 0; 00399 if (check_len == buffer_data_length(t_buf)) { 00400 memcpy(buffer_data_pointer(t_buf) + suite->pana_session.frag_off_set, eap_tls_header.data_ptr, eap_tls_header.tls_frame_length); 00401 t_buf->seq = header.id_seq; 00402 tr_debug("Full packet RX"); 00403 buffer_free(buf); 00404 buf = t_buf; 00405 suite->pana_session.frag_off_set = 0; 00406 } else { 00407 00408 buffer_free(t_buf); 00409 suite->pana_session.frag_off_set = 0; 00410 sec_lib_state_machine_trig(suite, TLS_ALERT_INTERNAL); 00411 return buffer_free(buf); 00412 } 00413 } else if (suite->pana_session.assy_length) { 00414 buffer_t *t_buf = suite->pana_session.eap_assy_buf; 00415 if (header.eap_code == EAP_RESPONSE) { 00416 suite->pana_session.assy_off_set += suite->pana_session.last_assy_size; 00417 if (eap_tls_header.tls_frame_length == 0) { 00418 t_buf->seq = header.id_seq; 00419 } 00420 } else { 00421 uint8_t cmp_seq = t_buf->seq ; 00422 if (cmp_seq == 0xff) { 00423 cmp_seq = 0; 00424 } else { 00425 cmp_seq++; 00426 } 00427 if (cmp_seq == header.id_seq) { 00428 suite->pana_session.assy_off_set += suite->pana_session.last_assy_size; 00429 if (eap_tls_header.tls_frame_length == 0) { 00430 t_buf->seq = header.id_seq; 00431 } 00432 } else { 00433 tr_debug("RETX"); 00434 } 00435 } 00436 if (suite->pana_session.assy_off_set < suite->pana_session.assy_length) { 00437 if (eap_tls_header.tls_frame_length == 0) { 00438 uint16_t len = 0; 00439 buffer_t *f_buf = 0; 00440 buffer_free(buf); 00441 suite->retry_counter = 0; 00442 pana_lib_parameters_s *parameters = pana_parameters_get(); 00443 if (suite->pana_session.assy_off_set + parameters->EAP_FRAGMENT_SIZE < suite->pana_session.assy_length) { 00444 len = parameters->EAP_FRAGMENT_SIZE; 00445 } else { 00446 len = suite->pana_session.assy_length - suite->pana_session.assy_off_set; 00447 } 00448 00449 f_buf = buffer_get(len + 50); 00450 if (f_buf) { 00451 //memcpy(f_buf->dst_sa.address, t_buf->src_sa.address, 16); 00452 f_buf->interface = suite->interface; 00453 f_buf->src_sa .addr_type = ADDR_NONE ; 00454 f_buf->dst_sa .addr_type = ADDR_NONE ; 00455 memcpy(buffer_data_pointer(f_buf), buffer_data_pointer(t_buf) + suite->pana_session.assy_off_set, len); 00456 buffer_data_length_set(f_buf, len); 00457 suite->pana_session.last_assy_size = len; 00458 tr_debug("Push frag"); 00459 return (f_buf); 00460 } else { 00461 tr_warn("No Mem"); 00462 return NULL; 00463 } 00464 } else { 00465 //IT cuold be alert 00466 buf->session_ptr = suite; 00467 eap_tls_payload_push(buf); 00468 return NULL; 00469 } 00470 } else { 00471 tr_debug("EAP Frag TX Done"); 00472 suite->pana_session.eap_assy_buf = buffer_free(t_buf); 00473 suite->pana_session.assy_length = 0; 00474 suite->pana_session.assy_off_set = 0; 00475 suite->pana_session.last_assy_size = 0; 00476 } 00477 } else if (!eap_tls_header.tls_frame_length) { 00478 if (header.eap_code == EAP_RESPONSE) { 00479 #ifdef PANA_SERVER_API 00480 if (suite->state == TLS_KEY_CHANGE && suite->pana_session.user_server) { 00481 //tr_debug("TLS Auth Ready"); 00482 pana_key_calculation(suite); 00483 sec_lib_state_machine_trig(suite, TLS_EAP_END_PANA_VERIFY); 00484 } 00485 #endif 00486 } 00487 00488 return buffer_free(buf); 00489 } 00490 buf->session_ptr = suite; 00491 eap_tls_payload_push(buf); 00492 return NULL; 00493 00494 } 00495 00496 //More flag is active 00497 if (!eap_tls_header.tls_frame_length) { 00498 tr_debug("More without Data"); 00499 return buffer_free(buf); 00500 } 00501 bool skip_packet = false; 00502 00503 if (eap_tls_header.tls_length) { 00504 //Check did we have a already action 00505 if (suite->pana_session.frag_length == 0) { 00506 00507 buffer_t *f_buf = NULL; 00508 if (force_frag_start_fail) { 00509 tr_debug("Force to drop fragment"); 00510 force_frag_start_fail = false; 00511 } else { 00512 tr_debug("First Fragment"); 00513 f_buf = buffer_get(eap_tls_header.tls_length); 00514 } 00515 if (f_buf) { 00516 buffer_data_length_set(f_buf, eap_tls_header.tls_length); 00517 memcpy(buffer_data_pointer(f_buf), eap_tls_header.data_ptr, eap_tls_header.tls_frame_length); 00518 suite->pana_session.frag_off_set = eap_tls_header.tls_frame_length; 00519 f_buf->seq = header.id_seq; 00520 suite->pana_session.eap_frag_buf = f_buf; 00521 suite->pana_session.frag_length = eap_tls_header.tls_length; 00522 skip_packet = true; 00523 } else { 00524 tr_debug("No free men for Fragment: %i", eap_tls_header.tls_length); 00525 sec_lib_state_machine_trig(suite, TLS_ALERT_INTERNAL); 00526 return buffer_free(buf); 00527 } 00528 } else if (suite->pana_session.frag_length != eap_tls_header.tls_length) { 00529 tr_debug("Fragment started already"); 00530 skip_packet = true; 00531 } else { 00532 00533 } 00534 } 00535 00536 if (!skip_packet && suite->pana_session.frag_length) { 00537 uint16_t check_len = 0; 00538 buffer_t *t_buf = suite->pana_session.eap_frag_buf; 00539 check_len = suite->pana_session.frag_off_set; 00540 check_len += eap_tls_header.tls_frame_length; 00541 00542 //new sequency 00543 if (check_len < buffer_data_length(t_buf)) { 00544 tr_debug("Copy Data to Fragment"); 00545 memcpy(buffer_data_pointer(t_buf) + suite->pana_session.frag_off_set, eap_tls_header.data_ptr, eap_tls_header.tls_frame_length); 00546 suite->pana_session.frag_off_set += eap_tls_header.tls_frame_length; 00547 t_buf->seq = suite->pana_session.eap_id_seq; 00548 } else { 00549 tr_debug("Overflow possible Free Current entry and set Alert"); 00550 buffer_free(t_buf); 00551 suite->pana_session.eap_frag_buf = NULL; 00552 suite->pana_session.frag_length = 0; 00553 suite->pana_session.frag_off_set = 0; 00554 sec_lib_state_machine_trig(suite, TLS_ALERT_INTERNAL); 00555 return buffer_free(buf); 00556 } 00557 } 00558 00559 if (header.eap_code == EAP_RESPONSE) { 00560 #ifdef PANA_SERVER_API 00561 if (suite->state == TLS_TX_SERVER_KEY_EXCHANGE) { 00562 if (suite->pana_session.assy_length) { 00563 suite->retry_counter = 0; 00564 } 00565 } 00566 #endif 00567 pana_timeout_timer_set(suite, suite->state); 00568 } 00569 /* TX ACK or new request to sender*/ 00570 buf = buffer_turnaround(buf); 00571 buf->buf_ptr = buf->buf_end ; 00572 memcpy(buf->dst_sa .address , buf->src_sa .address , 16); 00573 buf->src_sa .addr_type = ADDR_NONE ; 00574 return (buf); 00575 } 00576 00577 00578 default: 00579 tr_debug("%x", header.type); 00580 return buffer_free(buf); 00581 } 00582 } 00583 #else 00584 void pana_eap_fragmetation_start_filter(bool state) 00585 { 00586 (void) state; 00587 } 00588 00589 void pana_eap_fragmetation_force_timeout(bool state) 00590 { 00591 (void) state; 00592 } 00593 00594 void pana_eap_fragmetation_force_retry(bool state) 00595 { 00596 (void) state; 00597 } 00598 00599 #endif
Generated on Tue Jul 12 2022 13:54:17 by
