1 /* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
3 * Marek Lindner, Simon Wunderlich
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.
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.
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
20 #ifndef _NET_BATMAN_ADV_PACKET_H_
21 #define _NET_BATMAN_ADV_PACKET_H_
23 enum batadv_packettype
{
26 BATADV_UNICAST
= 0x03,
29 BATADV_UNICAST_FRAG
= 0x06,
30 BATADV_TT_QUERY
= 0x07,
31 BATADV_ROAM_ADV
= 0x08,
32 BATADV_UNICAST_4ADDR
= 0x09,
36 * enum batadv_subtype - packet subtype for unicast4addr
37 * @BATADV_P_DATA: user payload
38 * @BATADV_P_DAT_DHT_GET: DHT request message
39 * @BATADV_P_DAT_DHT_PUT: DHT store message
40 * @BATADV_P_DAT_CACHE_REPLY: ARP reply generated by DAT
44 BATADV_P_DAT_DHT_GET
= 0x02,
45 BATADV_P_DAT_DHT_PUT
= 0x03,
46 BATADV_P_DAT_CACHE_REPLY
= 0x04,
49 /* this file is included by batctl which needs these defines */
50 #define BATADV_COMPAT_VERSION 14
52 enum batadv_iv_flags
{
53 BATADV_NOT_BEST_NEXT_HOP
= BIT(3),
54 BATADV_PRIMARIES_FIRST_HOP
= BIT(4),
55 BATADV_VIS_SERVER
= BIT(5),
56 BATADV_DIRECTLINK
= BIT(6),
59 /* ICMP message types */
60 enum batadv_icmp_packettype
{
61 BATADV_ECHO_REPLY
= 0,
62 BATADV_DESTINATION_UNREACHABLE
= 3,
63 BATADV_ECHO_REQUEST
= 8,
64 BATADV_TTL_EXCEEDED
= 11,
65 BATADV_PARAMETER_PROBLEM
= 12,
69 enum batadv_vis_packettype
{
70 BATADV_VIS_TYPE_SERVER_SYNC
= 0,
71 BATADV_VIS_TYPE_CLIENT_UPDATE
= 1,
74 /* fragmentation defines */
75 enum batadv_unicast_frag_flags
{
76 BATADV_UNI_FRAG_HEAD
= BIT(0),
77 BATADV_UNI_FRAG_LARGETAIL
= BIT(1),
80 /* TT_QUERY subtypes */
81 #define BATADV_TT_QUERY_TYPE_MASK 0x3
83 enum batadv_tt_query_packettype
{
84 BATADV_TT_REQUEST
= 0,
85 BATADV_TT_RESPONSE
= 1,
89 enum batadv_tt_query_flags
{
90 BATADV_TT_FULL_TABLE
= BIT(2),
93 /* BATADV_TT_CLIENT flags.
94 * Flags from BIT(0) to BIT(7) are sent on the wire, while flags from BIT(8) to
95 * BIT(15) are used for local computation only
97 enum batadv_tt_client_flags
{
98 BATADV_TT_CLIENT_DEL
= BIT(0),
99 BATADV_TT_CLIENT_ROAM
= BIT(1),
100 BATADV_TT_CLIENT_WIFI
= BIT(2),
101 BATADV_TT_CLIENT_TEMP
= BIT(3),
102 BATADV_TT_CLIENT_NOPURGE
= BIT(8),
103 BATADV_TT_CLIENT_NEW
= BIT(9),
104 BATADV_TT_CLIENT_PENDING
= BIT(10),
107 /* claim frame types for the bridge loop avoidance */
108 enum batadv_bla_claimframe
{
109 BATADV_CLAIM_TYPE_CLAIM
= 0x00,
110 BATADV_CLAIM_TYPE_UNCLAIM
= 0x01,
111 BATADV_CLAIM_TYPE_ANNOUNCE
= 0x02,
112 BATADV_CLAIM_TYPE_REQUEST
= 0x03,
115 /* the destination hardware field in the ARP frame is used to
116 * transport the claim type and the group id
118 struct batadv_bla_claim_dst
{
119 uint8_t magic
[3]; /* FF:43:05 */
120 uint8_t type
; /* bla_claimframe */
121 __be16 group
; /* group id */
124 struct batadv_header
{
126 uint8_t version
; /* batman version field */
128 /* the parent struct has to add a byte after the header to make
129 * everything 4 bytes aligned again
133 struct batadv_ogm_packet
{
134 struct batadv_header header
;
135 uint8_t flags
; /* 0x40: DIRECTLINK flag, 0x20 VIS_SERVER flag... */
137 uint8_t orig
[ETH_ALEN
];
138 uint8_t prev_sender
[ETH_ALEN
];
139 uint8_t gw_flags
; /* flags related to gateway class */
141 uint8_t tt_num_changes
;
142 uint8_t ttvn
; /* translation table version number */
146 #define BATADV_OGM_HLEN sizeof(struct batadv_ogm_packet)
148 struct batadv_icmp_packet
{
149 struct batadv_header header
;
150 uint8_t msg_type
; /* see ICMP message types above */
151 uint8_t dst
[ETH_ALEN
];
152 uint8_t orig
[ETH_ALEN
];
158 #define BATADV_RR_LEN 16
160 /* icmp_packet_rr must start with all fields from imcp_packet
161 * as this is assumed by code that handles ICMP packets
163 struct batadv_icmp_packet_rr
{
164 struct batadv_header header
;
165 uint8_t msg_type
; /* see ICMP message types above */
166 uint8_t dst
[ETH_ALEN
];
167 uint8_t orig
[ETH_ALEN
];
171 uint8_t rr
[BATADV_RR_LEN
][ETH_ALEN
];
174 /* All packet headers in front of an ethernet header have to be completely
175 * divisible by 2 but not by 4 to make the payload after the ethernet
176 * header again 4 bytes boundary aligned.
178 * A packing of 2 is necessary to avoid extra padding at the end of the struct
179 * caused by a structure member which is larger than two bytes. Otherwise
180 * the structure would not fulfill the previously mentioned rule to avoid the
181 * misalignment of the payload after the ethernet header. It may also lead to
182 * leakage of information when the padding it not initialized before sending.
186 struct batadv_unicast_packet
{
187 struct batadv_header header
;
188 uint8_t ttvn
; /* destination translation table version number */
189 uint8_t dest
[ETH_ALEN
];
190 /* "4 bytes boundary + 2 bytes" long to make the payload after the
191 * following ethernet header again 4 bytes boundary aligned
196 * struct batadv_unicast_4addr_packet - extended unicast packet
197 * @u: common unicast packet header
198 * @src: address of the source
199 * @subtype: packet subtype
201 struct batadv_unicast_4addr_packet
{
202 struct batadv_unicast_packet u
;
203 uint8_t src
[ETH_ALEN
];
206 /* "4 bytes boundary + 2 bytes" long to make the payload after the
207 * following ethernet header again 4 bytes boundary aligned
211 struct batadv_unicast_frag_packet
{
212 struct batadv_header header
;
213 uint8_t ttvn
; /* destination translation table version number */
214 uint8_t dest
[ETH_ALEN
];
217 uint8_t orig
[ETH_ALEN
];
221 struct batadv_bcast_packet
{
222 struct batadv_header header
;
225 uint8_t orig
[ETH_ALEN
];
226 /* "4 bytes boundary + 2 bytes" long to make the payload after the
227 * following ethernet header again 4 bytes boundary aligned
233 struct batadv_vis_packet
{
234 struct batadv_header header
;
235 uint8_t vis_type
; /* which type of vis-participant sent this? */
236 __be32 seqno
; /* sequence number */
237 uint8_t entries
; /* number of entries behind this struct */
239 uint8_t vis_orig
[ETH_ALEN
]; /* originator reporting its neighbors */
240 uint8_t target_orig
[ETH_ALEN
]; /* who should receive this packet */
241 uint8_t sender_orig
[ETH_ALEN
]; /* who sent or forwarded this packet */
244 struct batadv_tt_query_packet
{
245 struct batadv_header header
;
246 /* the flag field is a combination of:
247 * - TT_REQUEST or TT_RESPONSE
251 uint8_t dst
[ETH_ALEN
];
252 uint8_t src
[ETH_ALEN
];
253 /* the ttvn field is:
254 * if TT_REQUEST: ttvn that triggered the
256 * if TT_RESPONSE: new ttvn for the src
261 * if TT_REQUEST: crc associated with the
263 * if TT_RESPONSE: table_size
268 struct batadv_roam_adv_packet
{
269 struct batadv_header header
;
271 uint8_t dst
[ETH_ALEN
];
272 uint8_t src
[ETH_ALEN
];
273 uint8_t client
[ETH_ALEN
];
276 struct batadv_tt_change
{
278 uint8_t addr
[ETH_ALEN
];
281 #endif /* _NET_BATMAN_ADV_PACKET_H_ */