#include "dp-packet.h"
#include "dpif-netdev.h"
#include "flow.h"
+#include "netdev-offload-provider.h"
#include "netdev-provider.h"
#include "netdev-vport.h"
#include "odp-util.h"
const void *buffer = dp_packet_data(packet);
size_t size = dp_packet_size(packet);
- if (packet->packet_type != htonl(PT_ETH)) {
+ if (!dp_packet_is_eth(packet)) {
error = EPFNOSUPPORT;
break;
}
struct nlattr *actions OVS_UNUSED,
size_t actions_len OVS_UNUSED,
const ovs_u128 *ufid, struct offload_info *info,
- struct dpif_flow_stats *stats OVS_UNUSED)
+ struct dpif_flow_stats *stats)
{
struct netdev_dummy *dev = netdev_dummy_cast(netdev);
struct offloaded_flow *off_flow;
ds_destroy(&ds);
}
+ if (stats) {
+ memset(stats, 0, sizeof *stats);
+ }
return 0;
}
static int
netdev_dummy_flow_del(struct netdev *netdev, const ovs_u128 *ufid,
- struct dpif_flow_stats *stats OVS_UNUSED)
+ struct dpif_flow_stats *stats)
{
struct netdev_dummy *dev = netdev_dummy_cast(netdev);
struct offloaded_flow *off_flow;
ds_destroy(&ds);
}
+ if (stats) {
+ memset(stats, 0, sizeof *stats);
+ }
return error ? -1 : 0;
}
-#define DUMMY_FLOW_OFFLOAD_API \
- .flow_put = netdev_dummy_flow_put, \
- .flow_del = netdev_dummy_flow_del
-
#define NETDEV_DUMMY_CLASS_COMMON \
.run = netdev_dummy_run, \
.wait = netdev_dummy_wait, \
.rxq_dealloc = netdev_dummy_rxq_dealloc, \
.rxq_recv = netdev_dummy_rxq_recv, \
.rxq_wait = netdev_dummy_rxq_wait, \
- .rxq_drain = netdev_dummy_rxq_drain, \
- DUMMY_FLOW_OFFLOAD_API
+ .rxq_drain = netdev_dummy_rxq_drain
static const struct netdev_class dummy_class = {
NETDEV_DUMMY_CLASS_COMMON,
.is_pmd = true,
.reconfigure = netdev_dummy_reconfigure
};
+
+static int
+netdev_dummy_offloads_init_flow_api(struct netdev *netdev)
+{
+ return is_dummy_class(netdev->netdev_class) ? 0 : EOPNOTSUPP;
+}
+
+static const struct netdev_flow_api netdev_offload_dummy = {
+ .type = "dummy",
+ .flow_put = netdev_dummy_flow_put,
+ .flow_del = netdev_dummy_flow_del,
+ .init_flow_api = netdev_dummy_offloads_init_flow_api,
+};
+
\f
/* Helper functions. */
netdev_register_provider(&dummy_internal_class);
netdev_register_provider(&dummy_pmd_class);
+ netdev_register_flow_api_provider(&netdev_offload_dummy);
+
netdev_vport_tunnel_register();
}