static const struct mlxsw_sp_ipip_ops mlxsw_sp_ipip_gre4_ops = {
        .dev_type = ARPHRD_IPGRE,
        .ul_proto = MLXSW_SP_L3_PROTO_IPV4,
+       .inc_parsing_depth = false,
        .parms_init = mlxsw_sp_ipip_netdev_parms_init_gre4,
        .nexthop_update = mlxsw_sp_ipip_nexthop_update_gre4,
        .decap_config = mlxsw_sp_ipip_decap_config_gre4,
 static const struct mlxsw_sp_ipip_ops mlxsw_sp1_ipip_gre6_ops = {
        .dev_type = ARPHRD_IP6GRE,
        .ul_proto = MLXSW_SP_L3_PROTO_IPV6,
+       .inc_parsing_depth = true,
        .parms_init = mlxsw_sp1_ipip_netdev_parms_init_gre6,
        .nexthop_update = mlxsw_sp1_ipip_nexthop_update_gre6,
        .decap_config = mlxsw_sp1_ipip_decap_config_gre6,
 
               mlxsw_sp_l3addr_eq(&tun_saddr, &saddr);
 }
 
+static int mlxsw_sp_ipip_decap_parsing_depth_inc(struct mlxsw_sp *mlxsw_sp,
+                                                enum mlxsw_sp_ipip_type ipipt)
+{
+       const struct mlxsw_sp_ipip_ops *ipip_ops;
+
+       ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipipt];
+
+       /* Not all tunnels require to increase the default pasing depth
+        * (96 bytes).
+        */
+       if (ipip_ops->inc_parsing_depth)
+               return mlxsw_sp_parsing_depth_inc(mlxsw_sp);
+
+       return 0;
+}
+
+static void mlxsw_sp_ipip_decap_parsing_depth_dec(struct mlxsw_sp *mlxsw_sp,
+                                                 enum mlxsw_sp_ipip_type ipipt)
+{
+       const struct mlxsw_sp_ipip_ops *ipip_ops =
+               mlxsw_sp->router->ipip_ops_arr[ipipt];
+
+       if (ipip_ops->inc_parsing_depth)
+               mlxsw_sp_parsing_depth_dec(mlxsw_sp);
+}
+
 static int
 mlxsw_sp_fib_entry_decap_init(struct mlxsw_sp *mlxsw_sp,
                              struct mlxsw_sp_fib_entry *fib_entry,
        if (err)
                return err;
 
+       err = mlxsw_sp_ipip_decap_parsing_depth_inc(mlxsw_sp,
+                                                   ipip_entry->ipipt);
+       if (err)
+               goto err_parsing_depth_inc;
+
        ipip_entry->decap_fib_entry = fib_entry;
        fib_entry->decap.ipip_entry = ipip_entry;
        fib_entry->decap.tunnel_index = tunnel_index;
+
        return 0;
+
+err_parsing_depth_inc:
+       mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 1,
+                          fib_entry->decap.tunnel_index);
+       return err;
 }
 
 static void mlxsw_sp_fib_entry_decap_fini(struct mlxsw_sp *mlxsw_sp,
                                          struct mlxsw_sp_fib_entry *fib_entry)
 {
+       enum mlxsw_sp_ipip_type ipipt = fib_entry->decap.ipip_entry->ipipt;
+
        /* Unlink this node from the IPIP entry that it's the decap entry of. */
        fib_entry->decap.ipip_entry->decap_fib_entry = NULL;
        fib_entry->decap.ipip_entry = NULL;
+       mlxsw_sp_ipip_decap_parsing_depth_dec(mlxsw_sp, ipipt);
        mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ,
                           1, fib_entry->decap.tunnel_index);
 }