{
int retval;
- retval = rx->netdev->netdev_class->rxq_recv(rx, batch->packets, &batch->count);
+ retval = rx->netdev->netdev_class->rxq_recv(rx, batch);
if (!retval) {
COVERAGE_INC(netdev_received);
} else {
return error;
}
-/* Sends 'buffers' on 'netdev'. Returns 0 if successful (for every packet),
+/* Sends 'batch' on 'netdev'. Returns 0 if successful (for every packet),
* otherwise a positive errno value. Returns EAGAIN without blocking if
* at least one the packets cannot be queued immediately. Returns EMSGSIZE
* if a partial packet was transmitted or if a packet is too big or too small
return EOPNOTSUPP;
}
- int error = netdev->netdev_class->send(netdev, qid,
- batch->packets, batch->count,
- may_steal);
+ int error = netdev->netdev_class->send(netdev, qid, batch, may_steal);
if (!error) {
COVERAGE_INC(netdev_sent);
+ if (!may_steal) {
+ dp_packet_batch_reset_cutlen(batch);
+ }
}
return error;
}
batch->count = n_cnt;
}
-int
-netdev_build_header(const struct netdev *netdev, struct ovs_action_push_tnl *data,
- const struct flow *tnl_flow)
+void
+netdev_init_tnl_build_header_params(struct netdev_tnl_build_header_params *params,
+ const struct flow *tnl_flow,
+ const struct in6_addr *src,
+ struct eth_addr dmac,
+ struct eth_addr smac)
+{
+ params->flow = tnl_flow;
+ params->dmac = dmac;
+ params->smac = smac;
+ params->s_ip = src;
+ params->is_ipv6 = !IN6_IS_ADDR_V4MAPPED(src);
+}
+
+int netdev_build_header(const struct netdev *netdev,
+ struct ovs_action_push_tnl *data,
+ const struct netdev_tnl_build_header_params *params)
{
if (netdev->netdev_class->build_header) {
- return netdev->netdev_class->build_header(netdev, data, tnl_flow);
+ return netdev->netdev_class->build_header(netdev, data, params);
}
return EOPNOTSUPP;
}