[v3] batman-adv: send each broadcast only once on non-wireless interfaces
Commit Message
While it makes sense to send each broadcast thrice on 802.11 (WLAN) interfaces
as broadcasts are often unreliable on these, there is no reason to do so on
other interface types.
The increased the overhead can be harmful on low-bandwidth links like VPN
connections over slow internet lines, therefore it is better to reduce the
number of broadcast packets sent on non-wireless links to one.
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
---
v3: fixed typo in commit message
hard-interface.c | 11 +++++++++++
main.h | 5 +++++
send.c | 5 ++++-
types.h | 1 +
4 files changed, 21 insertions(+), 1 deletion(-)
Comments
Hi Matthias,
On Sat, Mar 09, 2013 at 11:40:26AM +0100, Matthias Schiffer wrote:
> @@ -515,6 +515,17 @@ batadv_hardif_add_interface(struct net_device *net_dev)
> INIT_WORK(&hard_iface->cleanup_work,
> batadv_hardif_remove_interface_finish);
>
> + hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT;
> +
> +#if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211)
> + if (net_dev->ieee80211_ptr)
> + hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
> +#if IS_ENABLED(CONFIG_WIRELESS_EXT)
> + else if (net_dev->wireless_handlers)
> + hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
> +#endif
> +#endif
> +
> /* extra reference for return */
> atomic_set(&hard_iface->refcount, 2);
What about re-using batadv_is_wifi_iface() instead of adding the same code here?
:)
batadv_is_wifi_iface() takes an ifindex as parameter and then gets the
net_device by means of dev_get_by_index. You may want to split it up so that you
can avoid the research since you already have the related net_device object.
Cheers,
@@ -515,6 +515,17 @@ batadv_hardif_add_interface(struct net_device *net_dev)
INIT_WORK(&hard_iface->cleanup_work,
batadv_hardif_remove_interface_finish);
+ hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT;
+
+#if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211)
+ if (net_dev->ieee80211_ptr)
+ hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
+#if IS_ENABLED(CONFIG_WIRELESS_EXT)
+ else if (net_dev->wireless_handlers)
+ hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
+#endif
+#endif
+
/* extra reference for return */
atomic_set(&hard_iface->refcount, 2);
@@ -76,6 +76,11 @@
#define BATADV_LOG_BUF_LEN 8192 /* has to be a power of 2 */
+/* number of packets to send for broadcasts on different interface types */
+#define BATADV_NUM_BCASTS_DEFAULT 1
+#define BATADV_NUM_BCASTS_WIRELESS 3
+#define BATADV_NUM_BCASTS_MAX 3
+
/* msecs after which an ARP_REQUEST is sent in broadcast as fallback */
#define ARP_REQ_DELAY 250
/* numbers of originator to contact for any PUT/GET DHT operation */
@@ -260,6 +260,9 @@ static void batadv_send_outstanding_bcast_packet(struct work_struct *work)
if (hard_iface->soft_iface != soft_iface)
continue;
+ if (forw_packet->num_packets >= hard_iface->num_bcasts)
+ continue;
+
/* send a copy of the saved skb */
skb1 = skb_clone(forw_packet->skb, GFP_ATOMIC);
if (skb1)
@@ -271,7 +274,7 @@ static void batadv_send_outstanding_bcast_packet(struct work_struct *work)
forw_packet->num_packets++;
/* if we still have some more bcasts to send */
- if (forw_packet->num_packets < 3) {
+ if (forw_packet->num_packets < BATADV_NUM_BCASTS_MAX) {
_batadv_add_bcast_packet_to_list(bat_priv, forw_packet,
msecs_to_jiffies(5));
return;
@@ -76,6 +76,7 @@ struct batadv_hard_iface {
char if_status;
struct net_device *net_dev;
atomic_t frag_seqno;
+ uint8_t num_bcasts;
struct kobject *hardif_obj;
atomic_t refcount;
struct packet_type batman_adv_ptype;