- case OVS_ACTION_ATTR_RECIRC:
- execute.actions = action;
- execute.actions_len = NLA_ALIGN(action->nla_len);
+ case OVS_ACTION_ATTR_RECIRC: {
+ struct dpif_execute execute;
+ struct ofpbuf execute_actions;
+ uint64_t stub[256 / 8];
+
+ if (md->tunnel.ip_dst) {
+ /* The Linux kernel datapath throws away the tunnel information
+ * that we supply as metadata. We have to use a "set" action to
+ * supply it. */
+ ofpbuf_use_stub(&execute_actions, stub, sizeof stub);
+ odp_put_tunnel_action(&md->tunnel, &execute_actions);
+ ofpbuf_put(&execute_actions, action, NLA_ALIGN(action->nla_len));
+
+ execute.actions = ofpbuf_data(&execute_actions);
+ execute.actions_len = ofpbuf_size(&execute_actions);
+ } else {
+ execute.actions = action;
+ execute.actions_len = NLA_ALIGN(action->nla_len);
+ }
+