diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/batman-adv/main.c | 4 | ||||
-rw-r--r-- | net/batman-adv/packet.h | 40 | ||||
-rw-r--r-- | net/batman-adv/routing.c | 14 |
3 files changed, 44 insertions, 14 deletions
diff --git a/net/batman-adv/main.c b/net/batman-adv/main.c index d87778b9c5b4..1511f64a6cea 100644 --- a/net/batman-adv/main.c +++ b/net/batman-adv/main.c | |||
@@ -426,8 +426,8 @@ static void batadv_recv_handler_init(void) | |||
426 | BUILD_BUG_ON(offsetof(struct batadv_unicast_packet, dest) != 4); | 426 | BUILD_BUG_ON(offsetof(struct batadv_unicast_packet, dest) != 4); |
427 | BUILD_BUG_ON(offsetof(struct batadv_unicast_tvlv_packet, dst) != 4); | 427 | BUILD_BUG_ON(offsetof(struct batadv_unicast_tvlv_packet, dst) != 4); |
428 | BUILD_BUG_ON(offsetof(struct batadv_frag_packet, dest) != 4); | 428 | BUILD_BUG_ON(offsetof(struct batadv_frag_packet, dest) != 4); |
429 | BUILD_BUG_ON(offsetof(struct batadv_icmp_packet, icmph.dst) != 4); | 429 | BUILD_BUG_ON(offsetof(struct batadv_icmp_packet, dst) != 4); |
430 | BUILD_BUG_ON(offsetof(struct batadv_icmp_packet_rr, icmph.dst) != 4); | 430 | BUILD_BUG_ON(offsetof(struct batadv_icmp_packet_rr, dst) != 4); |
431 | 431 | ||
432 | /* broadcast packet */ | 432 | /* broadcast packet */ |
433 | batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet; | 433 | batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet; |
diff --git a/net/batman-adv/packet.h b/net/batman-adv/packet.h index 175ce7d721d6..2a857ed006fd 100644 --- a/net/batman-adv/packet.h +++ b/net/batman-adv/packet.h | |||
@@ -191,7 +191,7 @@ struct batadv_ogm_packet { | |||
191 | #define BATADV_OGM_HLEN sizeof(struct batadv_ogm_packet) | 191 | #define BATADV_OGM_HLEN sizeof(struct batadv_ogm_packet) |
192 | 192 | ||
193 | /** | 193 | /** |
194 | * batadv_icmp_header - common ICMP header | 194 | * batadv_icmp_header - common members among all the ICMP packets |
195 | * @packet_type: batman-adv packet type, part of the general header | 195 | * @packet_type: batman-adv packet type, part of the general header |
196 | * @version: batman-adv protocol version, part of the genereal header | 196 | * @version: batman-adv protocol version, part of the genereal header |
197 | * @ttl: time to live for this packet, part of the genereal header | 197 | * @ttl: time to live for this packet, part of the genereal header |
@@ -199,6 +199,11 @@ struct batadv_ogm_packet { | |||
199 | * @dst: address of the destination node | 199 | * @dst: address of the destination node |
200 | * @orig: address of the source node | 200 | * @orig: address of the source node |
201 | * @uid: local ICMP socket identifier | 201 | * @uid: local ICMP socket identifier |
202 | * @align: not used - useful for alignment purposes only | ||
203 | * | ||
204 | * This structure is used for ICMP packets parsing only and it is never sent | ||
205 | * over the wire. The alignment field at the end is there to ensure that | ||
206 | * members are padded the same way as they are in real packets. | ||
202 | */ | 207 | */ |
203 | struct batadv_icmp_header { | 208 | struct batadv_icmp_header { |
204 | uint8_t packet_type; | 209 | uint8_t packet_type; |
@@ -208,16 +213,29 @@ struct batadv_icmp_header { | |||
208 | uint8_t dst[ETH_ALEN]; | 213 | uint8_t dst[ETH_ALEN]; |
209 | uint8_t orig[ETH_ALEN]; | 214 | uint8_t orig[ETH_ALEN]; |
210 | uint8_t uid; | 215 | uint8_t uid; |
216 | uint8_t align[3]; | ||
211 | }; | 217 | }; |
212 | 218 | ||
213 | /** | 219 | /** |
214 | * batadv_icmp_packet - ICMP packet | 220 | * batadv_icmp_packet - ICMP packet |
215 | * @icmph: common ICMP header | 221 | * @packet_type: batman-adv packet type, part of the general header |
222 | * @version: batman-adv protocol version, part of the genereal header | ||
223 | * @ttl: time to live for this packet, part of the genereal header | ||
224 | * @msg_type: ICMP packet type | ||
225 | * @dst: address of the destination node | ||
226 | * @orig: address of the source node | ||
227 | * @uid: local ICMP socket identifier | ||
216 | * @reserved: not used - useful for alignment | 228 | * @reserved: not used - useful for alignment |
217 | * @seqno: ICMP sequence number | 229 | * @seqno: ICMP sequence number |
218 | */ | 230 | */ |
219 | struct batadv_icmp_packet { | 231 | struct batadv_icmp_packet { |
220 | struct batadv_icmp_header icmph; | 232 | uint8_t packet_type; |
233 | uint8_t version; | ||
234 | uint8_t ttl; | ||
235 | uint8_t msg_type; /* see ICMP message types above */ | ||
236 | uint8_t dst[ETH_ALEN]; | ||
237 | uint8_t orig[ETH_ALEN]; | ||
238 | uint8_t uid; | ||
221 | uint8_t reserved; | 239 | uint8_t reserved; |
222 | __be16 seqno; | 240 | __be16 seqno; |
223 | }; | 241 | }; |
@@ -226,13 +244,25 @@ struct batadv_icmp_packet { | |||
226 | 244 | ||
227 | /** | 245 | /** |
228 | * batadv_icmp_packet_rr - ICMP RouteRecord packet | 246 | * batadv_icmp_packet_rr - ICMP RouteRecord packet |
229 | * @icmph: common ICMP header | 247 | * @packet_type: batman-adv packet type, part of the general header |
248 | * @version: batman-adv protocol version, part of the genereal header | ||
249 | * @ttl: time to live for this packet, part of the genereal header | ||
250 | * @msg_type: ICMP packet type | ||
251 | * @dst: address of the destination node | ||
252 | * @orig: address of the source node | ||
253 | * @uid: local ICMP socket identifier | ||
230 | * @rr_cur: number of entries the rr array | 254 | * @rr_cur: number of entries the rr array |
231 | * @seqno: ICMP sequence number | 255 | * @seqno: ICMP sequence number |
232 | * @rr: route record array | 256 | * @rr: route record array |
233 | */ | 257 | */ |
234 | struct batadv_icmp_packet_rr { | 258 | struct batadv_icmp_packet_rr { |
235 | struct batadv_icmp_header icmph; | 259 | uint8_t packet_type; |
260 | uint8_t version; | ||
261 | uint8_t ttl; | ||
262 | uint8_t msg_type; /* see ICMP message types above */ | ||
263 | uint8_t dst[ETH_ALEN]; | ||
264 | uint8_t orig[ETH_ALEN]; | ||
265 | uint8_t uid; | ||
236 | uint8_t rr_cur; | 266 | uint8_t rr_cur; |
237 | __be16 seqno; | 267 | __be16 seqno; |
238 | uint8_t rr[BATADV_RR_LEN][ETH_ALEN]; | 268 | uint8_t rr[BATADV_RR_LEN][ETH_ALEN]; |
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c index 5b52d718a6eb..46278bfb8fdb 100644 --- a/net/batman-adv/routing.c +++ b/net/batman-adv/routing.c | |||
@@ -338,9 +338,9 @@ static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv, | |||
338 | icmp_packet = (struct batadv_icmp_packet *)skb->data; | 338 | icmp_packet = (struct batadv_icmp_packet *)skb->data; |
339 | 339 | ||
340 | /* send TTL exceeded if packet is an echo request (traceroute) */ | 340 | /* send TTL exceeded if packet is an echo request (traceroute) */ |
341 | if (icmp_packet->icmph.msg_type != BATADV_ECHO_REQUEST) { | 341 | if (icmp_packet->msg_type != BATADV_ECHO_REQUEST) { |
342 | pr_debug("Warning - can't forward icmp packet from %pM to %pM: ttl exceeded\n", | 342 | pr_debug("Warning - can't forward icmp packet from %pM to %pM: ttl exceeded\n", |
343 | icmp_packet->icmph.orig, icmp_packet->icmph.dst); | 343 | icmp_packet->orig, icmp_packet->dst); |
344 | goto out; | 344 | goto out; |
345 | } | 345 | } |
346 | 346 | ||
@@ -349,7 +349,7 @@ static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv, | |||
349 | goto out; | 349 | goto out; |
350 | 350 | ||
351 | /* get routing information */ | 351 | /* get routing information */ |
352 | orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->icmph.orig); | 352 | orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig); |
353 | if (!orig_node) | 353 | if (!orig_node) |
354 | goto out; | 354 | goto out; |
355 | 355 | ||
@@ -359,11 +359,11 @@ static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv, | |||
359 | 359 | ||
360 | icmp_packet = (struct batadv_icmp_packet *)skb->data; | 360 | icmp_packet = (struct batadv_icmp_packet *)skb->data; |
361 | 361 | ||
362 | memcpy(icmp_packet->icmph.dst, icmp_packet->icmph.orig, ETH_ALEN); | 362 | memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN); |
363 | memcpy(icmp_packet->icmph.orig, primary_if->net_dev->dev_addr, | 363 | memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, |
364 | ETH_ALEN); | 364 | ETH_ALEN); |
365 | icmp_packet->icmph.msg_type = BATADV_TTL_EXCEEDED; | 365 | icmp_packet->msg_type = BATADV_TTL_EXCEEDED; |
366 | icmp_packet->icmph.ttl = BATADV_TTL; | 366 | icmp_packet->ttl = BATADV_TTL; |
367 | 367 | ||
368 | if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP) | 368 | if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP) |
369 | ret = NET_RX_SUCCESS; | 369 | ret = NET_RX_SUCCESS; |