13 May, 2006

1 commit

  • The classical IP over ATM code maintains its own IPv4
    ARP table, using the standard neighbour-table code. The
    neigh_table_init function adds this neighbour table to a linked list
    of all neighbor tables which is used by the functions neigh_delete()
    neigh_add() and neightbl_set(), all called by the netlink code.

    Once the ATM neighbour table is added to the list, there are two
    tables with family == AF_INET there, and ARP entries sent via netlink
    go into the first table with matching family. This is indeterminate
    and often wrong.

    To see the bug, on a kernel with CLIP enabled, create a standard IPv4
    ARP entry by pinging an unused address on a local subnet. Then attempt
    to complete that entry by doing

    ip neigh replace lladdr nud reachable

    Looking at the ARP tables by using

    ip neigh show

    will reveal two ARP entries for the same address. One of these can be
    found in /proc/net/arp, and the other in /proc/net/atm/arp.

    This patch adds a new function, neigh_table_init_no_netlink() which
    does everything the neigh_table_init() does, except add the table to
    the netlink all-arp-tables chain. In addition neigh_table_init() has a
    check that all tables on the chain have a distinct address family.
    The init call in clip.c is changed to call
    neigh_table_init_no_netlink().

    Since ATM ARP tables are rather more complicated than can currently be
    handled by the available rtattrs in the netlink protocol, no
    functionality is lost by this patch, and non-ATM ARP manipulation via
    netlink is rescued. A more complete solution would involve a rtattr
    for ATM ARP entries and some way for the netlink code to give
    neigh_add and friends more information than just address family with
    which to find the correct ARP table.

    [ I've changed the assertion checking in neigh_table_init() to not
    use BUG_ON() while holding neigh_tbl_lock. Instead we remember that
    we found an existing tbl with the same family, and after dropping
    the lock we'll give a diagnostic kernel log message and a stack dump.
    -DaveM ]

    Signed-off-by: Simon Kelley
    Signed-off-by: David S. Miller

    Simon Kelley
     

11 Apr, 2006

1 commit

  • for_each_cpu() actually iterates across all possible CPUs. We've had mistakes
    in the past where people were using for_each_cpu() where they should have been
    iterating across only online or present CPUs. This is inefficient and
    possibly buggy.

    We're renaming for_each_cpu() to for_each_possible_cpu() to avoid this in the
    future.

    This patch replaces for_each_cpu with for_each_possible_cpu under /net

    Signed-off-by: KAMEZAWA Hiroyuki
    Acked-by: "David S. Miller"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    KAMEZAWA Hiroyuki
     

10 Apr, 2006

1 commit


21 Mar, 2006

2 commits

  • struct neigh_ops currently has a destructor field, which no in-kernel
    drivers outside of infiniband use. The infiniband/ulp/ipoib in-tree
    driver stashes some info in the neighbour structure (the results of
    the second-stage lookup from ARP results to real link-level path), and
    it uses neigh->ops->destructor to get a callback so it can clean up
    this extra info when a neighbour is freed. We've run into problems
    with this: since the destructor is in an ops field that is shared
    between neighbours that may belong to different net devices, there's
    no way to set/clear it safely.

    The following patch moves this field to neigh_parms where it can be
    safely set, together with its twin neigh_setup. Two additional
    patches in the patch series update ipoib to use this new interface.

    Signed-off-by: Michael S. Tsirkin
    Signed-off-by: Roland Dreier
    Signed-off-by: David S. Miller

    Michael S. Tsirkin
     
  • Signed-off-by: YOSHIFUJI Hideaki
    Signed-off-by: David S. Miller

    YOSHIFUJI Hideaki
     

26 Oct, 2005

1 commit

  • In 'net' change the explicit use of for-loops and NR_CPUS into the
    general for_each_cpu() or for_each_online_cpu() constructs, as
    appropriate. This widens the scope of potential future optimizations
    of the general constructs, as well as takes advantage of the existing
    optimizations of first_cpu() and next_cpu(), which is advantageous
    when the true CPU count is much smaller than NR_CPUS.

    Signed-off-by: John Hawkes
    Signed-off-by: David S. Miller
    Signed-off-by: Arnaldo Carvalho de Melo

    John Hawkes
     

23 Oct, 2005

3 commits

  • neigh_changeaddr attempts to delete neighbour timers without setting
    nud_state. This doesn't work because the timer may have already fired
    when we acquire the write lock in neigh_changeaddr. The result is that
    the timer may keep firing for quite a while until the entry reaches
    NEIGH_FAILED.

    It should be setting the nud_state straight away so that if the timer
    has already fired it can simply exit once we relinquish the lock.

    In fact, this whole function is simply duplicating the logic in
    neigh_ifdown which in turn is already doing the right thing when
    it comes to deleting timers and setting nud_state.

    So all we have to do is take that code out and put it into a common
    function and make both neigh_changeaddr and neigh_ifdown call it.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • neigh_add_timer cannot use add_timer unconditionally. The reason is that
    by the time it has obtained the write lock someone else (e.g., neigh_update)
    could have already added a new timer.

    So it should only use mod_timer and deal with its return value accordingly.

    This bug would have led to rare neighbour cache entry leaks.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • Stack traces are very helpful in determining the exact nature of a bug.
    So let's print a stack trace when the timer is added twice.

    Signed-off-by: Herbert Xu

    Herbert Xu
     

28 Sep, 2005

1 commit


25 Sep, 2005

1 commit

  • From: Amos Waterland

    If CONFIG_PROC_FS is not selected, the compiler emits this warning:

    net/core/neighbour.c:64: warning: `neigh_stat_seq_fops' defined but not used

    Which is correct, because neigh_stat_seq_fops is in fact only
    initialized and used by code that is protected by CONFIG_PROC_FS. So
    this patch fixes that up.

    Signed-off-by: Amos Waterland
    Signed-off-by: Andrew Morton
    Signed-off-by: David S. Miller

    Amos Waterland
     

30 Aug, 2005

2 commits


29 Jun, 2005

1 commit


24 Jun, 2005

1 commit

  • This patch creates a new kstrdup library function and changes the "local"
    implementations in several places to use this function.

    Most of the changes come from the sound and net subsystems. The sound part
    had already been acknowledged by Takashi Iwai and the net part by David S.
    Miller.

    I left UML alone for now because I would need more time to read the code
    carefully before making changes there.

    Signed-off-by: Paulo Marques
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Paulo Marques
     

19 Jun, 2005

5 commits

  • This patch rectifies some rtnetlink message builders that derive the
    flags from the pid. It is now explicit like the other cases
    which get it right. Also fixes half a dozen dumpers which did not
    set NLM_F_MULTI at all.

    Signed-off-by: Jamal Hadi Salim
    Signed-off-by: Thomas Graf
    Signed-off-by: David S. Miller

    Jamal Hadi Salim
     
  • Introduces a new macro NLMSG_NEW which extends NLMSG_PUT but takes
    a flags argument. NLMSG_PUT stays there for compatibility but now
    calls NLMSG_NEW with flags == 0. NLMSG_PUT_ANSWER is renamed to
    NLMSG_NEW_ANSWER which now also takes a flags argument.

    Also converts the users of NLMSG_PUT_ANSWER to use NLMSG_NEW_ANSWER
    and fixes the two direct users of __nlmsg_put to either provide
    the flags or use NLMSG_NEW(_ANSWER).

    Signed-off-by: Thomas Graf
    Signed-off-by: David S. Miller

    Thomas Graf
     
  • Signed-off-by: Thomas Graf
    Signed-off-by: David S. Miller

    Thomas Graf
     
  • Signed-off-by: Thomas Graf
    Signed-off-by: David S. Miller

    Thomas Graf
     
  • To retrieve the neighbour tables send RTM_GETNEIGHTBL with the
    NLM_F_DUMP flag set. Every neighbour table configuration is
    spread over multiple messages to avoid running into message
    size limits on systems with many interfaces. The first message
    in the sequence transports all not device specific data such as
    statistics, configuration, and the default parameter set.
    This message is followed by 0..n messages carrying device
    specific parameter sets.

    Although the ordering should be sufficient, NDTA_NAME can be
    used to identify sequences. The initial message can be identified
    by checking for NDTA_CONFIG. The device specific messages do
    not contain this TLV but have NDTPA_IFINDEX set to the
    corresponding interface index.

    To change neighbour table attributes, send RTM_SETNEIGHTBL
    with NDTA_NAME set. Changeable attribute include NDTA_THRESH[1-3],
    NDTA_GC_INTERVAL, and all TLVs in NDTA_PARMS unless marked
    otherwise. Device specific parameter sets can be changed by
    setting NDTPA_IFINDEX to the interface index of the corresponding
    device.

    Signed-off-by: Thomas Graf
    Signed-off-by: David S. Miller

    Thomas Graf
     

29 Apr, 2005

1 commit


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