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