+ struct odp_flow_put put;
+ int error;
+
+ memset(&put, 0, sizeof put);
+ put.flow.key = (struct nlattr *) key;
+ put.flow.key_len = key_len;
+ put.flow.actions = (struct nlattr *) actions;
+ put.flow.actions_len = actions_len;
+ put.flow.flags = 0;
+ put.flags = 0;
+ if (flags & DPIF_FP_CREATE) {
+ put.flags |= ODPPF_CREATE;
+ }
+ if (flags & DPIF_FP_MODIFY) {
+ put.flags |= ODPPF_MODIFY;
+ }
+ if (flags & DPIF_FP_ZERO_STATS) {
+ put.flags |= ODPPF_ZERO_STATS;
+ }
+ error = do_ioctl(dpif_, ODP_FLOW_PUT, &put);
+ if (!error && stats) {
+ odp_flow_stats_to_dpif_flow_stats(&put.flow.stats, stats);
+ }
+ return error;