ofproto/ofproto-dpif-trace.c
/* Executes all of the datapath actions, except for any OVS_ACTION_ATTR_OUTPUT
 * and OVS_ACTION_ATTR_RECIRC actions, in 'actions' on 'packet', which has the
 * given 'flow', on 'dpif'.  The actions have slow path reason 'slow' (if any).
 * Appends any error message to 'output'.
 *
 * With output and recirculation actions dropped, the only remaining side
 * effects are from OVS_ACTION_ATTR_USERSPACE actions for executing actions to
 * send a packet to an OpenFlow controller, IPFIX, NetFlow, and sFlow, etc. */


With output and recirculation actions dropped, the only remaining side
effects are from OVS_ACTION_ATTR_USERSPACE actions for executing actions to
send a packet to an OpenFlow controller, IPFIX, NetFlow, and sFlow, etc.
With output and recirculation actions dropped the only remaining side effects are from OVS_ACTION_ATTR_USERSPACE actions for executing actions to send a packet to an OpenFlow controller IPFIX NetFlow and sFlow etc .
static void
execute_actions_except_outputs(struct dpif *dpif,
                               const struct dp_packet *packet,
                               const struct flow *flow,
                               const struct ofpbuf *actions,
                               enum slow_path_reason slow,
                               struct ds *output)
{
    struct ofpbuf pruned_actions;
    ofpbuf_init(&pruned_actions, 0);
    prune_output_actions(actions, &pruned_actions);
    struct dpif_execute execute = {
        .actions = pruned_actions.data,
        .actions_len = pruned_actions.size,
        .needs_help = (slow & SLOW_ACTION) != 0,
        .flow = flow,
        .packet = dp_packet_clone_with_headroom(packet, 2),
    };
    int error = dpif_execute(dpif, &execute);
    if (error) {
        ds_put_format(output, "\nAction execution failed (%s)\n.",
                      ovs_strerror(error));
    }
    dp_packet_delete(execute.packet);
    ofpbuf_uninit(&pruned_actions);
}
static void execute_actions_except_outputs ( struct dpif * dpif , const struct dp_packet * packet , const struct flow * flow , const struct ofpbuf * actions , enum slow_path_reason slow , struct ds * output ) { struct ofpbuf pruned_actions ; ofpbuf_init ( & pruned_actions , 0 ) ; prune_output_actions ( actions , & pruned_actions ) ; struct dpif_execute execute = { . actions = pruned_actions . data , . actions_len = pruned_actions . size , . needs_help = ( slow & SLOW_ACTION ) != 0 , . flow = flow , . packet = dp_packet_clone_with_headroom ( packet , 2 ) , } ; int error = dpif_execute ( dpif , & execute ) ; if ( error ) { ds_put_format ( output , " \n \n " , ovs_strerror ( error ) ) ; } dp_packet_delete ( execute . packet ) ; ofpbuf_uninit ( & pruned_actions ) ; }
Executes all of the datapath actions, except for any OVS_ACTION_ATTR_OUTPUT
 and OVS_ACTION_ATTR_RECIRC actions, in 'actions' on 'packet', which has the
 given 'flow', on 'dpif'.
Executes all of the datapath actions except for any OVS_ACTION_ATTR_OUTPUT and OVS_ACTION_ATTR_RECIRC actions in ' actions ' on ' packet ' which has the given ' flow ' on ' dpif ' .