Skip to content

Commit

Permalink
dpif: Refactor obj type from void pointer to dpif_class
Browse files Browse the repository at this point in the history
It's basically what is being passed today and passing a specific
type adds a compiler type check.

Signed-off-by: Roi Dayan <roid@mellanox.com>
Reviewed-by: Paul Blakey <paulb@mellanox.com>
Signed-off-by: Simon Horman <simon.horman@netronome.com>
  • Loading branch information
roidayan authored and shorman-netronome committed Jul 27, 2017
1 parent 4862b4e commit dfaf79d
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 50 deletions.
15 changes: 8 additions & 7 deletions lib/dpif-netlink.c
Expand Up @@ -1160,7 +1160,7 @@ dpif_netlink_flow_flush(struct dpif *dpif_)
flow.dp_ifindex = dpif->dp_ifindex;

if (netdev_is_flow_api_enabled()) {
netdev_ports_flow_flush(DPIF_HMAP_KEY(dpif_));
netdev_ports_flow_flush(dpif_->dpif_class);
}

return dpif_netlink_flow_transact(&flow, NULL, NULL);
Expand Down Expand Up @@ -1487,7 +1487,7 @@ start_netdev_dump(const struct dpif *dpif_,
ovs_mutex_lock(&dump->netdev_lock);
dump->netdev_current_dump = 0;
dump->netdev_dumps
= netdev_ports_flow_dump_create(DPIF_HMAP_KEY(dpif_),
= netdev_ports_flow_dump_create(dpif_->dpif_class,
&dump->netdev_dumps_num);
ovs_mutex_unlock(&dump->netdev_lock);
}
Expand Down Expand Up @@ -2047,7 +2047,7 @@ parse_flow_get(struct dpif_netlink *dpif, struct dpif_flow_get *get)
int err;

ofpbuf_use_stack(&buf, &act_buf, sizeof act_buf);
err = netdev_ports_flow_get(DPIF_HMAP_KEY(&dpif->dpif), &match,
err = netdev_ports_flow_get(dpif->dpif.dpif_class, &match,
&actions, get->ufid, &stats, &buf);
if (err) {
return err;
Expand All @@ -2074,6 +2074,7 @@ static int
parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put)
{
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
const struct dpif_class *dpif_class = dpif->dpif.dpif_class;
struct match match;
odp_port_t in_port;
const struct nlattr *nla;
Expand All @@ -2100,7 +2101,7 @@ parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put)
}

in_port = match.flow.in_port.odp_port;
dev = netdev_ports_get(in_port, DPIF_HMAP_KEY(&dpif->dpif));
dev = netdev_ports_get(in_port, dpif_class);
if (!dev) {
return EOPNOTSUPP;
}
Expand All @@ -2120,7 +2121,7 @@ parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put)
}

out_port = nl_attr_get_odp_port(nla);
outdev = netdev_ports_get(out_port, DPIF_HMAP_KEY(&dpif->dpif));
outdev = netdev_ports_get(out_port, dpif_class);
if (!outdev) {
err = EOPNOTSUPP;
goto out;
Expand All @@ -2133,7 +2134,7 @@ parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put)
}
}

info.port_hmap_obj = DPIF_HMAP_KEY(&dpif->dpif);
info.dpif_class = dpif_class;
info.tp_dst_port = dst_port;
err = netdev_flow_put(dev, &match,
CONST_CAST(struct nlattr *, put->actions),
Expand Down Expand Up @@ -2211,7 +2212,7 @@ try_send_to_netdev(struct dpif_netlink *dpif, struct dpif_op *op)
}

log_flow_del_message(&dpif->dpif, &this_module, del, 0);
err = netdev_ports_flow_del(DPIF_HMAP_KEY(&dpif->dpif), del->ufid,
err = netdev_ports_flow_del(dpif->dpif.dpif_class, del->ufid,
del->stats);
break;
}
Expand Down
6 changes: 3 additions & 3 deletions lib/dpif.c
Expand Up @@ -366,7 +366,7 @@ do_open(const char *name, const char *type, bool create, struct dpif **dpifp)
err = netdev_open(dpif_port.name, dpif_port.type, &netdev);

if (!err) {
netdev_ports_insert(netdev, DPIF_HMAP_KEY(dpif), &dpif_port);
netdev_ports_insert(netdev, dpif->dpif_class, &dpif_port);
netdev_close(netdev);
} else {
VLOG_WARN("could not open netdev %s type %s: %s",
Expand Down Expand Up @@ -573,7 +573,7 @@ dpif_port_add(struct dpif *dpif, struct netdev *netdev, odp_port_t *port_nop)
dpif_port.type = CONST_CAST(char *, netdev_get_type(netdev));
dpif_port.name = CONST_CAST(char *, netdev_name);
dpif_port.port_no = port_no;
netdev_ports_insert(netdev, DPIF_HMAP_KEY(dpif), &dpif_port);
netdev_ports_insert(netdev, dpif->dpif_class, &dpif_port);
}
} else {
VLOG_WARN_RL(&error_rl, "%s: failed to add %s as port: %s",
Expand All @@ -600,7 +600,7 @@ dpif_port_del(struct dpif *dpif, odp_port_t port_no)
VLOG_DBG_RL(&dpmsg_rl, "%s: port_del(%"PRIu32")",
dpif_name(dpif), port_no);

netdev_ports_remove(port_no, DPIF_HMAP_KEY(dpif));
netdev_ports_remove(port_no, dpif->dpif_class);
} else {
log_operation(dpif, "port_del", error);
}
Expand Down
2 changes: 0 additions & 2 deletions lib/dpif.h
Expand Up @@ -401,8 +401,6 @@
extern "C" {
#endif

#define DPIF_HMAP_KEY(x) ((x)->dpif_class)

struct dpif;
struct dpif_class;
struct dpif_flow;
Expand Down
3 changes: 1 addition & 2 deletions lib/netdev-tc-offloads.c
Expand Up @@ -788,8 +788,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match,
NL_ATTR_FOR_EACH(nla, left, actions, actions_len) {
if (nl_attr_type(nla) == OVS_ACTION_ATTR_OUTPUT) {
odp_port_t port = nl_attr_get_odp_port(nla);
struct netdev *outdev = netdev_ports_get(port,
info->port_hmap_obj);
struct netdev *outdev = netdev_ports_get(port, info->dpif_class);

flower.ifindex_out = netdev_get_ifindex(outdev);
flower.set.tp_dst = info->tp_dst_port;
Expand Down
59 changes: 32 additions & 27 deletions lib/netdev.c
Expand Up @@ -2152,7 +2152,7 @@ struct port_to_netdev_data {
struct hmap_node node;
struct netdev *netdev;
struct dpif_port dpif_port;
const void *obj;
const struct dpif_class *dpif_class;
};

struct ifindex_to_port_data {
Expand All @@ -2161,27 +2161,31 @@ struct ifindex_to_port_data {
odp_port_t port;
};

#define NETDEV_PORTS_HASH_INT(port, dpif) \
hash_int(odp_to_u32(port),\
hash_pointer(dpif, 0));

static struct port_to_netdev_data *
netdev_ports_lookup(odp_port_t port_no, const void *obj)
netdev_ports_lookup(odp_port_t port_no, const struct dpif_class *dpif_class)
OVS_REQUIRES(netdev_hmap_mutex)
{
size_t hash = hash_int(odp_to_u32(port_no), hash_pointer(obj, 0));
size_t hash = NETDEV_PORTS_HASH_INT(port_no, dpif_class);
struct port_to_netdev_data *data;

HMAP_FOR_EACH_WITH_HASH(data, node, hash, &port_to_netdev) {
if (data->obj == obj && data->dpif_port.port_no == port_no) {
if (data->dpif_class == dpif_class
&& data->dpif_port.port_no == port_no) {
return data;
}
}
return NULL;
}

int
netdev_ports_insert(struct netdev *netdev, const void *obj,
netdev_ports_insert(struct netdev *netdev, const struct dpif_class *dpif_class,
struct dpif_port *dpif_port)
{
size_t hash = hash_int(odp_to_u32(dpif_port->port_no),
hash_pointer(obj, 0));
size_t hash = NETDEV_PORTS_HASH_INT(dpif_port->port_no, dpif_class);
struct port_to_netdev_data *data;
struct ifindex_to_port_data *ifidx;
int ifindex = netdev_get_ifindex(netdev);
Expand All @@ -2194,13 +2198,13 @@ netdev_ports_insert(struct netdev *netdev, const void *obj,
ifidx = xzalloc(sizeof *ifidx);

ovs_mutex_lock(&netdev_hmap_mutex);
if (netdev_ports_lookup(dpif_port->port_no, obj)) {
if (netdev_ports_lookup(dpif_port->port_no, dpif_class)) {
ovs_mutex_unlock(&netdev_hmap_mutex);
return EEXIST;
}

data->netdev = netdev_ref(netdev);
data->obj = obj;
data->dpif_class = dpif_class;
dpif_port_clone(&data->dpif_port, dpif_port);

ifidx->ifindex = ifindex;
Expand All @@ -2216,13 +2220,13 @@ netdev_ports_insert(struct netdev *netdev, const void *obj,
}

struct netdev *
netdev_ports_get(odp_port_t port_no, const void *obj)
netdev_ports_get(odp_port_t port_no, const struct dpif_class *dpif_class)
{
struct port_to_netdev_data *data;
struct netdev *ret = NULL;

ovs_mutex_lock(&netdev_hmap_mutex);
data = netdev_ports_lookup(port_no, obj);
data = netdev_ports_lookup(port_no, dpif_class);
if (data) {
ret = netdev_ref(data->netdev);
}
Expand All @@ -2232,14 +2236,14 @@ netdev_ports_get(odp_port_t port_no, const void *obj)
}

int
netdev_ports_remove(odp_port_t port_no, const void *obj)
netdev_ports_remove(odp_port_t port_no, const struct dpif_class *dpif_class)
{
struct port_to_netdev_data *data;
int ret = ENOENT;

ovs_mutex_lock(&netdev_hmap_mutex);

data = netdev_ports_lookup(port_no, obj);
data = netdev_ports_lookup(port_no, dpif_class);

if (data) {
dpif_port_destroy(&data->dpif_port);
Expand Down Expand Up @@ -2273,21 +2277,21 @@ netdev_ifindex_to_odp_port(int ifindex)
}

void
netdev_ports_flow_flush(const void *obj)
netdev_ports_flow_flush(const struct dpif_class *dpif_class)
{
struct port_to_netdev_data *data;

ovs_mutex_lock(&netdev_hmap_mutex);
HMAP_FOR_EACH(data, node, &port_to_netdev) {
if (data->obj == obj) {
if (data->dpif_class == dpif_class) {
netdev_flow_flush(data->netdev);
}
}
ovs_mutex_unlock(&netdev_hmap_mutex);
}

struct netdev_flow_dump **
netdev_ports_flow_dump_create(const void *obj, int *ports)
netdev_ports_flow_dump_create(const struct dpif_class *dpif_class, int *ports)
{
struct port_to_netdev_data *data;
struct netdev_flow_dump **dumps;
Expand All @@ -2296,15 +2300,15 @@ netdev_ports_flow_dump_create(const void *obj, int *ports)

ovs_mutex_lock(&netdev_hmap_mutex);
HMAP_FOR_EACH(data, node, &port_to_netdev) {
if (data->obj == obj) {
if (data->dpif_class == dpif_class) {
count++;
}
}

dumps = count ? xzalloc(sizeof *dumps * count) : NULL;

HMAP_FOR_EACH(data, node, &port_to_netdev) {
if (data->obj == obj) {
if (data->dpif_class == dpif_class) {
if (netdev_flow_dump_create(data->netdev, &dumps[i])) {
continue;
}
Expand All @@ -2320,14 +2324,16 @@ netdev_ports_flow_dump_create(const void *obj, int *ports)
}

int
netdev_ports_flow_del(const void *obj, const ovs_u128 *ufid,
netdev_ports_flow_del(const struct dpif_class *dpif_class,
const ovs_u128 *ufid,
struct dpif_flow_stats *stats)
{
struct port_to_netdev_data *data;

ovs_mutex_lock(&netdev_hmap_mutex);
HMAP_FOR_EACH(data, node, &port_to_netdev) {
if (data->obj == obj && !netdev_flow_del(data->netdev, ufid, stats)) {
if (data->dpif_class == dpif_class
&& !netdev_flow_del(data->netdev, ufid, stats)) {
ovs_mutex_unlock(&netdev_hmap_mutex);
return 0;
}
Expand All @@ -2338,18 +2344,17 @@ netdev_ports_flow_del(const void *obj, const ovs_u128 *ufid,
}

int
netdev_ports_flow_get(const void *obj, struct match *match,
struct nlattr **actions,
const ovs_u128 *ufid,
struct dpif_flow_stats *stats,
struct ofpbuf *buf)
netdev_ports_flow_get(const struct dpif_class *dpif_class, struct match *match,
struct nlattr **actions, const ovs_u128 *ufid,
struct dpif_flow_stats *stats, struct ofpbuf *buf)
{
struct port_to_netdev_data *data;

ovs_mutex_lock(&netdev_hmap_mutex);
HMAP_FOR_EACH(data, node, &port_to_netdev) {
if (data->obj == obj && !netdev_flow_get(data->netdev, match, actions,
ufid, stats, buf)) {
if (data->dpif_class == dpif_class
&& !netdev_flow_get(data->netdev, match, actions,
ufid, stats, buf)) {
ovs_mutex_unlock(&netdev_hmap_mutex);
return 0;
}
Expand Down
21 changes: 12 additions & 9 deletions lib/netdev.h
Expand Up @@ -186,9 +186,10 @@ void netdev_send_wait(struct netdev *, int qid);

/* Flow offloading. */
struct offload_info {
const void *port_hmap_obj; /* To query ports info from netdev port map */
const struct dpif_class *dpif_class;
ovs_be16 tp_dst_port; /* Destination port for tunnel in SET action */
};
struct dpif_class;
struct netdev_flow_dump;
int netdev_flow_flush(struct netdev *);
int netdev_flow_dump_create(struct netdev *, struct netdev_flow_dump **dump);
Expand All @@ -210,16 +211,18 @@ bool netdev_is_flow_api_enabled(void);
void netdev_set_flow_api_enabled(const struct smap *ovs_other_config);

struct dpif_port;
int netdev_ports_insert(struct netdev *, const void *obj, struct dpif_port *);
struct netdev *netdev_ports_get(odp_port_t port, const void *obj);
int netdev_ports_remove(odp_port_t port, const void *obj);
int netdev_ports_insert(struct netdev *, const struct dpif_class *,
struct dpif_port *);
struct netdev *netdev_ports_get(odp_port_t port, const struct dpif_class *);
int netdev_ports_remove(odp_port_t port, const struct dpif_class *);
odp_port_t netdev_ifindex_to_odp_port(int ifindex);
struct netdev_flow_dump **netdev_ports_flow_dump_create(const void *obj,
int *ports);
void netdev_ports_flow_flush(const void *obj);
int netdev_ports_flow_del(const void *obj, const ovs_u128 *ufid,
struct netdev_flow_dump **netdev_ports_flow_dump_create(
const struct dpif_class *,
int *ports);
void netdev_ports_flow_flush(const struct dpif_class *);
int netdev_ports_flow_del(const struct dpif_class *, const ovs_u128 *ufid,
struct dpif_flow_stats *stats);
int netdev_ports_flow_get(const void *obj, struct match *match,
int netdev_ports_flow_get(const struct dpif_class *, struct match *match,
struct nlattr **actions,
const ovs_u128 *ufid,
struct dpif_flow_stats *stats,
Expand Down

0 comments on commit dfaf79d

Please sign in to comment.