mlx5e_vxlan_add_port(priv, 4789);
 }
 
+static inline u8 mlx5e_vxlan_max_udp_ports(struct mlx5_core_dev *mdev)
+{
+       return MLX5_CAP_ETH(mdev, max_vxlan_udp_ports) ?: 4;
+}
+
 static int mlx5e_vxlan_core_add_port_cmd(struct mlx5_core_dev *mdev, u16 port)
 {
        u32 in[MLX5_ST_SZ_DW(add_vxlan_udp_dport_in)]   = {0};
                return;
        }
 
+       if (vxlan_db->num_ports >= mlx5e_vxlan_max_udp_ports(priv->mdev)) {
+               netdev_info(priv->netdev,
+                           "UDP port (%d) not offloaded, max number of UDP ports (%d) are already offloaded\n",
+                           port, mlx5e_vxlan_max_udp_ports(priv->mdev));
+               return;
+       }
+
        if (mlx5e_vxlan_core_add_port_cmd(priv->mdev, port))
                return;
 
        if (err)
                goto err_free;
 
+       vxlan_db->num_ports++;
        return;
 
 err_free:
        if (remove) {
                mlx5e_vxlan_core_del_port_cmd(priv->mdev, port);
                kfree(vxlan);
+               vxlan_db->num_ports--;
        }
        mutex_unlock(&priv->state_lock);
        kfree(vxlan_work);
 
        u8         swp[0x1];
        u8         swp_csum[0x1];
        u8         swp_lso[0x1];
-       u8         reserved_at_23[0x1b];
+       u8         reserved_at_23[0xd];
+       u8         max_vxlan_udp_ports[0x8];
+       u8         reserved_at_38[0x6];
        u8         max_geneve_opt_len[0x1];
        u8         tunnel_stateless_geneve_rx[0x1];