ho dato solo una occhiata sommaria al tuo codice...
Il campo doff (data offset) prelevato dall'header tcp è composto da 4 bit e contiene la lunghezza dell'header (option comprese) espressa in unità di 32-bit (4 byte). Questo significa che l'header (option comprese) è lungo (4*doff) bytes.
Detto questo mi sembra che il calcolo dell'inizio dei dati sia totalmente sbagliato nel tuo codice.
Tu scrivi:
codice:
unsigned int startdata = m+sizeof(struct iphdr)+sizeof(struct tcphdr)+tcp->doff;
che non ha senso perchè consideri due volte l'header tcp, calcolandolo comunque in modo errato.
Premetto che non ho verificato praticamente ma il codice esatto dovrebbe essere:
codice:
unsigned int startdata = m+sizeof(struct iphdr)+4*tcp->doff;
infatti sommi la lunghezza dell'header ip (fisso) + lunghezza header tcp (variabile a causa delle option)
L'unica parte variabile dell'header sono le option. Se queste esistono sono posizionate subito prima dei dati.
Se non ci fossero option l'header sarebbe lungo esattamente 20 byte.
Se (4*tcp->doff)>20 (ovvero se (tcp->doff)>5 ) sei sicuro che ci sono delle option e che queste cominciano da
codice:
unsigned int startoptions = m+sizeof(struct iphdr)+20;
Il campo option non è definito nel tuo header per cui devi accedervi in modo manuale...
Da startoptions fino a (startdata-1)
Ripeto, non ho verificato se funziona esattamente... ma dovrebbe essere così