noto ora... se ci sono option è assolutamente sbagliato considerare sizeof(struct tcphdr) come dimensione dell'header tcp. Vedo che tu usi quel valore per calcolarti al dimensione dei dati:

codice:
int dim_data = sizeof(ipq_packet_msg_t)-sizeof(struct tcphdr)-sizeof(struct iphdr);
quella non è la dim dei dati ma dei dati+option (se presenti)
sizeof(struct tcphdr) è la parte fissa degli header, cioè 20 bytes.

Conclusione: per non includere le option devi sostituire quel valore con (4*tcp->doff)