[07/18] batman-adv: Route multicast tracker packets
Commit Message
This commit adds the ability to also forward a received multicast
tracker packet (if necessary). It also makes use of the same splitting
methods introduced with one of the previous commits, in case of multiple
next hop destinations.
Signed-off-by: Linus Lüssing <linus.luessing@saxnet.de>
---
hard-interface.c | 5 +++++
routing.c | 20 ++++++++++++++++++++
routing.h | 1 +
3 files changed, 26 insertions(+), 0 deletions(-)
@@ -631,6 +631,11 @@ static int batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
ret = recv_bcast_packet(skb, batman_if);
break;
+ /* multicast tracker packet */
+ case BAT_MCAST_TRACKER:
+ ret = recv_mcast_tracker_packet(skb, batman_if);
+ break;
+
/* vis packet */
case BAT_VIS:
ret = recv_vis_packet(skb, batman_if);
@@ -35,6 +35,7 @@
#include "gateway_common.h"
#include "gateway_client.h"
#include "unicast.h"
+#include "multicast.h"
void slide_own_bcast_window(struct batman_if *batman_if)
{
@@ -1496,6 +1497,25 @@ out:
return ret;
}
+int recv_mcast_tracker_packet(struct sk_buff *skb, struct batman_if *recv_if)
+{
+ struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
+ int hdr_size = sizeof(struct mcast_tracker_packet);
+
+ /* keep skb linear */
+ if (skb_linearize(skb) < 0)
+ return NET_RX_DROP;
+
+ if (check_unicast_packet(skb, hdr_size) < 0)
+ return NET_RX_DROP;
+
+ route_mcast_tracker_packet(skb, bat_priv);
+
+ dev_kfree_skb(skb);
+
+ return NET_RX_SUCCESS;
+}
+
int recv_vis_packet(struct sk_buff *skb, struct batman_if *recv_if)
{
struct vis_packet *vis_packet;
@@ -38,6 +38,7 @@ int recv_icmp_packet(struct sk_buff *skb, struct batman_if *recv_if);
int recv_unicast_packet(struct sk_buff *skb, struct batman_if *recv_if);
int recv_ucast_frag_packet(struct sk_buff *skb, struct batman_if *recv_if);
int recv_bcast_packet(struct sk_buff *skb, struct batman_if *recv_if);
+int recv_mcast_tracker_packet(struct sk_buff *skb, struct batman_if *recv_if);
int recv_vis_packet(struct sk_buff *skb, struct batman_if *recv_if);
int recv_bat_packet(struct sk_buff *skb, struct batman_if *recv_if);
struct neigh_node *find_router(struct bat_priv *bat_priv,