diff options
author | Linus Lüssing <linus.luessing@web.de> | 2014-01-19 16:22:45 -0500 |
---|---|---|
committer | Antonio Quartulli <antonio@meshcoding.com> | 2014-03-22 03:50:26 -0400 |
commit | 927c2ed7e5879a96759aadda94404d516ce9fb42 (patch) | |
tree | fea8526ec7713221769eaf1bdc34533c45bbb4bb /net/batman-adv/send.c | |
parent | abae9479ca9fa5616ae0debfbda54bf5424001df (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.c | 11 |
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 |