22 Mar, 2014

7 commits

  • With this patch a node sends IPv4 multicast packets to nodes which
    have a BATADV_MCAST_WANT_ALL_IPV4 flag set and IPv6 multicast packets
    to nodes which have a BATADV_MCAST_WANT_ALL_IPV6 flag set, too.

    Why is this needed? There are scenarios involving bridges where
    multicast report snooping and multicast TT announcements are not
    sufficient, which would lead to packet loss for some nodes otherwise:

    MLDv1 and IGMPv1/IGMPv2 have a suppression mechanism
    for multicast listener reports. When we have an MLDv1/IGMPv1/IGMPv2
    querier behind a bridge then our snooping bridge is potentially not
    going to see any reports even though listeners exist because according
    to RFC4541 such reports are only forwarded to multicast routers:

    -----------------------------------------------------------
    ---------------
    {Querier}---|Snoop. Switch|----{Listener}
    ---------------
    \ ^
    -------
    | br0 | < ???
    -------
    \
    _-~---~_
    _-~/ ~-_
    ~ batman-adv \-----{Sender}
    \~_ cloud ~/
    -~~__-__-~_/

    I) MLDv1 Query: {Querier} -> flooded
    II) MLDv1 Report: {Listener} -> {Querier}

    -> br0 cannot detect the {Listener}
    => Packets from {Sender} need to be forwarded to all
    detected listeners and MLDv1/IGMPv1/IGMPv2 queriers.

    -----------------------------------------------------------

    Note that we do not need to explicitly forward to MLDv2/IGMPv3 queriers,
    because these protocols have no report suppression: A bridge has no
    trouble detecting MLDv2/IGMPv3 listeners.

    Even though we do not support bridges yet we need to provide the
    according infrastructure already to not break compatibility later.

    Signed-off-by: Linus Lüssing
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Linus Lüssing
     
  • With this patch a node may additionally perform the dropping or
    unicasting behaviour for a link-local IPv4 and link-local-all-nodes
    IPv6 multicast packet, too.

    The extra counter and BATADV_MCAST_WANT_ALL_UNSNOOPABLES flag is needed
    because with a future bridge snooping support integration a node with a
    bridge on top of its soft interface is not able to reliably detect its
    multicast listeners for IPv4 link-local and the IPv6
    link-local-all-nodes addresses anymore (see RFC4541, section 2.1.2.2
    and section 3).

    Even though this new flag does make "no difference" now, it'll ensure
    a seamless integration of multicast bridge support without needing to
    break compatibility later.

    Also note, that even with multicast bridge support it won't be possible
    to optimize 224.0.0.x and ff02::1 towards nodes with bridges, they will
    always receive these ranges.

    Signed-off-by: Linus Lüssing
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Linus Lüssing
     
  • With this patch a multicast packet is not always simply flooded anymore,
    the behaviour for the following cases is changed to reduce
    unnecessary overhead:

    If all nodes within the horizon of a certain node have signalized
    multicast listener announcement capability then an IPv6 multicast packet
    with a destination of IPv6 link-local scope (excluding ff02::1) coming
    from the upstream of this node...

    * ...is dropped if there is no according multicast listener in the
    translation table,
    * ...is forwarded via unicast if there is a single node with interested
    multicast listeners
    * ...and otherwise still gets flooded.

    Signed-off-by: Linus Lüssing
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Linus Lüssing
     
  • If the soft interface of a node is not part of a bridge then a node
    announces a new multicast TVLV: The existence of this TVLV
    signalizes that this node is announcing all of its multicast listeners
    via the translation table infrastructure.

    Signed-off-by: Linus Lüssing
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Linus Lüssing
     
  • Reported-by: Sven Eckelmann
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Marek Lindner
     
  • On some architectures ether_addr_copy() is slightly faster
    than memcpy() therefore use the former when possible.

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     
  • Our .ndo_start_xmit handler (batadv_interface_tx()) can rely on having
    the skb mac header pointer set correctly since the following commit
    present in kernels >= 3.9:

    "net: reset mac header in dev_start_xmit()" (6d1ccff627)

    Therefore we can safely use eth_hdr() and vlan_eth_hdr() instead of
    skb->data now, which spares us some ugly type casts.

    At the same time set the mac_header in batadv_dat_snoop_incoming_arp_request()
    before sending the skb along the TX path.

    Signed-off-by: Linus Lüssing
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Linus Lüssing
     

12 Jan, 2014

2 commits

  • Signed-off-by: Simon Wunderlich
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Simon Wunderlich
     
  • If the same interface is used for sending and receiving, there might be
    throughput degradation on half-duplex interfaces such as WiFi. Add a
    penalty if the same interface is used to reflect this problem in the
    metric. At the same time, change the hop penalty from 30 to 15 so there
    will be no change for single wifi mesh network. the effective hop
    penalty will stay at 30 due to the new wifi penalty for these networks.

    Signed-off-by: Simon Wunderlich
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Simon Wunderlich
     

09 Jan, 2014

5 commits

  • If a broadcast packet is coming from a client marked as
    isolated, then mark the skb using the isolation mark so
    that netfilter (or any other application) can recognise
    them.

    The mark is written in the skb based on the mask value:
    only bits set in the mask are substitued by those in the
    mark value

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     
  • A client sending packets which mark matches the value
    configured via sysfs has to be identified as isolated using
    the TT_CLIENT_ISOLA flag.

    The match is mask based, meaning that only bits set in the
    mask are compared with those in the mark value.

    If the configured mask is equal to 0 no operation is
    performed.

    Such flag is then advertised within the classic client
    announcement mechanism.

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     
  • This attribute can be used to set and read the value and the
    mask of the skb mark which will be used to classify the
    source non-mesh client as ISOLATED. In this way a client can
    be advertised as such and the mark can potentially be
    restored at the receiving node before delivering the skb.

    This can be helpful for creating network wide netfilter
    policies.

    This sysfs file expects a string of the shape "$mark/$mask".
    Where $mark has to be a 32-bit number in any base, while
    $mask must be a 32bit mask expressed in hex base. Only bits
    in $mark covered by the bitmask are really stored.

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     
  • In different situations it is possible that the DHCP server
    or client uses broadcast Ethernet frames to send messages
    to each other. The GW component in batman-adv takes care of
    using bat-unicast packets to bring broadcast DHCP
    Discover/Requests to the "best" server.

    On the way back the DHCP server usually sends unicasts,
    but upon client request it may decide to use broadcasts as
    well.

    This patch improves the GW component so that it now snoops
    and sends as unicast all the DHCP packets, no matter if they
    were generated by a DHCP server or client.

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     
  • As suggested by checkpatch, remove all the references to the
    FSF address since the kernel already has one reference in
    its documentation.

    In this way it is easier to update it in case of future
    changes.

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     

28 Dec, 2013

3 commits

  • When batadv_get_vid() is invoked in interface_rx() the
    batman-adv header has already been removed, therefore
    the header_len argument has to be 0.

    Introduced by c018ad3de61a1dc4194879a53e5559e094aa7b1a
    ("batman-adv: add the VLAN ID attribute to the TT entry")

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     
  • If an interface enslaved into batman-adv is a bridge (or a
    virtual interface built on top of a bridge) the nf_bridge
    member of the skbs reaching the soft-interface is filled
    with the state about "netfilter bridge" operations.

    Then, if one of such skbs is locally delivered, the nf_bridge
    member should be cleaned up to avoid that the old state
    could mess up with other "netfilter bridge" operations when
    entering a second bridge.
    This is needed because batman-adv is an encapsulation
    protocol.

    However at the moment skb->nf_bridge is not released at all
    leading to bogus "netfilter bridge" behaviours.

    Fix this by cleaning the netfilter state of the skb before
    it gets delivered to the upper layer in interface_rx().

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     
  • The size of the batadv_header of 3 is problematic on some architectures
    which automatically pad all structures to a 32 bit boundary. To not lose
    performance by packing this struct, better embed it into the various
    host structures.

    Reported-by: Russell King
    Signed-off-by: Simon Wunderlich
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Simon Wunderlich
     

23 Oct, 2013

1 commit

  • The local translation table size is limited by what can be
    transferred from one node to another via a full table request.

    The number of entries fitting into a full table request depend
    on whether the fragmentation is enabled or not. Therefore this
    patch introduces a max table size check and refuses to add
    more local clients when that size is reached. Moreover, if the
    max full table packet size changes (MTU change or fragmentation
    is disabled) the local table is downsized instantaneously.

    Signed-off-by: Marek Lindner
    Acked-by: Antonio Quartulli

    Marek Lindner
     

19 Oct, 2013

5 commits

  • With this patch the functions batadv_send_skb_unicast() and
    batadv_send_skb_unicast_4addr() are further refined into
    batadv_send_skb_via_tt(), batadv_send_skb_via_tt_4addr() and
    batadv_send_skb_via_gw(). This way we avoid any "guessing" about where to send
    a packet in the unicast forwarding methods and let the callers decide.

    This is going to be useful for the upcoming multicast related patches in
    particular.

    Further, the return values were polished a little to use the more
    appropriate NET_XMIT_* defines.

    Signed-off-by: Linus Lüssing
    Acked-by: Antonio Quartulli
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Linus Lüssing
     
  • AP isolation has to be enabled on one VLAN interface only.
    This patch moves the AP isolation attribute to the per-vlan
    interface attribute set, enabling it to have a different
    value depending on the selected vlan.

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     
  • Each VLAN can now have its own set of attributes which are
    exported through a new subfolder in the sysfs tree.
    Each VLAN created on top of a soft_iface will have its own
    subfolder.

    The subfolder is named "vlan%VID" and it is created inside
    the "mesh" sysfs folder belonging to batman-adv.

    Attributes corresponding to the untagged LAN are stored in
    the root sysfs folder as before.

    This patch also creates all the needed macros and data
    structures to easily handle new VLAN spacific attributes.

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     
  • Since batman-adv is now fully VLAN-aware, a proper framework
    able to handle per-vlan-interface attributes is needed.

    Those attributes will affect the associated VLAN interface
    only, rather than the real soft_iface (which would result
    in every vlan interface having the same attribute
    configuration).

    To make the code simpler and easier to extend, attributes
    associated to the standalone soft_iface are now treated
    like belonging to yet another vlan having a special vid.
    This vid is different from the others because it is made up
    by all zeros and the VLAN_HAS_TAG bit is not set.

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     
  • To make the translation table code VLAN-aware, each entry
    must carry the VLAN ID which it belongs to. This patch adds
    such attribute to the related TT structures.

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     

12 Oct, 2013

6 commits

  • We do not actually need to set any rx filters for the virtual batman
    soft interface. However a dummy handler enables a user to set static
    multicast listeners for instance.

    Signed-off-by: Linus Lüssing
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Linus Lüssing
     
  • The module prints a warning when the MTU on the hard interface is too
    small to transfer payload traffic without fragmentation. The required
    MTU is calculated based on the encapsulation header size. If network
    coding is compild into the module its header size is taken into
    account as well.

    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Marek Lindner
     
  • When comparing a network ordered value with a constant, it
    is better to convert the constant at compile time by means
    of htons() instead of converting the value at runtime using
    ntohs().

    This refactoring may slightly improve the code performance.

    Moreover substitute __constant_htons() with htons() since
    the latter increase readability and it is smart enough to be
    as efficient as the former

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner
    Acked-by: Simon Wunderlich

    Antonio Quartulli
     
  • Non-broadcast packets larger than MTU are fragmented and sent with
    an encapsulating header. Up to 16 fragments are supported, which are
    sent in reverse order on the wire to allow minimal memory copying when
    creating fragments.

    Signed-off-by: Martin Hundebøll
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Martin Hundebøll
     
  • Fragments arriving at their destination are buffered for later merge.
    Merged packets are passed to the main receive function as had they never
    been fragmented.

    Fragments are forwarded without merging if the MTU of the outgoing
    interface is smaller than the size of the merged packet.

    Signed-off-by: Martin Hundebøll
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Martin Hundebøll
     
  • Remove the existing fragmentation code before adding the new version
    and delete unicast.{h,c}.

    batadv_unicast_send_skb() is moved to send.c and renamed to
    batadv_send_skb_unicast().

    fragmentation entry in sysfs (bat_priv->fragmentation) is kept for use in
    the new fragmentation code.

    BATADV_UNICAST_FRAG packet type is renamed to BATADV_FRAG for use in the
    new fragmentation code.

    Signed-off-by: Martin Hundebøll
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Martin Hundebøll
     

10 Oct, 2013

2 commits

  • This is replaced by a userspace program, we don't need this
    functionality to bloat the kernel.

    Signed-off-by: Simon Wunderlich
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Simon Wunderlich
     
  • Prior to this patch batman-adv read the advertised uplink bandwidth
    from userspace and compressed this information into a single byte
    called "gateway class".
    Now the download & upload bandwidth information is sent as-is. No
    userspace change is necessary since the sysfs API always allowed
    to specify a bandwidth.

    Signed-off-by: Marek Lindner
    Signed-off-by: Spyros Gasteratos
    Signed-off-by: Antonio Quartulli

    Marek Lindner
     

18 Sep, 2013

1 commit

  • When receiving or sending a packet a packet on a VLAN, the
    vid has to be marked with the TAG flag in order to make any
    component in batman-adv understand that the packet is coming
    from a really tagged network.

    This fix the Bridge Loop Avoidance behaviour which was not
    able to send announces over VLAN interfaces.

    Introduced by 0b1da1765fdb00ca5d53bc95c9abc70dfc9aae5b
    ("batman-adv: change VID semantic in the BLA code")

    Signed-off-by: Antonio Quartulli
    Acked-by: Simon Wunderlich
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     

28 Aug, 2013

1 commit

  • The skb priority field may help the wireless driver to choose the right
    queue (e.g. WMM queues). This should be set in batman-adv, as this
    information is only available here.

    This patch adds support for IPv4/IPv6 DS fields and VLAN PCP. Note that
    only VLAN PCP is used if a VLAN header is present. Also initially set
    TC_PRIO_CONTROL only for self-generated packets, and keep the priority
    set by higher layers.

    Signed-off-by: Simon Wunderlich
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Simon Wunderlich
     

11 Aug, 2013

1 commit

  • There are several functions which might reallocate skb data. Currently
    some places keep reusing their old ethhdr pointer regardless of whether
    they became invalid after such a reallocation or not. This potentially
    leads to kernel paging errors.

    This patch fixes these by refetching the ethdr pointer after the
    potential reallocations.

    Signed-off-by: Linus Lüssing
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Linus Lüssing
     

29 May, 2013

2 commits

  • In order to make batman-adv fully vlan aware later, the
    semantic used for variables storing the VLAN ID values has
    to be changed in order to be adapted to the new one which
    will be used batman-adv wide.

    In particular, the VID has to be an "_unsigned_ short int"
    and its 4 MSB will be used as a flag bitfield, while the
    remaining 12 bits are used to store the real VID value

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner
    Acked-by: Simon Wunderlich

    Antonio Quartulli
     
  • Instead of casting the result of skb_mac_header() to
    "struct ethhdr *" every time, the eth_hdr inline function
    can be use to beautify the code and improve its readability.

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner

    Antonio Quartulli
     

22 May, 2013

1 commit

  • On errors in batadv_mesh_init(), bat_counters will be freed in both
    batadv_mesh_free() and batadv_softif_init_late(). This patch fixes this
    by returning earlier from batadv_softif_init_late() in case of errors in
    batadv_mesh_init() and by setting bat_counters to NULL after freeing.

    Signed-off-by: Martin Hundebøll
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Martin Hundebøll
     

23 Apr, 2013

1 commit

  • batadv_mesh_free() schedules some RCU callbacks which need the bat_priv struct
    to do their jobs, while free_netdev(), which is called immediately after, is
    destroying the private data.

    Put an rcu_barrier() in the middle so that free_netdev() is invoked only after
    all the callbacks returned.

    This bug has been introduced by ab8f433dd39be94e8617cff2dfe9f7eca162eb15
    ("batman-adv: Move deinitialization of soft-interface to destructor")

    Signed-off-by: Antonio Quartulli
    Signed-off-by: Marek Lindner
    Signed-off-by: David S. Miller

    Antonio Quartulli
     

27 Mar, 2013

2 commits

  • The sysfs configuration interface of batman-adv to add/remove slaves of an
    soft-iface is not deadlock free and doesn't follow the currently common way to
    modify slaves of an interface.

    An additional configuration interface though rtnl_link is introduced which
    provides easy device adding/removing with tools like "ip":
    $ ip link set dev eth0 master bat0
    $ ip link set dev eth0 nomaster

    Signed-off-by: Sven Eckelmann
    Signed-off-by: Marek Lindner
    Acked-by: Antonio Quartulli
    Signed-off-by: Antonio Quartulli

    Sven Eckelmann
     
  • The sysfs configuration interface of batman-adv to add/remove soft-interfaces
    is not deadlock free and doesn't follow the currently common way to create new
    virtual interfaces.

    An additional interface though rtnl_link is introduced which provides easy device
    creation/deletion with tools like "ip":

    $ ip link add dev bat0 type batadv
    $ ip link del dev bat0

    Signed-off-by: Sven Eckelmann
    Signed-off-by: Marek Lindner
    Signed-off-by: Antonio Quartulli

    Sven Eckelmann