mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-30 07:34:12 +08:00
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 -----BEGIN PGP SIGNATURE----- iQJKBAABCgA0FiEE1ilQI7G+y+fdhnrfoSvjmEKSnqEFAlqv5tcWHHN3QHNpbW9u d3VuZGVybGljaC5kZQAKCRChK+OYQpKeob7PD/wPnjVmFl6uQlRHfOfUBzGvW9hU ASakGylzfZTXzP2VviMJ+7JehXQgediM4caTr/8jWhJFeVxu5jmeYzv8nzOlwZJ/ PjNlX+ChuIAWv1wyxHI3YWwj7Y1Ox9Lp8Gs7m5UbmfyiZEtb+ybHjvPzZ/FMfhWo hOgbndSpFKfwFuXFkXyitektBcKTiFUyjk9U22v91XCQZZzMb8KqougVBE+bdg0w N8LfgKXVC448sUNKTEczhji7bFuJwR+Sogx1TwIIsyfT2Tp4JXY3A7M1LDwAL/Rc nTu9L58vk4qUouRjIQJ7rhhoxdPSrD5p3oinzVnLvJBxgOS3pxegY3asX8sRMXsj bgolIGCZ9vDfA21WXqa3RyjUiBEx9UId6W++h+22kVqVHt5tqIFK2nVQ6IInOXwB kzd3UDrRBLgRdBpwlu/ii9rn68MOEdLNpL3Seo9DkViJESfLn1ODnFA1Y2rFoK6S cVeYl1DVj4SQSXjNilqYhFZoTEo/kxN5KhgHRXzujTv6MCHVa2SnCZaXS5EXp8n6 u4gpPc363Isj17A+UVlmHmmzA6d8Jqe8veVvET0xSvQPHmE7eepMkJU9hIUNXfcv fENmQnU10pS1keJqS6xuR6k2RxMoofYRUPpKEigCcH7z/0GytWQc6QVGmo19LD9b GNcWAhKI453pc1IuUA== =hsM8 -----END PGP SIGNATURE----- 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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
ee54a9f9ae
@ -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_dst(skb, hdr_size), &ip_dst);
|
||||
|
||||
if (hdr_size == 0)
|
||||
if (hdr_size < sizeof(struct batadv_unicast_packet))
|
||||
return;
|
||||
|
||||
unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/eventpoll.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/fs.h>
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/eventpoll.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/fs.h>
|
||||
|
@ -543,8 +543,8 @@ update:
|
||||
bat_priv->mcast.enabled = true;
|
||||
}
|
||||
|
||||
return !(mcast_data.flags &
|
||||
(BATADV_MCAST_WANT_ALL_IPV4 | BATADV_MCAST_WANT_ALL_IPV6));
|
||||
return !(mcast_data.flags & BATADV_MCAST_WANT_ALL_IPV4 &&
|
||||
mcast_data.flags & BATADV_MCAST_WANT_ALL_IPV6);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -759,6 +759,7 @@ free_skb:
|
||||
/**
|
||||
* batadv_reroute_unicast_packet() - update the unicast header for re-routing
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @skb: unicast packet to process
|
||||
* @unicast_packet: the unicast header to be updated
|
||||
* @dst_addr: the payload destination
|
||||
* @vid: VLAN identifier
|
||||
@ -770,7 +771,7 @@ free_skb:
|
||||
* Return: true if the packet header has been updated, false otherwise
|
||||
*/
|
||||
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,
|
||||
u8 *dst_addr, unsigned short vid)
|
||||
{
|
||||
@ -799,8 +800,10 @@ batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
|
||||
}
|
||||
|
||||
/* update the packet header */
|
||||
skb_postpull_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
|
||||
ether_addr_copy(unicast_packet->dest, orig_addr);
|
||||
unicast_packet->ttvn = orig_ttvn;
|
||||
skb_postpush_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
|
||||
|
||||
ret = true;
|
||||
out:
|
||||
@ -841,7 +844,7 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
||||
* the packet to
|
||||
*/
|
||||
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))
|
||||
batadv_dbg_ratelimited(BATADV_DBG_TT,
|
||||
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
|
||||
* 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)) {
|
||||
batadv_dbg_ratelimited(BATADV_DBG_TT, bat_priv,
|
||||
"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,
|
||||
if (!primary_if)
|
||||
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);
|
||||
unicast_packet->ttvn = curr_ttvn;
|
||||
skb_postpush_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
|
||||
|
||||
batadv_hardif_put(primary_if);
|
||||
|
||||
unicast_packet->ttvn = curr_ttvn;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -968,14 +973,10 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
||||
struct batadv_orig_node *orig_node = NULL, *orig_node_gw = NULL;
|
||||
int check, hdr_size = sizeof(*unicast_packet);
|
||||
enum batadv_subtype subtype;
|
||||
struct ethhdr *ethhdr;
|
||||
int ret = NET_RX_DROP;
|
||||
bool is4addr, is_gw;
|
||||
|
||||
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;
|
||||
/* the caller function should have already pulled 2 bytes */
|
||||
if (is4addr)
|
||||
@ -995,12 +996,14 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
||||
if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
|
||||
goto free_skb;
|
||||
|
||||
unicast_packet = (struct batadv_unicast_packet *)skb->data;
|
||||
|
||||
/* packet for me */
|
||||
if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
|
||||
/* If this is a unicast packet from another backgone gw,
|
||||
* 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);
|
||||
if (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,
|
||||
}
|
||||
|
||||
if (is4addr) {
|
||||
unicast_4addr_packet =
|
||||
(struct batadv_unicast_4addr_packet *)skb->data;
|
||||
subtype = unicast_4addr_packet->subtype;
|
||||
batadv_dat_inc_counter(bat_priv, subtype);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user