batman-adv: Add multicast-to-unicast support for multiple targets
With this patch multicast packets with a limited number of destinations (current default: 16) will be split and transmitted by the originator as individual unicast transmissions. Wifi broadcasts with their low bitrate are still a costly undertaking. In a mesh network this cost multiplies with the overall size of the mesh network. Therefore using multiple unicast transmissions instead of broadcast flooding is almost always less burdensome for the mesh network. The maximum amount of unicast packets can be configured via the newly introduced multicast_fanout parameter. If this limit is exceeded distribution will fall back to classic broadcast flooding. The multicast-to-unicast conversion is performed on the initial multicast sender node and counts on a final destination node, mesh-wide basis (and not next hop, neighbor node basis). Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue> Signed-off-by: Sven Eckelmann <sven@narfation.org> Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
This commit is contained in:

committed by
Simon Wunderlich

parent
099e6cc158
commit
32e727449c
@@ -197,7 +197,7 @@ static netdev_tx_t batadv_interface_tx(struct sk_buff *skb,
|
||||
unsigned short vid;
|
||||
u32 seqno;
|
||||
int gw_mode;
|
||||
enum batadv_forw_mode forw_mode;
|
||||
enum batadv_forw_mode forw_mode = BATADV_FORW_SINGLE;
|
||||
struct batadv_orig_node *mcast_single_orig = NULL;
|
||||
int network_offset = ETH_HLEN;
|
||||
__be16 proto;
|
||||
@@ -305,7 +305,8 @@ send:
|
||||
if (forw_mode == BATADV_FORW_NONE)
|
||||
goto dropped;
|
||||
|
||||
if (forw_mode == BATADV_FORW_SINGLE)
|
||||
if (forw_mode == BATADV_FORW_SINGLE ||
|
||||
forw_mode == BATADV_FORW_SOME)
|
||||
do_bcast = false;
|
||||
}
|
||||
}
|
||||
@@ -365,6 +366,8 @@ send:
|
||||
ret = batadv_send_skb_unicast(bat_priv, skb,
|
||||
BATADV_UNICAST, 0,
|
||||
mcast_single_orig, vid);
|
||||
} else if (forw_mode == BATADV_FORW_SOME) {
|
||||
ret = batadv_mcast_forw_send(bat_priv, skb, vid);
|
||||
} else {
|
||||
if (batadv_dat_snoop_outgoing_arp_request(bat_priv,
|
||||
skb))
|
||||
@@ -806,6 +809,7 @@ static int batadv_softif_init_late(struct net_device *dev)
|
||||
bat_priv->mcast.querier_ipv6.shadowing = false;
|
||||
bat_priv->mcast.flags = BATADV_NO_FLAGS;
|
||||
atomic_set(&bat_priv->multicast_mode, 1);
|
||||
atomic_set(&bat_priv->multicast_fanout, 16);
|
||||
atomic_set(&bat_priv->mcast.num_want_all_unsnoopables, 0);
|
||||
atomic_set(&bat_priv->mcast.num_want_all_ipv4, 0);
|
||||
atomic_set(&bat_priv->mcast.num_want_all_ipv6, 0);
|
||||
|
Reference in New Issue
Block a user