|
42 | 42 |
|
43 | 43 | const uint8_t EAP_ANYMOUS[9] = {'a', 'n', 'o', 'n', 'y', 'm', 'o', 'u', 's'}; |
44 | 44 |
|
| 45 | +static bool force_frag_last_retry = false; |
| 46 | + |
| 47 | +static bool force_frag_start_fail = false; |
| 48 | + |
| 49 | +static bool force_frag_timeout = false; |
| 50 | + |
| 51 | +static void eap_seq_back_to_accept(sec_suite_t *suite) |
| 52 | +{ |
| 53 | + if (suite->pana_session.eap_id_seq == 0) { |
| 54 | + suite->pana_session.eap_id_seq = 0xff; |
| 55 | + } else { |
| 56 | + suite->pana_session.eap_id_seq--; |
| 57 | + } |
| 58 | +} |
| 59 | + |
| 60 | +void pana_eap_fragmetation_start_filter(bool state) |
| 61 | +{ |
| 62 | + tr_debug("Set start state %u", state); |
| 63 | + force_frag_start_fail = state; |
| 64 | +} |
| 65 | + |
| 66 | +void pana_eap_fragmetation_force_timeout(bool state) |
| 67 | +{ |
| 68 | + force_frag_timeout = state; |
| 69 | +} |
| 70 | + |
| 71 | +void pana_eap_fragmetation_force_retry(bool state) |
| 72 | +{ |
| 73 | + force_frag_last_retry = state; |
| 74 | +} |
| 75 | + |
45 | 76 | static buffer_t *eap_common_headroom_get_to_buffer(buffer_t *buf, uint16_t header_size) |
46 | 77 | { |
47 | 78 | if ((buf = buffer_headroom(buf, header_size)) == 0) { |
@@ -145,7 +176,7 @@ bool pana_eap_frag_re_tx(sec_suite_t *suite) |
145 | 176 | buffer_data_length_set(f_buf, suite->pana_session.last_assy_size); |
146 | 177 | goto success_push; |
147 | 178 | } |
148 | | - } else if (suite->pana_session.eap_frag_buf) { |
| 179 | + } else if (suite->pana_session.eap_frag_buf || suite->pana_session.packet_delivered) { |
149 | 180 | f_buf = buffer_get(127); |
150 | 181 | if (f_buf) { |
151 | 182 |
|
@@ -337,17 +368,24 @@ buffer_t *eap_up(buffer_t *buf, sec_suite_t *suite) |
337 | 368 | if (suite->pana_session.eap_assy_buf) { |
338 | 369 | tr_debug("Free Frag Buf"); |
339 | 370 | buffer_free(suite->pana_session.eap_assy_buf); |
340 | | - suite->pana_session.eap_assy_buf = 0; |
| 371 | + suite->pana_session.eap_assy_buf = NULL; |
341 | 372 | } |
342 | 373 | suite->pana_session.assy_length = 0; |
343 | 374 | suite->pana_session.assy_off_set = 0; |
344 | 375 | suite->pana_session.last_assy_size = 0; |
| 376 | + suite->pana_session.packet_delivered = true; |
| 377 | + suite->retry_counter = 0; |
345 | 378 | } |
346 | 379 | } |
347 | 380 | } |
348 | 381 |
|
349 | 382 | if ((eap_tls_header.eap_tls_flags & EAP_TLS_MORE_FRAGMENTS) == 0) { |
350 | 383 | if (suite->pana_session.frag_length) { |
| 384 | + if (force_frag_last_retry || force_frag_timeout) { |
| 385 | + force_frag_last_retry = false; |
| 386 | + eap_seq_back_to_accept(suite); |
| 387 | + return buffer_free(buf); |
| 388 | + } |
351 | 389 | buffer_t *t_buf = suite->pana_session.eap_frag_buf; |
352 | 390 |
|
353 | 391 | uint16_t check_len = suite->pana_session.frag_off_set; |
@@ -462,8 +500,14 @@ buffer_t *eap_up(buffer_t *buf, sec_suite_t *suite) |
462 | 500 | //Check did we have a already action |
463 | 501 | if (suite->pana_session.frag_length == 0) { |
464 | 502 |
|
465 | | - buffer_t *f_buf = buffer_get(eap_tls_header.tls_length); |
466 | | - tr_debug("First Fragment"); |
| 503 | + buffer_t *f_buf = NULL; |
| 504 | + if (force_frag_start_fail) { |
| 505 | + tr_debug("Force to drop fragment"); |
| 506 | + force_frag_start_fail = false; |
| 507 | + } else { |
| 508 | + tr_debug("First Fragment"); |
| 509 | + f_buf = buffer_get(eap_tls_header.tls_length); |
| 510 | + } |
467 | 511 | if (f_buf) { |
468 | 512 | buffer_data_length_set(f_buf, eap_tls_header.tls_length); |
469 | 513 | memcpy(buffer_data_pointer(f_buf), eap_tls_header.data_ptr, eap_tls_header.tls_frame_length); |
@@ -532,4 +576,20 @@ buffer_t *eap_up(buffer_t *buf, sec_suite_t *suite) |
532 | 576 | return buffer_free(buf); |
533 | 577 | } |
534 | 578 | } |
| 579 | +#else |
| 580 | +void pana_eap_fragmetation_start_filter(bool state) |
| 581 | +{ |
| 582 | + (void) state; |
| 583 | +} |
| 584 | + |
| 585 | +void pana_eap_fragmetation_force_timeout(bool state) |
| 586 | +{ |
| 587 | + (void) state; |
| 588 | +} |
| 589 | + |
| 590 | +void pana_eap_fragmetation_force_retry(bool state) |
| 591 | +{ |
| 592 | + (void) state; |
| 593 | +} |
| 594 | + |
535 | 595 | #endif |
0 commit comments