#include <fcntl.h>
#include <inttypes.h>
#include <net/if.h>
-#include <linux/rtnetlink.h>
-#include <linux/ethtool.h>
-#include <linux/sockios.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
-#include <sys/sysmacros.h>
#include <unistd.h>
#include "csum.h"
static int
name_to_dp_idx(const char *name)
{
- if (!strncmp(name, "dp", 2) && isdigit(name[2])) {
+ if (!strncmp(name, "dp", 2) && isdigit((unsigned char)name[2])) {
int dp_idx = atoi(name + 2);
if (dp_idx >= 0 && dp_idx < N_DP_NETDEVS) {
return dp_idx;
if (!internal) {
error = netdev_open(devname, NETDEV_ETH_TYPE_ANY, &netdev);
} else {
- error = netdev_open_tap(devname, &netdev);
+ char *tapname = xasprintf("tap:%s", devname);
+ error = netdev_open(tapname, NETDEV_ETH_TYPE_ANY, &netdev);
+ free(tapname);
}
if (error) {
return error;
port->netdev = netdev;
port->internal = internal;
- mtu = netdev_get_mtu(netdev);
+ netdev_get_mtu(netdev, &mtu);
if (mtu > max_mtu) {
max_mtu = mtu;
}
return do_add_port(dp, devname, flags, port_no);
}
}
- return EXFULL;
+ return EFBIG;
}
static int
}
static void
-answer_flow_query(const struct dp_netdev_flow *flow,
+answer_flow_query(struct dp_netdev_flow *flow, uint32_t query_flags,
struct odp_flow *odp_flow)
{
if (flow) {
n * sizeof *odp_flow->actions);
odp_flow->n_actions = flow->n_actions;
}
+
+ if (query_flags & ODPFF_ZERO_TCP_FLAGS) {
+ flow->tcp_ctl = 0;
+ }
+
} else {
odp_flow->stats.error = ENOENT;
}
for (i = 0; i < n; i++) {
struct odp_flow *odp_flow = &flows[i];
- answer_flow_query(dp_netdev_lookup_flow(dp, &odp_flow->key), odp_flow);
+ answer_flow_query(dp_netdev_lookup_flow(dp, &odp_flow->key),
+ odp_flow->flags, odp_flow);
}
return 0;
}
if (hmap_count(&dp->flow_table) < MAX_FLOWS) {
return add_flow(dpif, &put->flow);
} else {
- return EXFULL;
+ return EFBIG;
}
} else {
return ENOENT;
flow = dp_netdev_lookup_flow(dp, &odp_flow->key);
if (flow) {
- answer_flow_query(flow, odp_flow);
+ answer_flow_query(flow, 0, odp_flow);
dp_netdev_free_flow(dp, flow);
return 0;
} else {
if (i >= n) {
break;
}
- answer_flow_query(flow, &flows[i++]);
+ answer_flow_query(flow, 0, &flows[i++]);
}
return hmap_count(&dp->flow_table);
}
flow_t flow;
int error;
- if (packet->size < ETH_HLEN || packet->size > UINT16_MAX) {
+ if (packet->size < ETH_HEADER_LEN || packet->size > UINT16_MAX) {
return EINVAL;
}
time_timeval(&flow->used);
flow->packet_count++;
flow->byte_count += packet->size;
- if (key->dl_type == htons(ETH_P_IP)) {
+ if (key->dl_type == htons(ETH_TYPE_IP)) {
struct ip_header *nh = packet->l3;
flow->ip_tos = nh->ip_tos;
dp_netdev_set_tp_port(struct ofpbuf *packet, flow_t *key,
const struct odp_action_tp_port *a)
{
- if (key->dl_type == htons(ETH_P_IP)) {
+ if (key->dl_type == htons(ETH_TYPE_IP)) {
uint16_t *field;
if (key->nw_proto == IPPROTO_TCP) {
struct tcp_header *th = packet->l4;
"netdev",
dp_netdev_run,
dp_netdev_wait,
+ NULL, /* enumerate */
dpif_netdev_open,
dpif_netdev_close,
+ NULL, /* get_all_names */
dpif_netdev_delete,
dpif_netdev_get_stats,
dpif_netdev_get_drop_frags,