aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv/send.c
diff options
context:
space:
mode:
authorLinus Lüssing <linus.luessing@web.de>2014-01-19 16:22:45 -0500
committerAntonio Quartulli <antonio@meshcoding.com>2014-03-22 03:50:26 -0400
commit927c2ed7e5879a96759aadda94404d516ce9fb42 (patch)
treefea8526ec7713221769eaf1bdc34533c45bbb4bb /net/batman-adv/send.c
parentabae9479ca9fa5616ae0debfbda54bf5424001df (diff)
batman-adv: use vlan_/eth_hdr() instead of skb->data in interface_tx path
Our .ndo_start_xmit handler (batadv_interface_tx()) can rely on having the skb mac header pointer set correctly since the following commit present in kernels >= 3.9: "net: reset mac header in dev_start_xmit()" (6d1ccff627) Therefore we can safely use eth_hdr() and vlan_eth_hdr() instead of skb->data now, which spares us some ugly type casts. At the same time set the mac_header in batadv_dat_snoop_incoming_arp_request() before sending the skb along the TX path. Signed-off-by: Linus Lüssing <linus.luessing@web.de> Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch> Signed-off-by: Antonio Quartulli <antonio@meshcoding.com>
Diffstat (limited to 'net/batman-adv/send.c')
-rw-r--r--net/batman-adv/send.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/net/batman-adv/send.c b/net/batman-adv/send.c
index 843febd1e519..1703a2ef72a9 100644
--- a/net/batman-adv/send.c
+++ b/net/batman-adv/send.c
@@ -256,7 +256,7 @@ static int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
256{ 256{
257 struct ethhdr *ethhdr; 257 struct ethhdr *ethhdr;
258 struct batadv_unicast_packet *unicast_packet; 258 struct batadv_unicast_packet *unicast_packet;
259 int ret = NET_XMIT_DROP, hdr_size; 259 int ret = NET_XMIT_DROP;
260 260
261 if (!orig_node) 261 if (!orig_node)
262 goto out; 262 goto out;
@@ -265,16 +265,12 @@ static int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
265 case BATADV_UNICAST: 265 case BATADV_UNICAST:
266 if (!batadv_send_skb_prepare_unicast(skb, orig_node)) 266 if (!batadv_send_skb_prepare_unicast(skb, orig_node))
267 goto out; 267 goto out;
268
269 hdr_size = sizeof(*unicast_packet);
270 break; 268 break;
271 case BATADV_UNICAST_4ADDR: 269 case BATADV_UNICAST_4ADDR:
272 if (!batadv_send_skb_prepare_unicast_4addr(bat_priv, skb, 270 if (!batadv_send_skb_prepare_unicast_4addr(bat_priv, skb,
273 orig_node, 271 orig_node,
274 packet_subtype)) 272 packet_subtype))
275 goto out; 273 goto out;
276
277 hdr_size = sizeof(struct batadv_unicast_4addr_packet);
278 break; 274 break;
279 default: 275 default:
280 /* this function supports UNICAST and UNICAST_4ADDR only. It 276 /* this function supports UNICAST and UNICAST_4ADDR only. It
@@ -283,7 +279,10 @@ static int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
283 goto out; 279 goto out;
284 } 280 }
285 281
286 ethhdr = (struct ethhdr *)(skb->data + hdr_size); 282 /* skb->data might have been reallocated by
283 * batadv_send_skb_prepare_unicast{,_4addr}()
284 */
285 ethhdr = eth_hdr(skb);
287 unicast_packet = (struct batadv_unicast_packet *)skb->data; 286 unicast_packet = (struct batadv_unicast_packet *)skb->data;
288 287
289 /* inform the destination node that we are still missing a correct route 288 /* inform the destination node that we are still missing a correct route