|
|
@@ -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,
|