^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* Copyright (C) 2011-2020 B.A.T.M.A.N. contributors:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Simon Wunderlich
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include "bridge_loop_avoidance.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include "main.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/atomic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/byteorder/generic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/compiler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/crc16.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/etherdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/gfp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/if_arp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/if_ether.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/if_vlan.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/jhash.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/jiffies.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/kref.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/lockdep.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/netdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/netlink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/preempt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/rculist.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <linux/rcupdate.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/seq_file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <linux/skbuff.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/stddef.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include <net/arp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include <net/genetlink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include <net/netlink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include <net/sock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include <uapi/linux/batadv_packet.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include <uapi/linux/batman_adv.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include "hard-interface.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include "hash.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include "log.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include "netlink.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include "originator.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #include "soft-interface.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include "translation-table.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) static const u8 batadv_announce_mac[4] = {0x43, 0x05, 0x43, 0x05};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) static void batadv_bla_periodic_work(struct work_struct *work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) batadv_bla_send_announce(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct batadv_bla_backbone_gw *backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * batadv_choose_claim() - choose the right bucket for a claim.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * @data: data to hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * @size: size of the hash table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * Return: the hash index of the claim
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) static inline u32 batadv_choose_claim(const void *data, u32 size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) struct batadv_bla_claim *claim = (struct batadv_bla_claim *)data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) u32 hash = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) hash = jhash(&claim->addr, sizeof(claim->addr), hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) hash = jhash(&claim->vid, sizeof(claim->vid), hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) return hash % size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) * batadv_choose_backbone_gw() - choose the right bucket for a backbone gateway.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * @data: data to hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) * @size: size of the hash table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * Return: the hash index of the backbone gateway
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) static inline u32 batadv_choose_backbone_gw(const void *data, u32 size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) const struct batadv_bla_backbone_gw *gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) u32 hash = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) gw = (struct batadv_bla_backbone_gw *)data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) hash = jhash(&gw->orig, sizeof(gw->orig), hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) hash = jhash(&gw->vid, sizeof(gw->vid), hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) return hash % size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * batadv_compare_backbone_gw() - compare address and vid of two backbone gws
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * @node: list node of the first entry to compare
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * @data2: pointer to the second backbone gateway
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * Return: true if the backbones have the same data, false otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) static bool batadv_compare_backbone_gw(const struct hlist_node *node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) const void *data2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) const void *data1 = container_of(node, struct batadv_bla_backbone_gw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) hash_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) const struct batadv_bla_backbone_gw *gw1 = data1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) const struct batadv_bla_backbone_gw *gw2 = data2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) if (!batadv_compare_eth(gw1->orig, gw2->orig))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) if (gw1->vid != gw2->vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * batadv_compare_claim() - compare address and vid of two claims
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) * @node: list node of the first entry to compare
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) * @data2: pointer to the second claims
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) * Return: true if the claim have the same data, 0 otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) static bool batadv_compare_claim(const struct hlist_node *node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) const void *data2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) const void *data1 = container_of(node, struct batadv_bla_claim,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) hash_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) const struct batadv_bla_claim *cl1 = data1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) const struct batadv_bla_claim *cl2 = data2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) if (!batadv_compare_eth(cl1->addr, cl2->addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) if (cl1->vid != cl2->vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) * batadv_backbone_gw_release() - release backbone gw from lists and queue for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) * free after rcu grace period
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * @ref: kref pointer of the backbone gw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) static void batadv_backbone_gw_release(struct kref *ref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) backbone_gw = container_of(ref, struct batadv_bla_backbone_gw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) kfree_rcu(backbone_gw, rcu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * batadv_backbone_gw_put() - decrement the backbone gw refcounter and possibly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * release it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * @backbone_gw: backbone gateway to be free'd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) static void batadv_backbone_gw_put(struct batadv_bla_backbone_gw *backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) if (!backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) kref_put(&backbone_gw->refcount, batadv_backbone_gw_release);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * batadv_claim_release() - release claim from lists and queue for free after
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * rcu grace period
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) * @ref: kref pointer of the claim
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) static void batadv_claim_release(struct kref *ref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) struct batadv_bla_claim *claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) struct batadv_bla_backbone_gw *old_backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) claim = container_of(ref, struct batadv_bla_claim, refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) spin_lock_bh(&claim->backbone_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) old_backbone_gw = claim->backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) claim->backbone_gw = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) spin_unlock_bh(&claim->backbone_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) spin_lock_bh(&old_backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) old_backbone_gw->crc ^= crc16(0, claim->addr, ETH_ALEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) spin_unlock_bh(&old_backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) batadv_backbone_gw_put(old_backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) kfree_rcu(claim, rcu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) * batadv_claim_put() - decrement the claim refcounter and possibly release it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) * @claim: claim to be free'd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) static void batadv_claim_put(struct batadv_bla_claim *claim)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) if (!claim)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) kref_put(&claim->refcount, batadv_claim_release);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) * batadv_claim_hash_find() - looks for a claim in the claim hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) * @data: search data (may be local/static data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) * Return: claim if found or NULL otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) static struct batadv_bla_claim *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) batadv_claim_hash_find(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) struct batadv_bla_claim *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) struct batadv_hashtable *hash = bat_priv->bla.claim_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) struct hlist_head *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) struct batadv_bla_claim *claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct batadv_bla_claim *claim_tmp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) int index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) if (!hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) index = batadv_choose_claim(data, hash->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) head = &hash->table[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) hlist_for_each_entry_rcu(claim, head, hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) if (!batadv_compare_claim(&claim->hash_entry, data))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) if (!kref_get_unless_zero(&claim->refcount))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) claim_tmp = claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) return claim_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) * batadv_backbone_hash_find() - looks for a backbone gateway in the hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) * @addr: the address of the originator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) * @vid: the VLAN ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) * Return: backbone gateway if found or NULL otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) static struct batadv_bla_backbone_gw *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) batadv_backbone_hash_find(struct batadv_priv *bat_priv, u8 *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) unsigned short vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) struct hlist_head *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) struct batadv_bla_backbone_gw search_entry, *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct batadv_bla_backbone_gw *backbone_gw_tmp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) int index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) if (!hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) ether_addr_copy(search_entry.orig, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) search_entry.vid = vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) index = batadv_choose_backbone_gw(&search_entry, hash->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) head = &hash->table[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) if (!batadv_compare_backbone_gw(&backbone_gw->hash_entry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) &search_entry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) if (!kref_get_unless_zero(&backbone_gw->refcount))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) backbone_gw_tmp = backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) return backbone_gw_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) * batadv_bla_del_backbone_claims() - delete all claims for a backbone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) * @backbone_gw: backbone gateway where the claims should be removed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) batadv_bla_del_backbone_claims(struct batadv_bla_backbone_gw *backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) struct batadv_hashtable *hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) struct hlist_node *node_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) struct hlist_head *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) struct batadv_bla_claim *claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) spinlock_t *list_lock; /* protects write access to the hash lists */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) hash = backbone_gw->bat_priv->bla.claim_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) if (!hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) for (i = 0; i < hash->size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) head = &hash->table[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) list_lock = &hash->list_locks[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) spin_lock_bh(list_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) hlist_for_each_entry_safe(claim, node_tmp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) head, hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) if (claim->backbone_gw != backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) batadv_claim_put(claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) hlist_del_rcu(&claim->hash_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) spin_unlock_bh(list_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) /* all claims gone, initialize CRC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) spin_lock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) backbone_gw->crc = BATADV_BLA_CRC_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) spin_unlock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) * batadv_bla_send_claim() - sends a claim frame according to the provided info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) * @mac: the mac address to be announced within the claim
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) * @vid: the VLAN ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) * @claimtype: the type of the claim (CLAIM, UNCLAIM, ANNOUNCE, ...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) static void batadv_bla_send_claim(struct batadv_priv *bat_priv, u8 *mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) unsigned short vid, int claimtype)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) struct ethhdr *ethhdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) struct batadv_hard_iface *primary_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) struct net_device *soft_iface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) u8 *hw_src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) struct batadv_bla_claim_dst local_claim_dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) __be32 zeroip = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) primary_if = batadv_primary_if_get_selected(bat_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) if (!primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) memcpy(&local_claim_dest, &bat_priv->bla.claim_dest,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) sizeof(local_claim_dest));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) local_claim_dest.type = claimtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) soft_iface = primary_if->soft_iface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) skb = arp_create(ARPOP_REPLY, ETH_P_ARP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) /* IP DST: 0.0.0.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) zeroip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) primary_if->soft_iface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) /* IP SRC: 0.0.0.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) zeroip,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) /* Ethernet DST: Broadcast */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) /* Ethernet SRC/HW SRC: originator mac */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) primary_if->net_dev->dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) /* HW DST: FF:43:05:XX:YY:YY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) * with XX = claim type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) * and YY:YY = group id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) (u8 *)&local_claim_dest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) ethhdr = (struct ethhdr *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) hw_src = (u8 *)ethhdr + ETH_HLEN + sizeof(struct arphdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) /* now we pretend that the client would have sent this ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) switch (claimtype) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) case BATADV_CLAIM_TYPE_CLAIM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) /* normal claim frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) * set Ethernet SRC to the clients mac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) ether_addr_copy(ethhdr->h_source, mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) "%s(): CLAIM %pM on vid %d\n", __func__, mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) batadv_print_vid(vid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) case BATADV_CLAIM_TYPE_UNCLAIM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) /* unclaim frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) * set HW SRC to the clients mac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) ether_addr_copy(hw_src, mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) "%s(): UNCLAIM %pM on vid %d\n", __func__, mac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) batadv_print_vid(vid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) case BATADV_CLAIM_TYPE_ANNOUNCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) /* announcement frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) * set HW SRC to the special mac containg the crc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) ether_addr_copy(hw_src, mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) "%s(): ANNOUNCE of %pM on vid %d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) ethhdr->h_source, batadv_print_vid(vid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) case BATADV_CLAIM_TYPE_REQUEST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) /* request frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) * set HW SRC and header destination to the receiving backbone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) * gws mac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) ether_addr_copy(hw_src, mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) ether_addr_copy(ethhdr->h_dest, mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) "%s(): REQUEST of %pM to %pM on vid %d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) ethhdr->h_source, ethhdr->h_dest,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) batadv_print_vid(vid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) case BATADV_CLAIM_TYPE_LOOPDETECT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) ether_addr_copy(ethhdr->h_source, mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) "%s(): LOOPDETECT of %pM to %pM on vid %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) __func__, ethhdr->h_source, ethhdr->h_dest,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) batadv_print_vid(vid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) if (vid & BATADV_VLAN_HAS_TAG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) skb = vlan_insert_tag(skb, htons(ETH_P_8021Q),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) vid & VLAN_VID_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) skb_reset_mac_header(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) skb->protocol = eth_type_trans(skb, soft_iface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) batadv_inc_counter(bat_priv, BATADV_CNT_RX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) skb->len + ETH_HLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) if (in_interrupt())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) netif_rx(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) netif_rx_ni(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) if (primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) batadv_hardif_put(primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) * batadv_bla_loopdetect_report() - worker for reporting the loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) * @work: work queue item
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) * Throws an uevent, as the loopdetect check function can't do that itself
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) * since the kernel may sleep while throwing uevents.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) static void batadv_bla_loopdetect_report(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) struct batadv_priv *bat_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) char vid_str[6] = { '\0' };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) backbone_gw = container_of(work, struct batadv_bla_backbone_gw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) report_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) bat_priv = backbone_gw->bat_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) batadv_info(bat_priv->soft_iface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) "Possible loop on VLAN %d detected which can't be handled by BLA - please check your network setup!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) batadv_print_vid(backbone_gw->vid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) snprintf(vid_str, sizeof(vid_str), "%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) batadv_print_vid(backbone_gw->vid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) vid_str[sizeof(vid_str) - 1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) batadv_throw_uevent(bat_priv, BATADV_UEV_BLA, BATADV_UEV_LOOPDETECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) vid_str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) * batadv_bla_get_backbone_gw() - finds or creates a backbone gateway
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) * @orig: the mac address of the originator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) * @vid: the VLAN ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) * @own_backbone: set if the requested backbone is local
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) * Return: the (possibly created) backbone gateway or NULL on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) static struct batadv_bla_backbone_gw *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, u8 *orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) unsigned short vid, bool own_backbone)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) struct batadv_bla_backbone_gw *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) struct batadv_orig_node *orig_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) int hash_added;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) entry = batadv_backbone_hash_find(bat_priv, orig, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) if (entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) return entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) "%s(): not found (%pM, %d), creating new entry\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) orig, batadv_print_vid(vid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) if (!entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) entry->vid = vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) entry->lasttime = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) entry->crc = BATADV_BLA_CRC_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) entry->bat_priv = bat_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) spin_lock_init(&entry->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) atomic_set(&entry->request_sent, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) atomic_set(&entry->wait_periods, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) ether_addr_copy(entry->orig, orig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) INIT_WORK(&entry->report_work, batadv_bla_loopdetect_report);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) kref_init(&entry->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) kref_get(&entry->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) hash_added = batadv_hash_add(bat_priv->bla.backbone_hash,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) batadv_compare_backbone_gw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) batadv_choose_backbone_gw, entry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) &entry->hash_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) if (unlikely(hash_added != 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) /* hash failed, free the structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) kfree(entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) /* this is a gateway now, remove any TT entry on this VLAN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) orig_node = batadv_orig_hash_find(bat_priv, orig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) if (orig_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) batadv_tt_global_del_orig(bat_priv, orig_node, vid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) "became a backbone gateway");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) batadv_orig_node_put(orig_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) if (own_backbone) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) batadv_bla_send_announce(bat_priv, entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) /* this will be decreased in the worker thread */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) atomic_inc(&entry->request_sent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) atomic_set(&entry->wait_periods, BATADV_BLA_WAIT_PERIODS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) atomic_inc(&bat_priv->bla.num_requests);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) return entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) * batadv_bla_update_own_backbone_gw() - updates the own backbone gw for a VLAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) * @primary_if: the selected primary interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) * @vid: VLAN identifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) * update or add the own backbone gw to make sure we announce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) * where we receive other backbone gws
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) batadv_bla_update_own_backbone_gw(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) unsigned short vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) backbone_gw = batadv_bla_get_backbone_gw(bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) primary_if->net_dev->dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) vid, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) if (unlikely(!backbone_gw))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) backbone_gw->lasttime = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) * batadv_bla_answer_request() - answer a bla request by sending own claims
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) * @primary_if: interface where the request came on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) * @vid: the vid where the request came on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) * Repeat all of our own claims, and finally send an ANNOUNCE frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) * to allow the requester another check if the CRC is correct now.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) static void batadv_bla_answer_request(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) unsigned short vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) struct hlist_head *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) struct batadv_hashtable *hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) struct batadv_bla_claim *claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) "%s(): received a claim request, send all of our own claims again\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) backbone_gw = batadv_backbone_hash_find(bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) primary_if->net_dev->dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) if (!backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) hash = bat_priv->bla.claim_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) for (i = 0; i < hash->size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) head = &hash->table[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) hlist_for_each_entry_rcu(claim, head, hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) /* only own claims are interesting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) if (claim->backbone_gw != backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) batadv_bla_send_claim(bat_priv, claim->addr, claim->vid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) BATADV_CLAIM_TYPE_CLAIM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) /* finally, send an announcement frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) batadv_bla_send_announce(bat_priv, backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) * batadv_bla_send_request() - send a request to repeat claims
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) * @backbone_gw: the backbone gateway from whom we are out of sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) * When the crc is wrong, ask the backbone gateway for a full table update.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) * After the request, it will repeat all of his own claims and finally
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) * send an announcement claim with which we can check again.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) static void batadv_bla_send_request(struct batadv_bla_backbone_gw *backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) /* first, remove all old entries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) batadv_bla_del_backbone_claims(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) batadv_dbg(BATADV_DBG_BLA, backbone_gw->bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) "Sending REQUEST to %pM\n", backbone_gw->orig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) /* send request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) batadv_bla_send_claim(backbone_gw->bat_priv, backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) backbone_gw->vid, BATADV_CLAIM_TYPE_REQUEST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) /* no local broadcasts should be sent or received, for now. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) if (!atomic_read(&backbone_gw->request_sent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) atomic_inc(&backbone_gw->bat_priv->bla.num_requests);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) atomic_set(&backbone_gw->request_sent, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) * batadv_bla_send_announce() - Send an announcement frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) * @backbone_gw: our backbone gateway which should be announced
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) static void batadv_bla_send_announce(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) struct batadv_bla_backbone_gw *backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) u8 mac[ETH_ALEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) __be16 crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) memcpy(mac, batadv_announce_mac, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) spin_lock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) crc = htons(backbone_gw->crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) spin_unlock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) memcpy(&mac[4], &crc, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) batadv_bla_send_claim(bat_priv, mac, backbone_gw->vid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) BATADV_CLAIM_TYPE_ANNOUNCE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) * batadv_bla_add_claim() - Adds a claim in the claim hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) * @mac: the mac address of the claim
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) * @vid: the VLAN ID of the frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) * @backbone_gw: the backbone gateway which claims it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) static void batadv_bla_add_claim(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) const u8 *mac, const unsigned short vid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) struct batadv_bla_backbone_gw *backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) struct batadv_bla_backbone_gw *old_backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) struct batadv_bla_claim *claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) struct batadv_bla_claim search_claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) bool remove_crc = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) int hash_added;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) ether_addr_copy(search_claim.addr, mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) search_claim.vid = vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) claim = batadv_claim_hash_find(bat_priv, &search_claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) /* create a new claim entry if it does not exist yet. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) if (!claim) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) claim = kzalloc(sizeof(*claim), GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) if (!claim)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) ether_addr_copy(claim->addr, mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) spin_lock_init(&claim->backbone_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) claim->vid = vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) claim->lasttime = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) kref_get(&backbone_gw->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) claim->backbone_gw = backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) kref_init(&claim->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) "%s(): adding new entry %pM, vid %d to hash ...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) __func__, mac, batadv_print_vid(vid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) kref_get(&claim->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) hash_added = batadv_hash_add(bat_priv->bla.claim_hash,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) batadv_compare_claim,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) batadv_choose_claim, claim,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) &claim->hash_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) if (unlikely(hash_added != 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) /* only local changes happened. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) kfree(claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) claim->lasttime = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) if (claim->backbone_gw == backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) /* no need to register a new backbone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) goto claim_free_ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) "%s(): changing ownership for %pM, vid %d to gw %pM\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) __func__, mac, batadv_print_vid(vid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) backbone_gw->orig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) remove_crc = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) /* replace backbone_gw atomically and adjust reference counters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) spin_lock_bh(&claim->backbone_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) old_backbone_gw = claim->backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) kref_get(&backbone_gw->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) claim->backbone_gw = backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) spin_unlock_bh(&claim->backbone_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) if (remove_crc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) /* remove claim address from old backbone_gw */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) spin_lock_bh(&old_backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) old_backbone_gw->crc ^= crc16(0, claim->addr, ETH_ALEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) spin_unlock_bh(&old_backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) batadv_backbone_gw_put(old_backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) /* add claim address to new backbone_gw */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) spin_lock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) backbone_gw->crc ^= crc16(0, claim->addr, ETH_ALEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) spin_unlock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) backbone_gw->lasttime = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) claim_free_ref:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) batadv_claim_put(claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) * batadv_bla_claim_get_backbone_gw() - Get valid reference for backbone_gw of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) * claim
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) * @claim: claim whose backbone_gw should be returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) * Return: valid reference to claim::backbone_gw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) static struct batadv_bla_backbone_gw *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) batadv_bla_claim_get_backbone_gw(struct batadv_bla_claim *claim)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) spin_lock_bh(&claim->backbone_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) backbone_gw = claim->backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) kref_get(&backbone_gw->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) spin_unlock_bh(&claim->backbone_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) return backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) * batadv_bla_del_claim() - delete a claim from the claim hash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) * @mac: mac address of the claim to be removed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) * @vid: VLAN id for the claim to be removed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) static void batadv_bla_del_claim(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) const u8 *mac, const unsigned short vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) struct batadv_bla_claim search_claim, *claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) struct batadv_bla_claim *claim_removed_entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) struct hlist_node *claim_removed_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) ether_addr_copy(search_claim.addr, mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) search_claim.vid = vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) claim = batadv_claim_hash_find(bat_priv, &search_claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) if (!claim)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) batadv_dbg(BATADV_DBG_BLA, bat_priv, "%s(): %pM, vid %d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) mac, batadv_print_vid(vid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) claim_removed_node = batadv_hash_remove(bat_priv->bla.claim_hash,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) batadv_compare_claim,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) batadv_choose_claim, claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) if (!claim_removed_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) goto free_claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) /* reference from the hash is gone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) claim_removed_entry = hlist_entry(claim_removed_node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) struct batadv_bla_claim, hash_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) batadv_claim_put(claim_removed_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) free_claim:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) /* don't need the reference from hash_find() anymore */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) batadv_claim_put(claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) * batadv_handle_announce() - check for ANNOUNCE frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) * @an_addr: announcement mac address (ARP Sender HW address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) * @backbone_addr: originator address of the sender (Ethernet source MAC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) * @vid: the VLAN ID of the frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) * Return: true if handled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) static bool batadv_handle_announce(struct batadv_priv *bat_priv, u8 *an_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) u8 *backbone_addr, unsigned short vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) u16 backbone_crc, crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) if (memcmp(an_addr, batadv_announce_mac, 4) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) if (unlikely(!backbone_gw))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) /* handle as ANNOUNCE frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) backbone_gw->lasttime = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) crc = ntohs(*((__force __be16 *)(&an_addr[4])));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) "%s(): ANNOUNCE vid %d (sent by %pM)... CRC = %#.4x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) __func__, batadv_print_vid(vid), backbone_gw->orig, crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) spin_lock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) backbone_crc = backbone_gw->crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) spin_unlock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) if (backbone_crc != crc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) batadv_dbg(BATADV_DBG_BLA, backbone_gw->bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) "%s(): CRC FAILED for %pM/%d (my = %#.4x, sent = %#.4x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) __func__, backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) batadv_print_vid(backbone_gw->vid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) backbone_crc, crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) batadv_bla_send_request(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) /* if we have sent a request and the crc was OK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) * we can allow traffic again.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) if (atomic_read(&backbone_gw->request_sent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) atomic_dec(&backbone_gw->bat_priv->bla.num_requests);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) atomic_set(&backbone_gw->request_sent, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) * batadv_handle_request() - check for REQUEST frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) * @primary_if: the primary hard interface of this batman soft interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) * @backbone_addr: backbone address to be requested (ARP sender HW MAC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) * @ethhdr: ethernet header of a packet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) * @vid: the VLAN ID of the frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) * Return: true if handled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) static bool batadv_handle_request(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) u8 *backbone_addr, struct ethhdr *ethhdr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) unsigned short vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) /* check for REQUEST frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) if (!batadv_compare_eth(backbone_addr, ethhdr->h_dest))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) /* sanity check, this should not happen on a normal switch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) * we ignore it in this case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) if (!batadv_compare_eth(ethhdr->h_dest, primary_if->net_dev->dev_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) "%s(): REQUEST vid %d (sent by %pM)...\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) __func__, batadv_print_vid(vid), ethhdr->h_source);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) batadv_bla_answer_request(bat_priv, primary_if, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) * batadv_handle_unclaim() - check for UNCLAIM frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) * @primary_if: the primary hard interface of this batman soft interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) * @backbone_addr: originator address of the backbone (Ethernet source)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) * @claim_addr: Client to be unclaimed (ARP sender HW MAC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) * @vid: the VLAN ID of the frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) * Return: true if handled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) static bool batadv_handle_unclaim(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) u8 *backbone_addr, u8 *claim_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) unsigned short vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) /* unclaim in any case if it is our own */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) if (primary_if && batadv_compare_eth(backbone_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) primary_if->net_dev->dev_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) batadv_bla_send_claim(bat_priv, claim_addr, vid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) BATADV_CLAIM_TYPE_UNCLAIM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) backbone_gw = batadv_backbone_hash_find(bat_priv, backbone_addr, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) if (!backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) /* this must be an UNCLAIM frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) "%s(): UNCLAIM %pM on vid %d (sent by %pM)...\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) claim_addr, batadv_print_vid(vid), backbone_gw->orig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) batadv_bla_del_claim(bat_priv, claim_addr, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) * batadv_handle_claim() - check for CLAIM frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) * @primary_if: the primary hard interface of this batman soft interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) * @backbone_addr: originator address of the backbone (Ethernet Source)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) * @claim_addr: client mac address to be claimed (ARP sender HW MAC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) * @vid: the VLAN ID of the frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) * Return: true if handled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) static bool batadv_handle_claim(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) u8 *backbone_addr, u8 *claim_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) unsigned short vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) /* register the gateway if not yet available, and add the claim. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) if (unlikely(!backbone_gw))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) /* this must be a CLAIM frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) batadv_bla_add_claim(bat_priv, claim_addr, vid, backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) if (batadv_compare_eth(backbone_addr, primary_if->net_dev->dev_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) batadv_bla_send_claim(bat_priv, claim_addr, vid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) BATADV_CLAIM_TYPE_CLAIM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) /* TODO: we could call something like tt_local_del() here. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) * batadv_check_claim_group() - check for claim group membership
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) * @primary_if: the primary interface of this batman interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) * @hw_src: the Hardware source in the ARP Header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) * @hw_dst: the Hardware destination in the ARP Header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) * @ethhdr: pointer to the Ethernet header of the claim frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) * checks if it is a claim packet and if it's on the same group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) * This function also applies the group ID of the sender
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) * if it is in the same mesh.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) * Return:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) * 2 - if it is a claim packet and on the same group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) * 1 - if is a claim packet from another group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) * 0 - if it is not a claim packet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) static int batadv_check_claim_group(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) u8 *hw_src, u8 *hw_dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) struct ethhdr *ethhdr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) u8 *backbone_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) struct batadv_orig_node *orig_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) struct batadv_bla_claim_dst *bla_dst, *bla_dst_own;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) bla_dst = (struct batadv_bla_claim_dst *)hw_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) bla_dst_own = &bat_priv->bla.claim_dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) /* if announcement packet, use the source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) * otherwise assume it is in the hw_src
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) switch (bla_dst->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) case BATADV_CLAIM_TYPE_CLAIM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) backbone_addr = hw_src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) case BATADV_CLAIM_TYPE_REQUEST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) case BATADV_CLAIM_TYPE_ANNOUNCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) case BATADV_CLAIM_TYPE_UNCLAIM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) backbone_addr = ethhdr->h_source;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) /* don't accept claim frames from ourselves */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) if (batadv_compare_eth(backbone_addr, primary_if->net_dev->dev_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) /* if its already the same group, it is fine. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) if (bla_dst->group == bla_dst_own->group)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) /* lets see if this originator is in our mesh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) orig_node = batadv_orig_hash_find(bat_priv, backbone_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) /* dont accept claims from gateways which are not in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) * the same mesh or group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) if (!orig_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) /* if our mesh friends mac is bigger, use it for ourselves. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) if (ntohs(bla_dst->group) > ntohs(bla_dst_own->group)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) "taking other backbones claim group: %#.4x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) ntohs(bla_dst->group));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) bla_dst_own->group = bla_dst->group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) batadv_orig_node_put(orig_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) * batadv_bla_process_claim() - Check if this is a claim frame, and process it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) * @primary_if: the primary hard interface of this batman soft interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) * @skb: the frame to be checked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) * Return: true if it was a claim frame, otherwise return false to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) * tell the callee that it can use the frame on its own.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) static bool batadv_bla_process_claim(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) struct batadv_bla_claim_dst *bla_dst, *bla_dst_own;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) u8 *hw_src, *hw_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) struct vlan_hdr *vhdr, vhdr_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) struct ethhdr *ethhdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) struct arphdr *arphdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) unsigned short vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) int vlan_depth = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) __be16 proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) int headlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) vid = batadv_get_vid(skb, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) ethhdr = eth_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) proto = ethhdr->h_proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) headlen = ETH_HLEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) if (vid & BATADV_VLAN_HAS_TAG) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) /* Traverse the VLAN/Ethertypes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) * At this point it is known that the first protocol is a VLAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) * header, so start checking at the encapsulated protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) * The depth of the VLAN headers is recorded to drop BLA claim
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) * frames encapsulated into multiple VLAN headers (QinQ).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) vhdr = skb_header_pointer(skb, headlen, VLAN_HLEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) &vhdr_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) if (!vhdr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) proto = vhdr->h_vlan_encapsulated_proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) headlen += VLAN_HLEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) vlan_depth++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) } while (proto == htons(ETH_P_8021Q));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) if (proto != htons(ETH_P_ARP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) return false; /* not a claim frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) /* this must be a ARP frame. check if it is a claim. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) if (unlikely(!pskb_may_pull(skb, headlen + arp_hdr_len(skb->dev))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) /* pskb_may_pull() may have modified the pointers, get ethhdr again */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) ethhdr = eth_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) arphdr = (struct arphdr *)((u8 *)ethhdr + headlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) /* Check whether the ARP frame carries a valid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) * IP information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) if (arphdr->ar_hrd != htons(ARPHRD_ETHER))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) if (arphdr->ar_pro != htons(ETH_P_IP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) if (arphdr->ar_hln != ETH_ALEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) if (arphdr->ar_pln != 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) hw_src = (u8 *)arphdr + sizeof(struct arphdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) hw_dst = hw_src + ETH_ALEN + 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) bla_dst = (struct batadv_bla_claim_dst *)hw_dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) bla_dst_own = &bat_priv->bla.claim_dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) /* check if it is a claim frame in general */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) if (memcmp(bla_dst->magic, bla_dst_own->magic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) sizeof(bla_dst->magic)) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) /* check if there is a claim frame encapsulated deeper in (QinQ) and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) * drop that, as this is not supported by BLA but should also not be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) * sent via the mesh.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) if (vlan_depth > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) /* Let the loopdetect frames on the mesh in any case. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) if (bla_dst->type == BATADV_CLAIM_TYPE_LOOPDETECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) /* check if it is a claim frame. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) ret = batadv_check_claim_group(bat_priv, primary_if, hw_src, hw_dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) ethhdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) if (ret == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) "%s(): received a claim frame from another group. From: %pM on vid %d ...(hw_src %pM, hw_dst %pM)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) __func__, ethhdr->h_source, batadv_print_vid(vid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) hw_src, hw_dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) if (ret < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) return !!ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) /* become a backbone gw ourselves on this vlan if not happened yet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) batadv_bla_update_own_backbone_gw(bat_priv, primary_if, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) /* check for the different types of claim frames ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) switch (bla_dst->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) case BATADV_CLAIM_TYPE_CLAIM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) if (batadv_handle_claim(bat_priv, primary_if, hw_src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) ethhdr->h_source, vid))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) case BATADV_CLAIM_TYPE_UNCLAIM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) if (batadv_handle_unclaim(bat_priv, primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) ethhdr->h_source, hw_src, vid))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) case BATADV_CLAIM_TYPE_ANNOUNCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) if (batadv_handle_announce(bat_priv, hw_src, ethhdr->h_source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) vid))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) case BATADV_CLAIM_TYPE_REQUEST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) if (batadv_handle_request(bat_priv, primary_if, hw_src, ethhdr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) vid))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) "%s(): ERROR - this looks like a claim frame, but is useless. eth src %pM on vid %d ...(hw_src %pM, hw_dst %pM)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) __func__, ethhdr->h_source, batadv_print_vid(vid), hw_src,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) hw_dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) * batadv_bla_purge_backbone_gw() - Remove backbone gateways after a timeout or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) * immediately
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) * @now: whether the whole hash shall be wiped now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) * Check when we last heard from other nodes, and remove them in case of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) * a time out, or clean all backbone gws if now is set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) static void batadv_bla_purge_backbone_gw(struct batadv_priv *bat_priv, int now)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) struct hlist_node *node_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) struct hlist_head *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) struct batadv_hashtable *hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) spinlock_t *list_lock; /* protects write access to the hash lists */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) hash = bat_priv->bla.backbone_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) if (!hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) for (i = 0; i < hash->size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) head = &hash->table[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) list_lock = &hash->list_locks[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) spin_lock_bh(list_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) hlist_for_each_entry_safe(backbone_gw, node_tmp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) head, hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) if (now)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) goto purge_now;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) if (!batadv_has_timed_out(backbone_gw->lasttime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) BATADV_BLA_BACKBONE_TIMEOUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) batadv_dbg(BATADV_DBG_BLA, backbone_gw->bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) "%s(): backbone gw %pM timed out\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) __func__, backbone_gw->orig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) purge_now:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) /* don't wait for the pending request anymore */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) if (atomic_read(&backbone_gw->request_sent))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) atomic_dec(&bat_priv->bla.num_requests);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) batadv_bla_del_backbone_claims(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) hlist_del_rcu(&backbone_gw->hash_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) spin_unlock_bh(list_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) * batadv_bla_purge_claims() - Remove claims after a timeout or immediately
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) * @primary_if: the selected primary interface, may be NULL if now is set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) * @now: whether the whole hash shall be wiped now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) * Check when we heard last time from our own claims, and remove them in case of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) * a time out, or clean all claims if now is set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) static void batadv_bla_purge_claims(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) int now)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) struct batadv_bla_claim *claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) struct hlist_head *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) struct batadv_hashtable *hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) hash = bat_priv->bla.claim_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) if (!hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) for (i = 0; i < hash->size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) head = &hash->table[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) hlist_for_each_entry_rcu(claim, head, hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) backbone_gw = batadv_bla_claim_get_backbone_gw(claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) if (now)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) goto purge_now;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) if (!batadv_compare_eth(backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) primary_if->net_dev->dev_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) goto skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) if (!batadv_has_timed_out(claim->lasttime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) BATADV_BLA_CLAIM_TIMEOUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) goto skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) "%s(): timed out.\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) purge_now:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) "%s(): %pM, vid %d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) claim->addr, claim->vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) batadv_handle_unclaim(bat_priv, primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) claim->addr, claim->vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) skip:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) * batadv_bla_update_orig_address() - Update the backbone gateways when the own
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) * originator address changes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) * @primary_if: the new selected primary_if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) * @oldif: the old primary interface, may be NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) struct batadv_hard_iface *oldif)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) struct hlist_head *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) struct batadv_hashtable *hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) __be16 group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) /* reset bridge loop avoidance group id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) group = htons(crc16(0, primary_if->net_dev->dev_addr, ETH_ALEN));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) bat_priv->bla.claim_dest.group = group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) /* purge everything when bridge loop avoidance is turned off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) if (!atomic_read(&bat_priv->bridge_loop_avoidance))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) oldif = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) if (!oldif) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) batadv_bla_purge_claims(bat_priv, NULL, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) batadv_bla_purge_backbone_gw(bat_priv, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) hash = bat_priv->bla.backbone_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) if (!hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) for (i = 0; i < hash->size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) head = &hash->table[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) /* own orig still holds the old value. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) if (!batadv_compare_eth(backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) oldif->net_dev->dev_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) ether_addr_copy(backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) primary_if->net_dev->dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) /* send an announce frame so others will ask for our
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) * claims and update their tables.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) batadv_bla_send_announce(bat_priv, backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) * batadv_bla_send_loopdetect() - send a loopdetect frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) * @backbone_gw: the backbone gateway for which a loop should be detected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) * To detect loops that the bridge loop avoidance can't handle, send a loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) * detection packet on the backbone. Unlike other BLA frames, this frame will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) * be allowed on the mesh by other nodes. If it is received on the mesh, this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) * indicates that there is a loop.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) batadv_bla_send_loopdetect(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) struct batadv_bla_backbone_gw *backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) batadv_dbg(BATADV_DBG_BLA, bat_priv, "Send loopdetect frame for vid %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) backbone_gw->vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) batadv_bla_send_claim(bat_priv, bat_priv->bla.loopdetect_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) backbone_gw->vid, BATADV_CLAIM_TYPE_LOOPDETECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) * batadv_bla_status_update() - purge bla interfaces if necessary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) * @net_dev: the soft interface net device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) void batadv_bla_status_update(struct net_device *net_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) struct batadv_priv *bat_priv = netdev_priv(net_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) struct batadv_hard_iface *primary_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) primary_if = batadv_primary_if_get_selected(bat_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) if (!primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) /* this function already purges everything when bla is disabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) * so just call that one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) batadv_bla_update_orig_address(bat_priv, primary_if, primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) batadv_hardif_put(primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) * batadv_bla_periodic_work() - performs periodic bla work
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) * @work: kernel work struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) * periodic work to do:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) * * purge structures when they are too old
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) * * send announcements
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) static void batadv_bla_periodic_work(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) struct delayed_work *delayed_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) struct batadv_priv *bat_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) struct batadv_priv_bla *priv_bla;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) struct hlist_head *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) struct batadv_hashtable *hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) struct batadv_hard_iface *primary_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) bool send_loopdetect = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) delayed_work = to_delayed_work(work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) priv_bla = container_of(delayed_work, struct batadv_priv_bla, work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) bat_priv = container_of(priv_bla, struct batadv_priv, bla);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) primary_if = batadv_primary_if_get_selected(bat_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) if (!primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) batadv_bla_purge_claims(bat_priv, primary_if, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) batadv_bla_purge_backbone_gw(bat_priv, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) if (!atomic_read(&bat_priv->bridge_loop_avoidance))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) if (atomic_dec_and_test(&bat_priv->bla.loopdetect_next)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) /* set a new random mac address for the next bridge loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) * detection frames. Set the locally administered bit to avoid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) * collisions with users mac addresses.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) eth_random_addr(bat_priv->bla.loopdetect_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) bat_priv->bla.loopdetect_addr[0] = 0xba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) bat_priv->bla.loopdetect_addr[1] = 0xbe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) bat_priv->bla.loopdetect_lasttime = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) atomic_set(&bat_priv->bla.loopdetect_next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) BATADV_BLA_LOOPDETECT_PERIODS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) /* mark for sending loop detect on all VLANs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) send_loopdetect = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) hash = bat_priv->bla.backbone_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) if (!hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) for (i = 0; i < hash->size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) head = &hash->table[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) if (!batadv_compare_eth(backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) primary_if->net_dev->dev_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) backbone_gw->lasttime = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) batadv_bla_send_announce(bat_priv, backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) if (send_loopdetect)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) batadv_bla_send_loopdetect(bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) /* request_sent is only set after creation to avoid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) * problems when we are not yet known as backbone gw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) * in the backbone.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) * We can reset this now after we waited some periods
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) * to give bridge forward delays and bla group forming
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) * some grace time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) if (atomic_read(&backbone_gw->request_sent) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) if (!atomic_dec_and_test(&backbone_gw->wait_periods))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) atomic_dec(&backbone_gw->bat_priv->bla.num_requests);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) atomic_set(&backbone_gw->request_sent, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) if (primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) batadv_hardif_put(primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) queue_delayed_work(batadv_event_workqueue, &bat_priv->bla.work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) msecs_to_jiffies(BATADV_BLA_PERIOD_LENGTH));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) /* The hash for claim and backbone hash receive the same key because they
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) * are getting initialized by hash_new with the same key. Reinitializing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) * them with to different keys to allow nested locking without generating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) * lockdep warnings
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) static struct lock_class_key batadv_claim_hash_lock_class_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) static struct lock_class_key batadv_backbone_hash_lock_class_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) * batadv_bla_init() - initialize all bla structures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) * Return: 0 on success, < 0 on error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) int batadv_bla_init(struct batadv_priv *bat_priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) u8 claim_dest[ETH_ALEN] = {0xff, 0x43, 0x05, 0x00, 0x00, 0x00};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) struct batadv_hard_iface *primary_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) u16 crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) unsigned long entrytime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) spin_lock_init(&bat_priv->bla.bcast_duplist_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla hash registering\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) /* setting claim destination address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) memcpy(&bat_priv->bla.claim_dest.magic, claim_dest, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) bat_priv->bla.claim_dest.type = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) primary_if = batadv_primary_if_get_selected(bat_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) if (primary_if) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) crc = crc16(0, primary_if->net_dev->dev_addr, ETH_ALEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) bat_priv->bla.claim_dest.group = htons(crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) batadv_hardif_put(primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) bat_priv->bla.claim_dest.group = 0; /* will be set later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) /* initialize the duplicate list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) entrytime = jiffies - msecs_to_jiffies(BATADV_DUPLIST_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) for (i = 0; i < BATADV_DUPLIST_SIZE; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) bat_priv->bla.bcast_duplist[i].entrytime = entrytime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) bat_priv->bla.bcast_duplist_curr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) atomic_set(&bat_priv->bla.loopdetect_next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) BATADV_BLA_LOOPDETECT_PERIODS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) if (bat_priv->bla.claim_hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) bat_priv->bla.claim_hash = batadv_hash_new(128);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) if (!bat_priv->bla.claim_hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) bat_priv->bla.backbone_hash = batadv_hash_new(32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) if (!bat_priv->bla.backbone_hash) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) batadv_hash_destroy(bat_priv->bla.claim_hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) batadv_hash_set_lock_class(bat_priv->bla.claim_hash,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) &batadv_claim_hash_lock_class_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) batadv_hash_set_lock_class(bat_priv->bla.backbone_hash,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) &batadv_backbone_hash_lock_class_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla hashes initialized\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) INIT_DELAYED_WORK(&bat_priv->bla.work, batadv_bla_periodic_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) queue_delayed_work(batadv_event_workqueue, &bat_priv->bla.work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) msecs_to_jiffies(BATADV_BLA_PERIOD_LENGTH));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) * batadv_bla_check_duplist() - Check if a frame is in the broadcast dup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) * @skb: contains the multicast packet to be checked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) * @payload_ptr: pointer to position inside the head buffer of the skb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) * marking the start of the data to be CRC'ed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) * @orig: originator mac address, NULL if unknown
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) * Check if it is on our broadcast list. Another gateway might have sent the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) * same packet because it is connected to the same backbone, so we have to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) * remove this duplicate.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) * This is performed by checking the CRC, which will tell us
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) * with a good chance that it is the same packet. If it is furthermore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) * sent by another host, drop it. We allow equal packets from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) * the same host however as this might be intended.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) * Return: true if a packet is in the duplicate list, false otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) static bool batadv_bla_check_duplist(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) struct sk_buff *skb, u8 *payload_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) const u8 *orig)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) struct batadv_bcast_duplist_entry *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) bool ret = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) int i, curr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) __be32 crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) /* calculate the crc ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) crc = batadv_skb_crc32(skb, payload_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) spin_lock_bh(&bat_priv->bla.bcast_duplist_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) for (i = 0; i < BATADV_DUPLIST_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) curr = (bat_priv->bla.bcast_duplist_curr + i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) curr %= BATADV_DUPLIST_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) entry = &bat_priv->bla.bcast_duplist[curr];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) /* we can stop searching if the entry is too old ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) * later entries will be even older
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) if (batadv_has_timed_out(entry->entrytime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) BATADV_DUPLIST_TIMEOUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) if (entry->crc != crc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) /* are the originators both known and not anonymous? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) if (orig && !is_zero_ether_addr(orig) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) !is_zero_ether_addr(entry->orig)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) /* If known, check if the new frame came from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) * the same originator:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) * We are safe to take identical frames from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) * same orig, if known, as multiplications in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) * the mesh are detected via the (orig, seqno) pair.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) * So we can be a bit more liberal here and allow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) * identical frames from the same orig which the source
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) * host might have sent multiple times on purpose.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) if (batadv_compare_eth(entry->orig, orig))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) /* this entry seems to match: same crc, not too old,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) * and from another gw. therefore return true to forbid it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) ret = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) /* not found, add a new entry (overwrite the oldest entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) * and allow it, its the first occurrence.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) curr = (bat_priv->bla.bcast_duplist_curr + BATADV_DUPLIST_SIZE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) curr %= BATADV_DUPLIST_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) entry = &bat_priv->bla.bcast_duplist[curr];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) entry->crc = crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) entry->entrytime = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) /* known originator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) if (orig)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) ether_addr_copy(entry->orig, orig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) /* anonymous originator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) eth_zero_addr(entry->orig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) bat_priv->bla.bcast_duplist_curr = curr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) spin_unlock_bh(&bat_priv->bla.bcast_duplist_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) * batadv_bla_check_ucast_duplist() - Check if a frame is in the broadcast dup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) * @skb: contains the multicast packet to be checked, decapsulated from a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) * unicast_packet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) * Check if it is on our broadcast list. Another gateway might have sent the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) * same packet because it is connected to the same backbone, so we have to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) * remove this duplicate.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) * Return: true if a packet is in the duplicate list, false otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) static bool batadv_bla_check_ucast_duplist(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) return batadv_bla_check_duplist(bat_priv, skb, (u8 *)skb->data, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) * batadv_bla_check_bcast_duplist() - Check if a frame is in the broadcast dup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) * @skb: contains the bcast_packet to be checked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) * Check if it is on our broadcast list. Another gateway might have sent the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) * same packet because it is connected to the same backbone, so we have to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) * remove this duplicate.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) * Return: true if a packet is in the duplicate list, false otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) bool batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) struct batadv_bcast_packet *bcast_packet;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) u8 *payload_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) bcast_packet = (struct batadv_bcast_packet *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) payload_ptr = (u8 *)(bcast_packet + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) return batadv_bla_check_duplist(bat_priv, skb, payload_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) bcast_packet->orig);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) * batadv_bla_is_backbone_gw_orig() - Check if the originator is a gateway for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) * the VLAN identified by vid.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) * @orig: originator mac address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) * @vid: VLAN identifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) * Return: true if orig is a backbone for this vid, false otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) bool batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, u8 *orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) unsigned short vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) struct hlist_head *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) if (!atomic_read(&bat_priv->bridge_loop_avoidance))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) if (!hash)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) for (i = 0; i < hash->size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) head = &hash->table[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) if (batadv_compare_eth(backbone_gw->orig, orig) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) backbone_gw->vid == vid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) * batadv_bla_is_backbone_gw() - check if originator is a backbone gw for a VLAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) * @skb: the frame to be checked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) * @orig_node: the orig_node of the frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) * @hdr_size: maximum length of the frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) * Return: true if the orig_node is also a gateway on the soft interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) * otherwise it returns false.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) bool batadv_bla_is_backbone_gw(struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) struct batadv_orig_node *orig_node, int hdr_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) unsigned short vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) if (!atomic_read(&orig_node->bat_priv->bridge_loop_avoidance))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) /* first, find out the vid. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) if (!pskb_may_pull(skb, hdr_size + ETH_HLEN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) vid = batadv_get_vid(skb, hdr_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) /* see if this originator is a backbone gw for this VLAN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) backbone_gw = batadv_backbone_hash_find(orig_node->bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) orig_node->orig, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) if (!backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) * batadv_bla_free() - free all bla structures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) * for softinterface free or module unload
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) void batadv_bla_free(struct batadv_priv *bat_priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) struct batadv_hard_iface *primary_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) cancel_delayed_work_sync(&bat_priv->bla.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) primary_if = batadv_primary_if_get_selected(bat_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) if (bat_priv->bla.claim_hash) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) batadv_bla_purge_claims(bat_priv, primary_if, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) batadv_hash_destroy(bat_priv->bla.claim_hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) bat_priv->bla.claim_hash = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) if (bat_priv->bla.backbone_hash) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) batadv_bla_purge_backbone_gw(bat_priv, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) batadv_hash_destroy(bat_priv->bla.backbone_hash);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) bat_priv->bla.backbone_hash = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) if (primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) batadv_hardif_put(primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) * batadv_bla_loopdetect_check() - check and handle a detected loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) * @skb: the packet to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) * @primary_if: interface where the request came on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) * @vid: the VLAN ID of the frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) * Checks if this packet is a loop detect frame which has been sent by us,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) * throws an uevent and logs the event if that is the case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) * Return: true if it is a loop detect frame which is to be dropped, false
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) * otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) static bool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) batadv_bla_loopdetect_check(struct batadv_priv *bat_priv, struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) unsigned short vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) struct ethhdr *ethhdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) bool ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) ethhdr = eth_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) /* Only check for the MAC address and skip more checks here for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) * performance reasons - this function is on the hotpath, after all.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) if (!batadv_compare_eth(ethhdr->h_source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) bat_priv->bla.loopdetect_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) /* If the packet came too late, don't forward it on the mesh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) * but don't consider that as loop. It might be a coincidence.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) if (batadv_has_timed_out(bat_priv->bla.loopdetect_lasttime,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) BATADV_BLA_LOOPDETECT_TIMEOUT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) backbone_gw = batadv_bla_get_backbone_gw(bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) primary_if->net_dev->dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) vid, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) if (unlikely(!backbone_gw))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) ret = queue_work(batadv_event_workqueue, &backbone_gw->report_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) /* backbone_gw is unreferenced in the report work function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) * if queue_work() call was successful
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) * batadv_bla_rx() - check packets coming from the mesh.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) * @skb: the frame to be checked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) * @vid: the VLAN ID of the frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) * @packet_type: the batman packet type this frame came in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) * batadv_bla_rx avoidance checks if:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) * * we have to race for a claim
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) * * if the frame is allowed on the LAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) * In these cases, the skb is further handled by this function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) * Return: true if handled, otherwise it returns false and the caller shall
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) * further process the skb.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) unsigned short vid, int packet_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) struct ethhdr *ethhdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) struct batadv_bla_claim search_claim, *claim = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) struct batadv_hard_iface *primary_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) bool own_claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) bool ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) ethhdr = eth_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) primary_if = batadv_primary_if_get_selected(bat_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) if (!primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) goto handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) if (!atomic_read(&bat_priv->bridge_loop_avoidance))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) goto allow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) if (batadv_bla_loopdetect_check(bat_priv, skb, primary_if, vid))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) goto handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) if (unlikely(atomic_read(&bat_priv->bla.num_requests)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) /* don't allow multicast packets while requests are in flight */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) if (is_multicast_ether_addr(ethhdr->h_dest))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) /* Both broadcast flooding or multicast-via-unicasts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) * delivery might send to multiple backbone gateways
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) * sharing the same LAN and therefore need to coordinate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) * which backbone gateway forwards into the LAN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) * by claiming the payload source address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) * Broadcast flooding and multicast-via-unicasts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) * delivery use the following two batman packet types.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) * Note: explicitly exclude BATADV_UNICAST_4ADDR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) * as the DHCP gateway feature will send explicitly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) * to only one BLA gateway, so the claiming process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) * should be avoided there.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) if (packet_type == BATADV_BCAST ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) packet_type == BATADV_UNICAST)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) goto handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) /* potential duplicates from foreign BLA backbone gateways via
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) * multicast-in-unicast packets
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) if (is_multicast_ether_addr(ethhdr->h_dest) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) packet_type == BATADV_UNICAST &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) batadv_bla_check_ucast_duplist(bat_priv, skb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) goto handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) ether_addr_copy(search_claim.addr, ethhdr->h_source);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) search_claim.vid = vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) claim = batadv_claim_hash_find(bat_priv, &search_claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) if (!claim) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) /* possible optimization: race for a claim */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) /* No claim exists yet, claim it for us!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) batadv_dbg(BATADV_DBG_BLA, bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) "%s(): Unclaimed MAC %pM found. Claim it. Local: %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) __func__, ethhdr->h_source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) batadv_is_my_client(bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) ethhdr->h_source, vid) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) "yes" : "no");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) batadv_handle_claim(bat_priv, primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) primary_if->net_dev->dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) ethhdr->h_source, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) goto allow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) /* if it is our own claim ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) backbone_gw = batadv_bla_claim_get_backbone_gw(claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) own_claim = batadv_compare_eth(backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) primary_if->net_dev->dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) if (own_claim) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) /* ... allow it in any case */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) claim->lasttime = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) goto allow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) /* if it is a multicast ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) if (is_multicast_ether_addr(ethhdr->h_dest) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) (packet_type == BATADV_BCAST || packet_type == BATADV_UNICAST)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) /* ... drop it. the responsible gateway is in charge.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) * We need to check packet type because with the gateway
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) * feature, broadcasts (like DHCP requests) may be sent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) * using a unicast 4 address packet type. See comment above.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) goto handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) /* seems the client considers us as its best gateway.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) * send a claim and update the claim table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) * immediately.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) batadv_handle_claim(bat_priv, primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) primary_if->net_dev->dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) ethhdr->h_source, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) goto allow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) allow:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) batadv_bla_update_own_backbone_gw(bat_priv, primary_if, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) ret = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) handled:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) ret = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) if (primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) batadv_hardif_put(primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) if (claim)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) batadv_claim_put(claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) * batadv_bla_tx() - check packets going into the mesh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) * @skb: the frame to be checked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) * @vid: the VLAN ID of the frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) * batadv_bla_tx checks if:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) * * a claim was received which has to be processed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) * * the frame is allowed on the mesh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) * in these cases, the skb is further handled by this function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) * This call might reallocate skb data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) * Return: true if handled, otherwise it returns false and the caller shall
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) * further process the skb.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) bool batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) unsigned short vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) struct ethhdr *ethhdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) struct batadv_bla_claim search_claim, *claim = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) struct batadv_hard_iface *primary_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) bool client_roamed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) bool ret = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) primary_if = batadv_primary_if_get_selected(bat_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) if (!primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) if (!atomic_read(&bat_priv->bridge_loop_avoidance))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) goto allow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) if (batadv_bla_process_claim(bat_priv, primary_if, skb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) goto handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) ethhdr = eth_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) if (unlikely(atomic_read(&bat_priv->bla.num_requests)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) /* don't allow broadcasts while requests are in flight */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) if (is_multicast_ether_addr(ethhdr->h_dest))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) goto handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) ether_addr_copy(search_claim.addr, ethhdr->h_source);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) search_claim.vid = vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) claim = batadv_claim_hash_find(bat_priv, &search_claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) /* if no claim exists, allow it. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) if (!claim)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) goto allow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) /* check if we are responsible. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) backbone_gw = batadv_bla_claim_get_backbone_gw(claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) client_roamed = batadv_compare_eth(backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) primary_if->net_dev->dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) if (client_roamed) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) /* if yes, the client has roamed and we have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) * to unclaim it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) if (batadv_has_timed_out(claim->lasttime, 100)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) /* only unclaim if the last claim entry is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) * older than 100 ms to make sure we really
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) * have a roaming client here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) batadv_dbg(BATADV_DBG_BLA, bat_priv, "%s(): Roaming client %pM detected. Unclaim it.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) __func__, ethhdr->h_source);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) batadv_handle_unclaim(bat_priv, primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) primary_if->net_dev->dev_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) ethhdr->h_source, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) goto allow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) batadv_dbg(BATADV_DBG_BLA, bat_priv, "%s(): Race for claim %pM detected. Drop packet.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) __func__, ethhdr->h_source);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) goto handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) /* check if it is a multicast/broadcast frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) if (is_multicast_ether_addr(ethhdr->h_dest)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) /* drop it. the responsible gateway has forwarded it into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) * the backbone network.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) goto handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) /* we must allow it. at least if we are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) * responsible for the DESTINATION.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) goto allow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) allow:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) batadv_bla_update_own_backbone_gw(bat_priv, primary_if, vid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) ret = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) handled:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) ret = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) if (primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) batadv_hardif_put(primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) if (claim)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) batadv_claim_put(claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) #ifdef CONFIG_BATMAN_ADV_DEBUGFS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) * batadv_bla_claim_table_seq_print_text() - print the claim table in a seq file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) * @seq: seq file to print on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) * @offset: not used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) * Return: always 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) struct net_device *net_dev = (struct net_device *)seq->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) struct batadv_priv *bat_priv = netdev_priv(net_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) struct batadv_hashtable *hash = bat_priv->bla.claim_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) struct batadv_bla_claim *claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) struct batadv_hard_iface *primary_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) struct hlist_head *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) u16 backbone_crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) bool is_own;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) u8 *primary_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) primary_if = batadv_seq_print_text_primary_if_get(seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) if (!primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) primary_addr = primary_if->net_dev->dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) seq_printf(seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) "Claims announced for the mesh %s (orig %pM, group id %#.4x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) net_dev->name, primary_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) ntohs(bat_priv->bla.claim_dest.group));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) seq_puts(seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) " Client VID Originator [o] (CRC )\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) for (i = 0; i < hash->size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) head = &hash->table[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) hlist_for_each_entry_rcu(claim, head, hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) backbone_gw = batadv_bla_claim_get_backbone_gw(claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) is_own = batadv_compare_eth(backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) primary_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) spin_lock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) backbone_crc = backbone_gw->crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) spin_unlock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) seq_printf(seq, " * %pM on %5d by %pM [%c] (%#.4x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) claim->addr, batadv_print_vid(claim->vid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) (is_own ? 'x' : ' '),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) backbone_crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) batadv_backbone_gw_put(backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) if (primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) batadv_hardif_put(primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) * batadv_bla_claim_dump_entry() - dump one entry of the claim table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) * to a netlink socket
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) * @msg: buffer for the message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) * @portid: netlink port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) * @cb: Control block containing additional options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) * @primary_if: primary interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) * @claim: entry to dump
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) * Return: 0 or error code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) batadv_bla_claim_dump_entry(struct sk_buff *msg, u32 portid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) struct netlink_callback *cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) struct batadv_bla_claim *claim)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) u8 *primary_addr = primary_if->net_dev->dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) u16 backbone_crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) bool is_own;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) void *hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) int ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) hdr = genlmsg_put(msg, portid, cb->nlh->nlmsg_seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) &batadv_netlink_family, NLM_F_MULTI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) BATADV_CMD_GET_BLA_CLAIM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) if (!hdr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) ret = -ENOBUFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) genl_dump_check_consistent(cb, hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) is_own = batadv_compare_eth(claim->backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) primary_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) spin_lock_bh(&claim->backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) backbone_crc = claim->backbone_gw->crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) spin_unlock_bh(&claim->backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) if (is_own)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) if (nla_put_flag(msg, BATADV_ATTR_BLA_OWN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) genlmsg_cancel(msg, hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) if (nla_put(msg, BATADV_ATTR_BLA_ADDRESS, ETH_ALEN, claim->addr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) nla_put_u16(msg, BATADV_ATTR_BLA_VID, claim->vid) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) nla_put(msg, BATADV_ATTR_BLA_BACKBONE, ETH_ALEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) claim->backbone_gw->orig) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) nla_put_u16(msg, BATADV_ATTR_BLA_CRC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) backbone_crc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) genlmsg_cancel(msg, hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) genlmsg_end(msg, hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) * batadv_bla_claim_dump_bucket() - dump one bucket of the claim table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) * to a netlink socket
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) * @msg: buffer for the message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) * @portid: netlink port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) * @cb: Control block containing additional options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) * @primary_if: primary interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) * @hash: hash to dump
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) * @bucket: bucket index to dump
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) * @idx_skip: How many entries to skip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) * Return: always 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) batadv_bla_claim_dump_bucket(struct sk_buff *msg, u32 portid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) struct netlink_callback *cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) struct batadv_hashtable *hash, unsigned int bucket,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) int *idx_skip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) struct batadv_bla_claim *claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) int idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) spin_lock_bh(&hash->list_locks[bucket]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) cb->seq = atomic_read(&hash->generation) << 1 | 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) hlist_for_each_entry(claim, &hash->table[bucket], hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) if (idx++ < *idx_skip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) ret = batadv_bla_claim_dump_entry(msg, portid, cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) primary_if, claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) *idx_skip = idx - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) *idx_skip = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) spin_unlock_bh(&hash->list_locks[bucket]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) * batadv_bla_claim_dump() - dump claim table to a netlink socket
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) * @msg: buffer for the message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) * @cb: callback structure containing arguments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) * Return: message length.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) int batadv_bla_claim_dump(struct sk_buff *msg, struct netlink_callback *cb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) struct batadv_hard_iface *primary_if = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) int portid = NETLINK_CB(cb->skb).portid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) struct net *net = sock_net(cb->skb->sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) struct net_device *soft_iface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) struct batadv_hashtable *hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) struct batadv_priv *bat_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) int bucket = cb->args[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) int idx = cb->args[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) int ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) ifindex = batadv_netlink_get_ifindex(cb->nlh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) BATADV_ATTR_MESH_IFINDEX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) if (!ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) soft_iface = dev_get_by_index(net, ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) bat_priv = netdev_priv(soft_iface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) hash = bat_priv->bla.claim_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) primary_if = batadv_primary_if_get_selected(bat_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) if (!primary_if || primary_if->if_status != BATADV_IF_ACTIVE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) ret = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) while (bucket < hash->size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) if (batadv_bla_claim_dump_bucket(msg, portid, cb, primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) hash, bucket, &idx))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) bucket++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) cb->args[0] = bucket;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) cb->args[1] = idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) ret = msg->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) if (primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) batadv_hardif_put(primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) if (soft_iface)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) dev_put(soft_iface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) #ifdef CONFIG_BATMAN_ADV_DEBUGFS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) * batadv_bla_backbone_table_seq_print_text() - print the backbone table in a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) * seq file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) * @seq: seq file to print on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) * @offset: not used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) * Return: always 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) struct net_device *net_dev = (struct net_device *)seq->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) struct batadv_priv *bat_priv = netdev_priv(net_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) struct batadv_hard_iface *primary_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) struct hlist_head *head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) int secs, msecs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) u16 backbone_crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) bool is_own;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) u8 *primary_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) primary_if = batadv_seq_print_text_primary_if_get(seq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) if (!primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) primary_addr = primary_if->net_dev->dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) seq_printf(seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) "Backbones announced for the mesh %s (orig %pM, group id %#.4x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) net_dev->name, primary_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) ntohs(bat_priv->bla.claim_dest.group));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) seq_puts(seq, " Originator VID last seen (CRC )\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) for (i = 0; i < hash->size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) head = &hash->table[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) msecs = jiffies_to_msecs(jiffies -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) backbone_gw->lasttime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) secs = msecs / 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) msecs = msecs % 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) is_own = batadv_compare_eth(backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) primary_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) if (is_own)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) spin_lock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) backbone_crc = backbone_gw->crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) spin_unlock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) seq_printf(seq, " * %pM on %5d %4i.%03is (%#.4x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) batadv_print_vid(backbone_gw->vid), secs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) msecs, backbone_crc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) if (primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) batadv_hardif_put(primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) * batadv_bla_backbone_dump_entry() - dump one entry of the backbone table to a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) * netlink socket
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) * @msg: buffer for the message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) * @portid: netlink port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) * @cb: Control block containing additional options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) * @primary_if: primary interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) * @backbone_gw: entry to dump
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) * Return: 0 or error code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) batadv_bla_backbone_dump_entry(struct sk_buff *msg, u32 portid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) struct netlink_callback *cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) struct batadv_bla_backbone_gw *backbone_gw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) u8 *primary_addr = primary_if->net_dev->dev_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) u16 backbone_crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) bool is_own;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) int msecs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) void *hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) int ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) hdr = genlmsg_put(msg, portid, cb->nlh->nlmsg_seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) &batadv_netlink_family, NLM_F_MULTI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) BATADV_CMD_GET_BLA_BACKBONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) if (!hdr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) ret = -ENOBUFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) genl_dump_check_consistent(cb, hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) is_own = batadv_compare_eth(backbone_gw->orig, primary_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) spin_lock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) backbone_crc = backbone_gw->crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) spin_unlock_bh(&backbone_gw->crc_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) msecs = jiffies_to_msecs(jiffies - backbone_gw->lasttime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) if (is_own)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) if (nla_put_flag(msg, BATADV_ATTR_BLA_OWN)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) genlmsg_cancel(msg, hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) if (nla_put(msg, BATADV_ATTR_BLA_BACKBONE, ETH_ALEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) backbone_gw->orig) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) nla_put_u16(msg, BATADV_ATTR_BLA_VID, backbone_gw->vid) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) nla_put_u16(msg, BATADV_ATTR_BLA_CRC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) backbone_crc) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) nla_put_u32(msg, BATADV_ATTR_LAST_SEEN_MSECS, msecs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) genlmsg_cancel(msg, hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) genlmsg_end(msg, hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) * batadv_bla_backbone_dump_bucket() - dump one bucket of the backbone table to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) * a netlink socket
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) * @msg: buffer for the message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) * @portid: netlink port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) * @cb: Control block containing additional options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) * @primary_if: primary interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) * @hash: hash to dump
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) * @bucket: bucket index to dump
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) * @idx_skip: How many entries to skip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) * Return: always 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) batadv_bla_backbone_dump_bucket(struct sk_buff *msg, u32 portid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) struct netlink_callback *cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) struct batadv_hard_iface *primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) struct batadv_hashtable *hash,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) unsigned int bucket, int *idx_skip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) struct batadv_bla_backbone_gw *backbone_gw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) int idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) spin_lock_bh(&hash->list_locks[bucket]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) cb->seq = atomic_read(&hash->generation) << 1 | 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) hlist_for_each_entry(backbone_gw, &hash->table[bucket], hash_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) if (idx++ < *idx_skip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) ret = batadv_bla_backbone_dump_entry(msg, portid, cb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) primary_if, backbone_gw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) *idx_skip = idx - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) goto unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) *idx_skip = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) spin_unlock_bh(&hash->list_locks[bucket]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) * batadv_bla_backbone_dump() - dump backbone table to a netlink socket
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) * @msg: buffer for the message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) * @cb: callback structure containing arguments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) * Return: message length.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) int batadv_bla_backbone_dump(struct sk_buff *msg, struct netlink_callback *cb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) struct batadv_hard_iface *primary_if = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) int portid = NETLINK_CB(cb->skb).portid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) struct net *net = sock_net(cb->skb->sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) struct net_device *soft_iface;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) struct batadv_hashtable *hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) struct batadv_priv *bat_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) int bucket = cb->args[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) int idx = cb->args[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) int ifindex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) ifindex = batadv_netlink_get_ifindex(cb->nlh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) BATADV_ATTR_MESH_IFINDEX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) if (!ifindex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) soft_iface = dev_get_by_index(net, ifindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) bat_priv = netdev_priv(soft_iface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) hash = bat_priv->bla.backbone_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) primary_if = batadv_primary_if_get_selected(bat_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) if (!primary_if || primary_if->if_status != BATADV_IF_ACTIVE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) ret = -ENOENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) while (bucket < hash->size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) if (batadv_bla_backbone_dump_bucket(msg, portid, cb, primary_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) hash, bucket, &idx))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) bucket++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) cb->args[0] = bucket;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) cb->args[1] = idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) ret = msg->len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) if (primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) batadv_hardif_put(primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) if (soft_iface)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) dev_put(soft_iface);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) #ifdef CONFIG_BATMAN_ADV_DAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) * batadv_bla_check_claim() - check if address is claimed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) * @bat_priv: the bat priv with all the soft interface information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) * @addr: mac address of which the claim status is checked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) * @vid: the VLAN ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) * addr is checked if this address is claimed by the local device itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) * Return: true if bla is disabled or the mac is claimed by the device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) * false if the device addr is already claimed by another gateway
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) bool batadv_bla_check_claim(struct batadv_priv *bat_priv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) u8 *addr, unsigned short vid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) struct batadv_bla_claim search_claim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) struct batadv_bla_claim *claim = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) struct batadv_hard_iface *primary_if = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) bool ret = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) if (!atomic_read(&bat_priv->bridge_loop_avoidance))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) primary_if = batadv_primary_if_get_selected(bat_priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) if (!primary_if)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) /* First look if the mac address is claimed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) ether_addr_copy(search_claim.addr, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) search_claim.vid = vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) claim = batadv_claim_hash_find(bat_priv, &search_claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) /* If there is a claim and we are not owner of the claim,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) * return false.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) if (claim) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) if (!batadv_compare_eth(claim->backbone_gw->orig,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) primary_if->net_dev->dev_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) ret = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) batadv_claim_put(claim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) batadv_hardif_put(primary_if);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) #endif