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..