26 Apr, 2007

1 commit


26 Mar, 2007

1 commit

  • As per RFC2461, section 6.3.6, item #2, when no routers on the
    matching list are known to be reachable or probably reachable we
    do round robin on those available routes so that we make sure
    to probe as many of them as possible to detect when one becomes
    reachable faster.

    Each routing table has a rwlock protecting the tree and the linked
    list of routes at each leaf. The round robin code executes during
    lookup and thus with the rwlock taken as a reader. A small local
    spinlock tries to provide protection but this does not work at all
    for two reasons:

    1) The round-robin list manipulation, as coded, goes like this (with
    read lock held):

    walk routes finding head and tail

    spin_lock();
    rotate list using head and tail
    spin_unlock();

    While one thread is rotating the list, another thread can
    end up with stale values of head and tail and then proceed
    to corrupt the list when it gets the lock. This ends up causing
    the OOPS in fib6_add() later onthat many people have been hitting.

    2) All the other code paths that run with the rwlock held as
    a reader do not expect the list to change on them, they
    expect it to remain completely fixed while they hold the
    lock in that way.

    So, simply stated, it is impossible to implement this correctly using
    a manipulation of the list without violating the rwlock locking
    semantics.

    Reimplement using a per-fib6_node round-robin pointer. This way we
    don't need to manipulate the list at all, and since the round-robin
    pointer can only ever point to real existing entries we don't need
    to perform any locking on the changing of the round-robin pointer
    itself. We only need to reset the round-robin pointer to NULL when
    the entry it is pointing to is removed.

    The idea is from Thomas Graf and it is very similar to how this
    was implemented before the advanced router selection code when in.

    Signed-off-by: David S. Miller

    David S. Miller
     

11 Feb, 2007

1 commit


14 Dec, 2006

1 commit


03 Dec, 2006

1 commit


23 Sep, 2006

7 commits


22 Jun, 2005

1 commit

  • Essentially netlink at the moment always reports a pid and sequence of 0
    always for v6 route activities.
    To understand the repurcassions of this look at:
    http://lists.quagga.net/pipermail/quagga-dev/2005-June/003507.html

    While fixing this, i took the liberty to resolve the outstanding issue
    of IPV6 routes inserted via ioctls to have the correct pids as well.

    This patch tries to behave as close as possible to the v4 routes i.e
    maintains whatever PID the socket issuing the command owns as opposed to
    the process. That made the patch a little bulky.

    I have tested against both netlink derived utility to add/del routes as
    well as ioctl derived one. The Quagga folks have tested against quagga.
    This fixes the problem and so far hasnt been detected to introduce any
    new issues.

    Signed-off-by: Jamal Hadi Salim
    Acked-by: YOSHIFUJI Hideaki
    Signed-off-by: David S. Miller

    Jamal Hadi Salim
     

17 Apr, 2005

1 commit

  • Initial git repository build. I'm not bothering with the full history,
    even though we have it. We can create a separate "historical" git
    archive of that later if we want to, and in the meantime it's about
    3.2GB when imported into git - space that would just make the early
    git days unnecessarily complicated, when we don't have a lot of good
    infrastructure for it.

    Let it rip!

    Linus Torvalds