1/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors: 2 * 3 * Marek Lindner, Simon Wunderlich 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of version 2 of the GNU General Public 7 * License as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 17 * 02110-1301, USA 18 */ 19 20#ifndef _NET_BATMAN_ADV_PACKET_H_ 21#define _NET_BATMAN_ADV_PACKET_H_ 22 23/** 24 * enum batadv_packettype - types for batman-adv encapsulated packets 25 * @BATADV_IV_OGM: originator messages for B.A.T.M.A.N. IV 26 * @BATADV_BCAST: broadcast packets carrying broadcast payload 27 * @BATADV_CODED: network coded packets 28 * 29 * @BATADV_UNICAST: unicast packets carrying unicast payload traffic 30 * @BATADV_UNICAST_FRAG: unicast packets carrying a fragment of the original 31 * payload packet 32 * @BATADV_UNICAST_4ADDR: unicast packet including the originator address of 33 * the sender 34 * @BATADV_ICMP: unicast packet like IP ICMP used for ping or traceroute 35 * @BATADV_UNICAST_TVLV: unicast packet carrying TVLV containers 36 */ 37enum batadv_packettype { 38 /* 0x00 - 0x3f: local packets or special rules for handling */ 39 BATADV_IV_OGM = 0x00, 40 BATADV_BCAST = 0x01, 41 BATADV_CODED = 0x02, 42 /* 0x40 - 0x7f: unicast */ 43#define BATADV_UNICAST_MIN 0x40 44 BATADV_UNICAST = 0x40, 45 BATADV_UNICAST_FRAG = 0x41, 46 BATADV_UNICAST_4ADDR = 0x42, 47 BATADV_ICMP = 0x43, 48 BATADV_UNICAST_TVLV = 0x44, 49#define BATADV_UNICAST_MAX 0x7f 50 /* 0x80 - 0xff: reserved */ 51}; 52 53/** 54 * enum batadv_subtype - packet subtype for unicast4addr 55 * @BATADV_P_DATA: user payload 56 * @BATADV_P_DAT_DHT_GET: DHT request message 57 * @BATADV_P_DAT_DHT_PUT: DHT store message 58 * @BATADV_P_DAT_CACHE_REPLY: ARP reply generated by DAT 59 */ 60enum batadv_subtype { 61 BATADV_P_DATA = 0x01, 62 BATADV_P_DAT_DHT_GET = 0x02, 63 BATADV_P_DAT_DHT_PUT = 0x03, 64 BATADV_P_DAT_CACHE_REPLY = 0x04, 65}; 66 67/* this file is included by batctl which needs these defines */ 68#define BATADV_COMPAT_VERSION 15 69 70/** 71 * enum batadv_iv_flags - flags used in B.A.T.M.A.N. IV OGM packets 72 * @BATADV_NOT_BEST_NEXT_HOP: flag is set when ogm packet is forwarded and was 73 * previously received from someone else than the best neighbor. 74 * @BATADV_PRIMARIES_FIRST_HOP: flag is set when the primary interface address 75 * is used, and the packet travels its first hop. 76 * @BATADV_DIRECTLINK: flag is for the first hop or if rebroadcasted from a 77 * one hop neighbor on the interface where it was originally received. 78 */ 79enum batadv_iv_flags { 80 BATADV_NOT_BEST_NEXT_HOP = BIT(0), 81 BATADV_PRIMARIES_FIRST_HOP = BIT(1), 82 BATADV_DIRECTLINK = BIT(2), 83}; 84 85/* ICMP message types */ 86enum batadv_icmp_packettype { 87 BATADV_ECHO_REPLY = 0, 88 BATADV_DESTINATION_UNREACHABLE = 3, 89 BATADV_ECHO_REQUEST = 8, 90 BATADV_TTL_EXCEEDED = 11, 91 BATADV_PARAMETER_PROBLEM = 12, 92}; 93 94/* tt data subtypes */ 95#define BATADV_TT_DATA_TYPE_MASK 0x0F 96 97/** 98 * enum batadv_tt_data_flags - flags for tt data tvlv 99 * @BATADV_TT_OGM_DIFF: TT diff propagated through OGM 100 * @BATADV_TT_REQUEST: TT request message 101 * @BATADV_TT_RESPONSE: TT response message 102 * @BATADV_TT_FULL_TABLE: contains full table to replace existing table 103 */ 104enum batadv_tt_data_flags { 105 BATADV_TT_OGM_DIFF = BIT(0), 106 BATADV_TT_REQUEST = BIT(1), 107 BATADV_TT_RESPONSE = BIT(2), 108 BATADV_TT_FULL_TABLE = BIT(4), 109}; 110 111/* BATADV_TT_CLIENT flags. 112 * Flags from BIT(0) to BIT(7) are sent on the wire, while flags from BIT(8) to 113 * BIT(15) are used for local computation only. 114 * Flags from BIT(4) to BIT(7) are kept in sync with the rest of the network. 115 */ 116enum batadv_tt_client_flags { 117 BATADV_TT_CLIENT_DEL = BIT(0), 118 BATADV_TT_CLIENT_ROAM = BIT(1), 119 BATADV_TT_CLIENT_WIFI = BIT(4), 120 BATADV_TT_CLIENT_NOPURGE = BIT(8), 121 BATADV_TT_CLIENT_NEW = BIT(9), 122 BATADV_TT_CLIENT_PENDING = BIT(10), 123 BATADV_TT_CLIENT_TEMP = BIT(11), 124}; 125 126/** 127 * batadv_vlan_flags - flags for the four MSB of any vlan ID field 128 * @BATADV_VLAN_HAS_TAG: whether the field contains a valid vlan tag or not 129 */ 130enum batadv_vlan_flags { 131 BATADV_VLAN_HAS_TAG = BIT(15), 132}; 133 134/* claim frame types for the bridge loop avoidance */ 135enum batadv_bla_claimframe { 136 BATADV_CLAIM_TYPE_CLAIM = 0x00, 137 BATADV_CLAIM_TYPE_UNCLAIM = 0x01, 138 BATADV_CLAIM_TYPE_ANNOUNCE = 0x02, 139 BATADV_CLAIM_TYPE_REQUEST = 0x03, 140}; 141 142/** 143 * enum batadv_tvlv_type - tvlv type definitions 144 * @BATADV_TVLV_GW: gateway tvlv 145 * @BATADV_TVLV_DAT: distributed arp table tvlv 146 * @BATADV_TVLV_NC: network coding tvlv 147 * @BATADV_TVLV_TT: translation table tvlv 148 * @BATADV_TVLV_ROAM: roaming advertisement tvlv 149 */ 150enum batadv_tvlv_type { 151 BATADV_TVLV_GW = 0x01, 152 BATADV_TVLV_DAT = 0x02, 153 BATADV_TVLV_NC = 0x03, 154 BATADV_TVLV_TT = 0x04, 155 BATADV_TVLV_ROAM = 0x05, 156}; 157 158#pragma pack(2) 159/* the destination hardware field in the ARP frame is used to 160 * transport the claim type and the group id 161 */ 162struct batadv_bla_claim_dst { 163 uint8_t magic[3]; /* FF:43:05 */ 164 uint8_t type; /* bla_claimframe */ 165 __be16 group; /* group id */ 166}; 167#pragma pack() 168 169/** 170 * struct batadv_ogm_packet - ogm (routing protocol) packet 171 * @packet_type: batman-adv packet type, part of the general header 172 * @version: batman-adv protocol version, part of the genereal header 173 * @ttl: time to live for this packet, part of the genereal header 174 * @flags: contains routing relevant flags - see enum batadv_iv_flags 175 * @tvlv_len: length of tvlv data following the ogm header 176 */ 177struct batadv_ogm_packet { 178 uint8_t packet_type; 179 uint8_t version; 180 uint8_t ttl; 181 uint8_t flags; 182 __be32 seqno; 183 uint8_t orig[ETH_ALEN]; 184 uint8_t prev_sender[ETH_ALEN]; 185 uint8_t reserved; 186 uint8_t tq; 187 __be16 tvlv_len; 188 /* __packed is not needed as the struct size is divisible by 4, 189 * and the largest data type in this struct has a size of 4. 190 */ 191}; 192 193#define BATADV_OGM_HLEN sizeof(struct batadv_ogm_packet) 194 195/** 196 * batadv_icmp_header - common members among all the ICMP packets 197 * @packet_type: batman-adv packet type, part of the general header 198 * @version: batman-adv protocol version, part of the genereal header 199 * @ttl: time to live for this packet, part of the genereal header 200 * @msg_type: ICMP packet type 201 * @dst: address of the destination node 202 * @orig: address of the source node 203 * @uid: local ICMP socket identifier 204 * @align: not used - useful for alignment purposes only 205 * 206 * This structure is used for ICMP packets parsing only and it is never sent 207 * over the wire. The alignment field at the end is there to ensure that 208 * members are padded the same way as they are in real packets. 209 */ 210struct batadv_icmp_header { 211 uint8_t packet_type; 212 uint8_t version; 213 uint8_t ttl; 214 uint8_t msg_type; /* see ICMP message types above */ 215 uint8_t dst[ETH_ALEN]; 216 uint8_t orig[ETH_ALEN]; 217 uint8_t uid; 218 uint8_t align[3]; 219}; 220 221/** 222 * batadv_icmp_packet - ICMP packet 223 * @packet_type: batman-adv packet type, part of the general header 224 * @version: batman-adv protocol version, part of the genereal header 225 * @ttl: time to live for this packet, part of the genereal header 226 * @msg_type: ICMP packet type 227 * @dst: address of the destination node 228 * @orig: address of the source node 229 * @uid: local ICMP socket identifier 230 * @reserved: not used - useful for alignment 231 * @seqno: ICMP sequence number 232 */ 233struct batadv_icmp_packet { 234 uint8_t packet_type; 235 uint8_t version; 236 uint8_t ttl; 237 uint8_t msg_type; /* see ICMP message types above */ 238 uint8_t dst[ETH_ALEN]; 239 uint8_t orig[ETH_ALEN]; 240 uint8_t uid; 241 uint8_t reserved; 242 __be16 seqno; 243}; 244 245#define BATADV_RR_LEN 16 246 247/** 248 * batadv_icmp_packet_rr - ICMP RouteRecord packet 249 * @packet_type: batman-adv packet type, part of the general header 250 * @version: batman-adv protocol version, part of the genereal header 251 * @ttl: time to live for this packet, part of the genereal header 252 * @msg_type: ICMP packet type 253 * @dst: address of the destination node 254 * @orig: address of the source node 255 * @uid: local ICMP socket identifier 256 * @rr_cur: number of entries the rr array 257 * @seqno: ICMP sequence number 258 * @rr: route record array 259 */ 260struct batadv_icmp_packet_rr { 261 uint8_t packet_type; 262 uint8_t version; 263 uint8_t ttl; 264 uint8_t msg_type; /* see ICMP message types above */ 265 uint8_t dst[ETH_ALEN]; 266 uint8_t orig[ETH_ALEN]; 267 uint8_t uid; 268 uint8_t rr_cur; 269 __be16 seqno; 270 uint8_t rr[BATADV_RR_LEN][ETH_ALEN]; 271}; 272 273#define BATADV_ICMP_MAX_PACKET_SIZE sizeof(struct batadv_icmp_packet_rr) 274 275/* All packet headers in front of an ethernet header have to be completely 276 * divisible by 2 but not by 4 to make the payload after the ethernet 277 * header again 4 bytes boundary aligned. 278 * 279 * A packing of 2 is necessary to avoid extra padding at the end of the struct 280 * caused by a structure member which is larger than two bytes. Otherwise 281 * the structure would not fulfill the previously mentioned rule to avoid the 282 * misalignment of the payload after the ethernet header. It may also lead to 283 * leakage of information when the padding it not initialized before sending. 284 */ 285#pragma pack(2) 286 287/** 288 * struct batadv_unicast_packet - unicast packet for network payload 289 * @packet_type: batman-adv packet type, part of the general header 290 * @version: batman-adv protocol version, part of the genereal header 291 * @ttl: time to live for this packet, part of the genereal header 292 * @ttvn: translation table version number 293 * @dest: originator destination of the unicast packet 294 */ 295struct batadv_unicast_packet { 296 uint8_t packet_type; 297 uint8_t version; 298 uint8_t ttl; 299 uint8_t ttvn; /* destination translation table version number */ 300 uint8_t dest[ETH_ALEN]; 301 /* "4 bytes boundary + 2 bytes" long to make the payload after the 302 * following ethernet header again 4 bytes boundary aligned 303 */ 304}; 305 306/** 307 * struct batadv_unicast_4addr_packet - extended unicast packet 308 * @u: common unicast packet header 309 * @src: address of the source 310 * @subtype: packet subtype 311 */ 312struct batadv_unicast_4addr_packet { 313 struct batadv_unicast_packet u; 314 uint8_t src[ETH_ALEN]; 315 uint8_t subtype; 316 uint8_t reserved; 317 /* "4 bytes boundary + 2 bytes" long to make the payload after the 318 * following ethernet header again 4 bytes boundary aligned 319 */ 320}; 321 322/** 323 * struct batadv_frag_packet - fragmented packet 324 * @packet_type: batman-adv packet type, part of the general header 325 * @version: batman-adv protocol version, part of the genereal header 326 * @ttl: time to live for this packet, part of the genereal header 327 * @dest: final destination used when routing fragments 328 * @orig: originator of the fragment used when merging the packet 329 * @no: fragment number within this sequence 330 * @reserved: reserved byte for alignment 331 * @seqno: sequence identification 332 * @total_size: size of the merged packet 333 */ 334struct batadv_frag_packet { 335 uint8_t packet_type; 336 uint8_t version; /* batman version field */ 337 uint8_t ttl; 338#if defined(__BIG_ENDIAN_BITFIELD) 339 uint8_t no:4; 340 uint8_t reserved:4; 341#elif defined(__LITTLE_ENDIAN_BITFIELD) 342 uint8_t reserved:4; 343 uint8_t no:4; 344#else 345#error "unknown bitfield endianess" 346#endif 347 uint8_t dest[ETH_ALEN]; 348 uint8_t orig[ETH_ALEN]; 349 __be16 seqno; 350 __be16 total_size; 351}; 352 353/** 354 * struct batadv_bcast_packet - broadcast packet for network payload 355 * @packet_type: batman-adv packet type, part of the general header 356 * @version: batman-adv protocol version, part of the genereal header 357 * @ttl: time to live for this packet, part of the genereal header 358 * @reserved: reserved byte for alignment 359 * @seqno: sequence identification 360 * @orig: originator of the broadcast packet 361 */ 362struct batadv_bcast_packet { 363 uint8_t packet_type; 364 uint8_t version; /* batman version field */ 365 uint8_t ttl; 366 uint8_t reserved; 367 __be32 seqno; 368 uint8_t orig[ETH_ALEN]; 369 /* "4 bytes boundary + 2 bytes" long to make the payload after the 370 * following ethernet header again 4 bytes boundary aligned 371 */ 372}; 373 374/** 375 * struct batadv_coded_packet - network coded packet 376 * @packet_type: batman-adv packet type, part of the general header 377 * @version: batman-adv protocol version, part of the genereal header 378 * @ttl: time to live for this packet, part of the genereal header 379 * @reserved: Align following fields to 2-byte boundaries 380 * @first_source: original source of first included packet 381 * @first_orig_dest: original destinal of first included packet 382 * @first_crc: checksum of first included packet 383 * @first_ttvn: tt-version number of first included packet 384 * @second_ttl: ttl of second packet 385 * @second_dest: second receiver of this coded packet 386 * @second_source: original source of second included packet 387 * @second_orig_dest: original destination of second included packet 388 * @second_crc: checksum of second included packet 389 * @second_ttvn: tt version number of second included packet 390 * @coded_len: length of network coded part of the payload 391 */ 392struct batadv_coded_packet { 393 uint8_t packet_type; 394 uint8_t version; /* batman version field */ 395 uint8_t ttl; 396 uint8_t first_ttvn; 397 /* uint8_t first_dest[ETH_ALEN]; - saved in mac header destination */ 398 uint8_t first_source[ETH_ALEN]; 399 uint8_t first_orig_dest[ETH_ALEN]; 400 __be32 first_crc; 401 uint8_t second_ttl; 402 uint8_t second_ttvn; 403 uint8_t second_dest[ETH_ALEN]; 404 uint8_t second_source[ETH_ALEN]; 405 uint8_t second_orig_dest[ETH_ALEN]; 406 __be32 second_crc; 407 __be16 coded_len; 408}; 409 410#pragma pack() 411 412/** 413 * struct batadv_unicast_tvlv - generic unicast packet with tvlv payload 414 * @packet_type: batman-adv packet type, part of the general header 415 * @version: batman-adv protocol version, part of the genereal header 416 * @ttl: time to live for this packet, part of the genereal header 417 * @reserved: reserved field (for packet alignment) 418 * @src: address of the source 419 * @dst: address of the destination 420 * @tvlv_len: length of tvlv data following the unicast tvlv header 421 * @align: 2 bytes to align the header to a 4 byte boundry 422 */ 423struct batadv_unicast_tvlv_packet { 424 uint8_t packet_type; 425 uint8_t version; /* batman version field */ 426 uint8_t ttl; 427 uint8_t reserved; 428 uint8_t dst[ETH_ALEN]; 429 uint8_t src[ETH_ALEN]; 430 __be16 tvlv_len; 431 uint16_t align; 432}; 433 434/** 435 * struct batadv_tvlv_hdr - base tvlv header struct 436 * @type: tvlv container type (see batadv_tvlv_type) 437 * @version: tvlv container version 438 * @len: tvlv container length 439 */ 440struct batadv_tvlv_hdr { 441 uint8_t type; 442 uint8_t version; 443 __be16 len; 444}; 445 446/** 447 * struct batadv_tvlv_gateway_data - gateway data propagated through gw tvlv 448 * container 449 * @bandwidth_down: advertised uplink download bandwidth 450 * @bandwidth_up: advertised uplink upload bandwidth 451 */ 452struct batadv_tvlv_gateway_data { 453 __be32 bandwidth_down; 454 __be32 bandwidth_up; 455}; 456 457/** 458 * struct batadv_tvlv_tt_data - tt data propagated through the tt tvlv container 459 * @flags: translation table flags (see batadv_tt_data_flags) 460 * @ttvn: translation table version number 461 * @vlan_num: number of announced VLANs. In the TVLV this struct is followed by 462 * one batadv_tvlv_tt_vlan_data object per announced vlan 463 */ 464struct batadv_tvlv_tt_data { 465 uint8_t flags; 466 uint8_t ttvn; 467 __be16 num_vlan; 468}; 469 470/** 471 * struct batadv_tvlv_tt_vlan_data - vlan specific tt data propagated through 472 * the tt tvlv container 473 * @crc: crc32 checksum of the entries belonging to this vlan 474 * @vid: vlan identifier 475 * @reserved: unused, useful for alignment purposes 476 */ 477struct batadv_tvlv_tt_vlan_data { 478 __be32 crc; 479 __be16 vid; 480 uint16_t reserved; 481}; 482 483/** 484 * struct batadv_tvlv_tt_change - translation table diff data 485 * @flags: status indicators concerning the non-mesh client (see 486 * batadv_tt_client_flags) 487 * @reserved: reserved field - useful for alignment purposes only 488 * @addr: mac address of non-mesh client that triggered this tt change 489 * @vid: VLAN identifier 490 */ 491struct batadv_tvlv_tt_change { 492 uint8_t flags; 493 uint8_t reserved[3]; 494 uint8_t addr[ETH_ALEN]; 495 __be16 vid; 496}; 497 498/** 499 * struct batadv_tvlv_roam_adv - roaming advertisement 500 * @client: mac address of roaming client 501 * @vid: VLAN identifier 502 */ 503struct batadv_tvlv_roam_adv { 504 uint8_t client[ETH_ALEN]; 505 __be16 vid; 506}; 507 508#endif /* _NET_BATMAN_ADV_PACKET_H_ */ 509