Re: traceroute TOS
Thanks, useful(at least for me). On Apr 5, 2011, at 5:57 PM, Stuart Henderson wrote: On 2011/04/05 16:51, Stuart Henderson wrote: if -t is used, display a notice when the TOS changes en-route. ok? oh, it's better with a (contrived) example: $ traceroute -nt 7 naiad traceroute to naiad.spacehopper.org (195.95.187.35), 64 hops max, 40 byte packets 1 85.158.44.145 0.441 ms (TOS=33!) 0.328 ms 0.396 ms 2 193.178.223.245 14.637 ms 15.213 ms 15.466 ms 3 194.39.143.145 16.600 ms 15.468 ms 16.206 ms 4 194.39.143.205 16.483 ms 16.210 ms 15.843 ms 5 193.203.5.182 17.475 ms 16.708 ms 16.986 ms 6 195.95.187.248 17.211 ms (TOS=4!) 16.460 ms 16.468 ms 7 195.95.187.35 27.99 ms 16.207 ms 17.467 ms Index: traceroute.8 === RCS file: /cvs/src/usr.sbin/traceroute/traceroute.8,v retrieving revision 1.44 diff -u -p -r1.44 traceroute.8 --- traceroute.8 8 Jul 2010 20:23:03 - 1.44 +++ traceroute.8 5 Apr 2011 15:50:38 - @@ -177,6 +177,8 @@ in probe packets to the following value The value must be a decimal integer in the range 0 to 255. This option can be used to see if different types-of-service result in different paths. +If this option is used, changes to the type-of-service in the +returned packets are displayed. (If you are not running a .Bx 4.3 tahoe or later system, this may be academic since the normal network @@ -384,6 +386,8 @@ ever occur and the associated gateway is (destination network or host unreachable for TOS), .Sy !code (other ICMP unreachable code). +.Sy TOS=xxx +(TOS bit in returned packet differs from last hop). If almost all the probes result in some kind of unreachable, .Nm will give up and exit. Index: traceroute.c === RCS file: /cvs/src/usr.sbin/traceroute/traceroute.c,v retrieving revision 1.74 diff -u -p -r1.74 traceroute.c --- traceroute.c 22 Mar 2011 10:16:23 - 1.74 +++ traceroute.c 5 Apr 2011 15:50:38 - @@ -293,11 +293,13 @@ main(int argc, char *argv[]) int mib[4] = { CTL_NET, PF_INET, IPPROTO_IP, IPCTL_DEFTTL }; int ttl_flag = 0, incflag = 1, protoset = 0, sump = 0; int ch, i, lsrr = 0, on = 1, probe, seq = 0, tos = 0; +int last_tos, tos_returned; size_t size = sizeof(max_ttl); struct sockaddr_in from, to; struct hostent *hp; u_int32_t tmprnd; -struct ip *ip; +struct ip *ip, *inner_ip; +struct icmp *icp; u_int8_t ttl; char *ep; const char *errstr; @@ -427,7 +429,7 @@ main(int argc, char *argv[]) l = strtol(optarg, ep, 10); if (errno || !*optarg || *ep || l 0 || l 255) errx(1, tos must be 0 to 255.); -tos = (int)l; +last_tos = tos = (int)l; break; case 'v': verbose++; @@ -636,9 +638,21 @@ main(int argc, char *argv[]) ++got_there; break; } + +icp = (struct icmp *) (((u_char *)ip)+(ip-ip_hl2)); +inner_ip = (struct ip *) (((u_char *)icp)+8); + +tos_returned = inner_ip-ip_tos; + +if (tos_returned != last_tos) +printf ( (TOS=%d!), tos_returned); + +last_tos = tos_returned; + /* time exceeded in transit */ if (i == -1) break; + code = i - 1; switch (code) { case ICMP_UNREACH_PORT:
Re: traceroute TOS
On Tue, Apr 05, 2011 at 04:57:30PM +0100, Stuart Henderson wrote: On 2011/04/05 16:51, Stuart Henderson wrote: if -t is used, display a notice when the TOS changes en-route. ok? oh, it's better with a (contrived) example: $ traceroute -nt 7 naiad traceroute to naiad.spacehopper.org (195.95.187.35), 64 hops max, 40 byte packets 1 85.158.44.145 0.441 ms (TOS=33!) 0.328 ms 0.396 ms 2 193.178.223.245 14.637 ms 15.213 ms 15.466 ms 3 194.39.143.145 16.600 ms 15.468 ms 16.206 ms 4 194.39.143.205 16.483 ms 16.210 ms 15.843 ms 5 193.203.5.182 17.475 ms 16.708 ms 16.986 ms 6 195.95.187.248 17.211 ms (TOS=4!) 16.460 ms 16.468 ms 7 195.95.187.35 27.99 ms 16.207 ms 17.467 ms Diff looks good. What I don't like to specify and display the TOS as decimal since I have no idea what decimal numbers are which TOS/DiffServ Code points. No that is porbably a different diff, so OK claudio@ for this one. Index: traceroute.8 === RCS file: /cvs/src/usr.sbin/traceroute/traceroute.8,v retrieving revision 1.44 diff -u -p -r1.44 traceroute.8 --- traceroute.88 Jul 2010 20:23:03 - 1.44 +++ traceroute.85 Apr 2011 15:50:38 - @@ -177,6 +177,8 @@ in probe packets to the following value The value must be a decimal integer in the range 0 to 255. This option can be used to see if different types-of-service result in different paths. +If this option is used, changes to the type-of-service in the +returned packets are displayed. (If you are not running a .Bx 4.3 tahoe or later system, this may be academic since the normal network @@ -384,6 +386,8 @@ ever occur and the associated gateway is (destination network or host unreachable for TOS), .Sy !code (other ICMP unreachable code). +.Sy TOS=xxx +(TOS bit in returned packet differs from last hop). If almost all the probes result in some kind of unreachable, .Nm will give up and exit. Index: traceroute.c === RCS file: /cvs/src/usr.sbin/traceroute/traceroute.c,v retrieving revision 1.74 diff -u -p -r1.74 traceroute.c --- traceroute.c22 Mar 2011 10:16:23 - 1.74 +++ traceroute.c5 Apr 2011 15:50:38 - @@ -293,11 +293,13 @@ main(int argc, char *argv[]) int mib[4] = { CTL_NET, PF_INET, IPPROTO_IP, IPCTL_DEFTTL }; int ttl_flag = 0, incflag = 1, protoset = 0, sump = 0; int ch, i, lsrr = 0, on = 1, probe, seq = 0, tos = 0; + int last_tos, tos_returned; size_t size = sizeof(max_ttl); struct sockaddr_in from, to; struct hostent *hp; u_int32_t tmprnd; - struct ip *ip; + struct ip *ip, *inner_ip; + struct icmp *icp; u_int8_t ttl; char *ep; const char *errstr; @@ -427,7 +429,7 @@ main(int argc, char *argv[]) l = strtol(optarg, ep, 10); if (errno || !*optarg || *ep || l 0 || l 255) errx(1, tos must be 0 to 255.); - tos = (int)l; + last_tos = tos = (int)l; break; case 'v': verbose++; @@ -636,9 +638,21 @@ main(int argc, char *argv[]) ++got_there; break; } + + icp = (struct icmp *) (((u_char *)ip)+(ip-ip_hl2)); + inner_ip = (struct ip *) (((u_char *)icp)+8); + + tos_returned = inner_ip-ip_tos; + + if (tos_returned != last_tos) + printf ( (TOS=%d!), tos_returned); + + last_tos = tos_returned; + /* time exceeded in transit */ if (i == -1) break; + code = i - 1; switch (code) { case ICMP_UNREACH_PORT: -- :wq Claudio
Re: traceroute TOS
On 2011/04/06 13:35, Claudio Jeker wrote: On Tue, Apr 05, 2011 at 04:57:30PM +0100, Stuart Henderson wrote: On 2011/04/05 16:51, Stuart Henderson wrote: if -t is used, display a notice when the TOS changes en-route. ok? oh, it's better with a (contrived) example: $ traceroute -nt 7 naiad traceroute to naiad.spacehopper.org (195.95.187.35), 64 hops max, 40 byte packets 1 85.158.44.145 0.441 ms (TOS=33!) 0.328 ms 0.396 ms 2 193.178.223.245 14.637 ms 15.213 ms 15.466 ms 3 194.39.143.145 16.600 ms 15.468 ms 16.206 ms 4 194.39.143.205 16.483 ms 16.210 ms 15.843 ms 5 193.203.5.182 17.475 ms 16.708 ms 16.986 ms 6 195.95.187.248 17.211 ms (TOS=4!) 16.460 ms 16.468 ms 7 195.95.187.35 27.99 ms 16.207 ms 17.467 ms Diff looks good. What I don't like to specify and display the TOS as decimal since I have no idea what decimal numbers are which TOS/DiffServ Code points. No that is porbably a different diff, so OK claudio@ for this one. I agree, I think we would also want to be able to use these in -t (-t lowdelay, -t af11, etc.)
traceroute TOS
if -t is used, display a notice when the TOS changes en-route. ok? Index: traceroute.8 === RCS file: /cvs/src/usr.sbin/traceroute/traceroute.8,v retrieving revision 1.44 diff -u -p -r1.44 traceroute.8 --- traceroute.88 Jul 2010 20:23:03 - 1.44 +++ traceroute.85 Apr 2011 15:50:38 - @@ -177,6 +177,8 @@ in probe packets to the following value The value must be a decimal integer in the range 0 to 255. This option can be used to see if different types-of-service result in different paths. +If this option is used, changes to the type-of-service in the +returned packets are displayed. (If you are not running a .Bx 4.3 tahoe or later system, this may be academic since the normal network @@ -384,6 +386,8 @@ ever occur and the associated gateway is (destination network or host unreachable for TOS), .Sy !code (other ICMP unreachable code). +.Sy TOS=xxx +(TOS bit in returned packet differs from last hop). If almost all the probes result in some kind of unreachable, .Nm will give up and exit. Index: traceroute.c === RCS file: /cvs/src/usr.sbin/traceroute/traceroute.c,v retrieving revision 1.74 diff -u -p -r1.74 traceroute.c --- traceroute.c22 Mar 2011 10:16:23 - 1.74 +++ traceroute.c5 Apr 2011 15:50:38 - @@ -293,11 +293,13 @@ main(int argc, char *argv[]) int mib[4] = { CTL_NET, PF_INET, IPPROTO_IP, IPCTL_DEFTTL }; int ttl_flag = 0, incflag = 1, protoset = 0, sump = 0; int ch, i, lsrr = 0, on = 1, probe, seq = 0, tos = 0; + int last_tos, tos_returned; size_t size = sizeof(max_ttl); struct sockaddr_in from, to; struct hostent *hp; u_int32_t tmprnd; - struct ip *ip; + struct ip *ip, *inner_ip; + struct icmp *icp; u_int8_t ttl; char *ep; const char *errstr; @@ -427,7 +429,7 @@ main(int argc, char *argv[]) l = strtol(optarg, ep, 10); if (errno || !*optarg || *ep || l 0 || l 255) errx(1, tos must be 0 to 255.); - tos = (int)l; + last_tos = tos = (int)l; break; case 'v': verbose++; @@ -636,9 +638,21 @@ main(int argc, char *argv[]) ++got_there; break; } + + icp = (struct icmp *) (((u_char *)ip)+(ip-ip_hl2)); + inner_ip = (struct ip *) (((u_char *)icp)+8); + + tos_returned = inner_ip-ip_tos; + + if (tos_returned != last_tos) + printf ( (TOS=%d!), tos_returned); + + last_tos = tos_returned; + /* time exceeded in transit */ if (i == -1) break; + code = i - 1; switch (code) { case ICMP_UNREACH_PORT:
Re: traceroute TOS
On 2011/04/05 16:51, Stuart Henderson wrote: if -t is used, display a notice when the TOS changes en-route. ok? oh, it's better with a (contrived) example: $ traceroute -nt 7 naiad traceroute to naiad.spacehopper.org (195.95.187.35), 64 hops max, 40 byte packets 1 85.158.44.145 0.441 ms (TOS=33!) 0.328 ms 0.396 ms 2 193.178.223.245 14.637 ms 15.213 ms 15.466 ms 3 194.39.143.145 16.600 ms 15.468 ms 16.206 ms 4 194.39.143.205 16.483 ms 16.210 ms 15.843 ms 5 193.203.5.182 17.475 ms 16.708 ms 16.986 ms 6 195.95.187.248 17.211 ms (TOS=4!) 16.460 ms 16.468 ms 7 195.95.187.35 27.99 ms 16.207 ms 17.467 ms Index: traceroute.8 === RCS file: /cvs/src/usr.sbin/traceroute/traceroute.8,v retrieving revision 1.44 diff -u -p -r1.44 traceroute.8 --- traceroute.8 8 Jul 2010 20:23:03 - 1.44 +++ traceroute.8 5 Apr 2011 15:50:38 - @@ -177,6 +177,8 @@ in probe packets to the following value The value must be a decimal integer in the range 0 to 255. This option can be used to see if different types-of-service result in different paths. +If this option is used, changes to the type-of-service in the +returned packets are displayed. (If you are not running a .Bx 4.3 tahoe or later system, this may be academic since the normal network @@ -384,6 +386,8 @@ ever occur and the associated gateway is (destination network or host unreachable for TOS), .Sy !code (other ICMP unreachable code). +.Sy TOS=xxx +(TOS bit in returned packet differs from last hop). If almost all the probes result in some kind of unreachable, .Nm will give up and exit. Index: traceroute.c === RCS file: /cvs/src/usr.sbin/traceroute/traceroute.c,v retrieving revision 1.74 diff -u -p -r1.74 traceroute.c --- traceroute.c 22 Mar 2011 10:16:23 - 1.74 +++ traceroute.c 5 Apr 2011 15:50:38 - @@ -293,11 +293,13 @@ main(int argc, char *argv[]) int mib[4] = { CTL_NET, PF_INET, IPPROTO_IP, IPCTL_DEFTTL }; int ttl_flag = 0, incflag = 1, protoset = 0, sump = 0; int ch, i, lsrr = 0, on = 1, probe, seq = 0, tos = 0; + int last_tos, tos_returned; size_t size = sizeof(max_ttl); struct sockaddr_in from, to; struct hostent *hp; u_int32_t tmprnd; - struct ip *ip; + struct ip *ip, *inner_ip; + struct icmp *icp; u_int8_t ttl; char *ep; const char *errstr; @@ -427,7 +429,7 @@ main(int argc, char *argv[]) l = strtol(optarg, ep, 10); if (errno || !*optarg || *ep || l 0 || l 255) errx(1, tos must be 0 to 255.); - tos = (int)l; + last_tos = tos = (int)l; break; case 'v': verbose++; @@ -636,9 +638,21 @@ main(int argc, char *argv[]) ++got_there; break; } + + icp = (struct icmp *) (((u_char *)ip)+(ip-ip_hl2)); + inner_ip = (struct ip *) (((u_char *)icp)+8); + + tos_returned = inner_ip-ip_tos; + + if (tos_returned != last_tos) + printf ( (TOS=%d!), tos_returned); + + last_tos = tos_returned; + /* time exceeded in transit */ if (i == -1) break; + code = i - 1; switch (code) { case ICMP_UNREACH_PORT: