aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv
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
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')
-rw-r--r--net/batman-adv/bridge_loop_avoidance.c2
-rw-r--r--net/batman-adv/distributed-arp-table.c5
-rw-r--r--net/batman-adv/gateway_client.c6
-rw-r--r--net/batman-adv/send.c11
-rw-r--r--net/batman-adv/soft-interface.c8
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 */