linux/net/batman-adv/packet.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
   3 *
   4 * Marek Lindner, Simon Wunderlich
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of version 2 of the GNU General Public
   8 * License as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful, but
  11 * WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13 * General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License
  16 * along with this program; if not, write to the Free Software
  17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  18 * 02110-1301, USA
  19 *
  20 */
  21
  22#ifndef _NET_BATMAN_ADV_PACKET_H_
  23#define _NET_BATMAN_ADV_PACKET_H_
  24
  25#define ETH_P_BATMAN  0x4305    /* unofficial/not registered Ethertype */
  26
  27enum bat_packettype {
  28        BAT_PACKET       = 0x01,
  29        BAT_ICMP         = 0x02,
  30        BAT_UNICAST      = 0x03,
  31        BAT_BCAST        = 0x04,
  32        BAT_VIS          = 0x05,
  33        BAT_UNICAST_FRAG = 0x06,
  34        BAT_TT_QUERY     = 0x07,
  35        BAT_ROAM_ADV     = 0x08
  36};
  37
  38/* this file is included by batctl which needs these defines */
  39#define COMPAT_VERSION 14
  40
  41enum batman_flags {
  42        PRIMARIES_FIRST_HOP = 1 << 4,
  43        VIS_SERVER          = 1 << 5,
  44        DIRECTLINK          = 1 << 6
  45};
  46
  47/* ICMP message types */
  48enum icmp_packettype {
  49        ECHO_REPLY              = 0,
  50        DESTINATION_UNREACHABLE = 3,
  51        ECHO_REQUEST            = 8,
  52        TTL_EXCEEDED            = 11,
  53        PARAMETER_PROBLEM       = 12
  54};
  55
  56/* vis defines */
  57enum vis_packettype {
  58        VIS_TYPE_SERVER_SYNC   = 0,
  59        VIS_TYPE_CLIENT_UPDATE = 1
  60};
  61
  62/* fragmentation defines */
  63enum unicast_frag_flags {
  64        UNI_FRAG_HEAD      = 1 << 0,
  65        UNI_FRAG_LARGETAIL = 1 << 1
  66};
  67
  68/* TT_QUERY subtypes */
  69#define TT_QUERY_TYPE_MASK 0x3
  70
  71enum tt_query_packettype {
  72        TT_REQUEST    = 0,
  73        TT_RESPONSE   = 1
  74};
  75
  76/* TT_QUERY flags */
  77enum tt_query_flags {
  78        TT_FULL_TABLE = 1 << 2
  79};
  80
  81/* TT_CLIENT flags.
  82 * Flags from 1 to 1 << 7 are sent on the wire, while flags from 1 << 8 to
  83 * 1 << 15 are used for local computation only */
  84enum tt_client_flags {
  85        TT_CLIENT_DEL     = 1 << 0,
  86        TT_CLIENT_ROAM    = 1 << 1,
  87        TT_CLIENT_NOPURGE = 1 << 8,
  88        TT_CLIENT_NEW     = 1 << 9,
  89        TT_CLIENT_PENDING = 1 << 10
  90};
  91
  92struct batman_packet {
  93        uint8_t  packet_type;
  94        uint8_t  version;  /* batman version field */
  95        uint8_t  ttl;
  96        uint8_t  flags;    /* 0x40: DIRECTLINK flag, 0x20 VIS_SERVER flag... */
  97        uint32_t seqno;
  98        uint8_t  orig[6];
  99        uint8_t  prev_sender[6];
 100        uint8_t  gw_flags;  /* flags related to gateway class */
 101        uint8_t  tq;
 102        uint8_t  tt_num_changes;
 103        uint8_t  ttvn; /* translation table version number */
 104        uint16_t tt_crc;
 105} __packed;
 106
 107#define BAT_PACKET_LEN sizeof(struct batman_packet)
 108
 109struct icmp_packet {
 110        uint8_t  packet_type;
 111        uint8_t  version;  /* batman version field */
 112        uint8_t  ttl;
 113        uint8_t  msg_type; /* see ICMP message types above */
 114        uint8_t  dst[6];
 115        uint8_t  orig[6];
 116        uint16_t seqno;
 117        uint8_t  uid;
 118        uint8_t  reserved;
 119} __packed;
 120
 121#define BAT_RR_LEN 16
 122
 123/* icmp_packet_rr must start with all fields from imcp_packet
 124 * as this is assumed by code that handles ICMP packets */
 125struct icmp_packet_rr {
 126        uint8_t  packet_type;
 127        uint8_t  version;  /* batman version field */
 128        uint8_t  ttl;
 129        uint8_t  msg_type; /* see ICMP message types above */
 130        uint8_t  dst[6];
 131        uint8_t  orig[6];
 132        uint16_t seqno;
 133        uint8_t  uid;
 134        uint8_t  rr_cur;
 135        uint8_t  rr[BAT_RR_LEN][ETH_ALEN];
 136} __packed;
 137
 138struct unicast_packet {
 139        uint8_t  packet_type;
 140        uint8_t  version;  /* batman version field */
 141        uint8_t  ttl;
 142        uint8_t  ttvn; /* destination translation table version number */
 143        uint8_t  dest[6];
 144} __packed;
 145
 146struct unicast_frag_packet {
 147        uint8_t  packet_type;
 148        uint8_t  version;  /* batman version field */
 149        uint8_t  ttl;
 150        uint8_t  ttvn; /* destination translation table version number */
 151        uint8_t  dest[6];
 152        uint8_t  flags;
 153        uint8_t  align;
 154        uint8_t  orig[6];
 155        uint16_t seqno;
 156} __packed;
 157
 158struct bcast_packet {
 159        uint8_t  packet_type;
 160        uint8_t  version;  /* batman version field */
 161        uint8_t  ttl;
 162        uint8_t  reserved;
 163        uint32_t seqno;
 164        uint8_t  orig[6];
 165} __packed;
 166
 167struct vis_packet {
 168        uint8_t  packet_type;
 169        uint8_t  version;        /* batman version field */
 170        uint8_t  ttl;            /* TTL */
 171        uint8_t  vis_type;       /* which type of vis-participant sent this? */
 172        uint32_t seqno;          /* sequence number */
 173        uint8_t  entries;        /* number of entries behind this struct */
 174        uint8_t  reserved;
 175        uint8_t  vis_orig[6];    /* originator that announces its neighbors */
 176        uint8_t  target_orig[6]; /* who should receive this packet */
 177        uint8_t  sender_orig[6]; /* who sent or rebroadcasted this packet */
 178} __packed;
 179
 180struct tt_query_packet {
 181        uint8_t  packet_type;
 182        uint8_t  version;  /* batman version field */
 183        uint8_t  ttl;
 184        /* the flag field is a combination of:
 185         * - TT_REQUEST or TT_RESPONSE
 186         * - TT_FULL_TABLE */
 187        uint8_t  flags;
 188        uint8_t  dst[ETH_ALEN];
 189        uint8_t  src[ETH_ALEN];
 190        /* the ttvn field is:
 191         * if TT_REQUEST: ttvn that triggered the
 192         *                request
 193         * if TT_RESPONSE: new ttvn for the src
 194         *                 orig_node */
 195        uint8_t  ttvn;
 196        /* tt_data field is:
 197         * if TT_REQUEST: crc associated with the
 198         *                ttvn
 199         * if TT_RESPONSE: table_size */
 200        uint16_t tt_data;
 201} __packed;
 202
 203struct roam_adv_packet {
 204        uint8_t  packet_type;
 205        uint8_t  version;
 206        uint8_t  ttl;
 207        uint8_t  reserved;
 208        uint8_t  dst[ETH_ALEN];
 209        uint8_t  src[ETH_ALEN];
 210        uint8_t  client[ETH_ALEN];
 211} __packed;
 212
 213struct tt_change {
 214        uint8_t flags;
 215        uint8_t addr[ETH_ALEN];
 216} __packed;
 217
 218#endif /* _NET_BATMAN_ADV_PACKET_H_ */
 219