On 08/19/2010 04:23 PM, Andrej van der Zee wrote:
> Hi,
>
> I am trying to get the TCP sequence and ack number of TCP packets. Somehow I
> get different values than "tcpdump -vv" does. The numbers are way too big
> all the time. Source and destination ports are just fine. Below the relevant
> code. I studied the tcpdump source code but can't find why. Please help, I
> am stuck!
>
> Thank you,
> Andrej
>
>
> #define ETHER_HDRLEN    14
>
> typedef u_int32_t tcp_seq;
>
> struct tcphdr {
>   u_int16_t       th_sport;               /* source port */
>   u_int16_t       th_dport;               /* destination port */
>   tcp_seq         th_seq;                 /* sequence number */
>   tcp_seq         th_ack;                 /* acknowledgement number */
>   u_int8_t        th_offx2;               /* data offset, rsvd */
>   u_int8_t        th_flags;
>   u_int16_t       th_win;                 /* window */
>   u_int16_t       th_sum;                 /* checksum */
>   u_int16_t       th_urp;                 /* urgent pointer */
> };
>
> static void handle_packet(unsigned char * ifile, const struct pcap_pkthdr *
> h, const u_char * sp)
> {
>   const struct ip * ip = (struct ip *) (sp + ETHER_HDRLEN);
>   const struct tcphdr * tcp_hdr = (const struct tcphdr *)(sp + ETHER_HDRLEN
> + sizeof(struct iphdr));
>
>   tcp_seq seq = htonl(tcp_hdr->th_seq);
>   tcp_seq ack = htonl(tcp_hdr->th_ack);
>
>   fprintf(stdout,"seq %u ack %u", seq, ack);
> }
>
>   

Andrej,

I think you are performing your byte ordering conversion wrong. Seq and
Ack values are transmitted in network byte order so you need to perform
a "network to host long" conversion, and for that, you need to user
ntohl(), not htonl().

Regards,

Luis.

-
This is the tcpdump-workers list.
Visit https://cod.sandelman.ca/ to unsubscribe.

Reply via email to