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