Commit ee54a9f9 authored by David S. Miller's avatar David S. Miller

Merge tag 'batadv-net-for-davem-20180319' of git://git.open-mesh.org/linux-merge

Simon Wunderlich says:

====================
Here are some batman-adv bugfixes:

 - fix possible IPv6 packet loss when multicast extension is used, by Linus Luessing

 - fix SKB handling issues for TTVN and DAT, by Matthias Schiffer (two patches)

 - fix include for eventpoll, by Sven Eckelmann

 - fix skb checksum for ttvn reroutes, by Sven Eckelmann
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents ba9a1908 fc04fdb2
...@@ -393,7 +393,7 @@ static void batadv_dbg_arp(struct batadv_priv *bat_priv, struct sk_buff *skb, ...@@ -393,7 +393,7 @@ static void batadv_dbg_arp(struct batadv_priv *bat_priv, struct sk_buff *skb,
batadv_arp_hw_src(skb, hdr_size), &ip_src, batadv_arp_hw_src(skb, hdr_size), &ip_src,
batadv_arp_hw_dst(skb, hdr_size), &ip_dst); batadv_arp_hw_dst(skb, hdr_size), &ip_dst);
if (hdr_size == 0) if (hdr_size < sizeof(struct batadv_unicast_packet))
return; return;
unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data; unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/eventpoll.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/fcntl.h> #include <linux/fcntl.h>
#include <linux/fs.h> #include <linux/fs.h>
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/eventpoll.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/fcntl.h> #include <linux/fcntl.h>
#include <linux/fs.h> #include <linux/fs.h>
......
...@@ -543,8 +543,8 @@ static bool batadv_mcast_mla_tvlv_update(struct batadv_priv *bat_priv) ...@@ -543,8 +543,8 @@ static bool batadv_mcast_mla_tvlv_update(struct batadv_priv *bat_priv)
bat_priv->mcast.enabled = true; bat_priv->mcast.enabled = true;
} }
return !(mcast_data.flags & return !(mcast_data.flags & BATADV_MCAST_WANT_ALL_IPV4 &&
(BATADV_MCAST_WANT_ALL_IPV4 | BATADV_MCAST_WANT_ALL_IPV6)); mcast_data.flags & BATADV_MCAST_WANT_ALL_IPV6);
} }
/** /**
......
...@@ -759,6 +759,7 @@ static int batadv_route_unicast_packet(struct sk_buff *skb, ...@@ -759,6 +759,7 @@ static int batadv_route_unicast_packet(struct sk_buff *skb,
/** /**
* batadv_reroute_unicast_packet() - update the unicast header for re-routing * batadv_reroute_unicast_packet() - update the unicast header for re-routing
* @bat_priv: the bat priv with all the soft interface information * @bat_priv: the bat priv with all the soft interface information
* @skb: unicast packet to process
* @unicast_packet: the unicast header to be updated * @unicast_packet: the unicast header to be updated
* @dst_addr: the payload destination * @dst_addr: the payload destination
* @vid: VLAN identifier * @vid: VLAN identifier
...@@ -770,7 +771,7 @@ static int batadv_route_unicast_packet(struct sk_buff *skb, ...@@ -770,7 +771,7 @@ static int batadv_route_unicast_packet(struct sk_buff *skb,
* Return: true if the packet header has been updated, false otherwise * Return: true if the packet header has been updated, false otherwise
*/ */
static bool static bool
batadv_reroute_unicast_packet(struct batadv_priv *bat_priv, batadv_reroute_unicast_packet(struct batadv_priv *bat_priv, struct sk_buff *skb,
struct batadv_unicast_packet *unicast_packet, struct batadv_unicast_packet *unicast_packet,
u8 *dst_addr, unsigned short vid) u8 *dst_addr, unsigned short vid)
{ {
...@@ -799,8 +800,10 @@ batadv_reroute_unicast_packet(struct batadv_priv *bat_priv, ...@@ -799,8 +800,10 @@ batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
} }
/* update the packet header */ /* update the packet header */
skb_postpull_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
ether_addr_copy(unicast_packet->dest, orig_addr); ether_addr_copy(unicast_packet->dest, orig_addr);
unicast_packet->ttvn = orig_ttvn; unicast_packet->ttvn = orig_ttvn;
skb_postpush_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
ret = true; ret = true;
out: out:
...@@ -841,7 +844,7 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv, ...@@ -841,7 +844,7 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
* the packet to * the packet to
*/ */
if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) { if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) {
if (batadv_reroute_unicast_packet(bat_priv, unicast_packet, if (batadv_reroute_unicast_packet(bat_priv, skb, unicast_packet,
ethhdr->h_dest, vid)) ethhdr->h_dest, vid))
batadv_dbg_ratelimited(BATADV_DBG_TT, batadv_dbg_ratelimited(BATADV_DBG_TT,
bat_priv, bat_priv,
...@@ -887,7 +890,7 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv, ...@@ -887,7 +890,7 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
* destination can possibly be updated and forwarded towards the new * destination can possibly be updated and forwarded towards the new
* target host * target host
*/ */
if (batadv_reroute_unicast_packet(bat_priv, unicast_packet, if (batadv_reroute_unicast_packet(bat_priv, skb, unicast_packet,
ethhdr->h_dest, vid)) { ethhdr->h_dest, vid)) {
batadv_dbg_ratelimited(BATADV_DBG_TT, bat_priv, batadv_dbg_ratelimited(BATADV_DBG_TT, bat_priv,
"Rerouting unicast packet to %pM (dst=%pM): TTVN mismatch old_ttvn=%u new_ttvn=%u\n", "Rerouting unicast packet to %pM (dst=%pM): TTVN mismatch old_ttvn=%u new_ttvn=%u\n",
...@@ -910,12 +913,14 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv, ...@@ -910,12 +913,14 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
if (!primary_if) if (!primary_if)
return false; return false;
/* update the packet header */
skb_postpull_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr); ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr);
unicast_packet->ttvn = curr_ttvn;
skb_postpush_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
unicast_packet->ttvn = curr_ttvn;
return true; return true;
} }
...@@ -968,14 +973,10 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, ...@@ -968,14 +973,10 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
struct batadv_orig_node *orig_node = NULL, *orig_node_gw = NULL; struct batadv_orig_node *orig_node = NULL, *orig_node_gw = NULL;
int check, hdr_size = sizeof(*unicast_packet); int check, hdr_size = sizeof(*unicast_packet);
enum batadv_subtype subtype; enum batadv_subtype subtype;
struct ethhdr *ethhdr;
int ret = NET_RX_DROP; int ret = NET_RX_DROP;
bool is4addr, is_gw; bool is4addr, is_gw;
unicast_packet = (struct batadv_unicast_packet *)skb->data; unicast_packet = (struct batadv_unicast_packet *)skb->data;
unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
ethhdr = eth_hdr(skb);
is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR; is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR;
/* the caller function should have already pulled 2 bytes */ /* the caller function should have already pulled 2 bytes */
if (is4addr) if (is4addr)
...@@ -995,12 +996,14 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, ...@@ -995,12 +996,14 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size)) if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
goto free_skb; goto free_skb;
unicast_packet = (struct batadv_unicast_packet *)skb->data;
/* packet for me */ /* packet for me */
if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) { if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
/* If this is a unicast packet from another backgone gw, /* If this is a unicast packet from another backgone gw,
* drop it. * drop it.
*/ */
orig_addr_gw = ethhdr->h_source; orig_addr_gw = eth_hdr(skb)->h_source;
orig_node_gw = batadv_orig_hash_find(bat_priv, orig_addr_gw); orig_node_gw = batadv_orig_hash_find(bat_priv, orig_addr_gw);
if (orig_node_gw) { if (orig_node_gw) {
is_gw = batadv_bla_is_backbone_gw(skb, orig_node_gw, is_gw = batadv_bla_is_backbone_gw(skb, orig_node_gw,
...@@ -1015,6 +1018,8 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, ...@@ -1015,6 +1018,8 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
} }
if (is4addr) { if (is4addr) {
unicast_4addr_packet =
(struct batadv_unicast_4addr_packet *)skb->data;
subtype = unicast_4addr_packet->subtype; subtype = unicast_4addr_packet->subtype;
batadv_dat_inc_counter(bat_priv, subtype); batadv_dat_inc_counter(bat_priv, subtype);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment