kernel: backport flow dissector batman-adv support
Improves performance on multicore systems handling batman-adv traffic Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
		@@ -0,0 +1,36 @@
 | 
			
		||||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
 | 
			
		||||
Date: Thu, 21 Dec 2017 10:17:38 +0100
 | 
			
		||||
Subject: [PATCH] batman-adv: Let packet.h include its headers directly
 | 
			
		||||
 | 
			
		||||
The headers used by packet.h should also be included by it directly. main.h
 | 
			
		||||
is currently dealing with it in batman-adv, but this will no longer work
 | 
			
		||||
when this header is moved to include/uapi/linux/.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
 | 
			
		||||
Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
--- a/net/batman-adv/main.h
 | 
			
		||||
+++ b/net/batman-adv/main.h
 | 
			
		||||
@@ -184,10 +184,8 @@ enum batadv_uev_type {
 | 
			
		||||
 
 | 
			
		||||
 /* Kernel headers */
 | 
			
		||||
 
 | 
			
		||||
-#include <linux/bitops.h> /* for packet.h */
 | 
			
		||||
 #include <linux/compiler.h>
 | 
			
		||||
 #include <linux/etherdevice.h>
 | 
			
		||||
-#include <linux/if_ether.h> /* for packet.h */
 | 
			
		||||
 #include <linux/if_vlan.h>
 | 
			
		||||
 #include <linux/jiffies.h>
 | 
			
		||||
 #include <linux/percpu.h>
 | 
			
		||||
--- a/net/batman-adv/packet.h
 | 
			
		||||
+++ b/net/batman-adv/packet.h
 | 
			
		||||
@@ -19,6 +19,8 @@
 | 
			
		||||
 #define _NET_BATMAN_ADV_PACKET_H_
 | 
			
		||||
 
 | 
			
		||||
 #include <asm/byteorder.h>
 | 
			
		||||
+#include <linux/bitops.h>
 | 
			
		||||
+#include <linux/if_ether.h>
 | 
			
		||||
 #include <linux/types.h>
 | 
			
		||||
 
 | 
			
		||||
 #define batadv_tp_is_error(n) ((u8)(n) > 127 ? 1 : 0)
 | 
			
		||||
@@ -0,0 +1,72 @@
 | 
			
		||||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
 | 
			
		||||
Date: Thu, 21 Dec 2017 10:17:39 +0100
 | 
			
		||||
Subject: [PATCH] batman-adv: Remove usage of BIT(x) in packet.h
 | 
			
		||||
 | 
			
		||||
The BIT(x) macro is no longer available for uapi headers because it is
 | 
			
		||||
defined outside of it (linux/bitops.h). The use of it must therefore be
 | 
			
		||||
avoided and replaced by an appropriate other representation.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
 | 
			
		||||
Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
--- a/net/batman-adv/packet.h
 | 
			
		||||
+++ b/net/batman-adv/packet.h
 | 
			
		||||
@@ -19,7 +19,6 @@
 | 
			
		||||
 #define _NET_BATMAN_ADV_PACKET_H_
 | 
			
		||||
 
 | 
			
		||||
 #include <asm/byteorder.h>
 | 
			
		||||
-#include <linux/bitops.h>
 | 
			
		||||
 #include <linux/if_ether.h>
 | 
			
		||||
 #include <linux/types.h>
 | 
			
		||||
 
 | 
			
		||||
@@ -85,9 +84,9 @@ enum batadv_subtype {
 | 
			
		||||
  *     one hop neighbor on the interface where it was originally received.
 | 
			
		||||
  */
 | 
			
		||||
 enum batadv_iv_flags {
 | 
			
		||||
-	BATADV_NOT_BEST_NEXT_HOP   = BIT(0),
 | 
			
		||||
-	BATADV_PRIMARIES_FIRST_HOP = BIT(1),
 | 
			
		||||
-	BATADV_DIRECTLINK          = BIT(2),
 | 
			
		||||
+	BATADV_NOT_BEST_NEXT_HOP   = 1UL << 0,
 | 
			
		||||
+	BATADV_PRIMARIES_FIRST_HOP = 1UL << 1,
 | 
			
		||||
+	BATADV_DIRECTLINK          = 1UL << 2,
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /* ICMP message types */
 | 
			
		||||
@@ -108,9 +107,9 @@ enum batadv_icmp_packettype {
 | 
			
		||||
  * @BATADV_MCAST_WANT_ALL_IPV6: we want all IPv6 multicast packets
 | 
			
		||||
  */
 | 
			
		||||
 enum batadv_mcast_flags {
 | 
			
		||||
-	BATADV_MCAST_WANT_ALL_UNSNOOPABLES	= BIT(0),
 | 
			
		||||
-	BATADV_MCAST_WANT_ALL_IPV4		= BIT(1),
 | 
			
		||||
-	BATADV_MCAST_WANT_ALL_IPV6		= BIT(2),
 | 
			
		||||
+	BATADV_MCAST_WANT_ALL_UNSNOOPABLES	= 1UL << 0,
 | 
			
		||||
+	BATADV_MCAST_WANT_ALL_IPV4		= 1UL << 1,
 | 
			
		||||
+	BATADV_MCAST_WANT_ALL_IPV6		= 1UL << 2,
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /* tt data subtypes */
 | 
			
		||||
@@ -124,10 +123,10 @@ enum batadv_mcast_flags {
 | 
			
		||||
  * @BATADV_TT_FULL_TABLE: contains full table to replace existing table
 | 
			
		||||
  */
 | 
			
		||||
 enum batadv_tt_data_flags {
 | 
			
		||||
-	BATADV_TT_OGM_DIFF   = BIT(0),
 | 
			
		||||
-	BATADV_TT_REQUEST    = BIT(1),
 | 
			
		||||
-	BATADV_TT_RESPONSE   = BIT(2),
 | 
			
		||||
-	BATADV_TT_FULL_TABLE = BIT(4),
 | 
			
		||||
+	BATADV_TT_OGM_DIFF   = 1UL << 0,
 | 
			
		||||
+	BATADV_TT_REQUEST    = 1UL << 1,
 | 
			
		||||
+	BATADV_TT_RESPONSE   = 1UL << 2,
 | 
			
		||||
+	BATADV_TT_FULL_TABLE = 1UL << 4,
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
@@ -135,7 +134,7 @@ enum batadv_tt_data_flags {
 | 
			
		||||
  * @BATADV_VLAN_HAS_TAG: whether the field contains a valid vlan tag or not
 | 
			
		||||
  */
 | 
			
		||||
 enum batadv_vlan_flags {
 | 
			
		||||
-	BATADV_VLAN_HAS_TAG	= BIT(15),
 | 
			
		||||
+	BATADV_VLAN_HAS_TAG	= 1UL << 15,
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /* claim frame types for the bridge loop avoidance */
 | 
			
		||||
@@ -0,0 +1,386 @@
 | 
			
		||||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
 | 
			
		||||
Date: Thu, 21 Dec 2017 10:17:40 +0100
 | 
			
		||||
Subject: [PATCH] batman-adv: Remove kernel fixed width types in packet.h
 | 
			
		||||
 | 
			
		||||
The uapi headers use the __u8/__u16/... version of the fixed width types
 | 
			
		||||
instead of u8/u16/... The use of the latter must be avoided before
 | 
			
		||||
packet.h is copied to include/uapi/linux/.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
 | 
			
		||||
Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
--- a/net/batman-adv/packet.h
 | 
			
		||||
+++ b/net/batman-adv/packet.h
 | 
			
		||||
@@ -22,7 +22,7 @@
 | 
			
		||||
 #include <linux/if_ether.h>
 | 
			
		||||
 #include <linux/types.h>
 | 
			
		||||
 
 | 
			
		||||
-#define batadv_tp_is_error(n) ((u8)(n) > 127 ? 1 : 0)
 | 
			
		||||
+#define batadv_tp_is_error(n) ((__u8)(n) > 127 ? 1 : 0)
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
  * enum batadv_packettype - types for batman-adv encapsulated packets
 | 
			
		||||
@@ -169,8 +169,8 @@ enum batadv_tvlv_type {
 | 
			
		||||
  * transport the claim type and the group id
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_bla_claim_dst {
 | 
			
		||||
-	u8     magic[3];	/* FF:43:05 */
 | 
			
		||||
-	u8     type;		/* bla_claimframe */
 | 
			
		||||
+	__u8   magic[3];	/* FF:43:05 */
 | 
			
		||||
+	__u8   type;		/* bla_claimframe */
 | 
			
		||||
 	__be16 group;		/* group id */
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
@@ -190,15 +190,15 @@ struct batadv_bla_claim_dst {
 | 
			
		||||
  * @tvlv_len: length of tvlv data following the ogm header
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_ogm_packet {
 | 
			
		||||
-	u8     packet_type;
 | 
			
		||||
-	u8     version;
 | 
			
		||||
-	u8     ttl;
 | 
			
		||||
-	u8     flags;
 | 
			
		||||
+	__u8   packet_type;
 | 
			
		||||
+	__u8   version;
 | 
			
		||||
+	__u8   ttl;
 | 
			
		||||
+	__u8   flags;
 | 
			
		||||
 	__be32 seqno;
 | 
			
		||||
-	u8     orig[ETH_ALEN];
 | 
			
		||||
-	u8     prev_sender[ETH_ALEN];
 | 
			
		||||
-	u8     reserved;
 | 
			
		||||
-	u8     tq;
 | 
			
		||||
+	__u8   orig[ETH_ALEN];
 | 
			
		||||
+	__u8   prev_sender[ETH_ALEN];
 | 
			
		||||
+	__u8   reserved;
 | 
			
		||||
+	__u8   tq;
 | 
			
		||||
 	__be16 tvlv_len;
 | 
			
		||||
 	/* __packed is not needed as the struct size is divisible by 4,
 | 
			
		||||
 	 * and the largest data type in this struct has a size of 4.
 | 
			
		||||
@@ -219,12 +219,12 @@ struct batadv_ogm_packet {
 | 
			
		||||
  * @throughput: the currently flooded path throughput
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_ogm2_packet {
 | 
			
		||||
-	u8     packet_type;
 | 
			
		||||
-	u8     version;
 | 
			
		||||
-	u8     ttl;
 | 
			
		||||
-	u8     flags;
 | 
			
		||||
+	__u8   packet_type;
 | 
			
		||||
+	__u8   version;
 | 
			
		||||
+	__u8   ttl;
 | 
			
		||||
+	__u8   flags;
 | 
			
		||||
 	__be32 seqno;
 | 
			
		||||
-	u8     orig[ETH_ALEN];
 | 
			
		||||
+	__u8   orig[ETH_ALEN];
 | 
			
		||||
 	__be16 tvlv_len;
 | 
			
		||||
 	__be32 throughput;
 | 
			
		||||
 	/* __packed is not needed as the struct size is divisible by 4,
 | 
			
		||||
@@ -243,9 +243,9 @@ struct batadv_ogm2_packet {
 | 
			
		||||
  * @elp_interval: currently used ELP sending interval in ms
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_elp_packet {
 | 
			
		||||
-	u8     packet_type;
 | 
			
		||||
-	u8     version;
 | 
			
		||||
-	u8     orig[ETH_ALEN];
 | 
			
		||||
+	__u8   packet_type;
 | 
			
		||||
+	__u8   version;
 | 
			
		||||
+	__u8   orig[ETH_ALEN];
 | 
			
		||||
 	__be32 seqno;
 | 
			
		||||
 	__be32 elp_interval;
 | 
			
		||||
 };
 | 
			
		||||
@@ -268,14 +268,14 @@ struct batadv_elp_packet {
 | 
			
		||||
  * members are padded the same way as they are in real packets.
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_icmp_header {
 | 
			
		||||
-	u8 packet_type;
 | 
			
		||||
-	u8 version;
 | 
			
		||||
-	u8 ttl;
 | 
			
		||||
-	u8 msg_type; /* see ICMP message types above */
 | 
			
		||||
-	u8 dst[ETH_ALEN];
 | 
			
		||||
-	u8 orig[ETH_ALEN];
 | 
			
		||||
-	u8 uid;
 | 
			
		||||
-	u8 align[3];
 | 
			
		||||
+	__u8 packet_type;
 | 
			
		||||
+	__u8 version;
 | 
			
		||||
+	__u8 ttl;
 | 
			
		||||
+	__u8 msg_type; /* see ICMP message types above */
 | 
			
		||||
+	__u8 dst[ETH_ALEN];
 | 
			
		||||
+	__u8 orig[ETH_ALEN];
 | 
			
		||||
+	__u8 uid;
 | 
			
		||||
+	__u8 align[3];
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
@@ -291,14 +291,14 @@ struct batadv_icmp_header {
 | 
			
		||||
  * @seqno: ICMP sequence number
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_icmp_packet {
 | 
			
		||||
-	u8     packet_type;
 | 
			
		||||
-	u8     version;
 | 
			
		||||
-	u8     ttl;
 | 
			
		||||
-	u8     msg_type; /* see ICMP message types above */
 | 
			
		||||
-	u8     dst[ETH_ALEN];
 | 
			
		||||
-	u8     orig[ETH_ALEN];
 | 
			
		||||
-	u8     uid;
 | 
			
		||||
-	u8     reserved;
 | 
			
		||||
+	__u8   packet_type;
 | 
			
		||||
+	__u8   version;
 | 
			
		||||
+	__u8   ttl;
 | 
			
		||||
+	__u8   msg_type; /* see ICMP message types above */
 | 
			
		||||
+	__u8   dst[ETH_ALEN];
 | 
			
		||||
+	__u8   orig[ETH_ALEN];
 | 
			
		||||
+	__u8   uid;
 | 
			
		||||
+	__u8   reserved;
 | 
			
		||||
 	__be16 seqno;
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
@@ -320,15 +320,15 @@ struct batadv_icmp_packet {
 | 
			
		||||
  *  store it using network order
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_icmp_tp_packet {
 | 
			
		||||
-	u8  packet_type;
 | 
			
		||||
-	u8  version;
 | 
			
		||||
-	u8  ttl;
 | 
			
		||||
-	u8  msg_type; /* see ICMP message types above */
 | 
			
		||||
-	u8  dst[ETH_ALEN];
 | 
			
		||||
-	u8  orig[ETH_ALEN];
 | 
			
		||||
-	u8  uid;
 | 
			
		||||
-	u8  subtype;
 | 
			
		||||
-	u8  session[2];
 | 
			
		||||
+	__u8   packet_type;
 | 
			
		||||
+	__u8   version;
 | 
			
		||||
+	__u8   ttl;
 | 
			
		||||
+	__u8   msg_type; /* see ICMP message types above */
 | 
			
		||||
+	__u8   dst[ETH_ALEN];
 | 
			
		||||
+	__u8   orig[ETH_ALEN];
 | 
			
		||||
+	__u8   uid;
 | 
			
		||||
+	__u8   subtype;
 | 
			
		||||
+	__u8   session[2];
 | 
			
		||||
 	__be32 seqno;
 | 
			
		||||
 	__be32 timestamp;
 | 
			
		||||
 };
 | 
			
		||||
@@ -359,16 +359,16 @@ enum batadv_icmp_tp_subtype {
 | 
			
		||||
  * @rr: route record array
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_icmp_packet_rr {
 | 
			
		||||
-	u8     packet_type;
 | 
			
		||||
-	u8     version;
 | 
			
		||||
-	u8     ttl;
 | 
			
		||||
-	u8     msg_type; /* see ICMP message types above */
 | 
			
		||||
-	u8     dst[ETH_ALEN];
 | 
			
		||||
-	u8     orig[ETH_ALEN];
 | 
			
		||||
-	u8     uid;
 | 
			
		||||
-	u8     rr_cur;
 | 
			
		||||
+	__u8   packet_type;
 | 
			
		||||
+	__u8   version;
 | 
			
		||||
+	__u8   ttl;
 | 
			
		||||
+	__u8   msg_type; /* see ICMP message types above */
 | 
			
		||||
+	__u8   dst[ETH_ALEN];
 | 
			
		||||
+	__u8   orig[ETH_ALEN];
 | 
			
		||||
+	__u8   uid;
 | 
			
		||||
+	__u8   rr_cur;
 | 
			
		||||
 	__be16 seqno;
 | 
			
		||||
-	u8     rr[BATADV_RR_LEN][ETH_ALEN];
 | 
			
		||||
+	__u8   rr[BATADV_RR_LEN][ETH_ALEN];
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 #define BATADV_ICMP_MAX_PACKET_SIZE	sizeof(struct batadv_icmp_packet_rr)
 | 
			
		||||
@@ -394,11 +394,11 @@ struct batadv_icmp_packet_rr {
 | 
			
		||||
  * @dest: originator destination of the unicast packet
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_unicast_packet {
 | 
			
		||||
-	u8 packet_type;
 | 
			
		||||
-	u8 version;
 | 
			
		||||
-	u8 ttl;
 | 
			
		||||
-	u8 ttvn; /* destination translation table version number */
 | 
			
		||||
-	u8 dest[ETH_ALEN];
 | 
			
		||||
+	__u8 packet_type;
 | 
			
		||||
+	__u8 version;
 | 
			
		||||
+	__u8 ttl;
 | 
			
		||||
+	__u8 ttvn; /* destination translation table version number */
 | 
			
		||||
+	__u8 dest[ETH_ALEN];
 | 
			
		||||
 	/* "4 bytes boundary + 2 bytes" long to make the payload after the
 | 
			
		||||
 	 * following ethernet header again 4 bytes boundary aligned
 | 
			
		||||
 	 */
 | 
			
		||||
@@ -413,9 +413,9 @@ struct batadv_unicast_packet {
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_unicast_4addr_packet {
 | 
			
		||||
 	struct batadv_unicast_packet u;
 | 
			
		||||
-	u8 src[ETH_ALEN];
 | 
			
		||||
-	u8 subtype;
 | 
			
		||||
-	u8 reserved;
 | 
			
		||||
+	__u8 src[ETH_ALEN];
 | 
			
		||||
+	__u8 subtype;
 | 
			
		||||
+	__u8 reserved;
 | 
			
		||||
 	/* "4 bytes boundary + 2 bytes" long to make the payload after the
 | 
			
		||||
 	 * following ethernet header again 4 bytes boundary aligned
 | 
			
		||||
 	 */
 | 
			
		||||
@@ -435,22 +435,22 @@ struct batadv_unicast_4addr_packet {
 | 
			
		||||
  * @total_size: size of the merged packet
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_frag_packet {
 | 
			
		||||
-	u8     packet_type;
 | 
			
		||||
-	u8     version;  /* batman version field */
 | 
			
		||||
-	u8     ttl;
 | 
			
		||||
+	__u8   packet_type;
 | 
			
		||||
+	__u8   version;  /* batman version field */
 | 
			
		||||
+	__u8   ttl;
 | 
			
		||||
 #if defined(__BIG_ENDIAN_BITFIELD)
 | 
			
		||||
-	u8     no:4;
 | 
			
		||||
-	u8     priority:3;
 | 
			
		||||
-	u8     reserved:1;
 | 
			
		||||
+	__u8   no:4;
 | 
			
		||||
+	__u8   priority:3;
 | 
			
		||||
+	__u8   reserved:1;
 | 
			
		||||
 #elif defined(__LITTLE_ENDIAN_BITFIELD)
 | 
			
		||||
-	u8     reserved:1;
 | 
			
		||||
-	u8     priority:3;
 | 
			
		||||
-	u8     no:4;
 | 
			
		||||
+	__u8   reserved:1;
 | 
			
		||||
+	__u8   priority:3;
 | 
			
		||||
+	__u8   no:4;
 | 
			
		||||
 #else
 | 
			
		||||
 #error "unknown bitfield endianness"
 | 
			
		||||
 #endif
 | 
			
		||||
-	u8     dest[ETH_ALEN];
 | 
			
		||||
-	u8     orig[ETH_ALEN];
 | 
			
		||||
+	__u8   dest[ETH_ALEN];
 | 
			
		||||
+	__u8   orig[ETH_ALEN];
 | 
			
		||||
 	__be16 seqno;
 | 
			
		||||
 	__be16 total_size;
 | 
			
		||||
 };
 | 
			
		||||
@@ -465,12 +465,12 @@ struct batadv_frag_packet {
 | 
			
		||||
  * @orig: originator of the broadcast packet
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_bcast_packet {
 | 
			
		||||
-	u8     packet_type;
 | 
			
		||||
-	u8     version;  /* batman version field */
 | 
			
		||||
-	u8     ttl;
 | 
			
		||||
-	u8     reserved;
 | 
			
		||||
+	__u8   packet_type;
 | 
			
		||||
+	__u8   version;  /* batman version field */
 | 
			
		||||
+	__u8   ttl;
 | 
			
		||||
+	__u8   reserved;
 | 
			
		||||
 	__be32 seqno;
 | 
			
		||||
-	u8     orig[ETH_ALEN];
 | 
			
		||||
+	__u8   orig[ETH_ALEN];
 | 
			
		||||
 	/* "4 bytes boundary + 2 bytes" long to make the payload after the
 | 
			
		||||
 	 * following ethernet header again 4 bytes boundary aligned
 | 
			
		||||
 	 */
 | 
			
		||||
@@ -494,19 +494,19 @@ struct batadv_bcast_packet {
 | 
			
		||||
  * @coded_len: length of network coded part of the payload
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_coded_packet {
 | 
			
		||||
-	u8     packet_type;
 | 
			
		||||
-	u8     version;  /* batman version field */
 | 
			
		||||
-	u8     ttl;
 | 
			
		||||
-	u8     first_ttvn;
 | 
			
		||||
-	/* u8  first_dest[ETH_ALEN]; - saved in mac header destination */
 | 
			
		||||
-	u8     first_source[ETH_ALEN];
 | 
			
		||||
-	u8     first_orig_dest[ETH_ALEN];
 | 
			
		||||
+	__u8   packet_type;
 | 
			
		||||
+	__u8   version;  /* batman version field */
 | 
			
		||||
+	__u8   ttl;
 | 
			
		||||
+	__u8   first_ttvn;
 | 
			
		||||
+	/* __u8 first_dest[ETH_ALEN]; - saved in mac header destination */
 | 
			
		||||
+	__u8   first_source[ETH_ALEN];
 | 
			
		||||
+	__u8   first_orig_dest[ETH_ALEN];
 | 
			
		||||
 	__be32 first_crc;
 | 
			
		||||
-	u8     second_ttl;
 | 
			
		||||
-	u8     second_ttvn;
 | 
			
		||||
-	u8     second_dest[ETH_ALEN];
 | 
			
		||||
-	u8     second_source[ETH_ALEN];
 | 
			
		||||
-	u8     second_orig_dest[ETH_ALEN];
 | 
			
		||||
+	__u8   second_ttl;
 | 
			
		||||
+	__u8   second_ttvn;
 | 
			
		||||
+	__u8   second_dest[ETH_ALEN];
 | 
			
		||||
+	__u8   second_source[ETH_ALEN];
 | 
			
		||||
+	__u8   second_orig_dest[ETH_ALEN];
 | 
			
		||||
 	__be32 second_crc;
 | 
			
		||||
 	__be16 coded_len;
 | 
			
		||||
 };
 | 
			
		||||
@@ -525,14 +525,14 @@ struct batadv_coded_packet {
 | 
			
		||||
  * @align: 2 bytes to align the header to a 4 byte boundary
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_unicast_tvlv_packet {
 | 
			
		||||
-	u8     packet_type;
 | 
			
		||||
-	u8     version;  /* batman version field */
 | 
			
		||||
-	u8     ttl;
 | 
			
		||||
-	u8     reserved;
 | 
			
		||||
-	u8     dst[ETH_ALEN];
 | 
			
		||||
-	u8     src[ETH_ALEN];
 | 
			
		||||
+	__u8   packet_type;
 | 
			
		||||
+	__u8   version;  /* batman version field */
 | 
			
		||||
+	__u8   ttl;
 | 
			
		||||
+	__u8   reserved;
 | 
			
		||||
+	__u8   dst[ETH_ALEN];
 | 
			
		||||
+	__u8   src[ETH_ALEN];
 | 
			
		||||
 	__be16 tvlv_len;
 | 
			
		||||
-	u16    align;
 | 
			
		||||
+	__u16  align;
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
@@ -542,8 +542,8 @@ struct batadv_unicast_tvlv_packet {
 | 
			
		||||
  * @len: tvlv container length
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_tvlv_hdr {
 | 
			
		||||
-	u8     type;
 | 
			
		||||
-	u8     version;
 | 
			
		||||
+	__u8   type;
 | 
			
		||||
+	__u8   version;
 | 
			
		||||
 	__be16 len;
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
@@ -566,8 +566,8 @@ struct batadv_tvlv_gateway_data {
 | 
			
		||||
  *  one batadv_tvlv_tt_vlan_data object per announced vlan
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_tvlv_tt_data {
 | 
			
		||||
-	u8     flags;
 | 
			
		||||
-	u8     ttvn;
 | 
			
		||||
+	__u8   flags;
 | 
			
		||||
+	__u8   ttvn;
 | 
			
		||||
 	__be16 num_vlan;
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
@@ -581,7 +581,7 @@ struct batadv_tvlv_tt_data {
 | 
			
		||||
 struct batadv_tvlv_tt_vlan_data {
 | 
			
		||||
 	__be32 crc;
 | 
			
		||||
 	__be16 vid;
 | 
			
		||||
-	u16    reserved;
 | 
			
		||||
+	__u16  reserved;
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 /**
 | 
			
		||||
@@ -593,9 +593,9 @@ struct batadv_tvlv_tt_vlan_data {
 | 
			
		||||
  * @vid: VLAN identifier
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_tvlv_tt_change {
 | 
			
		||||
-	u8     flags;
 | 
			
		||||
-	u8     reserved[3];
 | 
			
		||||
-	u8     addr[ETH_ALEN];
 | 
			
		||||
+	__u8   flags;
 | 
			
		||||
+	__u8   reserved[3];
 | 
			
		||||
+	__u8   addr[ETH_ALEN];
 | 
			
		||||
 	__be16 vid;
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
@@ -605,7 +605,7 @@ struct batadv_tvlv_tt_change {
 | 
			
		||||
  * @vid: VLAN identifier
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_tvlv_roam_adv {
 | 
			
		||||
-	u8     client[ETH_ALEN];
 | 
			
		||||
+	__u8   client[ETH_ALEN];
 | 
			
		||||
 	__be16 vid;
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
@@ -615,8 +615,8 @@ struct batadv_tvlv_roam_adv {
 | 
			
		||||
  * @reserved: reserved field
 | 
			
		||||
  */
 | 
			
		||||
 struct batadv_tvlv_mcast_data {
 | 
			
		||||
-	u8 flags;
 | 
			
		||||
-	u8 reserved[3];
 | 
			
		||||
+	__u8 flags;
 | 
			
		||||
+	__u8 reserved[3];
 | 
			
		||||
 };
 | 
			
		||||
 
 | 
			
		||||
 #endif /* _NET_BATMAN_ADV_PACKET_H_ */
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -0,0 +1,108 @@
 | 
			
		||||
From: Sven Eckelmann <sven.eckelmann@openmesh.com>
 | 
			
		||||
Date: Thu, 21 Dec 2017 10:17:42 +0100
 | 
			
		||||
Subject: [PATCH] flow_dissector: Parse batman-adv unicast headers
 | 
			
		||||
 | 
			
		||||
The batman-adv unicast packets contain a full layer 2 frame in encapsulated
 | 
			
		||||
form. The flow dissector must therefore be able to parse the batman-adv
 | 
			
		||||
unicast header to reach the layer 2+3 information.
 | 
			
		||||
 | 
			
		||||
  +--------------------+
 | 
			
		||||
  | ip(v6)hdr          |
 | 
			
		||||
  +--------------------+
 | 
			
		||||
  | inner ethhdr       |
 | 
			
		||||
  +--------------------+
 | 
			
		||||
  | batadv unicast hdr |
 | 
			
		||||
  +--------------------+
 | 
			
		||||
  | outer ethhdr       |
 | 
			
		||||
  +--------------------+
 | 
			
		||||
 | 
			
		||||
The obtained information from the upper layer can then be used by RPS to
 | 
			
		||||
schedule the processing on separate cores. This allows better distribution
 | 
			
		||||
of multiple flows from the same neighbor to different cores.
 | 
			
		||||
 | 
			
		||||
Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com>
 | 
			
		||||
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
 | 
			
		||||
Acked-by: Willem de Bruijn <willemb@google.com>
 | 
			
		||||
Signed-off-by: David S. Miller <davem@davemloft.net>
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
--- a/net/core/flow_dissector.c
 | 
			
		||||
+++ b/net/core/flow_dissector.c
 | 
			
		||||
@@ -22,6 +22,7 @@
 | 
			
		||||
 #include <linux/tcp.h>
 | 
			
		||||
 #include <net/flow_dissector.h>
 | 
			
		||||
 #include <scsi/fc/fc_fcoe.h>
 | 
			
		||||
+#include <uapi/linux/batadv_packet.h>
 | 
			
		||||
 
 | 
			
		||||
 static void dissector_set_key(struct flow_dissector *flow_dissector,
 | 
			
		||||
 			      enum flow_dissector_key_id key_id)
 | 
			
		||||
@@ -338,6 +339,57 @@ __skb_flow_dissect_gre(const struct sk_b
 | 
			
		||||
 	return FLOW_DISSECT_RET_PROTO_AGAIN;
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
+/**
 | 
			
		||||
+ * __skb_flow_dissect_batadv() - dissect batman-adv header
 | 
			
		||||
+ * @skb: sk_buff to with the batman-adv header
 | 
			
		||||
+ * @key_control: flow dissectors control key
 | 
			
		||||
+ * @data: raw buffer pointer to the packet, if NULL use skb->data
 | 
			
		||||
+ * @p_proto: pointer used to update the protocol to process next
 | 
			
		||||
+ * @p_nhoff: pointer used to update inner network header offset
 | 
			
		||||
+ * @hlen: packet header length
 | 
			
		||||
+ * @flags: any combination of FLOW_DISSECTOR_F_*
 | 
			
		||||
+ *
 | 
			
		||||
+ * ETH_P_BATMAN packets are tried to be dissected. Only
 | 
			
		||||
+ * &struct batadv_unicast packets are actually processed because they contain an
 | 
			
		||||
+ * inner ethernet header and are usually followed by actual network header. This
 | 
			
		||||
+ * allows the flow dissector to continue processing the packet.
 | 
			
		||||
+ *
 | 
			
		||||
+ * Return: FLOW_DISSECT_RET_PROTO_AGAIN when &struct batadv_unicast was found,
 | 
			
		||||
+ *  FLOW_DISSECT_RET_OUT_GOOD when dissector should stop after encapsulation,
 | 
			
		||||
+ *  otherwise FLOW_DISSECT_RET_OUT_BAD
 | 
			
		||||
+ */
 | 
			
		||||
+static enum flow_dissect_ret
 | 
			
		||||
+__skb_flow_dissect_batadv(const struct sk_buff *skb,
 | 
			
		||||
+			  struct flow_dissector_key_control *key_control,
 | 
			
		||||
+			  void *data, __be16 *p_proto, int *p_nhoff, int hlen,
 | 
			
		||||
+			  unsigned int flags)
 | 
			
		||||
+{
 | 
			
		||||
+	struct {
 | 
			
		||||
+		struct batadv_unicast_packet batadv_unicast;
 | 
			
		||||
+		struct ethhdr eth;
 | 
			
		||||
+	} *hdr, _hdr;
 | 
			
		||||
+
 | 
			
		||||
+	hdr = __skb_header_pointer(skb, *p_nhoff, sizeof(_hdr), data, hlen,
 | 
			
		||||
+				   &_hdr);
 | 
			
		||||
+	if (!hdr)
 | 
			
		||||
+		return FLOW_DISSECT_RET_OUT_BAD;
 | 
			
		||||
+
 | 
			
		||||
+	if (hdr->batadv_unicast.version != BATADV_COMPAT_VERSION)
 | 
			
		||||
+		return FLOW_DISSECT_RET_OUT_BAD;
 | 
			
		||||
+
 | 
			
		||||
+	if (hdr->batadv_unicast.packet_type != BATADV_UNICAST)
 | 
			
		||||
+		return FLOW_DISSECT_RET_OUT_BAD;
 | 
			
		||||
+
 | 
			
		||||
+	*p_proto = hdr->eth.h_proto;
 | 
			
		||||
+	*p_nhoff += sizeof(*hdr);
 | 
			
		||||
+
 | 
			
		||||
+	key_control->flags |= FLOW_DIS_ENCAPSULATION;
 | 
			
		||||
+	if (flags & FLOW_DISSECTOR_F_STOP_AT_ENCAP)
 | 
			
		||||
+		return FLOW_DISSECT_RET_OUT_GOOD;
 | 
			
		||||
+
 | 
			
		||||
+	return FLOW_DISSECT_RET_PROTO_AGAIN;
 | 
			
		||||
+}
 | 
			
		||||
+
 | 
			
		||||
 static void
 | 
			
		||||
 __skb_flow_dissect_tcp(const struct sk_buff *skb,
 | 
			
		||||
 		       struct flow_dissector *flow_dissector,
 | 
			
		||||
@@ -717,6 +769,11 @@ proto_again:
 | 
			
		||||
 					       nhoff, hlen);
 | 
			
		||||
 		break;
 | 
			
		||||
 
 | 
			
		||||
+	case htons(ETH_P_BATMAN):
 | 
			
		||||
+		fdret = __skb_flow_dissect_batadv(skb, key_control, data,
 | 
			
		||||
+						  &proto, &nhoff, hlen, flags);
 | 
			
		||||
+		break;
 | 
			
		||||
+
 | 
			
		||||
 	default:
 | 
			
		||||
 		fdret = FLOW_DISSECT_RET_OUT_BAD;
 | 
			
		||||
 		break;
 | 
			
		||||
		Reference in New Issue
	
	Block a user