/* Out of order ACK. */
{ S, 0, 9999, 0, 4096, OUT },
{ S|A, 0, 9, 10000, 2048, IN },
{ A, 0, 10000, 10, 4096, OUT },
/* --- */
{ A, 0, 10, 10000, 2048, IN },
{ A, 1000, 10000, 10, 4096, OUT },
{ A, 1000, 11000, 10, 4096, OUT },
{ A, 0, 10, 12000, 2048, IN },
{ A, 0, 10, 13000, 2048, IN },
{ A, 1000, 12000, 10, 4096, OUT },
{ A, 0, 10, 11000, 1048, IN },
/* --- */
{ A, 1000, 14000, 10, 4096, OUT },
{ A, 0, 10, 13000, 2048, IN },
{ CLEAR },
/* Retransmission after out of order ACK and missing ACK. */
{ S, 0, 9999, 0, 1000, OUT },
{ S|A, 0, 9, 10000, 4000, IN },
{ A, 0, 10000, 10, 1000, OUT },
/* --- */
{ A, 1000, 10000, 10, 1000, OUT },
{ A, 0, 10, 11000, 4000, IN },
{ A, 1000, 11000, 10, 1000, OUT },
{ A, 1000, 12000, 10, 1000, OUT },
{ A, 1000, 13000, 10, 1000, OUT },
{ A, 1000, 14000, 10, 1000, OUT },
/* --- Assume the first was delayed; second was lost after us. */
{ A, 0, 10, 15000, 4000, IN },
{ A, 0, 10, 15000, 2000, IN },
/* --- */
{ A, 1000, 12000, 10, 1000, OUT },
{ CLEAR },
/* FIN exchange with retransmit. */
{ S, 0, 999, 0, 1000, OUT },
{ S|A, 0, 9, 1000, 2000, IN },
{ A, 0, 1000, 10, 1000, OUT },
/* --- */
{ F, 0, 10, 1000, 2000, IN },
{ F, 0, 1000, 10, 1000, OUT },
{ A, 0, 1000, 11, 1000, OUT },
/* --- */
{ F, 0, 1000, 11, 1000, OUT },
{ F, 0, 1000, 11, 1000, OUT },
{ A, 0, 11, 1001, 2000, OUT },
{ CLEAR },
/* Out of window. */
{ S, 0, 9, 0, 8760, OUT },
{ S|A, 0, 9999, 10, 1000, IN },
{ A, 0, 10, 10000, 8760, OUT },
/* --- */
{ A, 1460, 10000, 10, 1000, IN },
{ A, 1460, 11460, 10, 1000, IN },
{ A, 0, 10, 12920, 8760, OUT },
{ A, 1460, 12920, 10, 1000, IN },
{ A, 0, 10, 14380, 8760, OUT },
{ A, 1460, 17300, 10, 1000, IN },
{ A, 0, 10, 14380, 8760, OUT },
{ A, 1460, 18760, 10, 1000, IN },
{ A, 0, 10, 14380, 8760, OUT },
{ A, 1460, 20220, 10, 1000, IN },
{ A, 0, 10, 14380, 8760, OUT },
{ A, 1460, 21680, 10, 1000, IN },
{ A, 0, 10, 14380, 8760, OUT },
/* --- */
{ A, 1460, 14380, 10, 1000, IN },
{ A, 1460, 23140, 10, 1000, IN|ERR },
{ CLEAR },
for (unsigned i = 0; i < __arraycount(packet_sequence); i++) {
if (process_packet(i, &nst, &snew)) {
continue;
}
if (verbose) {
printf("Failed on packet %d, state dump:\n", i);
npf_state_dump(&nst);
}
ok = false;
}
return ok;
}