aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/batman-adv/main.c26
-rw-r--r--net/batman-adv/main.h1
-rw-r--r--net/batman-adv/translation-table.c13
3 files changed, 28 insertions, 12 deletions
diff --git a/net/batman-adv/main.c b/net/batman-adv/main.c
index 8abda424aae3..945e441b579d 100644
--- a/net/batman-adv/main.c
+++ b/net/batman-adv/main.c
@@ -1171,6 +1171,32 @@ unsigned short batadv_get_vid(struct sk_buff *skb, size_t header_len)
1171 return vid; 1171 return vid;
1172} 1172}
1173 1173
1174/**
1175 * batadv_vlan_ap_isola_get - return the AP isolation status for the given vlan
1176 * @bat_priv: the bat priv with all the soft interface information
1177 * @vid: the VLAN identifier for which the AP isolation attributed as to be
1178 * looked up
1179 *
1180 * Returns true if AP isolation is on for the VLAN idenfied by vid, false
1181 * otherwise
1182 */
1183bool batadv_vlan_ap_isola_get(struct batadv_priv *bat_priv, unsigned short vid)
1184{
1185 bool ap_isolation_enabled = false;
1186 struct batadv_softif_vlan *vlan;
1187
1188 /* if the AP isolation is requested on a VLAN, then check for its
1189 * setting in the proper VLAN private data structure
1190 */
1191 vlan = batadv_softif_vlan_get(bat_priv, vid);
1192 if (vlan) {
1193 ap_isolation_enabled = atomic_read(&vlan->ap_isolation);
1194 batadv_softif_vlan_free_ref(vlan);
1195 }
1196
1197 return ap_isolation_enabled;
1198}
1199
1174static int batadv_param_set_ra(const char *val, const struct kernel_param *kp) 1200static int batadv_param_set_ra(const char *val, const struct kernel_param *kp)
1175{ 1201{
1176 struct batadv_algo_ops *bat_algo_ops; 1202 struct batadv_algo_ops *bat_algo_ops;
diff --git a/net/batman-adv/main.h b/net/batman-adv/main.h
index fa9edbf79323..a468760b11ea 100644
--- a/net/batman-adv/main.h
+++ b/net/batman-adv/main.h
@@ -369,5 +369,6 @@ void batadv_tvlv_unicast_send(struct batadv_priv *bat_priv, uint8_t *src,
369 uint8_t *dst, uint8_t type, uint8_t version, 369 uint8_t *dst, uint8_t type, uint8_t version,
370 void *tvlv_value, uint16_t tvlv_value_len); 370 void *tvlv_value, uint16_t tvlv_value_len);
371unsigned short batadv_get_vid(struct sk_buff *skb, size_t header_len); 371unsigned short batadv_get_vid(struct sk_buff *skb, size_t header_len);
372bool batadv_vlan_ap_isola_get(struct batadv_priv *bat_priv, unsigned short vid);
372 373
373#endif /* _NET_BATMAN_ADV_MAIN_H_ */ 374#endif /* _NET_BATMAN_ADV_MAIN_H_ */
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index a874d08f9f0a..1337b6925f52 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -1900,19 +1900,8 @@ struct batadv_orig_node *batadv_transtable_search(struct batadv_priv *bat_priv,
1900 struct batadv_tt_global_entry *tt_global_entry = NULL; 1900 struct batadv_tt_global_entry *tt_global_entry = NULL;
1901 struct batadv_orig_node *orig_node = NULL; 1901 struct batadv_orig_node *orig_node = NULL;
1902 struct batadv_tt_orig_list_entry *best_entry; 1902 struct batadv_tt_orig_list_entry *best_entry;
1903 bool ap_isolation_enabled = false;
1904 struct batadv_softif_vlan *vlan;
1905
1906 /* if the AP isolation is requested on a VLAN, then check for its
1907 * setting in the proper VLAN private data structure
1908 */
1909 vlan = batadv_softif_vlan_get(bat_priv, vid);
1910 if (vlan) {
1911 ap_isolation_enabled = atomic_read(&vlan->ap_isolation);
1912 batadv_softif_vlan_free_ref(vlan);
1913 }
1914 1903
1915 if (src && ap_isolation_enabled) { 1904 if (src && batadv_vlan_ap_isola_get(bat_priv, vid)) {
1916 tt_local_entry = batadv_tt_local_hash_find(bat_priv, src, vid); 1905 tt_local_entry = batadv_tt_local_hash_find(bat_priv, src, vid);
1917 if (!tt_local_entry || 1906 if (!tt_local_entry ||
1918 (tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING)) 1907 (tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING))