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 27 enum bat_packettype { 28 BAT_OGM = 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 41 enum batman_flags { 42 PRIMARIES_FIRST_HOP = 1 << 4, 43 VIS_SERVER = 1 << 5, 44 DIRECTLINK = 1 << 6 45 }; 46 47 /* ICMP message types */ 48 enum 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 */ 57 enum vis_packettype { 58 VIS_TYPE_SERVER_SYNC = 0, 59 VIS_TYPE_CLIENT_UPDATE = 1 60 }; 61 62 /* fragmentation defines */ 63 enum 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 71 enum tt_query_packettype { 72 TT_REQUEST = 0, 73 TT_RESPONSE = 1 74 }; 75 76 /* TT_QUERY flags */ 77 enum 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 */ 84 enum tt_client_flags { 85 TT_CLIENT_DEL = 1 << 0, 86 TT_CLIENT_ROAM = 1 << 1, 87 TT_CLIENT_WIFI = 1 << 2, 88 TT_CLIENT_NOPURGE = 1 << 8, 89 TT_CLIENT_NEW = 1 << 9, 90 TT_CLIENT_PENDING = 1 << 10 91 }; 92 93 struct batman_ogm_packet { 94 uint8_t packet_type; 95 uint8_t version; /* batman version field */ 96 uint8_t ttl; 97 uint8_t flags; /* 0x40: DIRECTLINK flag, 0x20 VIS_SERVER flag... */ 98 uint32_t seqno; 99 uint8_t orig[6]; 100 uint8_t prev_sender[6]; 101 uint8_t gw_flags; /* flags related to gateway class */ 102 uint8_t tq; 103 uint8_t tt_num_changes; 104 uint8_t ttvn; /* translation table version number */ 105 uint16_t tt_crc; 106 } __packed; 107 108 #define BATMAN_OGM_LEN sizeof(struct batman_ogm_packet) 109 110 struct icmp_packet { 111 uint8_t packet_type; 112 uint8_t version; /* batman version field */ 113 uint8_t ttl; 114 uint8_t msg_type; /* see ICMP message types above */ 115 uint8_t dst[6]; 116 uint8_t orig[6]; 117 uint16_t seqno; 118 uint8_t uid; 119 uint8_t reserved; 120 } __packed; 121 122 #define BAT_RR_LEN 16 123 124 /* icmp_packet_rr must start with all fields from imcp_packet 125 * as this is assumed by code that handles ICMP packets */ 126 struct icmp_packet_rr { 127 uint8_t packet_type; 128 uint8_t version; /* batman version field */ 129 uint8_t ttl; 130 uint8_t msg_type; /* see ICMP message types above */ 131 uint8_t dst[6]; 132 uint8_t orig[6]; 133 uint16_t seqno; 134 uint8_t uid; 135 uint8_t rr_cur; 136 uint8_t rr[BAT_RR_LEN][ETH_ALEN]; 137 } __packed; 138 139 struct unicast_packet { 140 uint8_t packet_type; 141 uint8_t version; /* batman version field */ 142 uint8_t ttl; 143 uint8_t ttvn; /* destination translation table version number */ 144 uint8_t dest[6]; 145 } __packed; 146 147 struct unicast_frag_packet { 148 uint8_t packet_type; 149 uint8_t version; /* batman version field */ 150 uint8_t ttl; 151 uint8_t ttvn; /* destination translation table version number */ 152 uint8_t dest[6]; 153 uint8_t flags; 154 uint8_t align; 155 uint8_t orig[6]; 156 uint16_t seqno; 157 } __packed; 158 159 struct bcast_packet { 160 uint8_t packet_type; 161 uint8_t version; /* batman version field */ 162 uint8_t ttl; 163 uint8_t reserved; 164 uint32_t seqno; 165 uint8_t orig[6]; 166 } __packed; 167 168 struct vis_packet { 169 uint8_t packet_type; 170 uint8_t version; /* batman version field */ 171 uint8_t ttl; /* TTL */ 172 uint8_t vis_type; /* which type of vis-participant sent this? */ 173 uint32_t seqno; /* sequence number */ 174 uint8_t entries; /* number of entries behind this struct */ 175 uint8_t reserved; 176 uint8_t vis_orig[6]; /* originator that announces its neighbors */ 177 uint8_t target_orig[6]; /* who should receive this packet */ 178 uint8_t sender_orig[6]; /* who sent or rebroadcasted this packet */ 179 } __packed; 180 181 struct tt_query_packet { 182 uint8_t packet_type; 183 uint8_t version; /* batman version field */ 184 uint8_t ttl; 185 /* the flag field is a combination of: 186 * - TT_REQUEST or TT_RESPONSE 187 * - TT_FULL_TABLE */ 188 uint8_t flags; 189 uint8_t dst[ETH_ALEN]; 190 uint8_t src[ETH_ALEN]; 191 /* the ttvn field is: 192 * if TT_REQUEST: ttvn that triggered the 193 * request 194 * if TT_RESPONSE: new ttvn for the src 195 * orig_node */ 196 uint8_t ttvn; 197 /* tt_data field is: 198 * if TT_REQUEST: crc associated with the 199 * ttvn 200 * if TT_RESPONSE: table_size */ 201 uint16_t tt_data; 202 } __packed; 203 204 struct roam_adv_packet { 205 uint8_t packet_type; 206 uint8_t version; 207 uint8_t ttl; 208 uint8_t reserved; 209 uint8_t dst[ETH_ALEN]; 210 uint8_t src[ETH_ALEN]; 211 uint8_t client[ETH_ALEN]; 212 } __packed; 213 214 struct tt_change { 215 uint8_t flags; 216 uint8_t addr[ETH_ALEN]; 217 } __packed; 218 219 #endif /* _NET_BATMAN_ADV_PACKET_H_ */ 220