Re: traceroute TOS

2011-04-06 Thread Maxim Bourmistrov
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

2011-04-06 Thread Claudio Jeker
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

2011-04-06 Thread Stuart Henderson
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

2011-04-05 Thread Stuart Henderson
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

2011-04-05 Thread Stuart Henderson
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: