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