Basic Multicast Optimizations
This is the third revision of the basic multicast optimization patches. It includes one functional and some compat fixes, and some style improvements, thanks to Simons feedback:
PATCHv3 1/3:
* the pmc_rcu functions got removed - they weren't actually used in the submitted revision - so there's no more patch for net to export for_each_pmc_rcu() needed anymore. Should also fix Simon's compat error.
* Compat code for netdev_for_each_mc_addr() added.
(I needed to introduce a batadv_hw_addr because I wasn't able to achieve backwards compatibility with a netdev_hw_addr - my "official reasoning" will be that netdev_hw_addr is unnecessarily bloated, struct batadv_hw_addr has just the right size to do the job)
* Compat fix for IFF_BRIDGE_PORT
* Removed primary_if->soft_iface in batadv_mcast_mla_tt_update() as we can always use bat_priv->soft_iface instead.
PATCHv3 2/3
* Renamed num_non_aware to a more specific num_no_mla - because we will need things like a num_no_tracker for instance with the multicast tracker feature in the future.
* Fixed removal of orig_node's without BATADV_MCAST_LISTENER_ANNOUNCEMENT flag, update num_no_mla properly now.
PATCHv3 3/3
* Renamed batadv_mcast_flood() to batadv_mcast_forw_mode() because it does not only show whether to flood or not (=drop), but also whether to forward via unicast. In the future with the multicast tracker feature a fourth return value is going to be added, making the name "batadv_mcast_flood()" even less fitting.
* Simon's style suggestions for batadv_mcast_forw_mode() and batadv_interface_tx().
* batadv_mcast_forw_mode() now returns an enum (thanks to Marek and Antonio for the suggestion).
I did not change:
Quoted 2 lines
I don't quite understand why you return -1, maybe the packet could still be forwarded even if it could not be pulled?
Because if it returns -1 then something is wrong, for instance we could be out of memory. If we are out of memory then we probably won't be able to forward any packet. Also we shouldn't allocate any more memory for one thing but I think it is also better to drop/free packets to save some memory to increase the possibility of the system to recover without crashing.
Cheers, Linus
PATCH 1/3 batman-adv: Multicast Listener Announcements via Translation Table
With this patch a node which has no bridge interface on top of its soft interface announces its local multicast listeners via the translation table.
--- Makefile | 2 + Makefile.kbuild | 1 + compat.h | 20 ++++- gen-compat-autoconf.sh | 1 + main.c | 6 ++ main.h | 1 + multicast.c | 209 ++++++++++++++++++++++++++++++++++++++++++++++++ multicast.h | 43 ++++++++++ soft-interface.c | 3 + sysfs.c | 6 ++ translation-table.c | 22 ++++- types.h | 12 +++ 12 files changed, 321 insertions(+), 5 deletions(-) create mode 100644 multicast.c create mode 100644 multicast.h
Makefile +2 -0
@@ -27,6 +27,8 @@ export CONFIG_BATMAN_ADV_BLA=y export CONFIG_BATMAN_ADV_DAT=y # B.A.T.M.A.N network coding (catwoman): export CONFIG_BATMAN_ADV_NC=n +# B.A.T.M.A.N. multicast optimizations: +export CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS=y PWD:=$(shell pwd) KERNELPATH ?= /lib/modules/$(shell uname -r)/build
Makefile.kbuild +1 -0
@@ -38,3 +38,4 @@ batman-adv-y += send.o batman-adv-y += soft-interface.o batman-adv-y += sysfs.o batman-adv-y += translation-table.o +batman-adv-$(CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS) += multicast.o
compat.h +19 -1
@@ -103,13 +103,31 @@ static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,#define pr_warn pr_warning +#undef netdev_for_each_mc_addr +#define netdev_for_each_mc_addr (mclist, dev) \ + for (mclist = (struct bat_dev_addr_list *)dev->mc_list; mclist; \ + mclist = (struct bat_dev_addr_list *)mclist->next) + +/* Note, that this breaks the usage of the normal 'struct netdev_hw_addr' +* for kernels < 2.6.35 in batman-adv! +*/ +#define netdev_hw_addr batadv_dev_addr_list +struct batadv_dev_addr_list { +struct dev_addr_list *next; +u8 addr[MAX_ADDR_LEN ]; +u8 da_addrlen; +u8 da_synced; +int da_users; +int da_gusers; +}; +#endif /* < KERNEL_VERSION(2, 6, 35) */ #if LINUX_VERSION_CODE <KERNEL_VERSION (2 ,6 ,36 )#define __rcu -#define IFF_BRIDGE_PORT 0 || (hard_iface->net_dev->br_port ? 1 : 0) +#define IFF_BRIDGE_PORT 0 || (soft_iface->br_port ? 1 : 0) struct kernel_param_ops {/* Returns 0, or -errno. arg is in kp->arg. */
gen-compat-autoconf.sh +1 -0
@@ -39,6 +39,7 @@ gen_config() { gen_config 'CONFIG_BATMAN_ADV_DEBUG' ${CONFIG_BATMAN_ADV_DEBUG:="n"} >> "${TMP}" gen_config 'CONFIG_BATMAN_ADV_BLA' ${CONFIG_BATMAN_ADV_BLA:="y"} >> "${TMP}" gen_config 'CONFIG_BATMAN_ADV_DAT' ${CONFIG_BATMAN_ADV_DAT:="y"} >> "${TMP}" +gen_config 'CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS' ${CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS:="y"} >> "${TMP}" gen_config 'CONFIG_BATMAN_ADV_NC' ${CONFIG_BATMAN_ADV_NC:="n"} >> "${TMP}" # only regenerate compat-autoconf.h when config was changed
main.c +6 -0
@@ -32,6 +32,7 @@#include "gateway_client.h" #include "bridge_loop_avoidance.h" #include "distributed-arp-table.h" +#include "multicast.h" #include "gateway_common.h" #include "hash.h" #include "bat_algo.h"
@@ -115,6 +116,9 @@ int batadv_mesh_init(struct net_device *soft_iface)INIT_LIST_HEAD (&bat_priv->tt.changes_list);INIT_LIST_HEAD (&bat_priv->tt.req_list);INIT_LIST_HEAD (&bat_priv->tt.roam_list); +#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS +INIT_LIST_HEAD (&bat_priv->mcast.mla_list); +#endif INIT_HLIST_HEAD (&bat_priv->tvlv.container_list);INIT_HLIST_HEAD (&bat_priv->tvlv.handler_list);
@@ -168,6 +172,8 @@ void batadv_mesh_free(struct net_device *soft_iface)batadv_dat_free (bat_priv);batadv_bla_free (bat_priv); +batadv_mcast_free (bat_priv); +/* Free the TT and the originator tables only after having terminated * all the other depending components which may use these structures for * their purposes.
main.h +1 -0
@@ -164,6 +164,7 @@ enum batadv_uev_type {#include <linux/percpu.h> #include <linux/slab.h> #include <net/sock.h> /* struct sock */ +#include <net/addrconf.h> /* ipv6 address stuff */ #include <net/rtnetlink.h> #include <linux/jiffies.h> #include <linux/seq_file.h>
multicast.c new file +209 -0
209 lines not on this page · raw message
multicast.h new file +43 -0
43 lines not on this page · raw message
soft-interface.c +3 -0
@@ -456,6 +456,9 @@ static int batadv_softif_init_late(struct net_device *dev)#ifdef CONFIG_BATMAN_ADV_DAT atomic_set (&bat_priv->distributed_arp_table,1 );#endif +#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS +atomic_set (&bat_priv->mcast_group_awareness,1 ); +#endif atomic_set (&bat_priv->ap_isolation,0 );atomic_set (&bat_priv->gw_mode,BATADV_GW_MODE_OFF );atomic_set (&bat_priv->gw_sel_class,20 );
sysfs.c +6 -0
@@ -369,6 +369,9 @@ BATADV_ATTR_SIF_UINT(gw_sel_class, S_IRUGO | S_IWUSR, 1, BATADV_TQ_MAX_VALUE, batadv_post_gw_deselect); static BATADV_ATTR(gw_bandwidth, S_IRUGO | S_IWUSR, batadv_show_gw_bwidth, batadv_store_gw_bwidth); +#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS +BATADV_ATTR_SIF_BOOL (mcast_group_awareness,S_IRUGO |S_IWUSR ,NULL ); +#endif #ifdef CONFIG_BATMAN_ADV_DEBUG BATADV_ATTR_SIF_UINT (log_level,S_IRUGO |S_IWUSR ,0 ,BATADV_DBG_ALL ,NULL );#endif
@@ -386,6 +389,9 @@ static struct batadv_attribute *batadv_mesh_attrs[] = {#ifdef CONFIG_BATMAN_ADV_DAT &batadv_attr_distributed_arp_table,#endif +#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS + &batadv_attr_mcast_group_awareness, +#endif &batadv_attr_fragmentation, &batadv_attr_ap_isolation, &batadv_attr_routing_algo,
translation-table.c +18 -4
@@ -26,6 +26,7 @@#include "originator.h" #include "routing.h" #include "bridge_loop_avoidance.h" +#include "multicast.h" #include <linux/crc32c.h>
@@ -277,14 +278,16 @@ void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr, {struct batadv_priv *bat_priv =netdev_priv (soft_iface);struct batadv_tt_local_entry *tt_local; -struct batadv_tt_global_entry *tt_global; +struct batadv_tt_global_entry *tt_global =NULL ;struct hlist_head *head;struct batadv_tt_orig_list_entry *orig_entry;int hash_added;bool roamed_back = false; tt_local =batadv_tt_local_hash_find (bat_priv, addr); - tt_global =batadv_tt_global_hash_find (bat_priv, addr); + +if (!is_multicast_ether_addr (addr)) + tt_global =batadv_tt_global_hash_find (bat_priv, addr);if (tt_local) { tt_local->last_seen = jiffies;
@@ -335,8 +338,11 @@ void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr, tt_local->last_seen = jiffies; tt_local->common.added_at = tt_local->last_seen; -/* the batman interface mac address should never be purged */ -if (batadv_compare_eth (addr, soft_iface->dev_addr)) +/* the batman interface mac and multicast addresses should never be +* purged +*/ +if (batadv_compare_eth (addr, soft_iface->dev_addr) || +is_multicast_ether_addr (addr)) tt_local->common.flags |=BATADV_TT_CLIENT_NOPURGE ; hash_added = batadv_hash_add(bat_priv->tt.local_hash, batadv_compare_tt,
@@ -922,6 +928,11 @@ add_orig_entry: ret = true; out_remove: +/* Do not remove multicast addresses from the local hash on +* global additions +*/ +if (is_multicast_ether_addr (tt_addr)) + goto out;/* remove address from local hash if present */ local_flags = batadv_tt_local_remove(bat_priv, tt_addr,
@@ -2348,6 +2359,9 @@ void batadv_tt_local_commit_changes(struct batadv_priv *bat_priv) {uint16_t changed_num =0 ; +/* Update multicast addresses in local translation table */ +batadv_mcast_mla_tt_update (bat_priv); +if (atomic_read (&bat_priv->tt.local_changes) <1 ) {if (!batadv_atomic_dec_not_zero (&bat_priv->tt.ogm_append_cnt))batadv_tt_tvlv_container_update (bat_priv);
types.h +12 -0
@@ -501,6 +501,12 @@ struct batadv_priv_dat { };#endif +#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS +struct batadv_priv_mcast { +struct list_head mla_list; +}; +#endif +/** * struct batadv_priv_nc - per mesh interface network coding private data * @work: work queue callback item for cleanup
@@ -591,6 +597,9 @@ struct batadv_priv {#ifdef CONFIG_BATMAN_ADV_DAT atomic_t distributed_arp_table;#endif +#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS +atomic_t mcast_group_awareness; +#endif atomic_t gw_mode;atomic_t gw_sel_class;atomic_t orig_interval;
@@ -625,6 +634,9 @@ struct batadv_priv {#ifdef CONFIG_BATMAN_ADV_DAT struct batadv_priv_dat dat;#endif +#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS +struct batadv_priv_mcast mcast; +#endif #ifdef CONFIG_BATMAN_ADV_NC atomic_t network_coding;struct batadv_priv_nc nc;
Signature · 1 line
1.7.10.4
PATCH 2/3 batman-adv: Announce new capability via multicast TVLV
In reply to Linus LüssingIf the soft interface of a node is not part of a bridge then a node announces a new multicast TVLV: The according flag (BATADV_MCAST_LISTENER_ANNOUNCEMENT) signalizes that this node is announcing all of its multicast listeners via the translation table infrastructure. More precisely, all multicast listeners of scope greater than link-local for IPv4 and of scope greater
or equal to link-local for IPv6.
--- main.c | 4 ++++ multicast.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- multicast.h | 14 +++++++++++ originator.c | 6 +++++ packet.h | 7 ++++++ soft-interface.c | 1 + types.h | 4 ++++ 7 files changed, 102 insertions(+), 2 deletions(-)
main.c +4 -0
@@ -145,6 +145,10 @@ int batadv_mesh_init(struct net_device *soft_iface)if (ret <0 ) goto err; + ret =batadv_mcast_init (bat_priv); +if (ret <0 ) + goto err; + ret =batadv_gw_init (bat_priv);if (ret <0 ) goto err;
multicast.c +66 -2
96 lines not on this page · raw message
multicast.h +14 -0
@@ -24,8 +24,12 @@void batadv_mcast_mla_tt_update (struct batadv_priv *bat_priv); +int batadv_mcast_init (struct batadv_priv *bat_priv); +void batadv_mcast_free (struct batadv_priv *bat_priv); +void batadv_mcast_purge_orig (struct batadv_orig_node *orig_node); +#else static inline void batadv_mcast_mla_tt_update (struct batadv_priv *bat_priv)
@@ -33,11 +37,21 @@ static inline void batadv_mcast_mla_tt_update(struct batadv_priv *bat_priv)return ; } +static inline int batadv_mcast_init (struct batadv_priv *bat_priv) +{ +return 0 ; +} +static inline void batadv_mcast_free (struct batadv_priv *bat_priv) {return ; } +static inline void batadv_mcast_purge_orig (struct batadv_orig_node *orig_node) +{ +return ; +} +#endif /* CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS */ #endif /* _NET_BATMAN_ADV_MULTICAST_H_ */
originator.c +6 -0
@@ -29,6 +29,7 @@#include "bridge_loop_avoidance.h" #include "network-coding.h" #include "fragmentation.h" +#include "multicast.h" /* hash class keys */ static struct lock_class_key batadv_orig_hash_lock_class_key;
@@ -143,6 +144,8 @@ static void batadv_orig_node_free_rcu(struct rcu_head *rcu)spin_unlock_bh (&orig_node->neigh_list_lock); +batadv_mcast_purge_orig (orig_node); +/* Free nc_nodes */ batadv_nc_purge_orig (orig_node->bat_priv, orig_node,NULL );
@@ -258,6 +261,9 @@ struct batadv_orig_node *batadv_get_orig_node(struct batadv_priv *bat_priv, reset_time = jiffies -1 -msecs_to_jiffies (BATADV_RESET_PROTECTION_MS ); orig_node->bcast_seqno_reset = reset_time; orig_node->batman_seqno_reset = reset_time; +#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS + orig_node->mcast_flags =BATADV_MCAST_LISTENER_ANNOUNCEMENT ; +#endif atomic_set (&orig_node->bond_candidates,0 );
packet.h +7 -0
@@ -91,6 +91,11 @@ enum batadv_icmp_packettype { BATADV_PARAMETER_PROBLEM = 12, }; +/* multicast capabilities */ +enum batadv_mcast_flags { +BATADV_MCAST_LISTENER_ANNOUNCEMENT =BIT (0 ), +}; +/* tt data subtypes */ #define BATADV_TT_DATA_TYPE_MASK 0x0F
@@ -137,6 +142,7 @@ enum batadv_bla_claimframe {* @BATADV_TVLV_NC: network coding tvlv * @BATADV_TVLV_TT: translation table tvlv * @BATADV_TVLV_ROAM: roaming advertisement tvlv +* @BATADV_TVLV_MCAST: multicast capability tvlv */ enum batadv_tvlv_type {BATADV_TVLV_GW =0x01 ,
@@ -144,6 +150,7 @@ enum batadv_tvlv_type {BATADV_TVLV_NC =0x03 ,BATADV_TVLV_TT =0x04 ,BATADV_TVLV_ROAM =0x05 , + BATADV_TVLV_MCAST = 0x06, };/* the destination hardware field in the ARP frame is used to
soft-interface.c +1 -0
@@ -458,6 +458,7 @@ static int batadv_softif_init_late(struct net_device *dev)#endif #ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS atomic_set (&bat_priv->mcast_group_awareness,1 ); +atomic_set (&bat_priv->mcast.num_no_mla,0 );#endif atomic_set (&bat_priv->ap_isolation,0 );atomic_set (&bat_priv->gw_mode,BATADV_GW_MODE_OFF );
types.h +4 -0
@@ -163,6 +163,9 @@ struct batadv_orig_node {unsigned long last_seen;unsigned long bcast_seqno_reset;unsigned long batman_seqno_reset; +#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS +uint8_t mcast_flags; +#endif uint8_t capabilities;atomic_t last_ttvn;uint32_t tt_crc;
@@ -504,6 +507,7 @@ struct batadv_priv_dat {#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS struct batadv_priv_mcast {struct list_head mla_list; +atomic_t num_no_mla; };#endif
Signature · 1 line
1.7.10.4
PATCH 3/3 batman-adv: Modified forwarding behaviour for multicast packets
In reply to Linus LüssingWith this patch a multicast packet is not always simply flooded anymore, the bevahiour 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 (BATADV_MCAST_LISTENER_ANNOUNCEMENT) then an IPv6 multicast packet with a destination of IPv6 link-local scope 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.
--- multicast.c | 49 ++++++++++++++++++++++++++++++++++++++ multicast.h | 23 ++++++++++++++++++ soft-interface.c | 11 +++++++++ translation-table.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ translation-table.h | 1 + 5 files changed, 150 insertions(+)
multicast.c +49 -0
@@ -21,6 +21,7 @@#include "originator.h" #include "hard-interface.h" #include "translation-table.h" +#include "multicast.h" struct batadv_hw_addr {struct list_head list;
@@ -209,6 +210,54 @@ out: }/** +* batadv_mcast_forw_mode - check on how to forward a multicast packet +* @skb: The multicast packet to check +* @bat_priv: the bat priv with all the soft interface information +* +* Return the forwarding mode as enum batadv_forw_mode. +*/ +enum batadv_forw_mode +batadv_mcast_forw_mode (struct sk_buff *skb,struct batadv_priv *bat_priv) +{ +struct ethhdr *ethhdr = (struct ethhdr *)(skb->data); +struct ipv6hdr *ip6hdr; +int count; + +if (!atomic_read (&bat_priv->mcast_group_awareness)) +return BATADV_FORW_ALL ; + +if (atomic_read (&bat_priv->mcast.num_no_mla)) +return BATADV_FORW_ALL ; + +if (ntohs (ethhdr->h_proto) !=ETH_P_IPV6 ) +return BATADV_FORW_ALL ; + +/* We might fail due to out-of-memory -> drop it */ +if (!pskb_may_pull (skb,sizeof (*ethhdr) +sizeof (*ip6hdr))) +return BATADV_FORW_NONE ; + + ip6hdr =ipv6_hdr (skb); + +/* TODO: Implement Multicast Router Discovery, then add +* scope >= IPV6_ADDR_SCOPE_LINKLOCAL, too +*/ +if (IPV6_ADDR_MC_SCOPE (&ip6hdr->daddr) != +IPV6_ADDR_SCOPE_LINKLOCAL ) +return BATADV_FORW_ALL ; + + count =batadv_tt_global_hash_count (bat_priv, ethhdr->h_dest); + +switch (count) { +case 0 : +return BATADV_FORW_NONE ; +case 1 : +return BATADV_FORW_SINGLE ; +default : +return BATADV_FORW_ALL ; + } +} + +/** * batadv_mcast_tvlv_ogm_handler_v1 - process incoming multicast tvlv container * @bat_priv: the bat priv with all the soft interface information * @orig: the orig_node of the ogm
multicast.h +23 -0
@@ -20,10 +20,27 @@#ifndef _NET_BATMAN_ADV_MULTICAST_H_#define _NET_BATMAN_ADV_MULTICAST_H_ +/** +* batadv_forw_mode - the way a packet should be forwarded as +* @BATADV_FORW_ALL: forward the packet to all nodes +* (currently via classic flooding) +* @BATADV_FORW_SINGLE: forward the packet to a single node +* (currently via the BATMAN_IV unicast routing protocol) +* @BATADV_FORW_NONE: don't forward, drop it +*/ +enum batadv_forw_mode { +BATADV_FORW_ALL , +BATADV_FORW_SINGLE , +BATADV_FORW_NONE , +}; +#ifdef CONFIG_BATMAN_ADV_MCAST_OPTIMIZATIONS void batadv_mcast_mla_tt_update (struct batadv_priv *bat_priv); +enum batadv_forw_mode +batadv_mcast_forw_mode (struct sk_buff *skb,struct batadv_priv *bat_priv); +int batadv_mcast_init (struct batadv_priv *bat_priv);void batadv_mcast_free (struct batadv_priv *bat_priv);
@@ -37,6 +54,12 @@ static inline void batadv_mcast_mla_tt_update(struct batadv_priv *bat_priv)return ; } +static inline batadv_forw_mode +batadv_mcast_forw_mode (struct sk_buff *skb,struct batadv_priv *bat_priv) +{ +return BATADV_FORW_ALL ; +} +static inline int batadv_mcast_init (struct batadv_priv *bat_priv) {return 0 ;
soft-interface.c +11 -0
@@ -34,6 +34,7 @@#include <linux/ethtool.h> #include <linux/etherdevice.h> #include <linux/if_vlan.h> +#include "multicast.h" #include "bridge_loop_avoidance.h" #include "network-coding.h"
@@ -156,6 +157,7 @@ static int batadv_interface_tx(struct sk_buff *skb,bool do_bcast = false;uint32_t seqno;unsigned long brd_delay =1 ; +enum batadv_forw_mode mode;if (atomic_read (&bat_priv->mesh_state) !=BATADV_MESH_ACTIVE ) goto dropped;
@@ -218,6 +220,15 @@ static int batadv_interface_tx(struct sk_buff *skb,default :break ; } + +if (do_bcast && !is_broadcast_ether_addr (ethhdr->h_dest)) { + mode =batadv_mcast_forw_mode (skb, bat_priv); +if (mode ==BATADV_FORW_NONE ) + goto dropped; + +if (mode ==BATADV_FORW_SINGLE ) + do_bcast = false; + } }/* ethernet packet should be broadcasted */
translation-table.c +66 -0
72 lines not on this page · raw message
translation-table.h +1 -0
@@ -31,6 +31,7 @@ int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset);void batadv_tt_global_del_orig (struct batadv_priv *bat_priv,struct batadv_orig_node *orig_node,const char *message); +int batadv_tt_global_hash_count (struct batadv_priv *bat_priv,const void *data);struct batadv_orig_node *batadv_transtable_search (struct batadv_priv *bat_priv,const uint8_t *src,const uint8_t *addr);
Signature · 1 line
1.7.10.4
Hrm, forgot to add the v3 an the patch naming. And forgot to actually add
-static inline batadv_forw_mode
+static inline enum batadv_forw_mode
to the according commit.
Will send a v4 in a sec.
Cheers, Linus
Quoted 46 lines · Linus Lüssing
This is the third revision of the basic multicast optimization patches. It includes one functional and some compat fixes, and some style improvements, thanks to Simons feedback:
PATCHv3 1/3:
* thepmc_rcufunctions got removed - they weren't actually used in the submitted revision - so there's no more patch for net to exportfor_each_pmc_rcu()needed anymore. Should also fix Simon's compat error.
* Compat code fornetdev_for_each_mc_addr()added.
(I needed to introduce abatadv_hw_addrbecause I wasn't able to achieve backwards compatibility with anetdev_hw_addr- my "official reasoning" will be thatnetdev_hw_addris unnecessarily bloated, structbatadv_hw_addrhas just the right size to do the job)
* Compat fix forIFF_BRIDGE_PORT
* Removedprimary_if->soft_ifaceinbatadv_mcast_mla_tt_update()as we can always usebat_priv->soft_ifaceinstead.PATCHv3 2/3
* Renamednum_non_awareto a more specificnum_no_mla- because we will need things like anum_no_trackerfor instance with the multicast tracker feature in the future.
* Fixed removal of orig_node's withoutBATADV_MCAST_LISTENER_ANNOUNCEMENTflag, updatenum_no_mlaproperly now.PATCHv3 3/3
* Renamedbatadv_mcast_flood()tobatadv_mcast_forw_mode()because it does not only show whether to flood or not (=drop), but also whether to forward via unicast. In the future with the multicast tracker feature a fourth return value is going to be added, making the name "batadv_mcast_flood()" even less fitting.
* Simon's style suggestions forbatadv_mcast_forw_mode()andbatadv_interface_tx().
*batadv_mcast_forw_mode()now returns an enum (thanks to Marek and Antonio for the suggestion).I did not change:
Quoted 2 lines
I don't quite understand why you return -1, maybe the packet could still be forwarded even if it could not be pulled?
Because if it returns -1 then something is wrong, for instance we could be out of memory. If we are out of memory then we probably won't be able to forward any packet. Also we shouldn't allocate any more memory for one thing but I think it is also better to drop/free packets to save some memory to increase the possibility of the system to recover without crashing.
Cheers, Linus