1 /* 2 * Copyright (C) 2007-2012 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_header { 94 uint8_t packet_type; 95 uint8_t version; /* batman version field */ 96 uint8_t ttl; 97 } __packed; 98 99 struct batman_ogm_packet { 100 struct batman_header header; 101 uint8_t flags; /* 0x40: DIRECTLINK flag, 0x20 VIS_SERVER flag... */ 102 uint32_t seqno; 103 uint8_t orig[6]; 104 uint8_t prev_sender[6]; 105 uint8_t gw_flags; /* flags related to gateway class */ 106 uint8_t tq; 107 uint8_t tt_num_changes; 108 uint8_t ttvn; /* translation table version number */ 109 uint16_t tt_crc; 110 } __packed; 111 112 #define BATMAN_OGM_LEN sizeof(struct batman_ogm_packet) 113 114 struct icmp_packet { 115 struct batman_header header; 116 uint8_t msg_type; /* see ICMP message types above */ 117 uint8_t dst[6]; 118 uint8_t orig[6]; 119 uint16_t seqno; 120 uint8_t uid; 121 uint8_t reserved; 122 } __packed; 123 124 #define BAT_RR_LEN 16 125 126 /* icmp_packet_rr must start with all fields from imcp_packet 127 * as this is assumed by code that handles ICMP packets */ 128 struct icmp_packet_rr { 129 struct batman_header header; 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 struct batman_header header; 141 uint8_t ttvn; /* destination translation table version number */ 142 uint8_t dest[6]; 143 } __packed; 144 145 struct unicast_frag_packet { 146 struct batman_header header; 147 uint8_t ttvn; /* destination translation table version number */ 148 uint8_t dest[6]; 149 uint8_t flags; 150 uint8_t align; 151 uint8_t orig[6]; 152 uint16_t seqno; 153 } __packed; 154 155 struct bcast_packet { 156 struct batman_header header; 157 uint8_t reserved; 158 uint32_t seqno; 159 uint8_t orig[6]; 160 } __packed; 161 162 struct vis_packet { 163 struct batman_header header; 164 uint8_t vis_type; /* which type of vis-participant sent this? */ 165 uint32_t seqno; /* sequence number */ 166 uint8_t entries; /* number of entries behind this struct */ 167 uint8_t reserved; 168 uint8_t vis_orig[6]; /* originator that announces its neighbors */ 169 uint8_t target_orig[6]; /* who should receive this packet */ 170 uint8_t sender_orig[6]; /* who sent or rebroadcasted this packet */ 171 } __packed; 172 173 struct tt_query_packet { 174 struct batman_header header; 175 /* the flag field is a combination of: 176 * - TT_REQUEST or TT_RESPONSE 177 * - TT_FULL_TABLE */ 178 uint8_t flags; 179 uint8_t dst[ETH_ALEN]; 180 uint8_t src[ETH_ALEN]; 181 /* the ttvn field is: 182 * if TT_REQUEST: ttvn that triggered the 183 * request 184 * if TT_RESPONSE: new ttvn for the src 185 * orig_node */ 186 uint8_t ttvn; 187 /* tt_data field is: 188 * if TT_REQUEST: crc associated with the 189 * ttvn 190 * if TT_RESPONSE: table_size */ 191 uint16_t tt_data; 192 } __packed; 193 194 struct roam_adv_packet { 195 struct batman_header header; 196 uint8_t reserved; 197 uint8_t dst[ETH_ALEN]; 198 uint8_t src[ETH_ALEN]; 199 uint8_t client[ETH_ALEN]; 200 } __packed; 201 202 struct tt_change { 203 uint8_t flags; 204 uint8_t addr[ETH_ALEN]; 205 } __packed; 206 207 #endif /* _NET_BATMAN_ADV_PACKET_H_ */ 208