/* How many bytes should we tack onto the script packet to account for * the actual TCP options we did see? */ static int tcp_options_allowance(const struct packet *actual_packet, const struct packet *script_packet) { if (script_packet->flags & FLAG_OPTIONS_NOCHECK) return packet_tcp_options_len(actual_packet); else return 0; }
/* Print a string representation of the TCP packet: * direction opt_ip_info flags seq ack window tcp_options */ static int tcp_packet_to_string(FILE *s, struct packet *packet, enum dump_format_t format, char **error) { int result = STATUS_OK; /* return value */ if ((format == DUMP_FULL) || (format == DUMP_VERBOSE)) { endpoints_to_string(s, packet); fputc(' ', s); } /* We print flags in the same order as tcpdump 4.1.1. */ if (packet->tcp->fin) fputc('F', s); if (packet->tcp->syn) fputc('S', s); if (packet->tcp->rst) fputc('R', s); if (packet->tcp->psh) fputc('P', s); if (packet->tcp->ack) fputc('.', s); if (packet->tcp->urg) fputc('U', s); if (packet->tcp->ece) fputc('E', s); /* ECN *E*cho sent (ECN) */ if (packet->tcp->cwr) fputc('W', s); /* Congestion *W*indow reduced (ECN) */ fprintf(s, " %u:%u(%u) ", ntohl(packet->tcp->seq), ntohl(packet->tcp->seq) + packet_payload_len(packet), packet_payload_len(packet)); if (packet->tcp->ack) fprintf(s, "ack %u ", ntohl(packet->tcp->ack_seq)); if (!(packet->flags & FLAG_WIN_NOCHECK)) fprintf(s, "win %u ", ntohs(packet->tcp->window)); if (packet_tcp_options_len(packet) > 0) { char *tcp_options = NULL; if (tcp_options_to_string(packet, &tcp_options, error)) result = STATUS_ERR; else fprintf(s, "<%s>", tcp_options); } if (format == DUMP_VERBOSE) packet_buffer_to_string(s, packet); return result; }