* iproute2: prints bogus hoplimit
@ 2009-02-24 10:27 Jan Engelhardt
2009-03-18 22:12 ` Stephen Hemminger
0 siblings, 1 reply; 8+ messages in thread
From: Jan Engelhardt @ 2009-02-24 10:27 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: netdev
$ ip -6 r
fc00::/7 dev rtl0 proto kernel metric 256 mtu 1500 advmss 1440
hoplimit 4294967295
Most likely, "hoplimit -1" would be the right number, though I am not
sure if simply changing %u by %d is a correct thing to do, since it
would affect all fields.
---
ip/iproute.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/ip/iproute.c b/ip/iproute.c
index 6a2ea05..91a8cc0 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -507,7 +507,7 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
if (i != RTAX_RTT && i != RTAX_RTTVAR &&
i != RTAX_RTO_MIN)
- fprintf(fp, " %u", *(unsigned*)RTA_DATA(mxrta[i]));
+ fprintf(fp, " %d", *(unsigned*)RTA_DATA(mxrta[i]));
else {
unsigned long long val = *(unsigned*)RTA_DATA(mxrta[i]);
--
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: iproute2: prints bogus hoplimit
2009-02-24 10:27 iproute2: prints bogus hoplimit Jan Engelhardt
@ 2009-03-18 22:12 ` Stephen Hemminger
2009-03-18 22:35 ` Jan Engelhardt
2009-03-19 0:51 ` David Miller
0 siblings, 2 replies; 8+ messages in thread
From: Stephen Hemminger @ 2009-03-18 22:12 UTC (permalink / raw)
To: Jan Engelhardt; +Cc: Stephen Hemminger, netdev
On Tue, 24 Feb 2009 11:27:52 +0100 (CET)
Jan Engelhardt <jengelh@medozas.de> wrote:
>
> $ ip -6 r
> fc00::/7 dev rtl0 proto kernel metric 256 mtu 1500 advmss 1440
> hoplimit 4294967295
>
> Most likely, "hoplimit -1" would be the right number, though I am not
> sure if simply changing %u by %d is a correct thing to do, since it
> would affect all fields.
>
> ---
> ip/iproute.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/ip/iproute.c b/ip/iproute.c
> index 6a2ea05..91a8cc0 100644
> --- a/ip/iproute.c
> +++ b/ip/iproute.c
> @@ -507,7 +507,7 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
>
> if (i != RTAX_RTT && i != RTAX_RTTVAR &&
> i != RTAX_RTO_MIN)
> - fprintf(fp, " %u", *(unsigned*)RTA_DATA(mxrta[i]));
> + fprintf(fp, " %d", *(unsigned*)RTA_DATA(mxrta[i]));
> else {
> unsigned long long val = *(unsigned*)RTA_DATA(mxrta[i]);
>
No fix the kernel please.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: iproute2: prints bogus hoplimit
2009-03-18 22:12 ` Stephen Hemminger
@ 2009-03-18 22:35 ` Jan Engelhardt
2009-03-18 23:29 ` Stephen Hemminger
2009-03-19 0:51 ` David Miller
1 sibling, 1 reply; 8+ messages in thread
From: Jan Engelhardt @ 2009-03-18 22:35 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: Stephen Hemminger, netdev
On Wednesday 2009-03-18 23:12, Stephen Hemminger wrote:
>On Tue, 24 Feb 2009 11:27:52 +0100 (CET)
>Jan Engelhardt <jengelh@medozas.de> wrote:
>
>> $ ip -6 r
>> fc00::/7 dev rtl0 proto kernel metric 256 mtu 1500 advmss 1440
>> hoplimit 4294967295
>>
>> Most likely, "hoplimit -1" would be the right number, though I am not
>> sure if simply changing %u by %d is a correct thing to do, since it
>> would affect all fields.
>>
>> ---
>> ip/iproute.c | 2 +-
>> 1 files changed, 1 insertions(+), 1 deletions(-)
>> if (i != RTAX_RTT && i != RTAX_RTTVAR &&
>> i != RTAX_RTO_MIN)
>> - fprintf(fp, " %u", *(unsigned*)RTA_DATA(mxrta[i]));
>> + fprintf(fp, " %d", *(unsigned*)RTA_DATA(mxrta[i]));
>
>No fix the kernel please.
>
And what should the kernel return?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: iproute2: prints bogus hoplimit
2009-03-18 22:35 ` Jan Engelhardt
@ 2009-03-18 23:29 ` Stephen Hemminger
2009-03-19 0:54 ` David Miller
0 siblings, 1 reply; 8+ messages in thread
From: Stephen Hemminger @ 2009-03-18 23:29 UTC (permalink / raw)
To: Jan Engelhardt; +Cc: Stephen Hemminger, netdev
On Wed, 18 Mar 2009 23:35:12 +0100 (CET)
Jan Engelhardt <jengelh@medozas.de> wrote:
>
> On Wednesday 2009-03-18 23:12, Stephen Hemminger wrote:
> >On Tue, 24 Feb 2009 11:27:52 +0100 (CET)
> >Jan Engelhardt <jengelh@medozas.de> wrote:
> >
> >> $ ip -6 r
> >> fc00::/7 dev rtl0 proto kernel metric 256 mtu 1500 advmss 1440
> >> hoplimit 4294967295
> >>
> >> Most likely, "hoplimit -1" would be the right number, though I am not
> >> sure if simply changing %u by %d is a correct thing to do, since it
> >> would affect all fields.
> >>
> >> ---
> >> ip/iproute.c | 2 +-
> >> 1 files changed, 1 insertions(+), 1 deletions(-)
> >> if (i != RTAX_RTT && i != RTAX_RTTVAR &&
> >> i != RTAX_RTO_MIN)
> >> - fprintf(fp, " %u", *(unsigned*)RTA_DATA(mxrta[i]));
> >> + fprintf(fp, " %d", *(unsigned*)RTA_DATA(mxrta[i]));
> >
> >No fix the kernel please.
> >
> And what should the kernel return?
The issue is that the hoplimit metric in ipv6 gets converted
to -1 (if it is zero on the incoming route request)..
int ip6_route_add(struct fib6_config *cfg)
{
...
if (dst_metric(&rt->u.dst, RTAX_HOPLIMIT) == 0)
rt->u.dst.metrics[RTAX_HOPLIMIT-1] = -1;
What should happen is when ip6 returns the route back
on the dump request (rt6_fill_node), it should translate the -1 back to 0
to keep it symmetrical and logical. The metrics are unsigned.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: iproute2: prints bogus hoplimit
2009-03-18 22:12 ` Stephen Hemminger
2009-03-18 22:35 ` Jan Engelhardt
@ 2009-03-19 0:51 ` David Miller
2009-03-19 1:01 ` Stephen Hemminger
1 sibling, 1 reply; 8+ messages in thread
From: David Miller @ 2009-03-19 0:51 UTC (permalink / raw)
To: shemminger; +Cc: jengelh, stephen.hemminger, netdev
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 18 Mar 2009 15:12:16 -0700
> On Tue, 24 Feb 2009 11:27:52 +0100 (CET)
> Jan Engelhardt <jengelh@medozas.de> wrote:
>
> >
> > $ ip -6 r
> > fc00::/7 dev rtl0 proto kernel metric 256 mtu 1500 advmss 1440
> > hoplimit 4294967295
> >
> > Most likely, "hoplimit -1" would be the right number, though I am not
> > sure if simply changing %u by %d is a correct thing to do, since it
> > would affect all fields.
...
> > diff --git a/ip/iproute.c b/ip/iproute.c
> > index 6a2ea05..91a8cc0 100644
> > --- a/ip/iproute.c
> > +++ b/ip/iproute.c
> > @@ -507,7 +507,7 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
> >
> > if (i != RTAX_RTT && i != RTAX_RTTVAR &&
> > i != RTAX_RTO_MIN)
> > - fprintf(fp, " %u", *(unsigned*)RTA_DATA(mxrta[i]));
> > + fprintf(fp, " %d", *(unsigned*)RTA_DATA(mxrta[i]));
> > else {
> > unsigned long long val = *(unsigned*)RTA_DATA(mxrta[i]);
> >
>
> No fix the kernel please.
I don't know what you mean by this Stephen. Why don't you take
a look at when and why the kernel uses '-1'?
"-1" is the hoplimit the kernel uses in the dst metric to mean
"use the default".
So this iproute patch is absolutely correct, or alternatively, iproute
can print "default" when it sees '-1'.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: iproute2: prints bogus hoplimit
2009-03-18 23:29 ` Stephen Hemminger
@ 2009-03-19 0:54 ` David Miller
0 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2009-03-19 0:54 UTC (permalink / raw)
To: shemminger; +Cc: jengelh, stephen.hemminger, netdev
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 18 Mar 2009 16:29:28 -0700
> The issue is that the hoplimit metric in ipv6 gets converted
> to -1 (if it is zero on the incoming route request)..
>
> int ip6_route_add(struct fib6_config *cfg)
> {
> ...
> if (dst_metric(&rt->u.dst, RTAX_HOPLIMIT) == 0)
> rt->u.dst.metrics[RTAX_HOPLIMIT-1] = -1;
>
>
> What should happen is when ip6 returns the route back
> on the dump request (rt6_fill_node), it should translate the -1 back to 0
> to keep it symmetrical and logical. The metrics are unsigned.
This is how "default" is represented.
If you look, ipv4 does the same thing.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: iproute2: prints bogus hoplimit
2009-03-19 0:51 ` David Miller
@ 2009-03-19 1:01 ` Stephen Hemminger
2009-03-19 1:06 ` David Miller
0 siblings, 1 reply; 8+ messages in thread
From: Stephen Hemminger @ 2009-03-19 1:01 UTC (permalink / raw)
To: David Miller; +Cc: jengelh, stephen.hemminger, netdev
On Wed, 18 Mar 2009 17:51:09 -0700 (PDT)
David Miller <davem@davemloft.net> wrote:
> From: Stephen Hemminger <shemminger@vyatta.com>
> Date: Wed, 18 Mar 2009 15:12:16 -0700
>
> > On Tue, 24 Feb 2009 11:27:52 +0100 (CET)
> > Jan Engelhardt <jengelh@medozas.de> wrote:
> >
> > >
> > > $ ip -6 r
> > > fc00::/7 dev rtl0 proto kernel metric 256 mtu 1500 advmss 1440
> > > hoplimit 4294967295
> > >
> > > Most likely, "hoplimit -1" would be the right number, though I am not
> > > sure if simply changing %u by %d is a correct thing to do, since it
> > > would affect all fields.
> ...
> > > diff --git a/ip/iproute.c b/ip/iproute.c
> > > index 6a2ea05..91a8cc0 100644
> > > --- a/ip/iproute.c
> > > +++ b/ip/iproute.c
> > > @@ -507,7 +507,7 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
> > >
> > > if (i != RTAX_RTT && i != RTAX_RTTVAR &&
> > > i != RTAX_RTO_MIN)
> > > - fprintf(fp, " %u", *(unsigned*)RTA_DATA(mxrta[i]));
> > > + fprintf(fp, " %d", *(unsigned*)RTA_DATA(mxrta[i]));
> > > else {
> > > unsigned long long val = *(unsigned*)RTA_DATA(mxrta[i]);
> > >
> >
> > No fix the kernel please.
>
> I don't know what you mean by this Stephen. Why don't you take
> a look at when and why the kernel uses '-1'?
>
> "-1" is the hoplimit the kernel uses in the dst metric to mean
> "use the default".
>
> So this iproute patch is absolutely correct, or alternatively, iproute
> can print "default" when it sees '-1'.
>
if I create route with:
ip route add ... hoplimit 0
then to do
ip route show
one would expect the hoplimit in the show to match the add ??
Whether the kernel fudges it in rt6_fill or utility has special case
code really doesn't matter.
The correct patch in utility would be something like:
diff --git a/ip/iproute.c b/ip/iproute.c
index 6a2ea05..bf0f31b 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -493,6 +493,8 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
mxlock = *(unsigned*)RTA_DATA(mxrta[RTAX_LOCK]);
for (i=2; i<= RTAX_MAX; i++) {
+ unsigned val;
+
if (mxrta[i] == NULL)
continue;
if (!hz)
@@ -505,21 +507,31 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
if (mxlock & (1<<i))
fprintf(fp, " lock");
- if (i != RTAX_RTT && i != RTAX_RTTVAR &&
- i != RTAX_RTO_MIN)
- fprintf(fp, " %u", *(unsigned*)RTA_DATA(mxrta[i]));
- else {
- unsigned long long val = *(unsigned*)RTA_DATA(mxrta[i]);
+ val = *(unsigned*)RTA_DATA(mxrta[i]);
+ switch (i) {
+ case RTAX_HOPLIMIT:
+ if ((long)val == -1)
+ val = 0;
+ /* fall through */
+ default:
+ fprintf(fp, " %u", val);
+ break;
+ case RTAX_RTT:
+ case RTAX_RTTVAR:
+ case RTAX_RTO_MIN:
val *= 1000;
if (i == RTAX_RTT)
val /= 8;
else if (i == RTAX_RTTVAR)
val /= 4;
+
if (val >= hz)
- fprintf(fp, " %llums", val/hz);
+ fprintf(fp, " %llums",
+ (unsigned long long) val / hz);
else
- fprintf(fp, " %.2fms", (float)val/hz);
+ fprintf(fp, " %.2fms",
+ (double)val / hz);
}
}
}
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: iproute2: prints bogus hoplimit
2009-03-19 1:01 ` Stephen Hemminger
@ 2009-03-19 1:06 ` David Miller
0 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2009-03-19 1:06 UTC (permalink / raw)
To: shemminger; +Cc: jengelh, stephen.hemminger, netdev
From: Stephen Hemminger <shemminger@vyatta.com>
Date: Wed, 18 Mar 2009 18:01:06 -0700
> if I create route with:
> ip route add ... hoplimit 0
> then to do
> ip route show
> one would expect the hoplimit in the show to match the add ??
> Whether the kernel fudges it in rt6_fill or utility has special case
> code really doesn't matter.
Even if the kernel should change, the tool should behave correctly
for all existing Linux kernels out there so you'd need the iproute2
hack anyways.
> The correct patch in utility would be something like:
Sure.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2009-03-19 1:06 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-24 10:27 iproute2: prints bogus hoplimit Jan Engelhardt
2009-03-18 22:12 ` Stephen Hemminger
2009-03-18 22:35 ` Jan Engelhardt
2009-03-18 23:29 ` Stephen Hemminger
2009-03-19 0:54 ` David Miller
2009-03-19 0:51 ` David Miller
2009-03-19 1:01 ` Stephen Hemminger
2009-03-19 1:06 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).