dpif-netdev: Free packets on TUNNEL_PUSH if should_steal.
Unconditional return may cause packet leak in case of
'should_steal == true'.
Additionally, removed redundant checking for depth level.
CC: Sugesh Chandran
Fixes: ("tunneling: Avoid datapath-recirc by
combining recirc actions at xlate.")
@@ -5674,12 +5674,16 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_,
break;
case OVS_ACTION_ATTR_TUNNEL_PUSH:
- if (*depth < MAX_RECIRC_DEPTH) {
+ if (should_steal) {
+ /* We're requested to push tunnel header, but also we need to take
+ * the ownership of these packets. Thus, we can avoid performing
+ * the action, because the caller will not use the result anyway.
+ * Just break to free the batch. */
+ break;
+ }
dp_packet_batch_apply_cutlen(packets_);
push_tnl_action(pmd, a, packets_);
return;
- }
- break;
case OVS_ACTION_ATTR_TUNNEL_POP:
if (*depth < MAX_RECIRC_DEPTH) {
