#define BATADV_NULL_IFINDEX 0 /* dummy ifindex used to avoid iface checks */
 
+#define BATADV_NO_MARK 0
+
 #define BATADV_NUM_WORDS BITS_TO_LONGS(BATADV_TQ_LOCAL_WINDOW_SIZE)
 
 #define BATADV_LOG_BUF_LEN 8192          /* has to be a power of 2 */
 
        BATADV_TT_CLIENT_DEL     = BIT(0),
        BATADV_TT_CLIENT_ROAM    = BIT(1),
        BATADV_TT_CLIENT_WIFI    = BIT(4),
+       BATADV_TT_CLIENT_ISOLA   = BIT(5),
        BATADV_TT_CLIENT_NOPURGE = BIT(8),
        BATADV_TT_CLIENT_NEW     = BIT(9),
        BATADV_TT_CLIENT_PENDING = BIT(10),
 
                batadv_tt_local_remove(bat_priv, old_addr, BATADV_NO_FLAGS,
                                       "mac address changed", false);
                batadv_tt_local_add(dev, addr->sa_data, BATADV_NO_FLAGS,
-                                   BATADV_NULL_IFINDEX);
+                                   BATADV_NULL_IFINDEX, BATADV_NO_MARK);
        }
 
        return 0;
        /* Register the client MAC in the transtable */
        if (!is_multicast_ether_addr(ethhdr->h_source)) {
                client_added = batadv_tt_local_add(soft_iface, ethhdr->h_source,
-                                                  vid, skb->skb_iif);
+                                                  vid, skb->skb_iif,
+                                                  skb->mark);
                if (!client_added)
                        goto dropped;
        }
         */
        batadv_tt_local_add(bat_priv->soft_iface,
                            bat_priv->soft_iface->dev_addr, vid,
-                           BATADV_NULL_IFINDEX);
+                           BATADV_NULL_IFINDEX, BATADV_NO_MARK);
 
        spin_lock_bh(&bat_priv->softif_vlan_list_lock);
        hlist_add_head_rcu(&vlan->list, &bat_priv->softif_vlan_list);
 
  * @vid: VLAN identifier
  * @ifindex: index of the interface where the client is connected to (useful to
  *  identify wireless clients)
+ * @mark: the value contained in the skb->mark field of the received packet (if
+ *  any)
  *
  * Returns true if the client was successfully added, false otherwise.
  */
 bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
-                        unsigned short vid, int ifindex)
+                        unsigned short vid, int ifindex, uint32_t mark)
 {
        struct batadv_priv *bat_priv = netdev_priv(soft_iface);
        struct batadv_tt_local_entry *tt_local;
        int hash_added, table_size, packet_size_max;
        bool ret = false, roamed_back = false;
        uint8_t remote_flags;
+       uint32_t match_mark;
 
        if (ifindex != BATADV_NULL_IFINDEX)
                in_dev = dev_get_by_index(&init_net, ifindex);
        else
                tt_local->common.flags &= ~BATADV_TT_CLIENT_WIFI;
 
+       /* check the mark in the skb: if it's equal to the configured
+        * isolation_mark, it means the packet is coming from an isolated
+        * non-mesh client
+        */
+       match_mark = (mark & bat_priv->isolation_mark_mask);
+       if (bat_priv->isolation_mark_mask &&
+           match_mark == bat_priv->isolation_mark)
+               tt_local->common.flags |= BATADV_TT_CLIENT_ISOLA;
+       else
+               tt_local->common.flags &= ~BATADV_TT_CLIENT_ISOLA;
+
        /* if any "dynamic" flag has been modified, resend an ADD event for this
         * entry so that all the nodes can get the new flags
         */
 
 
 int batadv_tt_init(struct batadv_priv *bat_priv);
 bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
-                        unsigned short vid, int ifindex);
+                        unsigned short vid, int ifindex, uint32_t mark);
 uint16_t batadv_tt_local_remove(struct batadv_priv *bat_priv,
                                const uint8_t *addr, unsigned short vid,
                                const char *message, bool roaming);