Browse Source

Merge branch 'flow_dissector-Provide-basic-batman-adv-unicast-handling'

Sven Eckelmann says:

====================
flow_dissector: Provide basic batman-adv unicast handling

we are currently starting to use batman-adv as mesh protocol on multicore
embedded devices. These usually don't have a lot of CPU power per core but
are reasonable fast when using multiple cores.

It was noticed that sending was working very well but receiving was
basically only using on CPU core per neighbor. The reason for that is
format of the (normal) incoming packet:

  +--------------------+
  | ip(v6)hdr          |
  +--------------------+
  | inner ethhdr       |
  +--------------------+
  | batadv unicast hdr |
  +--------------------+
  | outer ethhdr       |
  +--------------------+

The flow dissector will therefore stop after parsing the outer ethernet
header and will not parse the actual ipv(4|6)/... header of the packet. Our
assumption was now that it would help us to add minimal support to the flow
dissector to jump over the batman-adv unicast and inner ethernet header
(like in gre ETH_P_TEB). The patch was implemented in a slightly hacky
way [1] and the results looked quite promising.

I didn't get any feedback how the files should actually be named. So I am
now just using the names from RFC v3

The discussion of the RFC v3 can be found in the related patches of
https://patchwork.ozlabs.org/cover/849345/

The discussion of the RFC v2 can be found in the related patches of
https://patchwork.ozlabs.org/cover/844783/

Changes in v4:
==============

* added  patch to change the u8/u16 to __u8/__u16 in
  include/uapi/linux/batadv_packet.h
  - requested by Willem de Bruijn <willemdebruijn.kernel@gmail.com>

Changes in v3:
==============

* removed change of uapi/linux/batman_adv.h to uapi/linux/batadv_genl.h
  - requested by Willem de Bruijn <willemdebruijn.kernel@gmail.com>
* removed naming fixes for enums/defines in uapi/linux/batadv_genl.h
  - requested by Willem de Bruijn <willemdebruijn.kernel@gmail.com>
* renamed uapi/linux/batadv.h to uapi/linux/batadv_packet.h
* moved batadv dissector functionality in own function
  - requested by Tom Herbert <tom@herbertland.com>
* added support for flags FLOW_DISSECTOR_F_STOP_AT_ENCAP and
  FLOW_DIS_ENCAPSULATION
  - requested by Willem de Bruijn <willemdebruijn.kernel@gmail.com>

Changes in v2:
==============

* removed the batman-adv unicast packet header definition from flow_dissector.c
* moved the batman-adv packet.h/uapi headers around to provide the correct
  definitions to flow_dissector.c
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
David S. Miller 7 years ago
parent
commit
0a80f0c26b

+ 1 - 0
MAINTAINERS

@@ -2564,6 +2564,7 @@ S:	Maintained
 F:	Documentation/ABI/testing/sysfs-class-net-batman-adv
 F:	Documentation/ABI/testing/sysfs-class-net-batman-adv
 F:	Documentation/ABI/testing/sysfs-class-net-mesh
 F:	Documentation/ABI/testing/sysfs-class-net-mesh
 F:	Documentation/networking/batman-adv.rst
 F:	Documentation/networking/batman-adv.rst
+F:	include/uapi/linux/batadv_packet.h
 F:	include/uapi/linux/batman_adv.h
 F:	include/uapi/linux/batman_adv.h
 F:	net/batman-adv/
 F:	net/batman-adv/
 
 

+ 123 - 122
net/batman-adv/packet.h → include/uapi/linux/batadv_packet.h

@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) */
 /* Copyright (C) 2007-2017  B.A.T.M.A.N. contributors:
 /* Copyright (C) 2007-2017  B.A.T.M.A.N. contributors:
  *
  *
  * Marek Lindner, Simon Wunderlich
  * Marek Lindner, Simon Wunderlich
@@ -16,10 +16,11 @@
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
  */
 
 
-#ifndef _NET_BATMAN_ADV_PACKET_H_
-#define _NET_BATMAN_ADV_PACKET_H_
+#ifndef _UAPI_LINUX_BATADV_PACKET_H_
+#define _UAPI_LINUX_BATADV_PACKET_H_
 
 
 #include <asm/byteorder.h>
 #include <asm/byteorder.h>
+#include <linux/if_ether.h>
 #include <linux/types.h>
 #include <linux/types.h>
 
 
 /**
 /**
@@ -28,7 +29,7 @@
  *
  *
  * Return: 0 when not error was detected, != 0 otherwise
  * Return: 0 when not error was detected, != 0 otherwise
  */
  */
-#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
  * enum batadv_packettype - types for batman-adv encapsulated packets
@@ -90,9 +91,9 @@ enum batadv_subtype {
  *     one hop neighbor on the interface where it was originally received.
  *     one hop neighbor on the interface where it was originally received.
  */
  */
 enum batadv_iv_flags {
 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,
 };
 };
 
 
 /**
 /**
@@ -121,9 +122,9 @@ enum batadv_icmp_packettype {
  * @BATADV_MCAST_WANT_ALL_IPV6: we want all IPv6 multicast packets
  * @BATADV_MCAST_WANT_ALL_IPV6: we want all IPv6 multicast packets
  */
  */
 enum batadv_mcast_flags {
 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 */
 /* tt data subtypes */
@@ -137,10 +138,10 @@ enum batadv_mcast_flags {
  * @BATADV_TT_FULL_TABLE: contains full table to replace existing table
  * @BATADV_TT_FULL_TABLE: contains full table to replace existing table
  */
  */
 enum batadv_tt_data_flags {
 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,
 };
 };
 
 
 /**
 /**
@@ -148,7 +149,7 @@ enum batadv_tt_data_flags {
  * @BATADV_VLAN_HAS_TAG: whether the field contains a valid vlan tag or not
  * @BATADV_VLAN_HAS_TAG: whether the field contains a valid vlan tag or not
  */
  */
 enum batadv_vlan_flags {
 enum batadv_vlan_flags {
-	BATADV_VLAN_HAS_TAG	= BIT(15),
+	BATADV_VLAN_HAS_TAG	= 1UL << 15,
 };
 };
 
 
 /**
 /**
@@ -190,8 +191,8 @@ enum batadv_tvlv_type {
  * transport the claim type and the group id
  * transport the claim type and the group id
  */
  */
 struct batadv_bla_claim_dst {
 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 */
 	__be16 group;		/* group id */
 };
 };
 
 
@@ -211,15 +212,15 @@ struct batadv_bla_claim_dst {
  * @tvlv_len: length of tvlv data following the ogm header
  * @tvlv_len: length of tvlv data following the ogm header
  */
  */
 struct batadv_ogm_packet {
 struct batadv_ogm_packet {
-	u8     packet_type;
-	u8     version;
-	u8     ttl;
-	u8     flags;
+	__u8   packet_type;
+	__u8   version;
+	__u8   ttl;
+	__u8   flags;
 	__be32 seqno;
 	__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;
 	__be16 tvlv_len;
 	/* __packed is not needed as the struct size is divisible by 4,
 	/* __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.
 	 * and the largest data type in this struct has a size of 4.
@@ -240,12 +241,12 @@ struct batadv_ogm_packet {
  * @throughput: the currently flooded path throughput
  * @throughput: the currently flooded path throughput
  */
  */
 struct batadv_ogm2_packet {
 struct batadv_ogm2_packet {
-	u8     packet_type;
-	u8     version;
-	u8     ttl;
-	u8     flags;
+	__u8   packet_type;
+	__u8   version;
+	__u8   ttl;
+	__u8   flags;
 	__be32 seqno;
 	__be32 seqno;
-	u8     orig[ETH_ALEN];
+	__u8   orig[ETH_ALEN];
 	__be16 tvlv_len;
 	__be16 tvlv_len;
 	__be32 throughput;
 	__be32 throughput;
 	/* __packed is not needed as the struct size is divisible by 4,
 	/* __packed is not needed as the struct size is divisible by 4,
@@ -264,9 +265,9 @@ struct batadv_ogm2_packet {
  * @elp_interval: currently used ELP sending interval in ms
  * @elp_interval: currently used ELP sending interval in ms
  */
  */
 struct batadv_elp_packet {
 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 seqno;
 	__be32 elp_interval;
 	__be32 elp_interval;
 };
 };
@@ -289,14 +290,14 @@ struct batadv_elp_packet {
  * members are padded the same way as they are in real packets.
  * members are padded the same way as they are in real packets.
  */
  */
 struct batadv_icmp_header {
 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];
 };
 };
 
 
 /**
 /**
@@ -312,14 +313,14 @@ struct batadv_icmp_header {
  * @seqno: ICMP sequence number
  * @seqno: ICMP sequence number
  */
  */
 struct batadv_icmp_packet {
 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;
 	__be16 seqno;
 };
 };
 
 
@@ -341,15 +342,15 @@ struct batadv_icmp_packet {
  *  store it using network order
  *  store it using network order
  */
  */
 struct batadv_icmp_tp_packet {
 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 seqno;
 	__be32 timestamp;
 	__be32 timestamp;
 };
 };
@@ -380,16 +381,16 @@ enum batadv_icmp_tp_subtype {
  * @rr: route record array
  * @rr: route record array
  */
  */
 struct batadv_icmp_packet_rr {
 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;
 	__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)
 #define BATADV_ICMP_MAX_PACKET_SIZE	sizeof(struct batadv_icmp_packet_rr)
@@ -415,11 +416,11 @@ struct batadv_icmp_packet_rr {
  * @dest: originator destination of the unicast packet
  * @dest: originator destination of the unicast packet
  */
  */
 struct batadv_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
 	/* "4 bytes boundary + 2 bytes" long to make the payload after the
 	 * following ethernet header again 4 bytes boundary aligned
 	 * following ethernet header again 4 bytes boundary aligned
 	 */
 	 */
@@ -434,9 +435,9 @@ struct batadv_unicast_packet {
  */
  */
 struct batadv_unicast_4addr_packet {
 struct batadv_unicast_4addr_packet {
 	struct batadv_unicast_packet u;
 	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
 	/* "4 bytes boundary + 2 bytes" long to make the payload after the
 	 * following ethernet header again 4 bytes boundary aligned
 	 * following ethernet header again 4 bytes boundary aligned
 	 */
 	 */
@@ -456,22 +457,22 @@ struct batadv_unicast_4addr_packet {
  * @total_size: size of the merged packet
  * @total_size: size of the merged packet
  */
  */
 struct batadv_frag_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)
 #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)
 #elif defined(__LITTLE_ENDIAN_BITFIELD)
-	u8     reserved:1;
-	u8     priority:3;
-	u8     no:4;
+	__u8   reserved:1;
+	__u8   priority:3;
+	__u8   no:4;
 #else
 #else
 #error "unknown bitfield endianness"
 #error "unknown bitfield endianness"
 #endif
 #endif
-	u8     dest[ETH_ALEN];
-	u8     orig[ETH_ALEN];
+	__u8   dest[ETH_ALEN];
+	__u8   orig[ETH_ALEN];
 	__be16 seqno;
 	__be16 seqno;
 	__be16 total_size;
 	__be16 total_size;
 };
 };
@@ -486,12 +487,12 @@ struct batadv_frag_packet {
  * @orig: originator of the broadcast packet
  * @orig: originator of the broadcast packet
  */
  */
 struct batadv_bcast_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;
 	__be32 seqno;
-	u8     orig[ETH_ALEN];
+	__u8   orig[ETH_ALEN];
 	/* "4 bytes boundary + 2 bytes" long to make the payload after the
 	/* "4 bytes boundary + 2 bytes" long to make the payload after the
 	 * following ethernet header again 4 bytes boundary aligned
 	 * following ethernet header again 4 bytes boundary aligned
 	 */
 	 */
@@ -515,19 +516,19 @@ struct batadv_bcast_packet {
  * @coded_len: length of network coded part of the payload
  * @coded_len: length of network coded part of the payload
  */
  */
 struct batadv_coded_packet {
 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;
 	__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;
 	__be32 second_crc;
 	__be16 coded_len;
 	__be16 coded_len;
 };
 };
@@ -546,14 +547,14 @@ struct batadv_coded_packet {
  * @align: 2 bytes to align the header to a 4 byte boundary
  * @align: 2 bytes to align the header to a 4 byte boundary
  */
  */
 struct batadv_unicast_tvlv_packet {
 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;
 	__be16 tvlv_len;
-	u16    align;
+	__u16  align;
 };
 };
 
 
 /**
 /**
@@ -563,8 +564,8 @@ struct batadv_unicast_tvlv_packet {
  * @len: tvlv container length
  * @len: tvlv container length
  */
  */
 struct batadv_tvlv_hdr {
 struct batadv_tvlv_hdr {
-	u8     type;
-	u8     version;
+	__u8   type;
+	__u8   version;
 	__be16 len;
 	__be16 len;
 };
 };
 
 
@@ -587,8 +588,8 @@ struct batadv_tvlv_gateway_data {
  *  one batadv_tvlv_tt_vlan_data object per announced vlan
  *  one batadv_tvlv_tt_vlan_data object per announced vlan
  */
  */
 struct batadv_tvlv_tt_data {
 struct batadv_tvlv_tt_data {
-	u8     flags;
-	u8     ttvn;
+	__u8   flags;
+	__u8   ttvn;
 	__be16 num_vlan;
 	__be16 num_vlan;
 };
 };
 
 
@@ -602,7 +603,7 @@ struct batadv_tvlv_tt_data {
 struct batadv_tvlv_tt_vlan_data {
 struct batadv_tvlv_tt_vlan_data {
 	__be32 crc;
 	__be32 crc;
 	__be16 vid;
 	__be16 vid;
-	u16    reserved;
+	__u16  reserved;
 };
 };
 
 
 /**
 /**
@@ -614,9 +615,9 @@ struct batadv_tvlv_tt_vlan_data {
  * @vid: VLAN identifier
  * @vid: VLAN identifier
  */
  */
 struct batadv_tvlv_tt_change {
 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;
 	__be16 vid;
 };
 };
 
 
@@ -626,7 +627,7 @@ struct batadv_tvlv_tt_change {
  * @vid: VLAN identifier
  * @vid: VLAN identifier
  */
  */
 struct batadv_tvlv_roam_adv {
 struct batadv_tvlv_roam_adv {
-	u8     client[ETH_ALEN];
+	__u8   client[ETH_ALEN];
 	__be16 vid;
 	__be16 vid;
 };
 };
 
 
@@ -636,8 +637,8 @@ struct batadv_tvlv_roam_adv {
  * @reserved: reserved field
  * @reserved: reserved field
  */
  */
 struct batadv_tvlv_mcast_data {
 struct batadv_tvlv_mcast_data {
-	u8 flags;
-	u8 reserved[3];
+	__u8 flags;
+	__u8 reserved[3];
 };
 };
 
 
-#endif /* _NET_BATMAN_ADV_PACKET_H_ */
+#endif /* _UAPI_LINUX_BATADV_PACKET_H_ */

+ 1 - 1
net/batman-adv/bat_iv_ogm.c

@@ -52,6 +52,7 @@
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
 #include <net/genetlink.h>
 #include <net/genetlink.h>
 #include <net/netlink.h>
 #include <net/netlink.h>
+#include <uapi/linux/batadv_packet.h>
 #include <uapi/linux/batman_adv.h>
 #include <uapi/linux/batman_adv.h>
 
 
 #include "bat_algo.h"
 #include "bat_algo.h"
@@ -63,7 +64,6 @@
 #include "netlink.h"
 #include "netlink.h"
 #include "network-coding.h"
 #include "network-coding.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "routing.h"
 #include "routing.h"
 #include "send.h"
 #include "send.h"
 #include "translation-table.h"
 #include "translation-table.h"

+ 1 - 1
net/batman-adv/bat_v.c

@@ -37,6 +37,7 @@
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
 #include <net/genetlink.h>
 #include <net/genetlink.h>
 #include <net/netlink.h>
 #include <net/netlink.h>
+#include <uapi/linux/batadv_packet.h>
 #include <uapi/linux/batman_adv.h>
 #include <uapi/linux/batman_adv.h>
 
 
 #include "bat_algo.h"
 #include "bat_algo.h"
@@ -49,7 +50,6 @@
 #include "log.h"
 #include "log.h"
 #include "netlink.h"
 #include "netlink.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 
 
 struct sk_buff;
 struct sk_buff;
 
 

+ 1 - 1
net/batman-adv/bat_v_elp.c

@@ -42,13 +42,13 @@
 #include <linux/types.h>
 #include <linux/types.h>
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
 #include <net/cfg80211.h>
 #include <net/cfg80211.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "bat_algo.h"
 #include "bat_algo.h"
 #include "bat_v_ogm.h"
 #include "bat_v_ogm.h"
 #include "hard-interface.h"
 #include "hard-interface.h"
 #include "log.h"
 #include "log.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "routing.h"
 #include "routing.h"
 #include "send.h"
 #include "send.h"
 
 

+ 1 - 1
net/batman-adv/bat_v_ogm.c

@@ -39,13 +39,13 @@
 #include <linux/string.h>
 #include <linux/string.h>
 #include <linux/types.h>
 #include <linux/types.h>
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "bat_algo.h"
 #include "bat_algo.h"
 #include "hard-interface.h"
 #include "hard-interface.h"
 #include "hash.h"
 #include "hash.h"
 #include "log.h"
 #include "log.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "routing.h"
 #include "routing.h"
 #include "send.h"
 #include "send.h"
 #include "translation-table.h"
 #include "translation-table.h"

+ 1 - 1
net/batman-adv/bridge_loop_avoidance.c

@@ -50,6 +50,7 @@
 #include <net/genetlink.h>
 #include <net/genetlink.h>
 #include <net/netlink.h>
 #include <net/netlink.h>
 #include <net/sock.h>
 #include <net/sock.h>
+#include <uapi/linux/batadv_packet.h>
 #include <uapi/linux/batman_adv.h>
 #include <uapi/linux/batman_adv.h>
 
 
 #include "hard-interface.h"
 #include "hard-interface.h"
@@ -57,7 +58,6 @@
 #include "log.h"
 #include "log.h"
 #include "netlink.h"
 #include "netlink.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "soft-interface.h"
 #include "soft-interface.h"
 #include "sysfs.h"
 #include "sysfs.h"
 #include "translation-table.h"
 #include "translation-table.h"

+ 1 - 1
net/batman-adv/distributed-arp-table.h

@@ -24,9 +24,9 @@
 #include <linux/compiler.h>
 #include <linux/compiler.h>
 #include <linux/netdevice.h>
 #include <linux/netdevice.h>
 #include <linux/types.h>
 #include <linux/types.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 
 
 struct seq_file;
 struct seq_file;
 struct sk_buff;
 struct sk_buff;

+ 1 - 1
net/batman-adv/fragmentation.c

@@ -33,10 +33,10 @@
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/spinlock.h>
 #include <linux/string.h>
 #include <linux/string.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "hard-interface.h"
 #include "hard-interface.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "routing.h"
 #include "routing.h"
 #include "send.h"
 #include "send.h"
 #include "soft-interface.h"
 #include "soft-interface.h"

+ 1 - 1
net/batman-adv/gateway_client.c

@@ -43,6 +43,7 @@
 #include <linux/stddef.h>
 #include <linux/stddef.h>
 #include <linux/udp.h>
 #include <linux/udp.h>
 #include <net/sock.h>
 #include <net/sock.h>
+#include <uapi/linux/batadv_packet.h>
 #include <uapi/linux/batman_adv.h>
 #include <uapi/linux/batman_adv.h>
 
 
 #include "gateway_common.h"
 #include "gateway_common.h"
@@ -50,7 +51,6 @@
 #include "log.h"
 #include "log.h"
 #include "netlink.h"
 #include "netlink.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "routing.h"
 #include "routing.h"
 #include "soft-interface.h"
 #include "soft-interface.h"
 #include "sysfs.h"
 #include "sysfs.h"

+ 1 - 1
net/batman-adv/gateway_common.c

@@ -27,10 +27,10 @@
 #include <linux/netdevice.h>
 #include <linux/netdevice.h>
 #include <linux/stddef.h>
 #include <linux/stddef.h>
 #include <linux/string.h>
 #include <linux/string.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "gateway_client.h"
 #include "gateway_client.h"
 #include "log.h"
 #include "log.h"
-#include "packet.h"
 #include "tvlv.h"
 #include "tvlv.h"
 
 
 /**
 /**

+ 1 - 1
net/batman-adv/hard-interface.c

@@ -38,6 +38,7 @@
 #include <linux/spinlock.h>
 #include <linux/spinlock.h>
 #include <net/net_namespace.h>
 #include <net/net_namespace.h>
 #include <net/rtnetlink.h>
 #include <net/rtnetlink.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "bat_v.h"
 #include "bat_v.h"
 #include "bridge_loop_avoidance.h"
 #include "bridge_loop_avoidance.h"
@@ -46,7 +47,6 @@
 #include "gateway_client.h"
 #include "gateway_client.h"
 #include "log.h"
 #include "log.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "send.h"
 #include "send.h"
 #include "soft-interface.h"
 #include "soft-interface.h"
 #include "sysfs.h"
 #include "sysfs.h"

+ 1 - 1
net/batman-adv/icmp_socket.c

@@ -44,11 +44,11 @@
 #include <linux/string.h>
 #include <linux/string.h>
 #include <linux/uaccess.h>
 #include <linux/uaccess.h>
 #include <linux/wait.h>
 #include <linux/wait.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "hard-interface.h"
 #include "hard-interface.h"
 #include "log.h"
 #include "log.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "send.h"
 #include "send.h"
 
 
 static struct batadv_socket_client *batadv_socket_client_hash[256];
 static struct batadv_socket_client *batadv_socket_client_hash[256];

+ 1 - 1
net/batman-adv/main.c

@@ -46,6 +46,7 @@
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
 #include <net/dsfield.h>
 #include <net/dsfield.h>
 #include <net/rtnetlink.h>
 #include <net/rtnetlink.h>
+#include <uapi/linux/batadv_packet.h>
 #include <uapi/linux/batman_adv.h>
 #include <uapi/linux/batman_adv.h>
 
 
 #include "bat_algo.h"
 #include "bat_algo.h"
@@ -63,7 +64,6 @@
 #include "netlink.h"
 #include "netlink.h"
 #include "network-coding.h"
 #include "network-coding.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "routing.h"
 #include "routing.h"
 #include "send.h"
 #include "send.h"
 #include "soft-interface.h"
 #include "soft-interface.h"

+ 1 - 3
net/batman-adv/main.h

@@ -217,16 +217,14 @@ enum batadv_uev_type {
 
 
 /* Kernel headers */
 /* Kernel headers */
 
 
-#include <linux/bitops.h> /* for packet.h */
 #include <linux/compiler.h>
 #include <linux/compiler.h>
 #include <linux/etherdevice.h>
 #include <linux/etherdevice.h>
-#include <linux/if_ether.h> /* for packet.h */
 #include <linux/if_vlan.h>
 #include <linux/if_vlan.h>
 #include <linux/jiffies.h>
 #include <linux/jiffies.h>
 #include <linux/percpu.h>
 #include <linux/percpu.h>
 #include <linux/types.h>
 #include <linux/types.h>
+#include <uapi/linux/batadv_packet.h>
 
 
-#include "packet.h"
 #include "types.h"
 #include "types.h"
 
 
 struct net_device;
 struct net_device;

+ 1 - 1
net/batman-adv/multicast.c

@@ -55,11 +55,11 @@
 #include <net/if_inet6.h>
 #include <net/if_inet6.h>
 #include <net/ip.h>
 #include <net/ip.h>
 #include <net/ipv6.h>
 #include <net/ipv6.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "hard-interface.h"
 #include "hard-interface.h"
 #include "hash.h"
 #include "hash.h"
 #include "log.h"
 #include "log.h"
-#include "packet.h"
 #include "translation-table.h"
 #include "translation-table.h"
 #include "tvlv.h"
 #include "tvlv.h"
 
 

+ 1 - 1
net/batman-adv/netlink.c

@@ -40,6 +40,7 @@
 #include <net/genetlink.h>
 #include <net/genetlink.h>
 #include <net/netlink.h>
 #include <net/netlink.h>
 #include <net/sock.h>
 #include <net/sock.h>
+#include <uapi/linux/batadv_packet.h>
 #include <uapi/linux/batman_adv.h>
 #include <uapi/linux/batman_adv.h>
 
 
 #include "bat_algo.h"
 #include "bat_algo.h"
@@ -47,7 +48,6 @@
 #include "gateway_client.h"
 #include "gateway_client.h"
 #include "hard-interface.h"
 #include "hard-interface.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "soft-interface.h"
 #include "soft-interface.h"
 #include "tp_meter.h"
 #include "tp_meter.h"
 #include "translation-table.h"
 #include "translation-table.h"

+ 1 - 1
net/batman-adv/network-coding.c

@@ -49,12 +49,12 @@
 #include <linux/stddef.h>
 #include <linux/stddef.h>
 #include <linux/string.h>
 #include <linux/string.h>
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "hard-interface.h"
 #include "hard-interface.h"
 #include "hash.h"
 #include "hash.h"
 #include "log.h"
 #include "log.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "routing.h"
 #include "routing.h"
 #include "send.h"
 #include "send.h"
 #include "tvlv.h"
 #include "tvlv.h"

+ 1 - 1
net/batman-adv/routing.c

@@ -34,6 +34,7 @@
 #include <linux/skbuff.h>
 #include <linux/skbuff.h>
 #include <linux/spinlock.h>
 #include <linux/spinlock.h>
 #include <linux/stddef.h>
 #include <linux/stddef.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "bitarray.h"
 #include "bitarray.h"
 #include "bridge_loop_avoidance.h"
 #include "bridge_loop_avoidance.h"
@@ -44,7 +45,6 @@
 #include "log.h"
 #include "log.h"
 #include "network-coding.h"
 #include "network-coding.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "send.h"
 #include "send.h"
 #include "soft-interface.h"
 #include "soft-interface.h"
 #include "tp_meter.h"
 #include "tp_meter.h"

+ 1 - 2
net/batman-adv/send.h

@@ -24,8 +24,7 @@
 #include <linux/compiler.h>
 #include <linux/compiler.h>
 #include <linux/spinlock.h>
 #include <linux/spinlock.h>
 #include <linux/types.h>
 #include <linux/types.h>
-
-#include "packet.h"
+#include <uapi/linux/batadv_packet.h>
 
 
 struct sk_buff;
 struct sk_buff;
 
 

+ 1 - 1
net/batman-adv/soft-interface.c

@@ -49,6 +49,7 @@
 #include <linux/stddef.h>
 #include <linux/stddef.h>
 #include <linux/string.h>
 #include <linux/string.h>
 #include <linux/types.h>
 #include <linux/types.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "bat_algo.h"
 #include "bat_algo.h"
 #include "bridge_loop_avoidance.h"
 #include "bridge_loop_avoidance.h"
@@ -60,7 +61,6 @@
 #include "multicast.h"
 #include "multicast.h"
 #include "network-coding.h"
 #include "network-coding.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "send.h"
 #include "send.h"
 #include "sysfs.h"
 #include "sysfs.h"
 #include "translation-table.h"
 #include "translation-table.h"

+ 1 - 1
net/batman-adv/sysfs.c

@@ -39,6 +39,7 @@
 #include <linux/string.h>
 #include <linux/string.h>
 #include <linux/stringify.h>
 #include <linux/stringify.h>
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "bridge_loop_avoidance.h"
 #include "bridge_loop_avoidance.h"
 #include "distributed-arp-table.h"
 #include "distributed-arp-table.h"
@@ -47,7 +48,6 @@
 #include "hard-interface.h"
 #include "hard-interface.h"
 #include "log.h"
 #include "log.h"
 #include "network-coding.h"
 #include "network-coding.h"
-#include "packet.h"
 #include "soft-interface.h"
 #include "soft-interface.h"
 
 
 static struct net_device *batadv_kobj_to_netdev(struct kobject *obj)
 static struct net_device *batadv_kobj_to_netdev(struct kobject *obj)

+ 1 - 1
net/batman-adv/tp_meter.c

@@ -49,13 +49,13 @@
 #include <linux/timer.h>
 #include <linux/timer.h>
 #include <linux/wait.h>
 #include <linux/wait.h>
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
+#include <uapi/linux/batadv_packet.h>
 #include <uapi/linux/batman_adv.h>
 #include <uapi/linux/batman_adv.h>
 
 
 #include "hard-interface.h"
 #include "hard-interface.h"
 #include "log.h"
 #include "log.h"
 #include "netlink.h"
 #include "netlink.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "send.h"
 #include "send.h"
 
 
 /**
 /**

+ 1 - 1
net/batman-adv/translation-table.c

@@ -52,6 +52,7 @@
 #include <net/genetlink.h>
 #include <net/genetlink.h>
 #include <net/netlink.h>
 #include <net/netlink.h>
 #include <net/sock.h>
 #include <net/sock.h>
+#include <uapi/linux/batadv_packet.h>
 #include <uapi/linux/batman_adv.h>
 #include <uapi/linux/batman_adv.h>
 
 
 #include "bridge_loop_avoidance.h"
 #include "bridge_loop_avoidance.h"
@@ -60,7 +61,6 @@
 #include "log.h"
 #include "log.h"
 #include "netlink.h"
 #include "netlink.h"
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "soft-interface.h"
 #include "soft-interface.h"
 #include "tvlv.h"
 #include "tvlv.h"
 
 

+ 1 - 1
net/batman-adv/tvlv.c

@@ -36,9 +36,9 @@
 #include <linux/stddef.h>
 #include <linux/stddef.h>
 #include <linux/string.h>
 #include <linux/string.h>
 #include <linux/types.h>
 #include <linux/types.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 #include "originator.h"
 #include "originator.h"
-#include "packet.h"
 #include "send.h"
 #include "send.h"
 #include "tvlv.h"
 #include "tvlv.h"
 
 

+ 1 - 2
net/batman-adv/types.h

@@ -35,10 +35,9 @@
 #include <linux/types.h>
 #include <linux/types.h>
 #include <linux/wait.h>
 #include <linux/wait.h>
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
+#include <uapi/linux/batadv_packet.h>
 #include <uapi/linux/batman_adv.h>
 #include <uapi/linux/batman_adv.h>
 
 
-#include "packet.h"
-
 struct seq_file;
 struct seq_file;
 
 
 #ifdef CONFIG_BATMAN_ADV_DAT
 #ifdef CONFIG_BATMAN_ADV_DAT

+ 57 - 0
net/core/flow_dissector.c

@@ -24,6 +24,7 @@
 #include <linux/tcp.h>
 #include <linux/tcp.h>
 #include <net/flow_dissector.h>
 #include <net/flow_dissector.h>
 #include <scsi/fc/fc_fcoe.h>
 #include <scsi/fc/fc_fcoe.h>
+#include <uapi/linux/batadv_packet.h>
 
 
 static void dissector_set_key(struct flow_dissector *flow_dissector,
 static void dissector_set_key(struct flow_dissector *flow_dissector,
 			      enum flow_dissector_key_id key_id)
 			      enum flow_dissector_key_id key_id)
@@ -437,6 +438,57 @@ __skb_flow_dissect_gre(const struct sk_buff *skb,
 	return FLOW_DISSECT_RET_PROTO_AGAIN;
 	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
 static void
 __skb_flow_dissect_tcp(const struct sk_buff *skb,
 __skb_flow_dissect_tcp(const struct sk_buff *skb,
 		       struct flow_dissector *flow_dissector,
 		       struct flow_dissector *flow_dissector,
@@ -815,6 +867,11 @@ proto_again:
 					       nhoff, hlen);
 					       nhoff, hlen);
 		break;
 		break;
 
 
+	case htons(ETH_P_BATMAN):
+		fdret = __skb_flow_dissect_batadv(skb, key_control, data,
+						  &proto, &nhoff, hlen, flags);
+		break;
+
 	default:
 	default:
 		fdret = FLOW_DISSECT_RET_OUT_BAD;
 		fdret = FLOW_DISSECT_RET_OUT_BAD;
 		break;
 		break;