aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv/packet.h
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-17 16:15:55 -0500
commit8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch)
treea8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /net/batman-adv/packet.h
parent406089d01562f1e2bf9f089fd7637009ebaad589 (diff)
Patched in Tegra support.
Diffstat (limited to 'net/batman-adv/packet.h')
-rw-r--r--net/batman-adv/packet.h287
1 files changed, 112 insertions, 175 deletions
diff --git a/net/batman-adv/packet.h b/net/batman-adv/packet.h
index cb6405bf755..b76b4be10b9 100644
--- a/net/batman-adv/packet.h
+++ b/net/batman-adv/packet.h
@@ -1,4 +1,5 @@
1/* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors: 1/*
2 * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
2 * 3 *
3 * Marek Lindner, Simon Wunderlich 4 * Marek Lindner, Simon Wunderlich
4 * 5 *
@@ -15,238 +16,174 @@
15 * along with this program; if not, write to the Free Software 16 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 * 02110-1301, USA 18 * 02110-1301, USA
19 *
18 */ 20 */
19 21
20#ifndef _NET_BATMAN_ADV_PACKET_H_ 22#ifndef _NET_BATMAN_ADV_PACKET_H_
21#define _NET_BATMAN_ADV_PACKET_H_ 23#define _NET_BATMAN_ADV_PACKET_H_
22 24
23enum batadv_packettype { 25#define ETH_P_BATMAN 0x4305 /* unofficial/not registered Ethertype */
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};
34 26
35/** 27enum bat_packettype {
36 * enum batadv_subtype - packet subtype for unicast4addr 28 BAT_PACKET = 0x01,
37 * @BATADV_P_DATA: user payload 29 BAT_ICMP = 0x02,
38 * @BATADV_P_DAT_DHT_GET: DHT request message 30 BAT_UNICAST = 0x03,
39 * @BATADV_P_DAT_DHT_PUT: DHT store message 31 BAT_BCAST = 0x04,
40 * @BATADV_P_DAT_CACHE_REPLY: ARP reply generated by DAT 32 BAT_VIS = 0x05,
41 */ 33 BAT_UNICAST_FRAG = 0x06,
42enum batadv_subtype { 34 BAT_TT_QUERY = 0x07,
43 BATADV_P_DATA = 0x01, 35 BAT_ROAM_ADV = 0x08
44 BATADV_P_DAT_DHT_GET = 0x02,
45 BATADV_P_DAT_DHT_PUT = 0x03,
46 BATADV_P_DAT_CACHE_REPLY = 0x04,
47}; 36};
48 37
49/* this file is included by batctl which needs these defines */ 38/* this file is included by batctl which needs these defines */
50#define BATADV_COMPAT_VERSION 14 39#define COMPAT_VERSION 14
51 40
52enum batadv_iv_flags { 41enum batman_flags {
53 BATADV_NOT_BEST_NEXT_HOP = BIT(3), 42 PRIMARIES_FIRST_HOP = 1 << 4,
54 BATADV_PRIMARIES_FIRST_HOP = BIT(4), 43 VIS_SERVER = 1 << 5,
55 BATADV_VIS_SERVER = BIT(5), 44 DIRECTLINK = 1 << 6
56 BATADV_DIRECTLINK = BIT(6),
57}; 45};
58 46
59/* ICMP message types */ 47/* ICMP message types */
60enum batadv_icmp_packettype { 48enum icmp_packettype {
61 BATADV_ECHO_REPLY = 0, 49 ECHO_REPLY = 0,
62 BATADV_DESTINATION_UNREACHABLE = 3, 50 DESTINATION_UNREACHABLE = 3,
63 BATADV_ECHO_REQUEST = 8, 51 ECHO_REQUEST = 8,
64 BATADV_TTL_EXCEEDED = 11, 52 TTL_EXCEEDED = 11,
65 BATADV_PARAMETER_PROBLEM = 12, 53 PARAMETER_PROBLEM = 12
66}; 54};
67 55
68/* vis defines */ 56/* vis defines */
69enum batadv_vis_packettype { 57enum vis_packettype {
70 BATADV_VIS_TYPE_SERVER_SYNC = 0, 58 VIS_TYPE_SERVER_SYNC = 0,
71 BATADV_VIS_TYPE_CLIENT_UPDATE = 1, 59 VIS_TYPE_CLIENT_UPDATE = 1
72}; 60};
73 61
74/* fragmentation defines */ 62/* fragmentation defines */
75enum batadv_unicast_frag_flags { 63enum unicast_frag_flags {
76 BATADV_UNI_FRAG_HEAD = BIT(0), 64 UNI_FRAG_HEAD = 1 << 0,
77 BATADV_UNI_FRAG_LARGETAIL = BIT(1), 65 UNI_FRAG_LARGETAIL = 1 << 1
78}; 66};
79 67
80/* TT_QUERY subtypes */ 68/* TT_QUERY subtypes */
81#define BATADV_TT_QUERY_TYPE_MASK 0x3 69#define TT_QUERY_TYPE_MASK 0x3
82 70
83enum batadv_tt_query_packettype { 71enum tt_query_packettype {
84 BATADV_TT_REQUEST = 0, 72 TT_REQUEST = 0,
85 BATADV_TT_RESPONSE = 1, 73 TT_RESPONSE = 1
86}; 74};
87 75
88/* TT_QUERY flags */ 76/* TT_QUERY flags */
89enum batadv_tt_query_flags { 77enum tt_query_flags {
90 BATADV_TT_FULL_TABLE = BIT(2), 78 TT_FULL_TABLE = 1 << 2
91}; 79};
92 80
93/* BATADV_TT_CLIENT flags. 81/* TT_CLIENT flags.
94 * Flags from BIT(0) to BIT(7) are sent on the wire, while flags from BIT(8) to 82 * Flags from 1 to 1 << 7 are sent on the wire, while flags from 1 << 8 to
95 * BIT(15) are used for local computation only 83 * 1 << 15 are used for local computation only */
96 */ 84enum tt_client_flags {
97enum batadv_tt_client_flags { 85 TT_CLIENT_DEL = 1 << 0,
98 BATADV_TT_CLIENT_DEL = BIT(0), 86 TT_CLIENT_ROAM = 1 << 1,
99 BATADV_TT_CLIENT_ROAM = BIT(1), 87 TT_CLIENT_NOPURGE = 1 << 8,
100 BATADV_TT_CLIENT_WIFI = BIT(2), 88 TT_CLIENT_NEW = 1 << 9,
101 BATADV_TT_CLIENT_TEMP = BIT(3), 89 TT_CLIENT_PENDING = 1 << 10
102 BATADV_TT_CLIENT_NOPURGE = BIT(8),
103 BATADV_TT_CLIENT_NEW = BIT(9),
104 BATADV_TT_CLIENT_PENDING = BIT(10),
105}; 90};
106 91
107/* claim frame types for the bridge loop avoidance */ 92struct batman_packet {
108enum 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,
113};
114
115/* the destination hardware field in the ARP frame is used to
116 * transport the claim type and the group id
117 */
118struct batadv_bla_claim_dst {
119 uint8_t magic[3]; /* FF:43:05 */
120 uint8_t type; /* bla_claimframe */
121 __be16 group; /* group id */
122};
123
124struct batadv_header {
125 uint8_t packet_type; 93 uint8_t packet_type;
126 uint8_t version; /* batman version field */ 94 uint8_t version; /* batman version field */
127 uint8_t ttl; 95 uint8_t ttl;
128 /* the parent struct has to add a byte after the header to make
129 * everything 4 bytes aligned again
130 */
131};
132
133struct batadv_ogm_packet {
134 struct batadv_header header;
135 uint8_t flags; /* 0x40: DIRECTLINK flag, 0x20 VIS_SERVER flag... */ 96 uint8_t flags; /* 0x40: DIRECTLINK flag, 0x20 VIS_SERVER flag... */
136 __be32 seqno; 97 uint32_t seqno;
137 uint8_t orig[ETH_ALEN]; 98 uint8_t orig[6];
138 uint8_t prev_sender[ETH_ALEN]; 99 uint8_t prev_sender[6];
139 uint8_t gw_flags; /* flags related to gateway class */ 100 uint8_t gw_flags; /* flags related to gateway class */
140 uint8_t tq; 101 uint8_t tq;
141 uint8_t tt_num_changes; 102 uint8_t tt_num_changes;
142 uint8_t ttvn; /* translation table version number */ 103 uint8_t ttvn; /* translation table version number */
143 __be16 tt_crc; 104 uint16_t tt_crc;
144} __packed; 105} __packed;
145 106
146#define BATADV_OGM_HLEN sizeof(struct batadv_ogm_packet) 107#define BAT_PACKET_LEN sizeof(struct batman_packet)
147 108
148struct batadv_icmp_packet { 109struct icmp_packet {
149 struct batadv_header header; 110 uint8_t packet_type;
111 uint8_t version; /* batman version field */
112 uint8_t ttl;
150 uint8_t msg_type; /* see ICMP message types above */ 113 uint8_t msg_type; /* see ICMP message types above */
151 uint8_t dst[ETH_ALEN]; 114 uint8_t dst[6];
152 uint8_t orig[ETH_ALEN]; 115 uint8_t orig[6];
153 __be16 seqno; 116 uint16_t seqno;
154 uint8_t uid; 117 uint8_t uid;
155 uint8_t reserved; 118 uint8_t reserved;
156}; 119} __packed;
157 120
158#define BATADV_RR_LEN 16 121#define BAT_RR_LEN 16
159 122
160/* icmp_packet_rr must start with all fields from imcp_packet 123/* icmp_packet_rr must start with all fields from imcp_packet
161 * as this is assumed by code that handles ICMP packets 124 * as this is assumed by code that handles ICMP packets */
162 */ 125struct icmp_packet_rr {
163struct batadv_icmp_packet_rr { 126 uint8_t packet_type;
164 struct batadv_header header; 127 uint8_t version; /* batman version field */
128 uint8_t ttl;
165 uint8_t msg_type; /* see ICMP message types above */ 129 uint8_t msg_type; /* see ICMP message types above */
166 uint8_t dst[ETH_ALEN]; 130 uint8_t dst[6];
167 uint8_t orig[ETH_ALEN]; 131 uint8_t orig[6];
168 __be16 seqno; 132 uint16_t seqno;
169 uint8_t uid; 133 uint8_t uid;
170 uint8_t rr_cur; 134 uint8_t rr_cur;
171 uint8_t rr[BATADV_RR_LEN][ETH_ALEN]; 135 uint8_t rr[BAT_RR_LEN][ETH_ALEN];
172}; 136} __packed;
173
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.
177 *
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.
183 */
184#pragma pack(2)
185 137
186struct batadv_unicast_packet { 138struct unicast_packet {
187 struct batadv_header header; 139 uint8_t packet_type;
140 uint8_t version; /* batman version field */
141 uint8_t ttl;
188 uint8_t ttvn; /* destination translation table version number */ 142 uint8_t ttvn; /* destination translation table version number */
189 uint8_t dest[ETH_ALEN]; 143 uint8_t dest[6];
190 /* "4 bytes boundary + 2 bytes" long to make the payload after the 144} __packed;
191 * following ethernet header again 4 bytes boundary aligned
192 */
193};
194
195/**
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
200 */
201struct batadv_unicast_4addr_packet {
202 struct batadv_unicast_packet u;
203 uint8_t src[ETH_ALEN];
204 uint8_t subtype;
205 uint8_t reserved;
206 /* "4 bytes boundary + 2 bytes" long to make the payload after the
207 * following ethernet header again 4 bytes boundary aligned
208 */
209};
210 145
211struct batadv_unicast_frag_packet { 146struct unicast_frag_packet {
212 struct batadv_header header; 147 uint8_t packet_type;
148 uint8_t version; /* batman version field */
149 uint8_t ttl;
213 uint8_t ttvn; /* destination translation table version number */ 150 uint8_t ttvn; /* destination translation table version number */
214 uint8_t dest[ETH_ALEN]; 151 uint8_t dest[6];
215 uint8_t flags; 152 uint8_t flags;
216 uint8_t align; 153 uint8_t align;
217 uint8_t orig[ETH_ALEN]; 154 uint8_t orig[6];
218 __be16 seqno; 155 uint16_t seqno;
219} __packed; 156} __packed;
220 157
221struct batadv_bcast_packet { 158struct bcast_packet {
222 struct batadv_header header; 159 uint8_t packet_type;
160 uint8_t version; /* batman version field */
161 uint8_t ttl;
223 uint8_t reserved; 162 uint8_t reserved;
224 __be32 seqno; 163 uint32_t seqno;
225 uint8_t orig[ETH_ALEN]; 164 uint8_t orig[6];
226 /* "4 bytes boundary + 2 bytes" long to make the payload after the 165} __packed;
227 * following ethernet header again 4 bytes boundary aligned
228 */
229};
230
231#pragma pack()
232 166
233struct batadv_vis_packet { 167struct vis_packet {
234 struct batadv_header header; 168 uint8_t packet_type;
169 uint8_t version; /* batman version field */
170 uint8_t ttl; /* TTL */
235 uint8_t vis_type; /* which type of vis-participant sent this? */ 171 uint8_t vis_type; /* which type of vis-participant sent this? */
236 __be32 seqno; /* sequence number */ 172 uint32_t seqno; /* sequence number */
237 uint8_t entries; /* number of entries behind this struct */ 173 uint8_t entries; /* number of entries behind this struct */
238 uint8_t reserved; 174 uint8_t reserved;
239 uint8_t vis_orig[ETH_ALEN]; /* originator reporting its neighbors */ 175 uint8_t vis_orig[6]; /* originator that announces its neighbors */
240 uint8_t target_orig[ETH_ALEN]; /* who should receive this packet */ 176 uint8_t target_orig[6]; /* who should receive this packet */
241 uint8_t sender_orig[ETH_ALEN]; /* who sent or forwarded this packet */ 177 uint8_t sender_orig[6]; /* who sent or rebroadcasted this packet */
242}; 178} __packed;
243 179
244struct batadv_tt_query_packet { 180struct tt_query_packet {
245 struct batadv_header header; 181 uint8_t packet_type;
182 uint8_t version; /* batman version field */
183 uint8_t ttl;
246 /* the flag field is a combination of: 184 /* the flag field is a combination of:
247 * - TT_REQUEST or TT_RESPONSE 185 * - TT_REQUEST or TT_RESPONSE
248 * - TT_FULL_TABLE 186 * - TT_FULL_TABLE */
249 */
250 uint8_t flags; 187 uint8_t flags;
251 uint8_t dst[ETH_ALEN]; 188 uint8_t dst[ETH_ALEN];
252 uint8_t src[ETH_ALEN]; 189 uint8_t src[ETH_ALEN];
@@ -254,26 +191,26 @@ struct batadv_tt_query_packet {
254 * if TT_REQUEST: ttvn that triggered the 191 * if TT_REQUEST: ttvn that triggered the
255 * request 192 * request
256 * if TT_RESPONSE: new ttvn for the src 193 * if TT_RESPONSE: new ttvn for the src
257 * orig_node 194 * orig_node */
258 */
259 uint8_t ttvn; 195 uint8_t ttvn;
260 /* tt_data field is: 196 /* tt_data field is:
261 * if TT_REQUEST: crc associated with the 197 * if TT_REQUEST: crc associated with the
262 * ttvn 198 * ttvn
263 * if TT_RESPONSE: table_size 199 * if TT_RESPONSE: table_size */
264 */ 200 uint16_t tt_data;
265 __be16 tt_data;
266} __packed; 201} __packed;
267 202
268struct batadv_roam_adv_packet { 203struct roam_adv_packet {
269 struct batadv_header header; 204 uint8_t packet_type;
205 uint8_t version;
206 uint8_t ttl;
270 uint8_t reserved; 207 uint8_t reserved;
271 uint8_t dst[ETH_ALEN]; 208 uint8_t dst[ETH_ALEN];
272 uint8_t src[ETH_ALEN]; 209 uint8_t src[ETH_ALEN];
273 uint8_t client[ETH_ALEN]; 210 uint8_t client[ETH_ALEN];
274} __packed; 211} __packed;
275 212
276struct batadv_tt_change { 213struct tt_change {
277 uint8_t flags; 214 uint8_t flags;
278 uint8_t addr[ETH_ALEN]; 215 uint8_t addr[ETH_ALEN];
279} __packed; 216} __packed;