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 -0000 1.44
> +++ traceroute.8 5 Apr 2011 15:50:38 -0000
> @@ -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 -0000 1.74
> +++ traceroute.c 5 Apr 2011 15:50:38 -0000
> @@ -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_hl<<2));
> + 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: