1. 02 6月, 2019 1 次提交
    • S
      batman-adv: Fix duplicated OGMs on NETDEV_UP · 9e6b5648
      Sven Eckelmann 提交于
      The state of slave interfaces are handled differently depending on whether
      the interface is up or not. All active interfaces (IFF_UP) will transmit
      OGMs. But for B.A.T.M.A.N. IV, also non-active interfaces are scheduling
      (low TTL) OGMs on active interfaces. The code which setups and schedules
      the OGMs must therefore already be called when the interfaces gets added as
      slave interface and the transmit function must then check whether it has to
      send out the OGM or not on the specific slave interface.
      
      But the commit f0d97253 ("batman-adv: remove ogm_emit and ogm_schedule
      API calls") moved the setup code from the enable function to the activate
      function. The latter is called either when the added slave was already up
      when batadv_hardif_enable_interface processed the new interface or when a
      NETDEV_UP event was received for this slave interfac. As result, each
      NETDEV_UP would schedule a new OGM worker for the interface and thus OGMs
      would be send a lot more than expected.
      
      Fixes: f0d97253 ("batman-adv: remove ogm_emit and ogm_schedule API calls")
      Reported-by: NLinus Lüssing <linus.luessing@c0d3.blue>
      Tested-by: NLinus Lüssing <linus.luessing@c0d3.blue>
      Acked-by: NMarek Lindner <mareklindner@neomailbox.ch>
      Signed-off-by: NSven Eckelmann <sven@narfation.org>
      Signed-off-by: NSimon Wunderlich <sw@simonwunderlich.de>
      9e6b5648
  2. 25 3月, 2019 1 次提交
  3. 04 1月, 2019 1 次提交
  4. 12 11月, 2018 2 次提交
  5. 15 9月, 2018 1 次提交
    • S
      batman-adv: Move OGM rebroadcast stats to orig_ifinfo · dee222c7
      Sven Eckelmann 提交于
      B.A.T.M.A.N. IV requires the number of rebroadcast from a neighboring
      originator. These statistics are gathered per interface which transmitted
      the OGM (and then received it again). Since an originator is not interface
      specific, a resizable array was used in each originator.
      
      This resizable array had an entry for each interface and had to be resizes
      (for all OGMs) when the number of active interface was modified. This could
      cause problems when a large number of interface is added and not enough
      continuous memory is available to allocate the array.
      
      There is already a per interface originator structure "batadv_orig_ifinfo"
      which can be used to store this information.
      Signed-off-by: NSven Eckelmann <sven@narfation.org>
      Signed-off-by: NSimon Wunderlich <sw@simonwunderlich.de>
      dee222c7
  6. 23 6月, 2018 1 次提交
  7. 27 2月, 2018 1 次提交
  8. 26 2月, 2018 2 次提交
    • S
      batman-adv: Fix internal interface indices types · f22e0893
      Sven Eckelmann 提交于
      batman-adv uses internal indices for each enabled and active interface.
      It is currently used by the B.A.T.M.A.N. IV algorithm to identifify the
      correct position in the ogm_cnt bitmaps.
      
      The type for the number of enabled interfaces (which defines the next
      interface index) was set to char. This type can be (depending on the
      architecture) either signed (limiting batman-adv to 127 active slave
      interfaces) or unsigned (limiting batman-adv to 255 active slave
      interfaces).
      
      This limit was not correctly checked when an interface was enabled and thus
      an overflow happened. This was only catched on systems with the signed char
      type when the B.A.T.M.A.N. IV code tried to resize its counter arrays with
      a negative size.
      
      The if_num interface index was only a s16 and therefore significantly
      smaller than the ifindex (int) used by the code net code.
      
      Both &batadv_hard_iface->if_num and &batadv_priv->num_ifaces must be
      (unsigned) int to support the same number of slave interfaces as the net
      core code. And the interface activation code must check the number of
      active slave interfaces to avoid integer overflows.
      
      Fixes: c6c8fea2 ("net: Add batman-adv meshing protocol")
      Signed-off-by: NSven Eckelmann <sven@narfation.org>
      Signed-off-by: NSimon Wunderlich <sw@simonwunderlich.de>
      f22e0893
    • S
      batman-adv: Ignore invalid batadv_iv_gw during netlink send · 10d57028
      Sven Eckelmann 提交于
      The function batadv_iv_gw_dump stops the processing loop when
      batadv_iv_gw_dump_entry returns a non-0 return code. This should only
      happen when the buffer is full. Otherwise, an empty message may be
      returned by batadv_gw_dump. This empty message will then stop the netlink
      dumping of gateway entries. At worst, not a single entry is returned to
      userspace even when plenty of possible gateways exist.
      
      Fixes: efb766af ("batman-adv: add B.A.T.M.A.N. IV bat_gw_dump implementations")
      Signed-off-by: NSven Eckelmann <sven.eckelmann@openmesh.com>
      Signed-off-by: NSimon Wunderlich <sw@simonwunderlich.de>
      10d57028
  9. 22 12月, 2017 1 次提交
  10. 16 12月, 2017 5 次提交
  11. 04 12月, 2017 1 次提交
  12. 28 9月, 2017 1 次提交
  13. 29 7月, 2017 2 次提交
  14. 16 6月, 2017 1 次提交
    • J
      networking: introduce and use skb_put_data() · 59ae1d12
      Johannes Berg 提交于
      A common pattern with skb_put() is to just want to memcpy()
      some data into the new space, introduce skb_put_data() for
      this.
      
      An spatch similar to the one for skb_put_zero() converts many
      of the places using it:
      
          @@
          identifier p, p2;
          expression len, skb, data;
          type t, t2;
          @@
          (
          -p = skb_put(skb, len);
          +p = skb_put_data(skb, data, len);
          |
          -p = (t)skb_put(skb, len);
          +p = skb_put_data(skb, data, len);
          )
          (
          p2 = (t2)p;
          -memcpy(p2, data, len);
          |
          -memcpy(p, data, len);
          )
      
          @@
          type t, t2;
          identifier p, p2;
          expression skb, data;
          @@
          t *p;
          ...
          (
          -p = skb_put(skb, sizeof(t));
          +p = skb_put_data(skb, data, sizeof(t));
          |
          -p = (t *)skb_put(skb, sizeof(t));
          +p = skb_put_data(skb, data, sizeof(t));
          )
          (
          p2 = (t2)p;
          -memcpy(p2, data, sizeof(*p));
          |
          -memcpy(p, data, sizeof(*p));
          )
      
          @@
          expression skb, len, data;
          @@
          -memcpy(skb_put(skb, len), data, len);
          +skb_put_data(skb, data, len);
      
      (again, manually post-processed to retain some comments)
      Reviewed-by: NStephen Hemminger <stephen@networkplumber.org>
      Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      59ae1d12
  15. 23 5月, 2017 2 次提交
  16. 26 3月, 2017 1 次提交
  17. 05 3月, 2017 1 次提交
    • S
      batman-adv: Initialize gw sel_class via batadv_algo · 1a9070ec
      Sven Eckelmann 提交于
      The gateway selection class variable is shared between different algorithm
      versions. But the interpretation of the content is algorithm specific. The
      initialization is therefore also algorithm specific.
      
      But this was implemented incorrectly and the initialization for BATMAN_V
      always overwrote the value previously written for BATMAN_IV. This could
      only be avoided when BATMAN_V was disabled during compile time.
      
      Using a special batadv_algo hook for this initialization avoids this
      problem.
      
      Fixes: 50164d8f ("batman-adv: B.A.T.M.A.N. V - implement GW selection logic")
      Signed-off-by: NSven Eckelmann <sven@narfation.org>
      Signed-off-by: NSimon Wunderlich <sw@simonwunderlich.de>
      1a9070ec
  18. 26 1月, 2017 1 次提交
  19. 09 11月, 2016 3 次提交
    • L
      batman-adv: fix rare race conditions on interface removal · 9b4aec64
      Linus Lüssing 提交于
      In rare cases during shutdown the following general protection fault can
      happen:
      
        general protection fault: 0000 [#1] SMP
        Modules linked in: batman_adv(O-) [...]
        CPU: 3 PID: 1714 Comm: rmmod Tainted: G           O    4.6.0-rc6+ #1
        [...]
        Call Trace:
         [<ffffffffa0363294>] batadv_hardif_disable_interface+0x29a/0x3a6 [batman_adv]
         [<ffffffffa0373db4>] batadv_softif_destroy_netlink+0x4b/0xa4 [batman_adv]
         [<ffffffff813b52f3>] __rtnl_link_unregister+0x48/0x92
         [<ffffffff813b9240>] rtnl_link_unregister+0xc1/0xdb
         [<ffffffff8108547c>] ? bit_waitqueue+0x87/0x87
         [<ffffffffa03850d2>] batadv_exit+0x1a/0xf48 [batman_adv]
         [<ffffffff810c26f9>] SyS_delete_module+0x136/0x1b0
         [<ffffffff8144dc65>] entry_SYSCALL_64_fastpath+0x18/0xa8
         [<ffffffff8108aaca>] ? trace_hardirqs_off_caller+0x37/0xa6
        Code: 89 f7 e8 21 bd 0d e1 4d 85 e4 75 0e 31 f6 48 c7 c7 50 d7 3b a0 e8 50 16 f2 e0 49 8b 9c 24 28 01 00 00 48 85 db 0f 84 b2 00 00 00 <48> 8b 03 4d 85 ed 48 89 45 c8 74 09 4c 39 ab f8 00 00 00 75 1c
        RIP  [<ffffffffa0371852>] batadv_purge_outstanding_packets+0x1c8/0x291 [batman_adv]
         RSP <ffff88001da5fd78>
        ---[ end trace 803b9bdc6a4a952b ]---
        Kernel panic - not syncing: Fatal exception in interrupt
        Kernel Offset: disabled
        ---[ end Kernel panic - not syncing: Fatal exception in interrupt
      
      It does not happen often, but may potentially happen when frequently
      shutting down and reinitializing an interface. With some carefully
      placed msleep()s/mdelay()s it can be reproduced easily.
      
      The issue is, that on interface removal, any still running worker thread
      of a forwarding packet will race with the interface purging routine to
      free a forwarding packet. Temporarily giving up a spin-lock to be able
      to sleep in the purging routine is not safe.
      
      Furthermore, there is a potential general protection fault not just for
      the purging side shown above, but also on the worker side: Temporarily
      removing a forw_packet from the according forw_{bcast,bat}_list will make
      it impossible for the purging routine to catch and cancel it.
      
       # How this patch tries to fix it:
      
      With this patch we split the queue purging into three steps: Step 1),
      removing forward packets from the queue of an interface and by that
      claim it as our responsibility to free.
      
      Step 2), we are either lucky to cancel a pending worker before it starts
      to run. Or if it is already running, we wait and let it do its thing,
      except two things:
      
      Through the claiming in step 1) we prevent workers from a) re-arming
      themselves. And b) prevent workers from freeing packets which we still
      hold in the interface purging routine.
      
      Finally, step 3, we are sure that no forwarding packets are pending or
      even running anymore on the interface to remove. We can then safely free
      the claimed forwarding packets.
      Signed-off-by: NLinus Lüssing <linus.luessing@c0d3.blue>
      Signed-off-by: NSven Eckelmann <sven@narfation.org>
      Signed-off-by: NSimon Wunderlich <sw@simonwunderlich.de>
      9b4aec64
    • S
      batman-adv: Cache the type of wifi device for each hardif · 10b1bbb4
      Sven Eckelmann 提交于
      batman-adv is requiring the type of wifi device in different contexts. Some
      of them can take the rtnl semaphore and some of them already have the
      semaphore taken. But even others don't allow that the semaphore will be
      taken.
      
      The data has to be retrieved when the hardif is added to batman-adv because
      some of the wifi information for an hardif will only be available with rtnl
      lock. It can then be cached in the batadv_hard_iface and the functions
      is_wifi_netdev and is_cfg80211_netdev can just compare the correct bits
      without imposing extra locking requirements.
      Signed-off-by: NSven Eckelmann <sven.eckelmann@open-mesh.com>
      Signed-off-by: NSimon Wunderlich <sw@simonwunderlich.de>
      10b1bbb4
    • S
      batman-adv: Consume skb in receive handlers · b91a2543
      Sven Eckelmann 提交于
      Receiving functions in Linux consume the supplied skbuff. Doing the same in
      the batadv_rx_handler functions makes the behavior more similar to the rest
      of the Linux network code.
      Signed-off-by: NSven Eckelmann <sven@narfation.org>
      Signed-off-by: NSimon Wunderlich <sw@simonwunderlich.de>
      b91a2543
  20. 30 10月, 2016 1 次提交
  21. 19 10月, 2016 1 次提交
  22. 09 8月, 2016 8 次提交
  23. 04 7月, 2016 1 次提交