Binding is double -s command line option.
Useful to see loss events
+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:
05/15/2011:
Release 1.3
Improvements:
+Ethernet
+Linux Cooked Capture (SLL)
+IPv4
+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
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:
01/19/2011:
Release 1.1
Bug Fixes:
-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.
-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.
For typical usage, you probably just want -s.
green=1;
}
if(argv[i][1]=='s' && strlen(argv[i])==2){ /*sack option*/
green=1;
}
if(argv[i][1]=='s' && strlen(argv[i])==2){ /*sack option*/
tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s2, ntohl(dccphack->dccph_ack_nr_low)));
}
if(sack){
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){
}
}else if(s1 && s2 && dccph->dccph_sport==s2->addr){
if(green){
tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s1, ntohl(dccphack->dccph_ack_nr_low)));
}
if(sack){
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) );
+
+ }
- 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){
}
}else if(s1 && s2 && dccph->dccph_sport==s2->addr){
if(green){
- 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) );
+ }
tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s2, ntohl(dccphack->dccph_ack_nr_low)));
}
if(sack){
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){
}
}else if(s1 && s2 && dccph->dccph_sport==s2->addr){
if(green){
tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s1, ntohl(dccphack->dccph_ack_nr_low)));
}
if(sack){
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) );
+ }
tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s2, ntohl(dccphack->dccph_ack_nr_low)));
}
if(sack){
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){
}
}else if(s1 && s2 && dccph->dccph_sport==s2->addr){
if(green){
tcph->window=htons(-interp_ack_vect((u_char*)dccph)*acked_packet_size(s1, ntohl(dccphack->dccph_ack_nr_low)));
}
if(sack){
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) );
+ }
tcph->window=htons(0);
}
if(sack){
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){
}
}else if(s1 && s2 && dccph->dccph_sport==s2->addr){
if(green){
tcph->window=htons(0);
}
if(sack){
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) );
+ }
tcph->window=htons(0);
}
if(sack){
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){
}
}else if(s1 && s2 && dccph->dccph_sport==s2->addr){
if(green){
tcph->window=htons(0);
}
if(sack){
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) );
+ }
-/*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;
unsigned int interp_ack_vect(u_char* hdr)
{
int hdrlen=((struct dccp_hdr*)hdr)->dccph_doff*4;