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