1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
38
39
40
41
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
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
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
70enum batadv_vis_packettype {
71 BATADV_VIS_TYPE_SERVER_SYNC = 0,
72 BATADV_VIS_TYPE_CLIENT_UPDATE = 1,
73};
74
75
76enum batadv_unicast_frag_flags {
77 BATADV_UNI_FRAG_HEAD = BIT(0),
78 BATADV_UNI_FRAG_LARGETAIL = BIT(1),
79};
80
81
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
90enum batadv_tt_query_flags {
91 BATADV_TT_FULL_TABLE = BIT(2),
92};
93
94
95
96
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
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
117
118
119struct batadv_bla_claim_dst {
120 uint8_t magic[3];
121 uint8_t type;
122 __be16 group;
123};
124
125struct batadv_header {
126 uint8_t packet_type;
127 uint8_t version;
128 uint8_t ttl;
129
130
131
132};
133
134struct batadv_ogm_packet {
135 struct batadv_header header;
136 uint8_t flags;
137 __be32 seqno;
138 uint8_t orig[ETH_ALEN];
139 uint8_t prev_sender[ETH_ALEN];
140 uint8_t gw_flags;
141 uint8_t tq;
142 uint8_t tt_num_changes;
143 uint8_t ttvn;
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;
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
162
163
164struct batadv_icmp_packet_rr {
165 struct batadv_header header;
166 uint8_t msg_type;
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
176
177
178
179
180
181
182
183
184
185#pragma pack(2)
186
187struct batadv_unicast_packet {
188 struct batadv_header header;
189 uint8_t ttvn;
190 uint8_t dest[ETH_ALEN];
191
192
193
194};
195
196
197
198
199
200
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
208
209
210};
211
212struct batadv_unicast_frag_packet {
213 struct batadv_header header;
214 uint8_t ttvn;
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
228
229
230};
231
232#pragma pack()
233
234struct batadv_vis_packet {
235 struct batadv_header header;
236 uint8_t vis_type;
237 __be32 seqno;
238 uint8_t entries;
239 uint8_t reserved;
240 uint8_t vis_orig[ETH_ALEN];
241 uint8_t target_orig[ETH_ALEN];
242 uint8_t sender_orig[ETH_ALEN];
243};
244
245struct batadv_tt_query_packet {
246 struct batadv_header header;
247
248
249
250
251 uint8_t flags;
252 uint8_t dst[ETH_ALEN];
253 uint8_t src[ETH_ALEN];
254
255
256
257
258
259
260 uint8_t ttvn;
261
262
263
264
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
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298struct batadv_coded_packet {
299 struct batadv_header header;
300 uint8_t first_ttvn;
301
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
315