From c93ffa0a5c9150fce168ecb203ce4057572e7c83 Mon Sep 17 00:00:00 2001 From: Samuel Jero Date: Wed, 25 May 2011 00:48:35 -0400 Subject: [PATCH] Option to only show Ack Vectors/SACKS with loss Binding is double -s command line option. Useful to see loss events --- ChangeLog | 8 ++++++++ README | 2 +- dccp2tcp.c | 54 ++++++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4341700..8513782 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +05/25/2011: + Release 1.4: + Improvements: + 1)Add double -s option to only show Ack Vectors/SACKS with loss events + + 05/15/2011: Release 1.3 Improvements: @@ -6,12 +12,14 @@ +Ethernet +Linux Cooked Capture (SLL) +IPv4 + 02/01/2011: Release 1.2 Bug Fixes: 1)Sequence number adjustments so that Tcptrace RTT graphing/statistics now work + 01/19/2011: Release 1.1 Bug Fixes: diff --git a/README b/README index 2001e5c..4364d41 100644 --- a/README +++ b/README @@ -20,7 +20,7 @@ dccp2tcp dccp_file tcp_file [-d] [-y] [-g] [-s] -d is debug -y shifts the window line in tcptrace (yellow) to the highest received acknowledgment. Normally this line is just a constant amount more than the ack number(i.e. useless). -g shifts the ack line in tcptrace (green) to the highest received acknowledgment. Normally this line is the standard TCP ack number, which, for DCCP, translates to the highest contiguous acknowledgement in the ack vector. - -s converts the DCCP ack vector to TCP SACKS. + -s converts the DCCP ack vector to TCP SACKS. Specify -s twice to only see those Ack vectors with a loss interval in them. This is convenient way to see loss events. For typical usage, you probably just want -s. diff --git a/dccp2tcp.c b/dccp2tcp.c index 94bc7dd..0ed79a5 100644 --- a/dccp2tcp.c +++ b/dccp2tcp.c @@ -80,7 +80,7 @@ int main(int argc, char *argv[]) green=1; } if(argv[i][1]=='s' && strlen(argv[i])==2){ /*sack option*/ - sack=1; + sack++; } } } @@ -293,7 +293,9 @@ int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_c tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s2, ntohl(dccphack->dccph_ack_nr_low))); } if(sack){ - ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + if(sack!=2 || interp_ack_vect((u_char*)dccph)){ + ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + } } }else if(s1 && s2 && dccph->dccph_sport==s2->addr){ if(green){ @@ -306,7 +308,10 @@ int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_c tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s1, ntohl(dccphack->dccph_ack_nr_low))); } if(sack){ - ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + if(sack!=2 || interp_ack_vect((u_char*)dccph)){ + ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + + } } } @@ -339,7 +344,9 @@ int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_c } } if(sack){ - ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + if(sack!=2 || interp_ack_vect((u_char*)dccph)){ + ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + } } }else if(s1 && s2 && dccph->dccph_sport==s2->addr){ if(green){ @@ -355,7 +362,9 @@ int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_c } } if(sack){ - ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + if(sack!=2 || interp_ack_vect((u_char*)dccph)){ + ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + } } } @@ -386,7 +395,9 @@ int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_c tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s2, ntohl(dccphack->dccph_ack_nr_low))); } if(sack){ - ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + if(sack!=2 || interp_ack_vect((u_char*)dccph)){ + ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + } } }else if(s1 && s2 && dccph->dccph_sport==s2->addr){ if(green){ @@ -399,7 +410,9 @@ int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_c tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s1, ntohl(dccphack->dccph_ack_nr_low))); } if(sack){ - ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + if(sack!=2 || interp_ack_vect((u_char*)dccph)){ + ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + } } } @@ -425,7 +438,9 @@ int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_c tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s2, ntohl(dccphack->dccph_ack_nr_low))); } if(sack){ - ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + if(sack!=2 || interp_ack_vect((u_char*)dccph)){ + ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + } } }else if(s1 && s2 && dccph->dccph_sport==s2->addr){ if(green){ @@ -438,7 +453,9 @@ int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_c tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s1, ntohl(dccphack->dccph_ack_nr_low))); } if(sack){ - ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + if(sack!=2 || interp_ack_vect((u_char*)dccph)){ + ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + } } } @@ -466,7 +483,9 @@ int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_c tcph->window=htons(0); } if(sack){ - ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + if(sack!=2 || interp_ack_vect((u_char*)dccph)){ + ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + } } }else if(s1 && s2 && dccph->dccph_sport==s2->addr){ if(green){ @@ -481,7 +500,9 @@ int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_c tcph->window=htons(0); } if(sack){ - ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + if(sack!=2 || interp_ack_vect((u_char*)dccph)){ + ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + } } } @@ -509,7 +530,9 @@ int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_c tcph->window=htons(0); } if(sack){ - ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low)); + if(sack!=2 || interp_ack_vect((u_char*)dccph)){ + ack_vect2sack(s2, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low)); + } } }else if(s1 && s2 && dccph->dccph_sport==s2->addr){ if(green){ @@ -524,7 +547,9 @@ int convert_packet(struct pcap_pkthdr *h, u_char **nptr, int *nlength, const u_c tcph->window=htons(0); } if(sack){ - ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + if(sack!=2 || interp_ack_vect((u_char*)dccph)){ + ack_vect2sack(s1, tcph, tcpopt, (u_char*)dccph, ntohl(dccphack->dccph_ack_nr_low) ); + } } } @@ -547,7 +572,8 @@ return 1; } -/*Parse Ack Vector Options*/ +/*Parse Ack Vector Options + * Returns the Number of packets since last recorded loss*/ unsigned int interp_ack_vect(u_char* hdr) { int hdrlen=((struct dccp_hdr*)hdr)->dccph_doff*4; -- 2.39.2