Giusto, eccolo qui 
codice:
int tcp_handle(ipq_packet_msg_t *m) {
struct iphdr *ip = (struct iphdr *) m->payload;
u_int32_t src_addr = ip->saddr;
u_int32_t dst_addr = ip->daddr;
fprintf(stderr, "TCPTCP\n");
fprintf(stderr, "IP sorgente: %s\n", inet_ntoa(src_addr));
fprintf(stderr, "IP destinazione: %s\n", inet_ntoa(dst_addr));
/* Cast the TCP Header from the raw packet */
struct tcphdr *tcp = (struct tcphdr *)(m->payload + (ip->ihl << 2));
fprintf(stderr,"DATA OFFSET == %d\n",tcp->doff);
fprintf(stderr,"URG=%d ACK=%d PSH=%d RST=%d SYN=%d FIN=%d\n",
tcp->urg,tcp->ack,tcp->psh,tcp->rst,tcp->syn,tcp->fin);
unsigned int startdata = m+sizeof(struct iphdr)+sizeof(struct tcphdr)+tcp->doff;
/* Occorre usare la memcpy per ottenere i dati */
fprintf(stderr,"m->payload = %d\n",sizeof(ipq_packet_msg_t));
fprintf(stderr,"sizeof(ip) = %d\n",sizeof(struct iphdr));
fprintf(stderr,"sizeof(tcp) = %d\n",sizeof(struct tcphdr));
fprintf(stderr,"startdata = %u\n",startdata);
int dim_data = sizeof(ipq_packet_msg_t)-sizeof(struct tcphdr)-sizeof(struct iphdr);
fprintf(stderr,"The dimension of the data is %d\n",dim_data);
char* data = malloc(dim_data);
fprintf(stderr,"Data starts at %u\n",startdata);
fprintf(stderr,"data = %u\n",data);
memcpy(data,startdata,dim_data);
fprintf(stderr,"M=%u struct tcphdr=%d tcp->doff=%d\n",m,sizeof(struct tcphdr),tcp->doff);
fprintf(stderr,"Data = %s",data);
int src_port = ntohs (tcp->source);
int dest_port = ntohs (tcp->dest);
fprintf(stderr, "Source port = %d && Dest Port = %d", src_port, dest_port);
}
Ci sono diverse stampe, ma comunque c'e tutta la struttura dell'accesso all'header..