mirror of https://gitee.com/openkylin/linux.git
Included changes:
- prevent compatibility issue between DAT and speedy join from creating inconsistencies in the global translation table - make sure temporary TT entries are purged out if not claimed - fix comparison function used for TT hash table - fix invalid stack access in batadv_dat_select_candidates() -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJWZZqMAAoJENpFlCjNi1MRPg4P/Rq04JLU51tzIYnC7dmkcKjY L0qFTF4C4FjRzyeDH7d7GwfDJAu/AN/sCw/N0UzkBQ8qlGmtM5pkyTglr12w2axT V2LalU8nR+VIqL/DvCmMAPthwRsXfAXAkwiKEPCbKp9GHOKuVF9uIC+UQP0V0HQE 6qKVii1j/IhVJWa30LrP8Uk/W4Ji55oB/oGBH4ggbWf0YWnaSldldfGGjtEY0JVd dfcOyTCYX3NiGs9QB5HRz2NDhc0t1u0CWTTaM1n5w7l2ejlUH6JYwqOfAr5Q5STt C265KonUeZCfq/ktzcEZ9c0NWHy8OePHA2anO1e5zPV/TwXNsSb50AnAHslaA7Fd vgZ3svTjhxowU20P21gMYOJGlUpmjMx+klBEcd0rAKEZHjcq2IFLS4LA6I8en8o4 XtcJLj1Rrk/4XV9BntOlLVIfrA8TKH7B/vjAkbLa45WbH74B1V1sODmGxIv4mUVs Vhe5lTyPktKFhducU0g4jDIg+Up07JIrMKs9/9TXWXuXf4tH255yg42dYSCOoqQD 4haKbUqQN90KvR1/cKGtkwpq0BlZq75RW4+SFtsUUZbdZyZNGx2zgR8g5e1owdN2 1I4c2XAsTbJMEaB86hsNWv/goy0H57dn4SNwi34BJr6OADfcorr2qGd4LRrTDUaL hpwirVIN0SiaEz9krwDW =tH3+ -----END PGP SIGNATURE----- Merge tag 'batman-adv-fix-for-davem' of git://git.open-mesh.org/linux-merge Antonio Quartulli says: ==================== Included changes: - prevent compatibility issue between DAT and speedy join from creating inconsistencies in the global translation table - make sure temporary TT entries are purged out if not claimed - fix comparison function used for TT hash table - fix invalid stack access in batadv_dat_select_candidates() ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
0c9cd7c433
|
@ -566,6 +566,7 @@ batadv_dat_select_candidates(struct batadv_priv *bat_priv, __be32 ip_dst)
|
|||
int select;
|
||||
batadv_dat_addr_t last_max = BATADV_DAT_ADDR_MAX, ip_key;
|
||||
struct batadv_dat_candidate *res;
|
||||
struct batadv_dat_entry dat;
|
||||
|
||||
if (!bat_priv->orig_hash)
|
||||
return NULL;
|
||||
|
@ -575,7 +576,9 @@ batadv_dat_select_candidates(struct batadv_priv *bat_priv, __be32 ip_dst)
|
|||
if (!res)
|
||||
return NULL;
|
||||
|
||||
ip_key = (batadv_dat_addr_t)batadv_hash_dat(&ip_dst,
|
||||
dat.ip = ip_dst;
|
||||
dat.vid = 0;
|
||||
ip_key = (batadv_dat_addr_t)batadv_hash_dat(&dat,
|
||||
BATADV_DAT_ADDR_MAX);
|
||||
|
||||
batadv_dbg(BATADV_DBG_DAT, bat_priv,
|
||||
|
|
|
@ -836,6 +836,7 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
|||
u8 *orig_addr;
|
||||
struct batadv_orig_node *orig_node = NULL;
|
||||
int check, hdr_size = sizeof(*unicast_packet);
|
||||
enum batadv_subtype subtype;
|
||||
bool is4addr;
|
||||
|
||||
unicast_packet = (struct batadv_unicast_packet *)skb->data;
|
||||
|
@ -863,10 +864,20 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
|||
/* packet for me */
|
||||
if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
|
||||
if (is4addr) {
|
||||
batadv_dat_inc_counter(bat_priv,
|
||||
unicast_4addr_packet->subtype);
|
||||
orig_addr = unicast_4addr_packet->src;
|
||||
orig_node = batadv_orig_hash_find(bat_priv, orig_addr);
|
||||
subtype = unicast_4addr_packet->subtype;
|
||||
batadv_dat_inc_counter(bat_priv, subtype);
|
||||
|
||||
/* Only payload data should be considered for speedy
|
||||
* join. For example, DAT also uses unicast 4addr
|
||||
* types, but those packets should not be considered
|
||||
* for speedy join, since the clients do not actually
|
||||
* reside at the sending originator.
|
||||
*/
|
||||
if (subtype == BATADV_P_DATA) {
|
||||
orig_addr = unicast_4addr_packet->src;
|
||||
orig_node = batadv_orig_hash_find(bat_priv,
|
||||
orig_addr);
|
||||
}
|
||||
}
|
||||
|
||||
if (batadv_dat_snoop_incoming_arp_request(bat_priv, skb,
|
||||
|
|
|
@ -68,13 +68,15 @@ static void batadv_tt_global_del(struct batadv_priv *bat_priv,
|
|||
unsigned short vid, const char *message,
|
||||
bool roaming);
|
||||
|
||||
/* returns 1 if they are the same mac addr */
|
||||
/* returns 1 if they are the same mac addr and vid */
|
||||
static int batadv_compare_tt(const struct hlist_node *node, const void *data2)
|
||||
{
|
||||
const void *data1 = container_of(node, struct batadv_tt_common_entry,
|
||||
hash_entry);
|
||||
const struct batadv_tt_common_entry *tt1 = data1;
|
||||
const struct batadv_tt_common_entry *tt2 = data2;
|
||||
|
||||
return batadv_compare_eth(data1, data2);
|
||||
return (tt1->vid == tt2->vid) && batadv_compare_eth(data1, data2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1427,9 +1429,15 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
|
|||
}
|
||||
|
||||
/* if the client was temporary added before receiving the first
|
||||
* OGM announcing it, we have to clear the TEMP flag
|
||||
* OGM announcing it, we have to clear the TEMP flag. Also,
|
||||
* remove the previous temporary orig node and re-add it
|
||||
* if required. If the orig entry changed, the new one which
|
||||
* is a non-temporary entry is preferred.
|
||||
*/
|
||||
common->flags &= ~BATADV_TT_CLIENT_TEMP;
|
||||
if (common->flags & BATADV_TT_CLIENT_TEMP) {
|
||||
batadv_tt_global_del_orig_list(tt_global_entry);
|
||||
common->flags &= ~BATADV_TT_CLIENT_TEMP;
|
||||
}
|
||||
|
||||
/* the change can carry possible "attribute" flags like the
|
||||
* TT_CLIENT_WIFI, therefore they have to be copied in the
|
||||
|
|
Loading…
Reference in New Issue