- memcpy(__skb_push(nskb, actions_len), a, actions_len);
- hdr = (struct odp_sflow_sample_header*)__skb_push(nskb, hdrlen);
- hdr->actions_len = actions_len;
- hdr->sample_pool = atomic_read(&vport->sflow_pool);
- dp_output_control(dp, nskb, _ODPL_SFLOW_NR, 0);
+ nskb = skb_clone(skb, GFP_ATOMIC);
+ if (unlikely(!nskb))
+ return;
+
+ upcall.cmd = ODP_PACKET_CMD_SAMPLE;
+ upcall.key = key;
+ upcall.userdata = 0;
+ upcall.sample_pool = atomic_read(&p->sflow_pool);
+ upcall.actions = a;
+ upcall.actions_len = actions_len;
+ dp_upcall(dp, nskb, &upcall);