* @block_shared:      Flag indicating if offload applies to shared blocks
  * @mac_list:          List entry of reprs that share the same offloaded MAC
  * @qos_table:         Stored info on filters implementing qos
+ * @on_bridge:         Indicates if the repr is attached to a bridge
  */
 struct nfp_flower_repr_priv {
        struct nfp_repr *nfp_repr;
        bool block_shared;
        struct list_head mac_list;
        struct nfp_fl_qos qos_table;
+       bool on_bridge;
 };
 
 /**
        return flow_pay->tc_flower_cookie == (unsigned long)flow_pay;
 }
 
+static inline bool nfp_flower_is_supported_bridge(struct net_device *netdev)
+{
+       return netif_is_ovs_master(netdev);
+}
+
 int nfp_flower_metadata_init(struct nfp_app *app, u64 host_ctx_count,
                             unsigned int host_ctx_split);
 void nfp_flower_metadata_cleanup(struct nfp_app *app);
 
                        return 0;
 
                repr_priv = repr->app_priv;
+               if (repr_priv->on_bridge)
+                       return 0;
+
                mac_offloaded = &repr_priv->mac_offloaded;
                off_mac = &repr_priv->offloaded_mac_addr[0];
                port = nfp_repr_get_port_id(netdev);
                if (err)
                        nfp_flower_cmsg_warn(app, "Failed to offload MAC change on %s.\n",
                                             netdev_name(netdev));
+       } else if (event == NETDEV_CHANGEUPPER) {
+               /* If a repr is attached to a bridge then tunnel packets
+                * entering the physical port are directed through the bridge
+                * datapath and cannot be directly detunneled. Therefore,
+                * associated offloaded MACs and indexes should not be used
+                * by fw for detunneling.
+                */
+               struct netdev_notifier_changeupper_info *info = ptr;
+               struct net_device *upper = info->upper_dev;
+               struct nfp_flower_repr_priv *repr_priv;
+               struct nfp_repr *repr;
+
+               if (!nfp_netdev_is_nfp_repr(netdev) ||
+                   !nfp_flower_is_supported_bridge(upper))
+                       return NOTIFY_OK;
+
+               repr = netdev_priv(netdev);
+               if (repr->app != app)
+                       return NOTIFY_OK;
+
+               repr_priv = repr->app_priv;
+
+               if (info->linking) {
+                       if (nfp_tunnel_offload_mac(app, netdev,
+                                                  NFP_TUNNEL_MAC_OFFLOAD_DEL))
+                               nfp_flower_cmsg_warn(app, "Failed to delete offloaded MAC on %s.\n",
+                                                    netdev_name(netdev));
+                       repr_priv->on_bridge = true;
+               } else {
+                       repr_priv->on_bridge = false;
+
+                       if (!(netdev->flags & IFF_UP))
+                               return NOTIFY_OK;
+
+                       if (nfp_tunnel_offload_mac(app, netdev,
+                                                  NFP_TUNNEL_MAC_OFFLOAD_ADD))
+                               nfp_flower_cmsg_warn(app, "Failed to offload MAC on %s.\n",
+                                                    netdev_name(netdev));
+               }
        }
        return NOTIFY_OK;
 }