28 #include <tas_memif.h> 31 #define ALLOW_FUTURE_ACKS 1 48 uint32_t pkt_seq, uint16_t pkt_bytes, uint16_t *trim_start,
51 uint32_t pseq_a = pkt_seq, pseq_b = pkt_seq + pkt_bytes;
54 if (pseq_a <= pseq_b && sseq_a <= sseq_b) {
65 *trim_start = sseq_a - pseq_a;
66 *trim_end = (pseq_b > sseq_b ? pseq_b - sseq_b : 0);
67 }
else if (pseq_a <= pseq_b && sseq_a > sseq_b) {
71 if (pseq_a >= sseq_b && pseq_b < sseq_a)
75 if (pseq_a > sseq_a || pseq_a < sseq_b)
78 *trim_start = sseq_a - pseq_a;
80 }
else if (pseq_a > pseq_b && sseq_a <= sseq_b) {
91 *trim_start = sseq_a - pseq_a;
92 *trim_end = (pseq_b > sseq_b ? pseq_b - sseq_b : 0);
101 *trim_start = sseq_a - pseq_a;
102 *trim_end = (pseq_b > sseq_b ? pseq_b - sseq_b : 0);
123 uint32_t pkt_seq, uint16_t pkt_bytes, uint16_t *trim_start,
126 uint32_t pseq_a = pkt_seq, pseq_b = pkt_seq + pkt_bytes;
129 if (pseq_a <= pseq_b && sseq_a <= sseq_b) {
140 *trim_start = (pseq_a < sseq_a ? sseq_a - pseq_a : 0);
141 *trim_end = (pseq_b > sseq_b ? pseq_b - sseq_b : 0);
142 }
else if (pseq_a <= pseq_b && sseq_a > sseq_b) {
146 if (pseq_a > sseq_b && pseq_b < sseq_a)
149 *trim_start = (pseq_a > sseq_b && pseq_a < sseq_a ? sseq_a - pseq_a : 0);
150 *trim_end = (pseq_b >= sseq_b && pseq_b < sseq_a ? pseq_b - sseq_b : 0);
151 }
else if (pseq_a > pseq_b && sseq_a <= sseq_b) {
155 if (pseq_a > sseq_b && pseq_b < sseq_a)
158 *trim_start = (sseq_a <= pseq_b || sseq_a > pseq_a ? sseq_a - pseq_a : 0);
159 *trim_end = (pseq_b > sseq_b || sseq_a >= pseq_a ? pseq_b - sseq_b : 0);
163 *trim_start = (pseq_a < sseq_a ? sseq_a - pseq_a: 0);
164 *trim_end = (pseq_b > sseq_b ? pseq_b - sseq_b : 0);
185 #ifdef ALLOW_FUTURE_ACKS 190 if (fsack_a <= fsack_b) {
191 if (ack < fsack_a || ack > fsack_b)
194 *bump = ack - fsack_a;
197 if (fsack_a > ack && ack > fsack_b)
200 *bump = ack - fsack_a;
215 const uint32_t *pavail)
217 uint32_t buf_avail, fc_avail;
219 buf_avail = (pavail != NULL ? *pavail : fs->
tx_avail);
224 return MIN(buf_avail, fc_avail);
243 static inline int tcp_parse_options(
const struct pkt_tcp *p, uint16_t len,
246 uint8_t *opt = (uint8_t *) (p + 1);
247 uint16_t opts_len = TCPH_HDRLEN(&p->tcp) * 4 - 20;
249 uint8_t opt_kind, opt_len, opt_avail;
254 if (TCPH_HDRLEN(&p->tcp) < 5 || opts_len > (len -
sizeof(*p))) {
255 fprintf(stderr,
"hlen=%u opts_len=%u len=%u so=%zu\n", TCPH_HDRLEN(&p->tcp), opts_len, len,
sizeof(*p));
259 while (off < opts_len) {
261 opt_avail = opts_len - off;
262 if (opt_kind == TCP_OPT_END_OF_OPTIONS) {
265 }
else if (opt_kind == TCP_OPT_NO_OP) {
271 fprintf(stderr,
"parse_options: opt_avail=%u kind=%u off=%u\n", opt_avail, opt_kind, off);
275 opt_len = opt[off + 1];
276 if (opt_kind == TCP_OPT_TIMESTAMP) {
278 fprintf(stderr,
"parse_options: opt_len=%u so=%zu\n", opt_len,
sizeof(
struct tcp_timestamp_opt));
struct tcp_timestamp_opt * ts