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 | |
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')
-rw-r--r-- | net/batman-adv/bridge_loop_avoidance.c | 2 | ||||
-rw-r--r-- | net/batman-adv/distributed-arp-table.c | 5 | ||||
-rw-r--r-- | net/batman-adv/gateway_client.c | 6 | ||||
-rw-r--r-- | net/batman-adv/send.c | 11 | ||||
-rw-r--r-- | net/batman-adv/soft-interface.c | 8 |
5 files changed, 18 insertions, 14 deletions
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c index 05f0712be5e7..73d83727d66a 100644 --- a/net/batman-adv/bridge_loop_avoidance.c +++ b/net/batman-adv/bridge_loop_avoidance.c | |||
@@ -882,7 +882,7 @@ static int batadv_bla_process_claim(struct batadv_priv *bat_priv, | |||
882 | proto = ethhdr->h_proto; | 882 | proto = ethhdr->h_proto; |
883 | headlen = ETH_HLEN; | 883 | headlen = ETH_HLEN; |
884 | if (vid & BATADV_VLAN_HAS_TAG) { | 884 | if (vid & BATADV_VLAN_HAS_TAG) { |
885 | vhdr = (struct vlan_ethhdr *)ethhdr; | 885 | vhdr = vlan_eth_hdr(skb); |
886 | proto = vhdr->h_vlan_encapsulated_proto; | 886 | proto = vhdr->h_vlan_encapsulated_proto; |
887 | headlen += VLAN_HLEN; | 887 | headlen += VLAN_HLEN; |
888 | } | 888 | } |
diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c index edee50411892..5bb37a8353dd 100644 --- a/net/batman-adv/distributed-arp-table.c +++ b/net/batman-adv/distributed-arp-table.c | |||
@@ -1027,6 +1027,11 @@ bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv, | |||
1027 | if (!skb_new) | 1027 | if (!skb_new) |
1028 | goto out; | 1028 | goto out; |
1029 | 1029 | ||
1030 | /* the rest of the TX path assumes that the mac_header offset pointing | ||
1031 | * to the inner Ethernet header has been set, therefore reset it now. | ||
1032 | */ | ||
1033 | skb_reset_mac_header(skb_new); | ||
1034 | |||
1030 | if (vid & BATADV_VLAN_HAS_TAG) | 1035 | if (vid & BATADV_VLAN_HAS_TAG) |
1031 | skb_new = vlan_insert_tag(skb_new, htons(ETH_P_8021Q), | 1036 | skb_new = vlan_insert_tag(skb_new, htons(ETH_P_8021Q), |
1032 | vid & VLAN_VID_MASK); | 1037 | vid & VLAN_VID_MASK); |
diff --git a/net/batman-adv/gateway_client.c b/net/batman-adv/gateway_client.c index d7fafc1009a0..07c7f2177648 100644 --- a/net/batman-adv/gateway_client.c +++ b/net/batman-adv/gateway_client.c | |||
@@ -678,7 +678,7 @@ batadv_gw_dhcp_recipient_get(struct sk_buff *skb, unsigned int *header_len, | |||
678 | if (!pskb_may_pull(skb, *header_len + ETH_HLEN)) | 678 | if (!pskb_may_pull(skb, *header_len + ETH_HLEN)) |
679 | return BATADV_DHCP_NO; | 679 | return BATADV_DHCP_NO; |
680 | 680 | ||
681 | ethhdr = (struct ethhdr *)skb->data; | 681 | ethhdr = eth_hdr(skb); |
682 | proto = ethhdr->h_proto; | 682 | proto = ethhdr->h_proto; |
683 | *header_len += ETH_HLEN; | 683 | *header_len += ETH_HLEN; |
684 | 684 | ||
@@ -687,7 +687,7 @@ batadv_gw_dhcp_recipient_get(struct sk_buff *skb, unsigned int *header_len, | |||
687 | if (!pskb_may_pull(skb, *header_len + VLAN_HLEN)) | 687 | if (!pskb_may_pull(skb, *header_len + VLAN_HLEN)) |
688 | return BATADV_DHCP_NO; | 688 | return BATADV_DHCP_NO; |
689 | 689 | ||
690 | vhdr = (struct vlan_ethhdr *)skb->data; | 690 | vhdr = vlan_eth_hdr(skb); |
691 | proto = vhdr->h_vlan_encapsulated_proto; | 691 | proto = vhdr->h_vlan_encapsulated_proto; |
692 | *header_len += VLAN_HLEN; | 692 | *header_len += VLAN_HLEN; |
693 | } | 693 | } |
@@ -726,7 +726,7 @@ batadv_gw_dhcp_recipient_get(struct sk_buff *skb, unsigned int *header_len, | |||
726 | return BATADV_DHCP_NO; | 726 | return BATADV_DHCP_NO; |
727 | 727 | ||
728 | /* skb->data might have been reallocated by pskb_may_pull() */ | 728 | /* skb->data might have been reallocated by pskb_may_pull() */ |
729 | ethhdr = (struct ethhdr *)skb->data; | 729 | ethhdr = eth_hdr(skb); |
730 | if (ntohs(ethhdr->h_proto) == ETH_P_8021Q) | 730 | if (ntohs(ethhdr->h_proto) == ETH_P_8021Q) |
731 | ethhdr = (struct ethhdr *)(skb->data + VLAN_HLEN); | 731 | ethhdr = (struct ethhdr *)(skb->data + VLAN_HLEN); |
732 | 732 | ||
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 |
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c index f82c267e1886..c4392fcd4eb0 100644 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c | |||
@@ -176,11 +176,11 @@ static int batadv_interface_tx(struct sk_buff *skb, | |||
176 | 176 | ||
177 | soft_iface->trans_start = jiffies; | 177 | soft_iface->trans_start = jiffies; |
178 | vid = batadv_get_vid(skb, 0); | 178 | vid = batadv_get_vid(skb, 0); |
179 | ethhdr = (struct ethhdr *)skb->data; | 179 | ethhdr = eth_hdr(skb); |
180 | 180 | ||
181 | switch (ntohs(ethhdr->h_proto)) { | 181 | switch (ntohs(ethhdr->h_proto)) { |
182 | case ETH_P_8021Q: | 182 | case ETH_P_8021Q: |
183 | vhdr = (struct vlan_ethhdr *)skb->data; | 183 | vhdr = vlan_eth_hdr(skb); |
184 | 184 | ||
185 | if (vhdr->h_vlan_encapsulated_proto != ethertype) | 185 | if (vhdr->h_vlan_encapsulated_proto != ethertype) |
186 | break; | 186 | break; |
@@ -194,7 +194,7 @@ static int batadv_interface_tx(struct sk_buff *skb, | |||
194 | goto dropped; | 194 | goto dropped; |
195 | 195 | ||
196 | /* skb->data might have been reallocated by batadv_bla_tx() */ | 196 | /* skb->data might have been reallocated by batadv_bla_tx() */ |
197 | ethhdr = (struct ethhdr *)skb->data; | 197 | ethhdr = eth_hdr(skb); |
198 | 198 | ||
199 | /* Register the client MAC in the transtable */ | 199 | /* Register the client MAC in the transtable */ |
200 | if (!is_multicast_ether_addr(ethhdr->h_source)) { | 200 | if (!is_multicast_ether_addr(ethhdr->h_source)) { |
@@ -230,7 +230,7 @@ static int batadv_interface_tx(struct sk_buff *skb, | |||
230 | /* skb->data may have been modified by | 230 | /* skb->data may have been modified by |
231 | * batadv_gw_dhcp_recipient_get() | 231 | * batadv_gw_dhcp_recipient_get() |
232 | */ | 232 | */ |
233 | ethhdr = (struct ethhdr *)skb->data; | 233 | ethhdr = eth_hdr(skb); |
234 | /* if gw_mode is on, broadcast any non-DHCP message. | 234 | /* if gw_mode is on, broadcast any non-DHCP message. |
235 | * All the DHCP packets are going to be sent as unicast | 235 | * All the DHCP packets are going to be sent as unicast |
236 | */ | 236 | */ |