Hello!

Yes the case when the trie is just a single leaf got wrong with the iterator 
and your patchs
cures it. I think we have a similar problem with /proc/net/fib_trie

Cheers
                                                        --ro

Signed-off-by: Robert Olsson <[EMAIL PROTECTED]>



Eric W. Biederman writes:
 > 
 > In a kernel with trie routing enabled I had a simple routing setup
 > with only a single route to the outside world and no default
 > route. "ip route table list main" showed my the route just fine but
 > /proc/net/route was an empty file.  What was going on?
 > 
 > Thinking it was a bug in something I did and I looked deeper.  Eventually
 > I setup a second route and everything looked correct, huh?  Finally I
 > realized that the it was just the iterator pair in fib_trie_get_first,
 > fib_trie_get_next just could not handle a routing table with a single entry.
 > 
 > So to save myself and others further confusion, here is a simple fix for
 > the fib proc iterator so it works even when there is only a single route
 > in a routing table.
 > 
 > Signed-off-by: Eric W. Biederman <[EMAIL PROTECTED]>
 > ---
 >  net/ipv4/fib_trie.c |   21 ++++++++++++++++-----
 >  1 files changed, 16 insertions(+), 5 deletions(-)
 > 
 > diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
 > index cfb249c..13307c0 100644
 > --- a/net/ipv4/fib_trie.c
 > +++ b/net/ipv4/fib_trie.c
 > @@ -1989,6 +1989,10 @@ static struct node *fib_trie_get_next(struct 
 > fib_trie_iter *iter)
 >      unsigned cindex = iter->index;
 >      struct tnode *p;
 >  
 > +    /* A single entry routing table */
 > +    if (!tn)
 > +            return NULL;
 > +
 >      pr_debug("get_next iter={node=%p index=%d depth=%d}\n",
 >               iter->tnode, iter->index, iter->depth);
 >  rescan:
 > @@ -2037,11 +2041,18 @@ static struct node *fib_trie_get_first(struct 
 > fib_trie_iter *iter,
 >      if(!iter)
 >              return NULL;
 >  
 > -    if (n && IS_TNODE(n)) {
 > -            iter->tnode = (struct tnode *) n;
 > -            iter->trie = t;
 > -            iter->index = 0;
 > -            iter->depth = 1;
 > +    if (n) {
 > +            if (IS_TNODE(n)) {
 > +                    iter->tnode = (struct tnode *) n;
 > +                    iter->trie = t;
 > +                    iter->index = 0;
 > +                    iter->depth = 1;
 > +            } else {
 > +                    iter->tnode = NULL;
 > +                    iter->trie  = t;
 > +                    iter->index = 0;
 > +                    iter->depth = 0;
 > +            }
 >              return n;
 >      }
 >      return NULL;
 > -- 
 > 1.4.4.1.g278f
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to