04 May, 2013

3 commits

  • When sending packets, TIPC bearers use skb_clone() before writing their
    hardware header. This will however NOT copy the data buffer.
    So when the same packet is sent over multiple bearers (to reach multiple
    nodes), the same socket buffer data will be treated by multiple
    tipc_media drivers which will write their own hardware header through
    dev_hard_header().
    Most of the time this is not a problem, because by the time the
    packet is processed by the second media, it has already been sent over
    the first one. However, when the first transmission is delayed (e.g.
    because of insufficient bandwidth or through a shaper), the next bearer
    will overwrite the hardware header, resulting in the packet being sent:
    a) with the wrong source address, when bearers of the same type,
    e.g. ethernet, are involved
    b) with a completely corrupt header, or even dropped, when bearers of
    different types are involved.

    So when the same socket buffer is to be sent multiple times, send a
    pskb_copy() instead (from the second instance on), and release it
    afterwards (the bearer will skb_clone() it anyway).

    Signed-off-by: Gerlando Falauto
    Signed-off-by: David S. Miller

    Gerlando Falauto
     
  • Signed-off-by: Gerlando Falauto
    Signed-off-by: David S. Miller

    Gerlando Falauto
     
  • Signed-off-by: Gerlando Falauto
    Signed-off-by: David S. Miller

    Gerlando Falauto
     

18 Apr, 2013

1 commit


16 Feb, 2013

1 commit

  • After commit 3c294cb3 "tipc: remove the bearer congestion mechanism",
    we try to grab the broadcast bearer lock when sending multicast
    messages over the broadcast link. This will cause an oops because
    the lock is never initialized. This is an old bug, but the lock
    was never actually used before commit 3c294cb3, so that why it was
    not visible until now. The oops will look something like:

    BUG: spinlock bad magic on CPU#2, daemon/147
    lock: bcast_bearer+0x48/0xffffffffffffd19a [tipc],
    .magic: 00000000, .owner: /-1, .owner_cpu: 0
    Pid: 147, comm: daemon Not tainted 3.8.0-rc3+ #206
    Call Trace:
    spin_dump+0x8a/0x8f
    spin_bug+0x21/0x26
    do_raw_spin_lock+0x114/0x150
    _raw_spin_lock_bh+0x19/0x20
    tipc_bearer_blocked+0x1f/0x40 [tipc]
    tipc_link_send_buf+0x82/0x280 [tipc]
    ? __alloc_skb+0x9f/0x2b0
    tipc_bclink_send_msg+0x77/0xa0 [tipc]
    tipc_multicast+0x11b/0x1b0 [tipc]
    send_msg+0x225/0x530 [tipc]
    sock_sendmsg+0xca/0xe0

    The above can be triggered by running the multicast demo program.

    Signed-off-by: Erik Hugne
    Signed-off-by: Paul Gortmaker
    Signed-off-by: David S. Miller

    Erik Hugne
     

22 Nov, 2012

2 commits

  • Rename the "supported" flag in bclink structure to "recv_permitted"
    to better reflect what it is used for. When this flag is set for a
    given node, we are permitted to receive and acknowledge broadcast
    messages from that node. Convert it to a bool at the same time,
    since it is not used to store any numerical values.

    Signed-off-by: Ying Xue
    Signed-off-by: Jon Maloy
    Signed-off-by: Paul Gortmaker

    Ying Xue
     
  • Currently at the TIPC bearer layer there is the following congestion
    mechanism:

    Once sending packets has failed via that bearer, the bearer will be
    flagged as being in congested state at once. During bearer congestion,
    all packets arriving at link will be queued on the link's outgoing
    buffer. When we detect that the state of bearer congestion has
    relaxed (e.g. some packets are received from the bearer) we will try
    our best to push all packets in the link's outgoing buffer until the
    buffer is empty, or until the bearer is congested again.

    However, in fact the TIPC bearer never receives any feedback from the
    device layer whether a send was successful or not, so it must always
    assume it was successful. Therefore, the bearer congestion mechanism
    as it exists currently is of no value.

    But the bearer blocking state is still useful for us. For example,
    when the physical media goes down/up, we need to change the state of
    the links bound to the bearer. So the code maintaing the state
    information is not removed.

    Signed-off-by: Ying Xue
    Signed-off-by: Paul Gortmaker

    Ying Xue
     

14 Jul, 2012

2 commits

  • The tipc_printf is renamed to tipc_snprintf, as the new name
    describes more what the function actually does. It is also
    changed to take a buffer and length parameter and return
    number of characters written to the buffer. All callers of
    this function that used to pass a print_buf are updated.

    Final removal of the struct print_buf itself will be done
    synchronously with the pending removal of the deprecated
    logging code that also was using it.

    Functions that build up a response message with a list of
    ports, nametable contents etc. are changed to return the number
    of characters written to the output buffer. This information
    was previously hidden in a field of the print_buf struct, and
    the number of chars written was fetched with a call to
    tipc_printbuf_validate. This function is removed since it
    is no longer referenced nor needed.

    A generic max size ULTRA_STRING_MAX_LEN is defined, named
    in keeping with the existing TIPC_TLV_ULTRA_STRING, and the
    various definitions in port, link and nametable code that
    largely duplicated this information are removed. This means
    that amount of link statistics that can be returned is now
    increased from 2k to 32k.

    The buffer overflow check is now done just before the reply
    message is passed over netlink or TIPC to a remote node and
    the message indicating a truncated buffer is changed to a less
    dramatic one (less CAPS), placed at the end of the message.

    Signed-off-by: Erik Hugne
    Signed-off-by: Jon Maloy
    Signed-off-by: Paul Gortmaker

    Erik Hugne
     
  • All messages should go directly to the kernel log. The TIPC
    specific error, warning, info and debug trace macro's are
    removed and all references replaced with pr_err, pr_warn,
    pr_info and pr_debug.

    Commonly used sub-strings are explicitly declared as a const
    char to reduce .text size.

    Note that this means the debug messages (changed to pr_debug),
    are now enabled through dynamic debugging, instead of a TIPC
    specific Kconfig option (TIPC_DEBUG). The latter will be
    phased out completely

    Signed-off-by: Erik Hugne
    Signed-off-by: Jon Maloy
    [PG: use pr_fmt as suggested by Joe Perches ]
    Signed-off-by: Paul Gortmaker

    Erik Hugne
     

11 Jul, 2012

1 commit


01 May, 2012

1 commit

  • Some of the comment blocks are floating in limbo between two
    functions, or between blocks of code. Delete the extra line
    feeds between any comment and its associated following block
    of code, to be consistent with the majority of the rest of
    the kernel. Also delete trailing newlines at EOF and fix
    a couple trivial typos in existing comments.

    This is a 100% cosmetic change with no runtime impact. We get
    rid of over 500 lines of non-code, and being blank line deletes,
    they won't even show up as noise in git blame.

    Signed-off-by: Paul Gortmaker

    Paul Gortmaker
     

25 Feb, 2012

1 commit

  • Gets rid of two inlined routines that simply call existing sk_buff
    manipulation routines, since there is no longer any extra processing
    done by the helper routines.

    Note that these changes are essentially cosmetic in nature, and have
    no impact on the actual operation of TIPC.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     

07 Feb, 2012

7 commits

  • Modifies broadcast link so that an incoming fragmented message is not
    lost if reassembly cannot begin because there currently is no buffer
    big enough to hold the entire reassembled message. The broadcast link
    now ignores the first fragment completely, which causes the sending node
    to retransmit the first fragment so that reassembly can be re-attempted.

    Previously, the sender would have had no reason to retransmit the 1st
    fragment, so we would never have a chance to re-try the allocation.

    To do this cleanly without duplicaton, a new bclink_accept_pkt()
    function is introduced.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Eliminates support for the broadcast tag field, which is no longer
    used by broadcast link NACK messages.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Completely redesigns broadcast link ACK and NACK mechanisms to prevent
    spurious retransmit requests in dual LAN networks, and to prevent the
    broadcast link from stalling due to the failure of a receiving node to
    acknowledge receiving a broadcast message or request its retransmission.

    Note: These changes only impact the timing of when ACK and NACK messages
    are sent, and not the basic broadcast link protocol itself, so inter-
    operability with nodes using the "classic" algorithms is maintained.

    The revised algorithms are as follows:

    1) An explicit ACK message is still sent after receiving 16 in-sequence
    messages, and implicit ACK information continues to be carried in other
    unicast link message headers (including link state messages). However,
    the timing of explicit ACKs is now based on the receiving node's absolute
    network address rather than its relative network address to ensure that
    the failure of another node does not delay the ACK beyond its 16 message
    target.

    2) A NACK message is now typically sent only when a message gap persists
    for two consecutive incoming link state messages; this ensures that a
    suspected gap is not confirmed until both LANs in a dual LAN network have
    had an opportunity to deliver the message, thereby preventing spurious NACKs.
    A NACK message can also be generated by the arrival of a single link state
    message, if the deferred queue is so big that the current message gap
    cannot be the result of "normal" mis-ordering due to the use of dual LANs
    (or one LAN using a bonded interface). Since link state messages typically
    arrive at different nodes at different times the problem of multiple nodes
    issuing identical NACKs simultaneously is inherently avoided.

    3) Nodes continue to "peek" at NACK messages sent by other nodes. If
    another node requests retransmission of a message gap suspected (but not
    yet confirmed) by the peeking node, the peeking node forgets about the
    gap and does not generate a duplicate retransmit request. (If the peeking
    node subsequently fails to receive the lost message, later link state
    messages will cause it to rediscover and confirm the gap and send another
    NACK.)

    4) Message gap "equality" is now determined by the start of the gap only.
    This is sufficient to deal with the most common cases of message loss,
    and eliminates the need for complex end of gap computations.

    5) A peeking node no longer tries to determine whether it should send a
    complementary NACK, since the most common cases of message loss don't
    require it to be sent. Consequently, the node no longer examines the
    "broadcast tag" field of a NACK message when peeking.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Ensures that all attempts to update broadcast link statistics are done
    only while holding the lock that protects the link's main data structures,
    to prevent interference by simultaneous updates caused by messages
    arriving on other interfaces.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Modifies broadcast link so that it increments the "received duplicate
    message" count if an incoming message cannot be added to the deferred
    message queue because it is already present in the queue. (The aligns
    broadcast link behavior with that of TIPC's unicast links.)

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Fixes a pair of problems in broadcast link message reception code
    relating to the reclamation of the node lock after consuming an
    in-sequence message.

    1) Now retests to see if the sending node is still up after reclaiming
    the node lock, and bails out if it is non-operational.

    2) Now manipulates the node's deferred message queue only after
    reclaiming the node lock, rather than using queue head pointer
    information that was cached previously.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Ensures that any attempt to send a NACK message over TIPC's broadcast
    link has exclusive access to the link's main data structures, to prevent
    interference with a simultaneous attempt to send other broadcast link
    traffic (such as application-generated multicast messages).

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     

30 Dec, 2011

5 commits


28 Dec, 2011

7 commits

  • Migrates the buf_seqno() helper routine from broadcast link level to
    unicast link level so that it can be used both types of TIPC links.
    This is a cosmetic change only, and does not affect the operation of TIPC.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Adds checks to TIPC's broadcast link so that it ignores any
    acknowledgement message containing a sequence number that does not
    correspond to an unacknowledged message currently in the broadcast
    link's transmit queue.

    This change prevents the broadcast link from becoming stalled if a
    newly booted node receives stale broadcast link acknowledgement
    information from another node that has not yet fully synchronized
    its end of the broadcast link to reflect the current state of the
    new node's end.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Adds code to release any unsent broadcast messages in the broadcast link
    transmit queue if TIPC loses contact with its only neighboring node.
    Previously, a broadcast link that was in the congested state would hold
    on to the unsent messages, even though the messages were now undeliverable.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • The two broadcast link statistics fields that are used to derive the
    average length of that link's transmit queue are now updated only after
    a successful attempt to send a broadcast message, since there is no need
    to update these values when an unsuccessful send attempt leaves the
    queue unchanged.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Adds a check to detect when an attempt is made to send a message
    via the broadcast link and no neighboring nodes are currently available
    to receive it. Rather than wasting effort passing the message to the
    broadcast link and broadcast bearer, who will only throw it away,
    TIPC now frees the message immediately and reports success (i.e. the
    message has been delivered to all available destinations).

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Fixes oversight that allowed broadcast link node map to be updated without
    first taking the broadcast link spinlock that protects the map. As part
    of this fix the node map has been incorporated into the broadcast link
    structure to make the need for such protection more evident.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Creates global variables to hold the broadcast link's pseudo-bearer and
    pseudo-link structures, rather than allocating them dynamically. There
    is only a single instance of each structure, and changing over to static
    allocation allows elimination of code to handle the cases where dynamic
    allocation was unsuccessful.

    The memset in the teardown code may look like they aren't used, but
    the same teardown code is run when there is a non-fatal error at
    init-time, so that stale data isn't present when the user fixes the
    cause of the soft error.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     

01 Sep, 2011

7 commits

  • Eliminates obsolete code that handles broadcast bearer congestion when
    the broadast link sends a NACK message, since the broadcast pseudo-bearer
    never becomes blocked.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Modifies TIPC's incoming broadcast packet handler to discard messages
    that cannot legally be sent over the broadcast link, including:

    - broadcast protocol messages that do no contain state information
    - payload messages that are not named multicast messages
    - any other form of message except for bundled messages, fragmented
    messages, and name distribution messages.

    These checks are needed to prevent TIPC from handing an unexpected
    message to a routine that isn't prepared to handle it, which could
    lead to incorrect processing (up to and including invalid memory
    references caused by attempts to access message fields that aren't
    present in the message).

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Modifies TIPC's incoming broadcast packet handler so that it no longer
    pre-reads information about the deferred packet queue, since the cached
    value is unreliable once the associated node lock has been released.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Modifies TIPC's incoming broadcast packet handler to ensure that the
    node lock associated with the sender of the packet is held whenever
    node-related data structure fields are accessed. The routine is also
    restructured with a single exit point, making it easier to ensure
    the node lock is properly released and the incoming packet is properly
    disposed of.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Eliminates code associated with the sending of unsent broadcast link
    traffic when the broadcast pseudo-bearer becomes unblocked following a
    temporary congestion situation. This code is non-executable because the
    broadcast pseudo-bearer never becomes blocked [see tipc_bcbearer_send()].

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Updates the comments in the broadcast bearer send routine to more
    accurately describe the processing done by the routine. Also replaces
    the improper use of a TIPC payload message error status symbol (in a place
    that has nothing to do with such errors) with its numeric equivalent.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     
  • Updates TIPC's broadcast link in a couple of places that were missed
    during the transition from its former name ("multicast-link") to its
    current name ("broadcast-link"). These changes are essentially cosmetic
    and do not affect the overall operation of TIPC.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     

25 Jun, 2011

1 commit

  • Modifies the existing broadcast link sanity check that detects an
    attempt to send a message off-node when there are no available
    destinations so that it no longer causes a kernel panic; instead,
    the check now issues a warning and stack trace and then returns
    without sending the message anywhere.

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens
     

11 May, 2011

1 commit

  • Modifies a TIPC send routine that did not discard the outgoing sk_buff
    if it was not transmitted because of link congestion; this eliminates
    the potential for buffer leakage in the many callers who did not clean up
    the unsent buffer. (The two routines that previously did discard the unsent
    buffer have been updated to eliminate their now-redundant clean up.)

    Signed-off-by: Allan Stephens
    Signed-off-by: Paul Gortmaker

    Allan Stephens