const char *ret = trace_seq_buffer_ptr(p);
 
        switch (dst->type) {
+       case MLX5_FLOW_DESTINATION_TYPE_UPLINK:
+               trace_seq_printf(p, "uplink\n");
+               break;
        case MLX5_FLOW_DESTINATION_TYPE_VPORT:
                trace_seq_printf(p, "vport=%u\n", dst->vport.num);
                break;
 
                        case MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE:
                                id = dst->dest_attr.ft->id;
                                break;
+                       case MLX5_FLOW_DESTINATION_TYPE_UPLINK:
                        case MLX5_FLOW_DESTINATION_TYPE_VPORT:
-                               id = dst->dest_attr.vport.num;
                                MLX5_SET(dest_format_struct, in_dests,
                                         destination_eswitch_owner_vhca_id_valid,
                                         !!(dst->dest_attr.vport.flags &
                                MLX5_SET(dest_format_struct, in_dests,
                                         destination_eswitch_owner_vhca_id,
                                         dst->dest_attr.vport.vhca_id);
+                               if (type == MLX5_FLOW_DESTINATION_TYPE_UPLINK) {
+                                       /* destination_id is reserved */
+                                       id = 0;
+                                       break;
+                               }
+                               id = dst->dest_attr.vport.num;
                                if (extended_dest &&
                                    dst->dest_attr.vport.pkt_reformat) {
                                        MLX5_SET(dest_format_struct, in_dests,
 
        MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE   = 0x1,
        MLX5_FLOW_DESTINATION_TYPE_TIR          = 0x2,
        MLX5_FLOW_DESTINATION_TYPE_FLOW_SAMPLER = 0x6,
+       MLX5_FLOW_DESTINATION_TYPE_UPLINK       = 0x8,
 
        MLX5_FLOW_DESTINATION_TYPE_PORT         = 0x99,
        MLX5_FLOW_DESTINATION_TYPE_COUNTER      = 0x100,