ofproto/ofproto-dpif-trace.c
/* Implements a "trace" through 'ofproto''s flow table, appending a textual
 * description of the results to 'output'.
 *
 * The trace follows a packet with the specified 'flow' through the flow
 * table.  'packet' may be nonnull to trace an actual packet, with consequent
 * side effects (if it is nonnull then its flow must be 'flow').
 *
 * If 'ofpacts' is nonnull then its 'ofpacts_len' bytes specify the actions to
 * trace, otherwise the actions are determined by a flow table lookup. */


The trace follows a packet with the specified 'flow' through the flow
table.  'packet' may be nonnull to trace an actual packet, with consequent
side effects (if it is nonnull then its flow must be 'flow').

If 'ofpacts' is nonnull then its 'ofpacts_len' bytes specify the actions to
trace, otherwise the actions are determined by a flow table lookup.
The trace follows a packet with the specified ' flow ' through the flow table . ' packet ' may be nonnull to trace an actual packet with consequent side effects ( if it is nonnull then its flow must be ' flow ' ) . If ' ofpacts ' is nonnull then its ' ofpacts_len ' bytes specify the actions to trace otherwise the actions are determined by a flow table lookup .
void
ofproto_trace(struct ofproto_dpif *ofproto, const struct flow *flow,
              const struct dp_packet *packet,
              const struct ofpact ofpacts[], size_t ofpacts_len,
              struct ovs_list *next_ct_states, struct ds *output)
{
    struct ovs_list recirc_queue = OVS_LIST_INITIALIZER(&recirc_queue);
    ofproto_trace__(ofproto, flow, packet, &recirc_queue,
                    ofpacts, ofpacts_len, output);
    struct oftrace_recirc_node *recirc_node;
    LIST_FOR_EACH_POP (recirc_node, node, &recirc_queue) {
        ofproto_trace_recirc_node(recirc_node, next_ct_states, output);
        ofproto_trace__(ofproto, &recirc_node->flow, recirc_node->packet,
                        &recirc_queue, ofpacts, ofpacts_len, output);
        oftrace_recirc_node_destroy(recirc_node);
    }
}
void ofproto_trace ( struct ofproto_dpif * ofproto , const struct flow * flow , const struct dp_packet * packet , const struct ofpact ofpacts [ ] , size_t ofpacts_len , struct ovs_list * next_ct_states , struct ds * output ) { struct ovs_list recirc_queue = OVS_LIST_INITIALIZER ( & recirc_queue ) ; ofproto_trace__ ( ofproto , flow , packet , & recirc_queue , ofpacts , ofpacts_len , output ) ; struct oftrace_recirc_node * recirc_node ; LIST_FOR_EACH_POP ( recirc_node , node , & recirc_queue ) { ofproto_trace_recirc_node ( recirc_node , next_ct_states , output ) ; ofproto_trace__ ( ofproto , & recirc_node -> flow , recirc_node -> packet , & recirc_queue , ofpacts , ofpacts_len , output ) ; oftrace_recirc_node_destroy ( recirc_node ) ; } }
Implements a "trace" through 'ofproto''s flow table, appending a textual
 description of the results to 'output'.
Implements a " trace " through ' ofproto ' ' s flow table appending a textual description of the results to ' output ' .