linux/net/batman-adv/packet.h
<<
>>
Prefs
   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
  23enum batadv_packettype {
  24        BATADV_IV_OGM           = 0x01,
  25        BATADV_ICMP             = 0x02,
  26        BATADV_UNICAST          = 0x03,
  27        BATADV_BCAST            = 0x04,
  28        BATADV_VIS              = 0x05,
  29        BATADV_UNICAST_FRAG     = 0x06,
  30        BATADV_TT_QUERY         = 0x07,
  31        BATADV_ROAM_ADV         = 0x08,
  32        BATADV_UNICAST_4ADDR    = 0x09,
  33        BATADV_CODED            = 0x0a,
  34};
  35
  36/**
  37 * enum batadv_subtype - packet subtype for unicast4addr
  38 * @BATADV_P_DATA: user payload
  39 * @BATADV_P_DAT_DHT_GET: DHT request message
  40 * @BATADV_P_DAT_DHT_PUT: DHT store message
  41 * @BATADV_P_DAT_CACHE_REPLY: ARP reply generated by DAT
  42 */
  43enum batadv_subtype {
  44        BATADV_P_DATA                   = 0x01,
  45        BATADV_P_DAT_DHT_GET            = 0x02,
  46        BATADV_P_DAT_DHT_PUT            = 0x03,
  47        BATADV_P_DAT_CACHE_REPLY        = 0x04,
  48};
  49
  50/* this file is included by batctl which needs these defines */
  51#define BATADV_COMPAT_VERSION 14
  52
  53enum batadv_iv_flags {
  54        BATADV_NOT_BEST_NEXT_HOP   = BIT(3),
  55        BATADV_PRIMARIES_FIRST_HOP = BIT(4),
  56        BATADV_VIS_SERVER          = BIT(5),
  57        BATADV_DIRECTLINK          = BIT(6),
  58};
  59
  60/* ICMP message types */
  61enum batadv_icmp_packettype {
  62        BATADV_ECHO_REPLY              = 0,
  63        BATADV_DESTINATION_UNREACHABLE = 3,
  64        BATADV_ECHO_REQUEST            = 8,
  65        BATADV_TTL_EXCEEDED            = 11,
  66        BATADV_PARAMETER_PROBLEM       = 12,
  67};
  68
  69/* vis defines */
  70enum batadv_vis_packettype {
  71        BATADV_VIS_TYPE_SERVER_SYNC   = 0,
  72        BATADV_VIS_TYPE_CLIENT_UPDATE = 1,
  73};
  74
  75/* fragmentation defines */
  76enum batadv_unicast_frag_flags {
  77        BATADV_UNI_FRAG_HEAD      = BIT(0),
  78        BATADV_UNI_FRAG_LARGETAIL = BIT(1),
  79};
  80
  81/* TT_QUERY subtypes */
  82#define BATADV_TT_QUERY_TYPE_MASK 0x3
  83
  84enum batadv_tt_query_packettype {
  85        BATADV_TT_REQUEST  = 0,
  86        BATADV_TT_RESPONSE = 1,
  87};
  88
  89/* TT_QUERY flags */
  90enum batadv_tt_query_flags {
  91        BATADV_TT_FULL_TABLE = BIT(2),
  92};
  93
  94/* BATADV_TT_CLIENT flags.
  95 * Flags from BIT(0) to BIT(7) are sent on the wire, while flags from BIT(8) to
  96 * BIT(15) are used for local computation only
  97 */
  98enum batadv_tt_client_flags {
  99        BATADV_TT_CLIENT_DEL     = BIT(0),
 100        BATADV_TT_CLIENT_ROAM    = BIT(1),
 101        BATADV_TT_CLIENT_WIFI    = BIT(2),
 102        BATADV_TT_CLIENT_TEMP    = BIT(3),
 103        BATADV_TT_CLIENT_NOPURGE = BIT(8),
 104        BATADV_TT_CLIENT_NEW     = BIT(9),
 105        BATADV_TT_CLIENT_PENDING = BIT(10),
 106};
 107
 108/* claim frame types for the bridge loop avoidance */
 109enum batadv_bla_claimframe {
 110        BATADV_CLAIM_TYPE_CLAIM         = 0x00,
 111        BATADV_CLAIM_TYPE_UNCLAIM       = 0x01,
 112        BATADV_CLAIM_TYPE_ANNOUNCE      = 0x02,
 113        BATADV_CLAIM_TYPE_REQUEST       = 0x03,
 114};
 115
 116/* the destination hardware field in the ARP frame is used to
 117 * transport the claim type and the group id
 118 */
 119struct batadv_bla_claim_dst {
 120        uint8_t magic[3];       /* FF:43:05 */
 121        uint8_t type;           /* bla_claimframe */
 122        __be16 group;           /* group id */
 123};
 124
 125struct batadv_header {
 126        uint8_t  packet_type;
 127        uint8_t  version;  /* batman version field */
 128        uint8_t  ttl;
 129        /* the parent struct has to add a byte after the header to make
 130         * everything 4 bytes aligned again
 131         */
 132};
 133
 134struct batadv_ogm_packet {
 135        struct batadv_header header;
 136        uint8_t  flags;    /* 0x40: DIRECTLINK flag, 0x20 VIS_SERVER flag... */
 137        __be32   seqno;
 138        uint8_t  orig[ETH_ALEN];
 139        uint8_t  prev_sender[ETH_ALEN];
 140        uint8_t  gw_flags;  /* flags related to gateway class */
 141        uint8_t  tq;
 142        uint8_t  tt_num_changes;
 143        uint8_t  ttvn; /* translation table version number */
 144        __be16   tt_crc;
 145} __packed;
 146
 147#define BATADV_OGM_HLEN sizeof(struct batadv_ogm_packet)
 148
 149struct batadv_icmp_packet {
 150        struct batadv_header header;
 151        uint8_t  msg_type; /* see ICMP message types above */
 152        uint8_t  dst[ETH_ALEN];
 153        uint8_t  orig[ETH_ALEN];
 154        __be16   seqno;
 155        uint8_t  uid;
 156        uint8_t  reserved;
 157};
 158
 159#define BATADV_RR_LEN 16
 160
 161/* icmp_packet_rr must start with all fields from imcp_packet
 162 * as this is assumed by code that handles ICMP packets
 163 */
 164struct batadv_icmp_packet_rr {
 165        struct batadv_header header;
 166        uint8_t  msg_type; /* see ICMP message types above */
 167        uint8_t  dst[ETH_ALEN];
 168        uint8_t  orig[ETH_ALEN];
 169        __be16   seqno;
 170        uint8_t  uid;
 171        uint8_t  rr_cur;
 172        uint8_t  rr[BATADV_RR_LEN][ETH_ALEN];
 173};
 174
 175/* All packet headers in front of an ethernet header have to be completely
 176 * divisible by 2 but not by 4 to make the payload after the ethernet
 177 * header again 4 bytes boundary aligned.
 178 *
 179 * A packing of 2 is necessary to avoid extra padding at the end of the struct
 180 * caused by a structure member which is larger than two bytes. Otherwise
 181 * the structure would not fulfill the previously mentioned rule to avoid the
 182 * misalignment of the payload after the ethernet header. It may also lead to
 183 * leakage of information when the padding it not initialized before sending.
 184 */
 185#pragma pack(2)
 186
 187struct batadv_unicast_packet {
 188        struct batadv_header header;
 189        uint8_t  ttvn; /* destination translation table version number */
 190        uint8_t  dest[ETH_ALEN];
 191        /* "4 bytes boundary + 2 bytes" long to make the payload after the
 192         * following ethernet header again 4 bytes boundary aligned
 193         */
 194};
 195
 196/**
 197 * struct batadv_unicast_4addr_packet - extended unicast packet
 198 * @u: common unicast packet header
 199 * @src: address of the source
 200 * @subtype: packet subtype
 201 */
 202struct batadv_unicast_4addr_packet {
 203        struct batadv_unicast_packet u;
 204        uint8_t src[ETH_ALEN];
 205        uint8_t subtype;
 206        uint8_t reserved;
 207        /* "4 bytes boundary + 2 bytes" long to make the payload after the
 208         * following ethernet header again 4 bytes boundary aligned
 209         */
 210};
 211
 212struct batadv_unicast_frag_packet {
 213        struct batadv_header header;
 214        uint8_t  ttvn; /* destination translation table version number */
 215        uint8_t  dest[ETH_ALEN];
 216        uint8_t  flags;
 217        uint8_t  align;
 218        uint8_t  orig[ETH_ALEN];
 219        __be16   seqno;
 220} __packed;
 221
 222struct batadv_bcast_packet {
 223        struct batadv_header header;
 224        uint8_t  reserved;
 225        __be32   seqno;
 226        uint8_t  orig[ETH_ALEN];
 227        /* "4 bytes boundary + 2 bytes" long to make the payload after the
 228         * following ethernet header again 4 bytes boundary aligned
 229         */
 230};
 231
 232#pragma pack()
 233
 234struct batadv_vis_packet {
 235        struct batadv_header header;
 236        uint8_t  vis_type;       /* which type of vis-participant sent this? */
 237        __be32   seqno;          /* sequence number */
 238        uint8_t  entries;        /* number of entries behind this struct */
 239        uint8_t  reserved;
 240        uint8_t  vis_orig[ETH_ALEN];    /* originator reporting its neighbors */
 241        uint8_t  target_orig[ETH_ALEN]; /* who should receive this packet */
 242        uint8_t  sender_orig[ETH_ALEN]; /* who sent or forwarded this packet */
 243};
 244
 245struct batadv_tt_query_packet {
 246        struct batadv_header header;
 247        /* the flag field is a combination of:
 248         * - TT_REQUEST or TT_RESPONSE
 249         * - TT_FULL_TABLE
 250         */
 251        uint8_t  flags;
 252        uint8_t  dst[ETH_ALEN];
 253        uint8_t  src[ETH_ALEN];
 254        /* the ttvn field is:
 255         * if TT_REQUEST: ttvn that triggered the
 256         *                request
 257         * if TT_RESPONSE: new ttvn for the src
 258         *                 orig_node
 259         */
 260        uint8_t  ttvn;
 261        /* tt_data field is:
 262         * if TT_REQUEST: crc associated with the
 263         *                ttvn
 264         * if TT_RESPONSE: table_size
 265         */
 266        __be16 tt_data;
 267} __packed;
 268
 269struct batadv_roam_adv_packet {
 270        struct batadv_header header;
 271        uint8_t  reserved;
 272        uint8_t  dst[ETH_ALEN];
 273        uint8_t  src[ETH_ALEN];
 274        uint8_t  client[ETH_ALEN];
 275} __packed;
 276
 277struct batadv_tt_change {
 278        uint8_t flags;
 279        uint8_t addr[ETH_ALEN];
 280} __packed;
 281
 282/**
 283 * struct batadv_coded_packet - network coded packet
 284 * @header: common batman packet header and ttl of first included packet
 285 * @reserved: Align following fields to 2-byte boundaries
 286 * @first_source: original source of first included packet
 287 * @first_orig_dest: original destinal of first included packet
 288 * @first_crc: checksum of first included packet
 289 * @first_ttvn: tt-version number of first included packet
 290 * @second_ttl: ttl of second packet
 291 * @second_dest: second receiver of this coded packet
 292 * @second_source: original source of second included packet
 293 * @second_orig_dest: original destination of second included packet
 294 * @second_crc: checksum of second included packet
 295 * @second_ttvn: tt version number of second included packet
 296 * @coded_len: length of network coded part of the payload
 297 */
 298struct batadv_coded_packet {
 299        struct batadv_header header;
 300        uint8_t  first_ttvn;
 301        /* uint8_t  first_dest[ETH_ALEN]; - saved in mac header destination */
 302        uint8_t  first_source[ETH_ALEN];
 303        uint8_t  first_orig_dest[ETH_ALEN];
 304        __be32   first_crc;
 305        uint8_t  second_ttl;
 306        uint8_t  second_ttvn;
 307        uint8_t  second_dest[ETH_ALEN];
 308        uint8_t  second_source[ETH_ALEN];
 309        uint8_t  second_orig_dest[ETH_ALEN];
 310        __be32   second_crc;
 311        __be16   coded_len;
 312};
 313
 314#endif /* _NET_BATMAN_ADV_PACKET_H_ */
 315