1fec149f5SSven Eckelmann /* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) */
2cfa55c6dSSven Eckelmann /* Copyright (C) B.A.T.M.A.N. contributors:
3fec149f5SSven Eckelmann  *
4fec149f5SSven Eckelmann  * Marek Lindner, Simon Wunderlich
5fec149f5SSven Eckelmann  */
6fec149f5SSven Eckelmann 
7fec149f5SSven Eckelmann #ifndef _UAPI_LINUX_BATADV_PACKET_H_
8fec149f5SSven Eckelmann #define _UAPI_LINUX_BATADV_PACKET_H_
9fec149f5SSven Eckelmann 
10fec149f5SSven Eckelmann #include <asm/byteorder.h>
11fec149f5SSven Eckelmann #include <linux/if_ether.h>
12*4436df47SErick Archer #include <linux/stddef.h>
13fec149f5SSven Eckelmann #include <linux/types.h>
14fec149f5SSven Eckelmann 
15fec149f5SSven Eckelmann /**
16fec149f5SSven Eckelmann  * batadv_tp_is_error() - Check throughput meter return code for error
17fec149f5SSven Eckelmann  * @n: throughput meter return code
18fec149f5SSven Eckelmann  *
19fec149f5SSven Eckelmann  * Return: 0 when not error was detected, != 0 otherwise
20fec149f5SSven Eckelmann  */
21fec149f5SSven Eckelmann #define batadv_tp_is_error(n) ((__u8)(n) > 127 ? 1 : 0)
22fec149f5SSven Eckelmann 
23fec149f5SSven Eckelmann /**
24fec149f5SSven Eckelmann  * enum batadv_packettype - types for batman-adv encapsulated packets
25fec149f5SSven Eckelmann  * @BATADV_IV_OGM: originator messages for B.A.T.M.A.N. IV
26fec149f5SSven Eckelmann  * @BATADV_BCAST: broadcast packets carrying broadcast payload
27fec149f5SSven Eckelmann  * @BATADV_CODED: network coded packets
28fec149f5SSven Eckelmann  * @BATADV_ELP: echo location packets for B.A.T.M.A.N. V
29fec149f5SSven Eckelmann  * @BATADV_OGM2: originator messages for B.A.T.M.A.N. V
300c4061c0SLinus Lüssing  * @BATADV_MCAST: multicast packet with multiple destination addresses
31fec149f5SSven Eckelmann  *
32fec149f5SSven Eckelmann  * @BATADV_UNICAST: unicast packets carrying unicast payload traffic
33fec149f5SSven Eckelmann  * @BATADV_UNICAST_FRAG: unicast packets carrying a fragment of the original
34fec149f5SSven Eckelmann  *     payload packet
35fec149f5SSven Eckelmann  * @BATADV_UNICAST_4ADDR: unicast packet including the originator address of
36fec149f5SSven Eckelmann  *     the sender
37fec149f5SSven Eckelmann  * @BATADV_ICMP: unicast packet like IP ICMP used for ping or traceroute
38fec149f5SSven Eckelmann  * @BATADV_UNICAST_TVLV: unicast packet carrying TVLV containers
39fec149f5SSven Eckelmann  */
40fec149f5SSven Eckelmann enum batadv_packettype {
41fec149f5SSven Eckelmann 	/* 0x00 - 0x3f: local packets or special rules for handling */
42fec149f5SSven Eckelmann 	BATADV_IV_OGM           = 0x00,
43fec149f5SSven Eckelmann 	BATADV_BCAST            = 0x01,
44fec149f5SSven Eckelmann 	BATADV_CODED            = 0x02,
45fec149f5SSven Eckelmann 	BATADV_ELP		= 0x03,
46fec149f5SSven Eckelmann 	BATADV_OGM2		= 0x04,
470c4061c0SLinus Lüssing 	BATADV_MCAST            = 0x05,
48fec149f5SSven Eckelmann 	/* 0x40 - 0x7f: unicast */
49fec149f5SSven Eckelmann #define BATADV_UNICAST_MIN     0x40
50fec149f5SSven Eckelmann 	BATADV_UNICAST          = 0x40,
51fec149f5SSven Eckelmann 	BATADV_UNICAST_FRAG     = 0x41,
52fec149f5SSven Eckelmann 	BATADV_UNICAST_4ADDR    = 0x42,
53fec149f5SSven Eckelmann 	BATADV_ICMP             = 0x43,
54fec149f5SSven Eckelmann 	BATADV_UNICAST_TVLV     = 0x44,
55fec149f5SSven Eckelmann #define BATADV_UNICAST_MAX     0x7f
56fec149f5SSven Eckelmann 	/* 0x80 - 0xff: reserved */
57fec149f5SSven Eckelmann };
58fec149f5SSven Eckelmann 
59fec149f5SSven Eckelmann /**
60fec149f5SSven Eckelmann  * enum batadv_subtype - packet subtype for unicast4addr
61fec149f5SSven Eckelmann  * @BATADV_P_DATA: user payload
62fec149f5SSven Eckelmann  * @BATADV_P_DAT_DHT_GET: DHT request message
63fec149f5SSven Eckelmann  * @BATADV_P_DAT_DHT_PUT: DHT store message
64fec149f5SSven Eckelmann  * @BATADV_P_DAT_CACHE_REPLY: ARP reply generated by DAT
65fec149f5SSven Eckelmann  */
66fec149f5SSven Eckelmann enum batadv_subtype {
67fec149f5SSven Eckelmann 	BATADV_P_DATA			= 0x01,
68fec149f5SSven Eckelmann 	BATADV_P_DAT_DHT_GET		= 0x02,
69fec149f5SSven Eckelmann 	BATADV_P_DAT_DHT_PUT		= 0x03,
70fec149f5SSven Eckelmann 	BATADV_P_DAT_CACHE_REPLY	= 0x04,
71fec149f5SSven Eckelmann };
72fec149f5SSven Eckelmann 
73fec149f5SSven Eckelmann /* this file is included by batctl which needs these defines */
74fec149f5SSven Eckelmann #define BATADV_COMPAT_VERSION 15
75fec149f5SSven Eckelmann 
76fec149f5SSven Eckelmann /**
77fec149f5SSven Eckelmann  * enum batadv_iv_flags - flags used in B.A.T.M.A.N. IV OGM packets
78bccb48c8SSven Eckelmann  * @BATADV_NOT_BEST_NEXT_HOP: flag is set when the ogm packet is forwarded and
79bccb48c8SSven Eckelmann  *  was previously received from someone other than the best neighbor.
80fec149f5SSven Eckelmann  * @BATADV_PRIMARIES_FIRST_HOP: flag unused.
81fec149f5SSven Eckelmann  * @BATADV_DIRECTLINK: flag is for the first hop or if rebroadcasted from a
82fec149f5SSven Eckelmann  *     one hop neighbor on the interface where it was originally received.
83fec149f5SSven Eckelmann  */
84fec149f5SSven Eckelmann enum batadv_iv_flags {
85fec149f5SSven Eckelmann 	BATADV_NOT_BEST_NEXT_HOP   = 1UL << 0,
86fec149f5SSven Eckelmann 	BATADV_PRIMARIES_FIRST_HOP = 1UL << 1,
87fec149f5SSven Eckelmann 	BATADV_DIRECTLINK          = 1UL << 2,
88fec149f5SSven Eckelmann };
89fec149f5SSven Eckelmann 
90fec149f5SSven Eckelmann /**
91fec149f5SSven Eckelmann  * enum batadv_icmp_packettype - ICMP message types
92fec149f5SSven Eckelmann  * @BATADV_ECHO_REPLY: success reply to BATADV_ECHO_REQUEST
93fec149f5SSven Eckelmann  * @BATADV_DESTINATION_UNREACHABLE: failure when route to destination not found
94fec149f5SSven Eckelmann  * @BATADV_ECHO_REQUEST: request BATADV_ECHO_REPLY from destination
95fec149f5SSven Eckelmann  * @BATADV_TTL_EXCEEDED: error after BATADV_ECHO_REQUEST traversed too many hops
96fec149f5SSven Eckelmann  * @BATADV_PARAMETER_PROBLEM: return code for malformed messages
97fec149f5SSven Eckelmann  * @BATADV_TP: throughput meter packet
98fec149f5SSven Eckelmann  */
99fec149f5SSven Eckelmann enum batadv_icmp_packettype {
100fec149f5SSven Eckelmann 	BATADV_ECHO_REPLY	       = 0,
101fec149f5SSven Eckelmann 	BATADV_DESTINATION_UNREACHABLE = 3,
102fec149f5SSven Eckelmann 	BATADV_ECHO_REQUEST	       = 8,
103fec149f5SSven Eckelmann 	BATADV_TTL_EXCEEDED	       = 11,
104fec149f5SSven Eckelmann 	BATADV_PARAMETER_PROBLEM       = 12,
105fec149f5SSven Eckelmann 	BATADV_TP		       = 15,
106fec149f5SSven Eckelmann };
107fec149f5SSven Eckelmann 
108fec149f5SSven Eckelmann /**
109fec149f5SSven Eckelmann  * enum batadv_mcast_flags - flags for multicast capabilities and settings
110fec149f5SSven Eckelmann  * @BATADV_MCAST_WANT_ALL_UNSNOOPABLES: we want all packets destined for
111fec149f5SSven Eckelmann  *  224.0.0.0/24 or ff02::1
112fec149f5SSven Eckelmann  * @BATADV_MCAST_WANT_ALL_IPV4: we want all IPv4 multicast packets
11361caf3d1SLinus Lüssing  *  (both link-local and routable ones)
114fec149f5SSven Eckelmann  * @BATADV_MCAST_WANT_ALL_IPV6: we want all IPv6 multicast packets
11561caf3d1SLinus Lüssing  *  (both link-local and routable ones)
11661caf3d1SLinus Lüssing  * @BATADV_MCAST_WANT_NO_RTR4: we have no IPv4 multicast router and therefore
11761caf3d1SLinus Lüssing  * only need routable IPv4 multicast packets we signed up for explicitly
11861caf3d1SLinus Lüssing  * @BATADV_MCAST_WANT_NO_RTR6: we have no IPv6 multicast router and therefore
11961caf3d1SLinus Lüssing  * only need routable IPv6 multicast packets we signed up for explicitly
12007afe1baSLinus Lüssing  * @BATADV_MCAST_HAVE_MC_PTYPE_CAPA: we can parse, receive and forward
12107afe1baSLinus Lüssing  * batman-adv multicast packets with a multicast tracker TVLV. And all our
12207afe1baSLinus Lüssing  * hard interfaces have an MTU of at least 1280 bytes.
123fec149f5SSven Eckelmann  */
124fec149f5SSven Eckelmann enum batadv_mcast_flags {
125fec149f5SSven Eckelmann 	BATADV_MCAST_WANT_ALL_UNSNOOPABLES	= 1UL << 0,
126fec149f5SSven Eckelmann 	BATADV_MCAST_WANT_ALL_IPV4		= 1UL << 1,
127fec149f5SSven Eckelmann 	BATADV_MCAST_WANT_ALL_IPV6		= 1UL << 2,
12861caf3d1SLinus Lüssing 	BATADV_MCAST_WANT_NO_RTR4		= 1UL << 3,
12961caf3d1SLinus Lüssing 	BATADV_MCAST_WANT_NO_RTR6		= 1UL << 4,
13007afe1baSLinus Lüssing 	BATADV_MCAST_HAVE_MC_PTYPE_CAPA		= 1UL << 5,
131fec149f5SSven Eckelmann };
132fec149f5SSven Eckelmann 
133fec149f5SSven Eckelmann /* tt data subtypes */
134fec149f5SSven Eckelmann #define BATADV_TT_DATA_TYPE_MASK 0x0F
135fec149f5SSven Eckelmann 
136fec149f5SSven Eckelmann /**
137fec149f5SSven Eckelmann  * enum batadv_tt_data_flags - flags for tt data tvlv
138fec149f5SSven Eckelmann  * @BATADV_TT_OGM_DIFF: TT diff propagated through OGM
139fec149f5SSven Eckelmann  * @BATADV_TT_REQUEST: TT request message
140fec149f5SSven Eckelmann  * @BATADV_TT_RESPONSE: TT response message
141fec149f5SSven Eckelmann  * @BATADV_TT_FULL_TABLE: contains full table to replace existing table
142fec149f5SSven Eckelmann  */
143fec149f5SSven Eckelmann enum batadv_tt_data_flags {
144fec149f5SSven Eckelmann 	BATADV_TT_OGM_DIFF   = 1UL << 0,
145fec149f5SSven Eckelmann 	BATADV_TT_REQUEST    = 1UL << 1,
146fec149f5SSven Eckelmann 	BATADV_TT_RESPONSE   = 1UL << 2,
147fec149f5SSven Eckelmann 	BATADV_TT_FULL_TABLE = 1UL << 4,
148fec149f5SSven Eckelmann };
149fec149f5SSven Eckelmann 
150fec149f5SSven Eckelmann /**
151fec149f5SSven Eckelmann  * enum batadv_vlan_flags - flags for the four MSB of any vlan ID field
152fec149f5SSven Eckelmann  * @BATADV_VLAN_HAS_TAG: whether the field contains a valid vlan tag or not
153fec149f5SSven Eckelmann  */
154fec149f5SSven Eckelmann enum batadv_vlan_flags {
155fec149f5SSven Eckelmann 	BATADV_VLAN_HAS_TAG	= 1UL << 15,
156fec149f5SSven Eckelmann };
157fec149f5SSven Eckelmann 
158fec149f5SSven Eckelmann /**
159fec149f5SSven Eckelmann  * enum batadv_bla_claimframe - claim frame types for the bridge loop avoidance
160fec149f5SSven Eckelmann  * @BATADV_CLAIM_TYPE_CLAIM: claim of a client mac address
161fec149f5SSven Eckelmann  * @BATADV_CLAIM_TYPE_UNCLAIM: unclaim of a client mac address
162fec149f5SSven Eckelmann  * @BATADV_CLAIM_TYPE_ANNOUNCE: announcement of backbone with current crc
163fec149f5SSven Eckelmann  * @BATADV_CLAIM_TYPE_REQUEST: request of full claim table
164fec149f5SSven Eckelmann  * @BATADV_CLAIM_TYPE_LOOPDETECT: mesh-traversing loop detect packet
165fec149f5SSven Eckelmann  */
166fec149f5SSven Eckelmann enum batadv_bla_claimframe {
167fec149f5SSven Eckelmann 	BATADV_CLAIM_TYPE_CLAIM		= 0x00,
168fec149f5SSven Eckelmann 	BATADV_CLAIM_TYPE_UNCLAIM	= 0x01,
169fec149f5SSven Eckelmann 	BATADV_CLAIM_TYPE_ANNOUNCE	= 0x02,
170fec149f5SSven Eckelmann 	BATADV_CLAIM_TYPE_REQUEST	= 0x03,
171fec149f5SSven Eckelmann 	BATADV_CLAIM_TYPE_LOOPDETECT	= 0x04,
172fec149f5SSven Eckelmann };
173fec149f5SSven Eckelmann 
174fec149f5SSven Eckelmann /**
175fec149f5SSven Eckelmann  * enum batadv_tvlv_type - tvlv type definitions
176fec149f5SSven Eckelmann  * @BATADV_TVLV_GW: gateway tvlv
177fec149f5SSven Eckelmann  * @BATADV_TVLV_DAT: distributed arp table tvlv
178fec149f5SSven Eckelmann  * @BATADV_TVLV_NC: network coding tvlv
179fec149f5SSven Eckelmann  * @BATADV_TVLV_TT: translation table tvlv
180fec149f5SSven Eckelmann  * @BATADV_TVLV_ROAM: roaming advertisement tvlv
181fec149f5SSven Eckelmann  * @BATADV_TVLV_MCAST: multicast capability tvlv
18207afe1baSLinus Lüssing  * @BATADV_TVLV_MCAST_TRACKER: multicast tracker tvlv
183fec149f5SSven Eckelmann  */
184fec149f5SSven Eckelmann enum batadv_tvlv_type {
185fec149f5SSven Eckelmann 	BATADV_TVLV_GW			= 0x01,
186fec149f5SSven Eckelmann 	BATADV_TVLV_DAT			= 0x02,
187fec149f5SSven Eckelmann 	BATADV_TVLV_NC			= 0x03,
188fec149f5SSven Eckelmann 	BATADV_TVLV_TT			= 0x04,
189fec149f5SSven Eckelmann 	BATADV_TVLV_ROAM		= 0x05,
190fec149f5SSven Eckelmann 	BATADV_TVLV_MCAST		= 0x06,
19107afe1baSLinus Lüssing 	BATADV_TVLV_MCAST_TRACKER	= 0x07,
192fec149f5SSven Eckelmann };
193fec149f5SSven Eckelmann 
194fec149f5SSven Eckelmann #pragma pack(2)
195fec149f5SSven Eckelmann /* the destination hardware field in the ARP frame is used to
196fec149f5SSven Eckelmann  * transport the claim type and the group id
197fec149f5SSven Eckelmann  */
198fec149f5SSven Eckelmann struct batadv_bla_claim_dst {
199fec149f5SSven Eckelmann 	__u8   magic[3];	/* FF:43:05 */
200fec149f5SSven Eckelmann 	__u8   type;		/* bla_claimframe */
201fec149f5SSven Eckelmann 	__be16 group;		/* group id */
202fec149f5SSven Eckelmann };
203fec149f5SSven Eckelmann 
204fec149f5SSven Eckelmann /**
205fec149f5SSven Eckelmann  * struct batadv_ogm_packet - ogm (routing protocol) packet
206fec149f5SSven Eckelmann  * @packet_type: batman-adv packet type, part of the general header
207bccb48c8SSven Eckelmann  * @version: batman-adv protocol version, part of the general header
208bccb48c8SSven Eckelmann  * @ttl: time to live for this packet, part of the general header
209fec149f5SSven Eckelmann  * @flags: contains routing relevant flags - see enum batadv_iv_flags
210fec149f5SSven Eckelmann  * @seqno: sequence identification
211fec149f5SSven Eckelmann  * @orig: address of the source node
212fec149f5SSven Eckelmann  * @prev_sender: address of the previous sender
213fec149f5SSven Eckelmann  * @reserved: reserved byte for alignment
214fec149f5SSven Eckelmann  * @tq: transmission quality
215fec149f5SSven Eckelmann  * @tvlv_len: length of tvlv data following the ogm header
216fec149f5SSven Eckelmann  */
217fec149f5SSven Eckelmann struct batadv_ogm_packet {
218fec149f5SSven Eckelmann 	__u8   packet_type;
219fec149f5SSven Eckelmann 	__u8   version;
220fec149f5SSven Eckelmann 	__u8   ttl;
221fec149f5SSven Eckelmann 	__u8   flags;
222fec149f5SSven Eckelmann 	__be32 seqno;
223fec149f5SSven Eckelmann 	__u8   orig[ETH_ALEN];
224fec149f5SSven Eckelmann 	__u8   prev_sender[ETH_ALEN];
225fec149f5SSven Eckelmann 	__u8   reserved;
226fec149f5SSven Eckelmann 	__u8   tq;
227fec149f5SSven Eckelmann 	__be16 tvlv_len;
228fec149f5SSven Eckelmann };
229fec149f5SSven Eckelmann 
230fec149f5SSven Eckelmann #define BATADV_OGM_HLEN sizeof(struct batadv_ogm_packet)
231fec149f5SSven Eckelmann 
232fec149f5SSven Eckelmann /**
233fec149f5SSven Eckelmann  * struct batadv_ogm2_packet - ogm2 (routing protocol) packet
234fec149f5SSven Eckelmann  * @packet_type: batman-adv packet type, part of the general header
235fec149f5SSven Eckelmann  * @version: batman-adv protocol version, part of the general header
236fec149f5SSven Eckelmann  * @ttl: time to live for this packet, part of the general header
237180cf62cSSven Eckelmann  * @flags: reserved for routing relevant flags - currently always 0
238fec149f5SSven Eckelmann  * @seqno: sequence number
239fec149f5SSven Eckelmann  * @orig: originator mac address
240fec149f5SSven Eckelmann  * @tvlv_len: length of the appended tvlv buffer (in bytes)
241fec149f5SSven Eckelmann  * @throughput: the currently flooded path throughput
242fec149f5SSven Eckelmann  */
243fec149f5SSven Eckelmann struct batadv_ogm2_packet {
244fec149f5SSven Eckelmann 	__u8   packet_type;
245fec149f5SSven Eckelmann 	__u8   version;
246fec149f5SSven Eckelmann 	__u8   ttl;
247fec149f5SSven Eckelmann 	__u8   flags;
248fec149f5SSven Eckelmann 	__be32 seqno;
249fec149f5SSven Eckelmann 	__u8   orig[ETH_ALEN];
250fec149f5SSven Eckelmann 	__be16 tvlv_len;
251fec149f5SSven Eckelmann 	__be32 throughput;
252fec149f5SSven Eckelmann };
253fec149f5SSven Eckelmann 
254fec149f5SSven Eckelmann #define BATADV_OGM2_HLEN sizeof(struct batadv_ogm2_packet)
255fec149f5SSven Eckelmann 
256fec149f5SSven Eckelmann /**
257fec149f5SSven Eckelmann  * struct batadv_elp_packet - elp (neighbor discovery) packet
258fec149f5SSven Eckelmann  * @packet_type: batman-adv packet type, part of the general header
259bccb48c8SSven Eckelmann  * @version: batman-adv protocol version, part of the general header
260fec149f5SSven Eckelmann  * @orig: originator mac address
261fec149f5SSven Eckelmann  * @seqno: sequence number
262fec149f5SSven Eckelmann  * @elp_interval: currently used ELP sending interval in ms
263fec149f5SSven Eckelmann  */
264fec149f5SSven Eckelmann struct batadv_elp_packet {
265fec149f5SSven Eckelmann 	__u8   packet_type;
266fec149f5SSven Eckelmann 	__u8   version;
267fec149f5SSven Eckelmann 	__u8   orig[ETH_ALEN];
268fec149f5SSven Eckelmann 	__be32 seqno;
269fec149f5SSven Eckelmann 	__be32 elp_interval;
270fec149f5SSven Eckelmann };
271fec149f5SSven Eckelmann 
272fec149f5SSven Eckelmann #define BATADV_ELP_HLEN sizeof(struct batadv_elp_packet)
273fec149f5SSven Eckelmann 
274fec149f5SSven Eckelmann /**
275fec149f5SSven Eckelmann  * struct batadv_icmp_header - common members among all the ICMP packets
276fec149f5SSven Eckelmann  * @packet_type: batman-adv packet type, part of the general header
277bccb48c8SSven Eckelmann  * @version: batman-adv protocol version, part of the general header
278bccb48c8SSven Eckelmann  * @ttl: time to live for this packet, part of the general header
279fec149f5SSven Eckelmann  * @msg_type: ICMP packet type
280fec149f5SSven Eckelmann  * @dst: address of the destination node
281fec149f5SSven Eckelmann  * @orig: address of the source node
282fec149f5SSven Eckelmann  * @uid: local ICMP socket identifier
283fec149f5SSven Eckelmann  * @align: not used - useful for alignment purposes only
284fec149f5SSven Eckelmann  *
285bccb48c8SSven Eckelmann  * This structure is used for ICMP packet parsing only and it is never sent
286fec149f5SSven Eckelmann  * over the wire. The alignment field at the end is there to ensure that
287fec149f5SSven Eckelmann  * members are padded the same way as they are in real packets.
288fec149f5SSven Eckelmann  */
289fec149f5SSven Eckelmann struct batadv_icmp_header {
290fec149f5SSven Eckelmann 	__u8 packet_type;
291fec149f5SSven Eckelmann 	__u8 version;
292fec149f5SSven Eckelmann 	__u8 ttl;
293fec149f5SSven Eckelmann 	__u8 msg_type; /* see ICMP message types above */
294fec149f5SSven Eckelmann 	__u8 dst[ETH_ALEN];
295fec149f5SSven Eckelmann 	__u8 orig[ETH_ALEN];
296fec149f5SSven Eckelmann 	__u8 uid;
297fec149f5SSven Eckelmann 	__u8 align[3];
298fec149f5SSven Eckelmann };
299fec149f5SSven Eckelmann 
300fec149f5SSven Eckelmann /**
301fec149f5SSven Eckelmann  * struct batadv_icmp_packet - ICMP packet
302fec149f5SSven Eckelmann  * @packet_type: batman-adv packet type, part of the general header
303bccb48c8SSven Eckelmann  * @version: batman-adv protocol version, part of the general header
304bccb48c8SSven Eckelmann  * @ttl: time to live for this packet, part of the general header
305fec149f5SSven Eckelmann  * @msg_type: ICMP packet type
306fec149f5SSven Eckelmann  * @dst: address of the destination node
307fec149f5SSven Eckelmann  * @orig: address of the source node
308fec149f5SSven Eckelmann  * @uid: local ICMP socket identifier
309fec149f5SSven Eckelmann  * @reserved: not used - useful for alignment
310fec149f5SSven Eckelmann  * @seqno: ICMP sequence number
311fec149f5SSven Eckelmann  */
312fec149f5SSven Eckelmann struct batadv_icmp_packet {
313fec149f5SSven Eckelmann 	__u8   packet_type;
314fec149f5SSven Eckelmann 	__u8   version;
315fec149f5SSven Eckelmann 	__u8   ttl;
316fec149f5SSven Eckelmann 	__u8   msg_type; /* see ICMP message types above */
317fec149f5SSven Eckelmann 	__u8   dst[ETH_ALEN];
318fec149f5SSven Eckelmann 	__u8   orig[ETH_ALEN];
319fec149f5SSven Eckelmann 	__u8   uid;
320fec149f5SSven Eckelmann 	__u8   reserved;
321fec149f5SSven Eckelmann 	__be16 seqno;
322fec149f5SSven Eckelmann };
323fec149f5SSven Eckelmann 
324fec149f5SSven Eckelmann /**
325fec149f5SSven Eckelmann  * struct batadv_icmp_tp_packet - ICMP TP Meter packet
326fec149f5SSven Eckelmann  * @packet_type: batman-adv packet type, part of the general header
327bccb48c8SSven Eckelmann  * @version: batman-adv protocol version, part of the general header
328bccb48c8SSven Eckelmann  * @ttl: time to live for this packet, part of the general header
329fec149f5SSven Eckelmann  * @msg_type: ICMP packet type
330fec149f5SSven Eckelmann  * @dst: address of the destination node
331fec149f5SSven Eckelmann  * @orig: address of the source node
332fec149f5SSven Eckelmann  * @uid: local ICMP socket identifier
333fec149f5SSven Eckelmann  * @subtype: TP packet subtype (see batadv_icmp_tp_subtype)
334fec149f5SSven Eckelmann  * @session: TP session identifier
335fec149f5SSven Eckelmann  * @seqno: the TP sequence number
336fec149f5SSven Eckelmann  * @timestamp: time when the packet has been sent. This value is filled in a
337fec149f5SSven Eckelmann  *  TP_MSG and echoed back in the next TP_ACK so that the sender can compute the
338fec149f5SSven Eckelmann  *  RTT. Since it is read only by the host which wrote it, there is no need to
339fec149f5SSven Eckelmann  *  store it using network order
340fec149f5SSven Eckelmann  */
341fec149f5SSven Eckelmann struct batadv_icmp_tp_packet {
342fec149f5SSven Eckelmann 	__u8   packet_type;
343fec149f5SSven Eckelmann 	__u8   version;
344fec149f5SSven Eckelmann 	__u8   ttl;
345fec149f5SSven Eckelmann 	__u8   msg_type; /* see ICMP message types above */
346fec149f5SSven Eckelmann 	__u8   dst[ETH_ALEN];
347fec149f5SSven Eckelmann 	__u8   orig[ETH_ALEN];
348fec149f5SSven Eckelmann 	__u8   uid;
349fec149f5SSven Eckelmann 	__u8   subtype;
350fec149f5SSven Eckelmann 	__u8   session[2];
351fec149f5SSven Eckelmann 	__be32 seqno;
352fec149f5SSven Eckelmann 	__be32 timestamp;
353fec149f5SSven Eckelmann };
354fec149f5SSven Eckelmann 
355fec149f5SSven Eckelmann /**
356fec149f5SSven Eckelmann  * enum batadv_icmp_tp_subtype - ICMP TP Meter packet subtypes
357fec149f5SSven Eckelmann  * @BATADV_TP_MSG: Msg from sender to receiver
358fec149f5SSven Eckelmann  * @BATADV_TP_ACK: acknowledgment from receiver to sender
359fec149f5SSven Eckelmann  */
360fec149f5SSven Eckelmann enum batadv_icmp_tp_subtype {
361fec149f5SSven Eckelmann 	BATADV_TP_MSG	= 0,
362fec149f5SSven Eckelmann 	BATADV_TP_ACK,
363fec149f5SSven Eckelmann };
364fec149f5SSven Eckelmann 
365fec149f5SSven Eckelmann #define BATADV_RR_LEN 16
366fec149f5SSven Eckelmann 
367fec149f5SSven Eckelmann /**
368fec149f5SSven Eckelmann  * struct batadv_icmp_packet_rr - ICMP RouteRecord packet
369fec149f5SSven Eckelmann  * @packet_type: batman-adv packet type, part of the general header
370bccb48c8SSven Eckelmann  * @version: batman-adv protocol version, part of the general header
371bccb48c8SSven Eckelmann  * @ttl: time to live for this packet, part of the general header
372fec149f5SSven Eckelmann  * @msg_type: ICMP packet type
373fec149f5SSven Eckelmann  * @dst: address of the destination node
374fec149f5SSven Eckelmann  * @orig: address of the source node
375fec149f5SSven Eckelmann  * @uid: local ICMP socket identifier
376fec149f5SSven Eckelmann  * @rr_cur: number of entries the rr array
377fec149f5SSven Eckelmann  * @seqno: ICMP sequence number
378fec149f5SSven Eckelmann  * @rr: route record array
379fec149f5SSven Eckelmann  */
380fec149f5SSven Eckelmann struct batadv_icmp_packet_rr {
381fec149f5SSven Eckelmann 	__u8   packet_type;
382fec149f5SSven Eckelmann 	__u8   version;
383fec149f5SSven Eckelmann 	__u8   ttl;
384fec149f5SSven Eckelmann 	__u8   msg_type; /* see ICMP message types above */
385fec149f5SSven Eckelmann 	__u8   dst[ETH_ALEN];
386fec149f5SSven Eckelmann 	__u8   orig[ETH_ALEN];
387fec149f5SSven Eckelmann 	__u8   uid;
388fec149f5SSven Eckelmann 	__u8   rr_cur;
389fec149f5SSven Eckelmann 	__be16 seqno;
390fec149f5SSven Eckelmann 	__u8   rr[BATADV_RR_LEN][ETH_ALEN];
391fec149f5SSven Eckelmann };
392fec149f5SSven Eckelmann 
393fec149f5SSven Eckelmann #define BATADV_ICMP_MAX_PACKET_SIZE	sizeof(struct batadv_icmp_packet_rr)
394fec149f5SSven Eckelmann 
395fec149f5SSven Eckelmann /* All packet headers in front of an ethernet header have to be completely
396fec149f5SSven Eckelmann  * divisible by 2 but not by 4 to make the payload after the ethernet
397fec149f5SSven Eckelmann  * header again 4 bytes boundary aligned.
398fec149f5SSven Eckelmann  *
399fec149f5SSven Eckelmann  * A packing of 2 is necessary to avoid extra padding at the end of the struct
400fec149f5SSven Eckelmann  * caused by a structure member which is larger than two bytes. Otherwise
401fec149f5SSven Eckelmann  * the structure would not fulfill the previously mentioned rule to avoid the
402fec149f5SSven Eckelmann  * misalignment of the payload after the ethernet header. It may also lead to
403fec149f5SSven Eckelmann  * leakage of information when the padding it not initialized before sending.
404fec149f5SSven Eckelmann  */
405fec149f5SSven Eckelmann 
406fec149f5SSven Eckelmann /**
407fec149f5SSven Eckelmann  * struct batadv_unicast_packet - unicast packet for network payload
408fec149f5SSven Eckelmann  * @packet_type: batman-adv packet type, part of the general header
409bccb48c8SSven Eckelmann  * @version: batman-adv protocol version, part of the general header
410bccb48c8SSven Eckelmann  * @ttl: time to live for this packet, part of the general header
411fec149f5SSven Eckelmann  * @ttvn: translation table version number
412fec149f5SSven Eckelmann  * @dest: originator destination of the unicast packet
413fec149f5SSven Eckelmann  */
414fec149f5SSven Eckelmann struct batadv_unicast_packet {
415fec149f5SSven Eckelmann 	__u8 packet_type;
416fec149f5SSven Eckelmann 	__u8 version;
417fec149f5SSven Eckelmann 	__u8 ttl;
418fec149f5SSven Eckelmann 	__u8 ttvn; /* destination translation table version number */
419fec149f5SSven Eckelmann 	__u8 dest[ETH_ALEN];
420fec149f5SSven Eckelmann 	/* "4 bytes boundary + 2 bytes" long to make the payload after the
421fec149f5SSven Eckelmann 	 * following ethernet header again 4 bytes boundary aligned
422fec149f5SSven Eckelmann 	 */
423fec149f5SSven Eckelmann };
424fec149f5SSven Eckelmann 
425fec149f5SSven Eckelmann /**
426fec149f5SSven Eckelmann  * struct batadv_unicast_4addr_packet - extended unicast packet
427fec149f5SSven Eckelmann  * @u: common unicast packet header
428fec149f5SSven Eckelmann  * @src: address of the source
429fec149f5SSven Eckelmann  * @subtype: packet subtype
430fec149f5SSven Eckelmann  * @reserved: reserved byte for alignment
431fec149f5SSven Eckelmann  */
432fec149f5SSven Eckelmann struct batadv_unicast_4addr_packet {
433fec149f5SSven Eckelmann 	struct batadv_unicast_packet u;
434fec149f5SSven Eckelmann 	__u8 src[ETH_ALEN];
435fec149f5SSven Eckelmann 	__u8 subtype;
436fec149f5SSven Eckelmann 	__u8 reserved;
437fec149f5SSven Eckelmann 	/* "4 bytes boundary + 2 bytes" long to make the payload after the
438fec149f5SSven Eckelmann 	 * following ethernet header again 4 bytes boundary aligned
439fec149f5SSven Eckelmann 	 */
440fec149f5SSven Eckelmann };
441fec149f5SSven Eckelmann 
442fec149f5SSven Eckelmann /**
443fec149f5SSven Eckelmann  * struct batadv_frag_packet - fragmented packet
444fec149f5SSven Eckelmann  * @packet_type: batman-adv packet type, part of the general header
445bccb48c8SSven Eckelmann  * @version: batman-adv protocol version, part of the general header
446bccb48c8SSven Eckelmann  * @ttl: time to live for this packet, part of the general header
447fec149f5SSven Eckelmann  * @dest: final destination used when routing fragments
448fec149f5SSven Eckelmann  * @orig: originator of the fragment used when merging the packet
449fec149f5SSven Eckelmann  * @no: fragment number within this sequence
450fec149f5SSven Eckelmann  * @priority: priority of frame, from ToS IP precedence or 802.1p
451fec149f5SSven Eckelmann  * @reserved: reserved byte for alignment
452fec149f5SSven Eckelmann  * @seqno: sequence identification
453fec149f5SSven Eckelmann  * @total_size: size of the merged packet
454fec149f5SSven Eckelmann  */
455fec149f5SSven Eckelmann struct batadv_frag_packet {
456fec149f5SSven Eckelmann 	__u8   packet_type;
457fec149f5SSven Eckelmann 	__u8   version;  /* batman version field */
458fec149f5SSven Eckelmann 	__u8   ttl;
459fec149f5SSven Eckelmann #if defined(__BIG_ENDIAN_BITFIELD)
460fec149f5SSven Eckelmann 	__u8   no:4;
461fec149f5SSven Eckelmann 	__u8   priority:3;
462fec149f5SSven Eckelmann 	__u8   reserved:1;
463fec149f5SSven Eckelmann #elif defined(__LITTLE_ENDIAN_BITFIELD)
464fec149f5SSven Eckelmann 	__u8   reserved:1;
465fec149f5SSven Eckelmann 	__u8   priority:3;
466fec149f5SSven Eckelmann 	__u8   no:4;
467fec149f5SSven Eckelmann #else
468fec149f5SSven Eckelmann #error "unknown bitfield endianness"
469fec149f5SSven Eckelmann #endif
470fec149f5SSven Eckelmann 	__u8   dest[ETH_ALEN];
471fec149f5SSven Eckelmann 	__u8   orig[ETH_ALEN];
472fec149f5SSven Eckelmann 	__be16 seqno;
473fec149f5SSven Eckelmann 	__be16 total_size;
474fec149f5SSven Eckelmann };
475fec149f5SSven Eckelmann 
476fec149f5SSven Eckelmann /**
477fec149f5SSven Eckelmann  * struct batadv_bcast_packet - broadcast packet for network payload
478fec149f5SSven Eckelmann  * @packet_type: batman-adv packet type, part of the general header
479bccb48c8SSven Eckelmann  * @version: batman-adv protocol version, part of the general header
480bccb48c8SSven Eckelmann  * @ttl: time to live for this packet, part of the general header
481fec149f5SSven Eckelmann  * @reserved: reserved byte for alignment
482fec149f5SSven Eckelmann  * @seqno: sequence identification
483fec149f5SSven Eckelmann  * @orig: originator of the broadcast packet
484fec149f5SSven Eckelmann  */
485fec149f5SSven Eckelmann struct batadv_bcast_packet {
486fec149f5SSven Eckelmann 	__u8   packet_type;
487fec149f5SSven Eckelmann 	__u8   version;  /* batman version field */
488fec149f5SSven Eckelmann 	__u8   ttl;
489fec149f5SSven Eckelmann 	__u8   reserved;
490fec149f5SSven Eckelmann 	__be32 seqno;
491fec149f5SSven Eckelmann 	__u8   orig[ETH_ALEN];
492fec149f5SSven Eckelmann 	/* "4 bytes boundary + 2 bytes" long to make the payload after the
493fec149f5SSven Eckelmann 	 * following ethernet header again 4 bytes boundary aligned
494fec149f5SSven Eckelmann 	 */
495fec149f5SSven Eckelmann };
496fec149f5SSven Eckelmann 
497fec149f5SSven Eckelmann /**
49807afe1baSLinus Lüssing  * struct batadv_mcast_packet - multicast packet for network payload
49907afe1baSLinus Lüssing  * @packet_type: batman-adv packet type, part of the general header
50007afe1baSLinus Lüssing  * @version: batman-adv protocol version, part of the general header
50107afe1baSLinus Lüssing  * @ttl: time to live for this packet, part of the general header
50207afe1baSLinus Lüssing  * @reserved: reserved byte for alignment
50307afe1baSLinus Lüssing  * @tvlv_len: length of the appended tvlv buffer (in bytes)
50407afe1baSLinus Lüssing  */
50507afe1baSLinus Lüssing struct batadv_mcast_packet {
50607afe1baSLinus Lüssing 	__u8 packet_type;
50707afe1baSLinus Lüssing 	__u8 version;
50807afe1baSLinus Lüssing 	__u8 ttl;
50907afe1baSLinus Lüssing 	__u8 reserved;
51007afe1baSLinus Lüssing 	__be16 tvlv_len;
51107afe1baSLinus Lüssing 	/* "4 bytes boundary + 2 bytes" long to make the payload after the
51207afe1baSLinus Lüssing 	 * following ethernet header again 4 bytes boundary aligned
51307afe1baSLinus Lüssing 	 */
51407afe1baSLinus Lüssing };
51507afe1baSLinus Lüssing 
51607afe1baSLinus Lüssing /**
517fec149f5SSven Eckelmann  * struct batadv_coded_packet - network coded packet
518fec149f5SSven Eckelmann  * @packet_type: batman-adv packet type, part of the general header
519bccb48c8SSven Eckelmann  * @version: batman-adv protocol version, part of the general header
520bccb48c8SSven Eckelmann  * @ttl: time to live for this packet, part of the general header
521fec149f5SSven Eckelmann  * @first_source: original source of first included packet
522bccb48c8SSven Eckelmann  * @first_orig_dest: original destination of first included packet
523fec149f5SSven Eckelmann  * @first_crc: checksum of first included packet
524fec149f5SSven Eckelmann  * @first_ttvn: tt-version number of first included packet
525fec149f5SSven Eckelmann  * @second_ttl: ttl of second packet
526fec149f5SSven Eckelmann  * @second_dest: second receiver of this coded packet
527fec149f5SSven Eckelmann  * @second_source: original source of second included packet
528fec149f5SSven Eckelmann  * @second_orig_dest: original destination of second included packet
529fec149f5SSven Eckelmann  * @second_crc: checksum of second included packet
530fec149f5SSven Eckelmann  * @second_ttvn: tt version number of second included packet
531fec149f5SSven Eckelmann  * @coded_len: length of network coded part of the payload
532fec149f5SSven Eckelmann  */
533fec149f5SSven Eckelmann struct batadv_coded_packet {
534fec149f5SSven Eckelmann 	__u8   packet_type;
535fec149f5SSven Eckelmann 	__u8   version;  /* batman version field */
536fec149f5SSven Eckelmann 	__u8   ttl;
537fec149f5SSven Eckelmann 	__u8   first_ttvn;
538fec149f5SSven Eckelmann 	/* __u8 first_dest[ETH_ALEN]; - saved in mac header destination */
539fec149f5SSven Eckelmann 	__u8   first_source[ETH_ALEN];
540fec149f5SSven Eckelmann 	__u8   first_orig_dest[ETH_ALEN];
541fec149f5SSven Eckelmann 	__be32 first_crc;
542fec149f5SSven Eckelmann 	__u8   second_ttl;
543fec149f5SSven Eckelmann 	__u8   second_ttvn;
544fec149f5SSven Eckelmann 	__u8   second_dest[ETH_ALEN];
545fec149f5SSven Eckelmann 	__u8   second_source[ETH_ALEN];
546fec149f5SSven Eckelmann 	__u8   second_orig_dest[ETH_ALEN];
547fec149f5SSven Eckelmann 	__be32 second_crc;
548fec149f5SSven Eckelmann 	__be16 coded_len;
549fec149f5SSven Eckelmann };
550fec149f5SSven Eckelmann 
551fec149f5SSven Eckelmann /**
552fec149f5SSven Eckelmann  * struct batadv_unicast_tvlv_packet - generic unicast packet with tvlv payload
553fec149f5SSven Eckelmann  * @packet_type: batman-adv packet type, part of the general header
554bccb48c8SSven Eckelmann  * @version: batman-adv protocol version, part of the general header
555bccb48c8SSven Eckelmann  * @ttl: time to live for this packet, part of the general header
556fec149f5SSven Eckelmann  * @reserved: reserved field (for packet alignment)
557fec149f5SSven Eckelmann  * @src: address of the source
558fec149f5SSven Eckelmann  * @dst: address of the destination
559fec149f5SSven Eckelmann  * @tvlv_len: length of tvlv data following the unicast tvlv header
560fec149f5SSven Eckelmann  * @align: 2 bytes to align the header to a 4 byte boundary
561fec149f5SSven Eckelmann  */
562fec149f5SSven Eckelmann struct batadv_unicast_tvlv_packet {
563fec149f5SSven Eckelmann 	__u8   packet_type;
564fec149f5SSven Eckelmann 	__u8   version;  /* batman version field */
565fec149f5SSven Eckelmann 	__u8   ttl;
566fec149f5SSven Eckelmann 	__u8   reserved;
567fec149f5SSven Eckelmann 	__u8   dst[ETH_ALEN];
568fec149f5SSven Eckelmann 	__u8   src[ETH_ALEN];
569fec149f5SSven Eckelmann 	__be16 tvlv_len;
570fec149f5SSven Eckelmann 	__u16  align;
571fec149f5SSven Eckelmann };
572fec149f5SSven Eckelmann 
573fec149f5SSven Eckelmann /**
574fec149f5SSven Eckelmann  * struct batadv_tvlv_hdr - base tvlv header struct
575fec149f5SSven Eckelmann  * @type: tvlv container type (see batadv_tvlv_type)
576fec149f5SSven Eckelmann  * @version: tvlv container version
577fec149f5SSven Eckelmann  * @len: tvlv container length
578fec149f5SSven Eckelmann  */
579fec149f5SSven Eckelmann struct batadv_tvlv_hdr {
580fec149f5SSven Eckelmann 	__u8   type;
581fec149f5SSven Eckelmann 	__u8   version;
582fec149f5SSven Eckelmann 	__be16 len;
583fec149f5SSven Eckelmann };
584fec149f5SSven Eckelmann 
585fec149f5SSven Eckelmann /**
586fec149f5SSven Eckelmann  * struct batadv_tvlv_gateway_data - gateway data propagated through gw tvlv
587fec149f5SSven Eckelmann  *  container
588fec149f5SSven Eckelmann  * @bandwidth_down: advertised uplink download bandwidth
589fec149f5SSven Eckelmann  * @bandwidth_up: advertised uplink upload bandwidth
590fec149f5SSven Eckelmann  */
591fec149f5SSven Eckelmann struct batadv_tvlv_gateway_data {
592fec149f5SSven Eckelmann 	__be32 bandwidth_down;
593fec149f5SSven Eckelmann 	__be32 bandwidth_up;
594fec149f5SSven Eckelmann };
595fec149f5SSven Eckelmann 
596fec149f5SSven Eckelmann /**
597fec149f5SSven Eckelmann  * struct batadv_tvlv_tt_vlan_data - vlan specific tt data propagated through
598fec149f5SSven Eckelmann  *  the tt tvlv container
599fec149f5SSven Eckelmann  * @crc: crc32 checksum of the entries belonging to this vlan
600fec149f5SSven Eckelmann  * @vid: vlan identifier
601fec149f5SSven Eckelmann  * @reserved: unused, useful for alignment purposes
602fec149f5SSven Eckelmann  */
603fec149f5SSven Eckelmann struct batadv_tvlv_tt_vlan_data {
604fec149f5SSven Eckelmann 	__be32 crc;
605fec149f5SSven Eckelmann 	__be16 vid;
606fec149f5SSven Eckelmann 	__u16  reserved;
607fec149f5SSven Eckelmann };
608fec149f5SSven Eckelmann 
609fec149f5SSven Eckelmann /**
610*4436df47SErick Archer  * struct batadv_tvlv_tt_data - tt data propagated through the tt tvlv container
611*4436df47SErick Archer  * @flags: translation table flags (see batadv_tt_data_flags)
612*4436df47SErick Archer  * @ttvn: translation table version number
613*4436df47SErick Archer  * @num_vlan: number of announced VLANs. In the TVLV this struct is followed by
614*4436df47SErick Archer  *  one batadv_tvlv_tt_vlan_data object per announced vlan
615*4436df47SErick Archer  * @vlan_data: array of batadv_tvlv_tt_vlan_data objects
616*4436df47SErick Archer  */
617*4436df47SErick Archer struct batadv_tvlv_tt_data {
618*4436df47SErick Archer 	__u8   flags;
619*4436df47SErick Archer 	__u8   ttvn;
620*4436df47SErick Archer 	__be16 num_vlan;
621*4436df47SErick Archer 	struct batadv_tvlv_tt_vlan_data vlan_data[] __counted_by_be(num_vlan);
622*4436df47SErick Archer };
623*4436df47SErick Archer 
624*4436df47SErick Archer /**
625fec149f5SSven Eckelmann  * struct batadv_tvlv_tt_change - translation table diff data
626fec149f5SSven Eckelmann  * @flags: status indicators concerning the non-mesh client (see
627fec149f5SSven Eckelmann  *  batadv_tt_client_flags)
628fec149f5SSven Eckelmann  * @reserved: reserved field - useful for alignment purposes only
629fec149f5SSven Eckelmann  * @addr: mac address of non-mesh client that triggered this tt change
630fec149f5SSven Eckelmann  * @vid: VLAN identifier
631fec149f5SSven Eckelmann  */
632fec149f5SSven Eckelmann struct batadv_tvlv_tt_change {
633fec149f5SSven Eckelmann 	__u8   flags;
634fec149f5SSven Eckelmann 	__u8   reserved[3];
635fec149f5SSven Eckelmann 	__u8   addr[ETH_ALEN];
636fec149f5SSven Eckelmann 	__be16 vid;
637fec149f5SSven Eckelmann };
638fec149f5SSven Eckelmann 
639fec149f5SSven Eckelmann /**
640fec149f5SSven Eckelmann  * struct batadv_tvlv_roam_adv - roaming advertisement
641fec149f5SSven Eckelmann  * @client: mac address of roaming client
642fec149f5SSven Eckelmann  * @vid: VLAN identifier
643fec149f5SSven Eckelmann  */
644fec149f5SSven Eckelmann struct batadv_tvlv_roam_adv {
645fec149f5SSven Eckelmann 	__u8   client[ETH_ALEN];
646fec149f5SSven Eckelmann 	__be16 vid;
647fec149f5SSven Eckelmann };
648fec149f5SSven Eckelmann 
649fec149f5SSven Eckelmann /**
650fec149f5SSven Eckelmann  * struct batadv_tvlv_mcast_data - payload of a multicast tvlv
651fec149f5SSven Eckelmann  * @flags: multicast flags announced by the orig node
652fec149f5SSven Eckelmann  * @reserved: reserved field
653fec149f5SSven Eckelmann  */
654fec149f5SSven Eckelmann struct batadv_tvlv_mcast_data {
655fec149f5SSven Eckelmann 	__u8 flags;
656fec149f5SSven Eckelmann 	__u8 reserved[3];
657fec149f5SSven Eckelmann };
658fec149f5SSven Eckelmann 
65907afe1baSLinus Lüssing /**
66007afe1baSLinus Lüssing  * struct batadv_tvlv_mcast_tracker - payload of a multicast tracker tvlv
66107afe1baSLinus Lüssing  * @num_dests: number of subsequent destination originator MAC addresses
66207afe1baSLinus Lüssing  */
66307afe1baSLinus Lüssing struct batadv_tvlv_mcast_tracker {
66407afe1baSLinus Lüssing 	__be16	num_dests;
66507afe1baSLinus Lüssing };
66607afe1baSLinus Lüssing 
667a163dc22SMatthias Schiffer #pragma pack()
668a163dc22SMatthias Schiffer 
669fec149f5SSven Eckelmann #endif /* _UAPI_LINUX_BATADV_PACKET_H_ */
670