lkml.org 
[lkml]   [2007]   [Feb]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 49/59] IPV4: Fix the fib trie iterator to work with a single entry routing tables
    -stable review patch.  If anyone has any objections, please let us know.
    ------------------

    From: Eric W. Biederman <ebiederm@xmission.com>

    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 <ebiederm@xmission.com>
    Signed-off-by: Robert Olsson <robert.olsson@its.uu.se>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Chris Wright <chrisw@sous-sol.org>
    ---
    net/ipv4/fib_trie.c | 21 ++++++++++++++++-----
    1 file changed, 16 insertions(+), 5 deletions(-)

    --- linux-2.6.19.2.orig/net/ipv4/fib_trie.c
    +++ linux-2.6.19.2/net/ipv4/fib_trie.c
    @@ -1989,6 +1989,10 @@ static struct node *fib_trie_get_next(st
    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(s
    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;
    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-02-03 03:53    [W:4.082 / U:0.640 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site