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