[ovs-dev] [RFC v3 2/4] netdev-offload: Use dpif type instead of class.

Ophir Munk ophirmu at mellanox.com
Wed Dec 11 12:51:30 UTC 2019



> -----Original Message-----
> From: Ilya Maximets <i.maximets at ovn.org>
> Sent: Tuesday, December 3, 2019 1:13 PM
> To: ovs-dev at openvswitch.org
> Cc: Ophir Munk <ophirmu at mellanox.com>; Roni Bar Yanai
> <roniba at mellanox.com>; Simon Horman
> <simon.horman at netronome.com>; Ilya Maximets <i.maximets at ovn.org>
> Subject: [RFC v3 2/4] netdev-offload: Use dpif type instead of class.
> 
> There is no real difference between the 'class' and 'type' in the context of
> common lookup operations inside netdev-offload module because it only
> checks the value of pointers without using the value itself.  However, 'type'
> has some meaning and can be used by offload provides on the initialization
> phase to check if this type of Flow API in pair with the netdev type could be
> used in particular datapath type.  For example, this is needed to check if
> Linux flow API could be used for current tunneling vport because it could be
> used only if tunneling vport belongs to system datapath, i.e. has backing linux
> interface.
> 
> This is needed to unblock tunneling offloads in userspace datapath with
> DPDK flow API.
> 
> Signed-off-by: Ilya Maximets <i.maximets at ovn.org>
> ---
>  lib/dpif-netdev.c             | 10 ++++---
>  lib/dpif-netlink.c            | 23 +++++++++-------
>  lib/dpif.c                    | 21 ++++++++-------
>  lib/netdev-offload-tc.c       |  4 +--
>  lib/netdev-offload.c          | 51 +++++++++++++++++------------------
>  lib/netdev-offload.h          | 16 +++++------
>  ofproto/ofproto-dpif-upcall.c |  5 ++--
>  7 files changed, 67 insertions(+), 63 deletions(-)
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 885a4df36..a78fd5909
> 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -2253,10 +2253,11 @@ static int
>  mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd,
>                            struct dp_netdev_flow *flow)  {
> -    int ret = 0;
> -    uint32_t mark = flow->mark;
> +    const char *dpif_type_str =
> + dpif_normalize_type(dpif_type(pmd->dp->dpif));
>      struct cmap_node *mark_node = CONST_CAST(struct cmap_node *,
>                                               &flow->mark_node);
> +    uint32_t mark = flow->mark;
> +    int ret = 0;
> 
>      cmap_remove(&flow_mark.mark_to_flow, mark_node, hash_int(mark,
> 0));
>      flow->mark = INVALID_FLOW_MARK;
> @@ -2269,7 +2270,7 @@ mark_to_flow_disassociate(struct
> dp_netdev_pmd_thread *pmd,
>          struct netdev *port;
>          odp_port_t in_port = flow->flow.in_port.odp_port;
> 
> -        port = netdev_ports_get(in_port, pmd->dp->dpif->dpif_class);
> +        port = netdev_ports_get(in_port, dpif_type_str);
>          if (port) {
>              ret = netdev_flow_del(port, &flow->mega_ufid, NULL);
>              netdev_close(port);
> @@ -2374,6 +2375,7 @@ dp_netdev_flow_offload_put(struct
> dp_flow_offload_item *offload)
>      struct dp_netdev_pmd_thread *pmd = offload->pmd;
>      struct dp_netdev_flow *flow = offload->flow;
>      odp_port_t in_port = flow->flow.in_port.odp_port;
> +    const char *dpif_type_str =
> + dpif_normalize_type(dpif_type(pmd->dp->dpif));
>      bool modification = offload->op ==
> DP_NETDEV_FLOW_OFFLOAD_OP_MOD;
>      struct offload_info info;
>      struct netdev *port;
> @@ -2410,7 +2412,7 @@ dp_netdev_flow_offload_put(struct
> dp_flow_offload_item *offload)
>      }
>      info.flow_mark = mark;
> 
> -    port = netdev_ports_get(in_port, pmd->dp->dpif->dpif_class);
> +    port = netdev_ports_get(in_port, dpif_type_str);
>      if (!port || netdev_vport_is_vport_class(port->netdev_class)) {
>          netdev_close(port);
>          goto err_free;
> diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index e9a6887f7..8272d855f
> 100644
> --- a/lib/dpif-netlink.c
> +++ b/lib/dpif-netlink.c
> @@ -1072,6 +1072,7 @@ dpif_netlink_port_get_pid(const struct dpif *dpif_,
> odp_port_t port_no)  static int  dpif_netlink_flow_flush(struct dpif *dpif_)  {
> +    const char *dpif_type_str = dpif_normalize_type(dpif_type(dpif_));
>      const struct dpif_netlink *dpif = dpif_netlink_cast(dpif_);
>      struct dpif_netlink_flow flow;
> 
> @@ -1080,7 +1081,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_->dpif_class);
> +        netdev_ports_flow_flush(dpif_type_str);
>      }
> 
>      return dpif_netlink_flow_transact(&flow, NULL, NULL); @@ -1397,7
> +1398,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_->dpif_class,
> +        =
> + netdev_ports_flow_dump_create(dpif_normalize_type(dpif_type(dpif_)),
>                                          &dump->netdev_dumps_num);
>      ovs_mutex_unlock(&dump->netdev_lock);
>  }
> @@ -1949,6 +1950,7 @@ dpif_netlink_operate__(struct dpif_netlink *dpif,
> static int  parse_flow_get(struct dpif_netlink *dpif, struct dpif_flow_get
> *get)  {
> +    const char *dpif_type_str =
> + dpif_normalize_type(dpif_type(&dpif->dpif));
>      struct dpif_flow *dpif_flow = get->flow;
>      struct match match;
>      struct nlattr *actions;
> @@ -1963,8 +1965,8 @@ 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->dpif.dpif_class, &match,
> -                                &actions, get->ufid, &stats, &attrs, &buf);
> +    err = netdev_ports_flow_get(dpif_type_str, &match, &actions, get-
> >ufid,
> +                                &stats, &attrs, &buf);
>      if (err) {
>          return err;
>      }
> @@ -1989,8 +1991,8 @@ parse_flow_get(struct dpif_netlink *dpif, struct
> dpif_flow_get *get)  static int  parse_flow_put(struct dpif_netlink *dpif,
> struct dpif_flow_put *put)  {
> +    const char *dpif_type_str =
> + dpif_normalize_type(dpif_type(&dpif->dpif));
>      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;
> @@ -2012,7 +2014,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_class);
> +    dev = netdev_ports_get(in_port, dpif_type_str);
>      if (!dev) {
>          return EOPNOTSUPP;
>      }
> @@ -2025,7 +2027,7 @@ parse_flow_put(struct dpif_netlink *dpif, struct
> dpif_flow_put *put)
>              odp_port_t out_port;
> 
>              out_port = nl_attr_get_odp_port(nla);
> -            outdev = netdev_ports_get(out_port, dpif_class);
> +            outdev = netdev_ports_get(out_port, dpif_type_str);
>              if (!outdev) {
>                  err = EOPNOTSUPP;
>                  goto out;
> @@ -2041,7 +2043,6 @@ parse_flow_put(struct dpif_netlink *dpif, struct
> dpif_flow_put *put)
>          }
>      }
> 
> -    info.dpif_class = dpif_class;
>      info.tp_dst_port = dst_port;
>      info.tunnel_csum_on = csum_on;
>      err = netdev_flow_put(dev, &match,
> @@ -2139,8 +2140,10 @@ 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->dpif.dpif_class, del->ufid,
> -                                    del->stats);
> +        err = netdev_ports_flow_del(
> +                                dpif_normalize_type(dpif_type(&dpif->dpif)),
> +                                del->ufid,
> +                                del->stats);
>          break;
>      }
>      case DPIF_OP_FLOW_GET: {
> diff --git a/lib/dpif.c b/lib/dpif.c
> index c88b2106f..22d5f3ea6 100644
> --- a/lib/dpif.c
> +++ b/lib/dpif.c
> @@ -347,6 +347,7 @@ do_open(const char *name, const char *type, bool
> create, struct dpif **dpifp)
>      error = registered_class->dpif_class->open(registered_class->dpif_class,
>                                                 name, create, &dpif);
>      if (!error) {
> +        const char *dpif_type_str =
> + dpif_normalize_type(dpif_type(dpif));
>          struct dpif_port_dump port_dump;
>          struct dpif_port dpif_port;
> 
> @@ -363,7 +364,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->dpif_class, &dpif_port);
> +                netdev_ports_insert(netdev, dpif_type_str, &dpif_port);
>                  netdev_close(netdev);
>              } else {
>                  VLOG_WARN("could not open netdev %s type %s: %s", @@ -427,14
> +428,15 @@ dpif_create_and_open(const char *name, const char *type,
> struct dpif **dpifp)
> 
>  static void
>  dpif_remove_netdev_ports(struct dpif *dpif) {
> -        struct dpif_port_dump port_dump;
> -        struct dpif_port dpif_port;
> +    const char *dpif_type_str = dpif_normalize_type(dpif_type(dpif));
> +    struct dpif_port_dump port_dump;
> +    struct dpif_port dpif_port;
> 
> -        DPIF_PORT_FOR_EACH (&dpif_port, &port_dump, dpif) {
> -            if (!dpif_is_tap_port(dpif_port.type)) {
> -                netdev_ports_remove(dpif_port.port_no, dpif->dpif_class);
> -            }
> +    DPIF_PORT_FOR_EACH (&dpif_port, &port_dump, dpif) {
> +        if (!dpif_is_tap_port(dpif_port.type)) {
> +            netdev_ports_remove(dpif_port.port_no, dpif_type_str);
>          }
> +    }
>  }
> 
>  /* Closes and frees the connection to 'dpif'.  Does not destroy the datapath
> @@ -588,12 +590,13 @@ dpif_port_add(struct dpif *dpif, struct netdev
> *netdev, odp_port_t *port_nop)
> 
>          if (!dpif_is_tap_port(netdev_get_type(netdev))) {
> 
> +            const char *dpif_type_str =
> + dpif_normalize_type(dpif_type(dpif));
>              struct dpif_port dpif_port;
> 
>              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->dpif_class, &dpif_port);
> +            netdev_ports_insert(netdev, dpif_type_str, &dpif_port);
>          }
>      } else {
>          VLOG_WARN_RL(&error_rl, "%s: failed to add %s as port: %s", @@ -
> 625,7 +628,7 @@ dpif_port_del(struct dpif *dpif, odp_port_t port_no, bool
> local_delete)
>          }
>      }
> 
> -    netdev_ports_remove(port_no, dpif->dpif_class);
> +    netdev_ports_remove(port_no, dpif_normalize_type(dpif_type(dpif)));

For styling consistency I would retrieve the dpif_type_str first and then use it:

const char *dpif_type_str = dpif_normalize_type(dpif_type(dpif));
...
netdev_ports_remove(port_no, dpif_type_str);

>      return error;
>  }
> 
> diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c index
> 1adbb325b..dee82aa9a 100644
> --- a/lib/netdev-offload-tc.c
> +++ b/lib/netdev-offload-tc.c
> @@ -1368,8 +1368,8 @@ netdev_tc_flow_put(struct netdev *netdev, struct
> match *match,
>          action = &flower.actions[flower.action_count];
>          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->dpif_class);
> -
> +            struct netdev *outdev = netdev_ports_get(
> +                                        port,
> + netdev_get_dpif_type(netdev));
>              action->out.ifindex_out = netdev_get_ifindex(outdev);
>              action->out.ingress = is_internal_port(netdev_get_type(outdev));
>              action->type = TC_ACT_OUTPUT; diff --git a/lib/netdev-offload.c
> b/lib/netdev-offload.c index ae01acda6..00fb083fc 100644
> --- a/lib/netdev-offload.c
> +++ b/lib/netdev-offload.c
> @@ -370,11 +370,10 @@ static struct hmap ifindex_to_port
> OVS_GUARDED_BY(netdev_hmap_rwlock)
>      = HMAP_INITIALIZER(&ifindex_to_port);
> 
>  struct port_to_netdev_data {
> -    struct hmap_node portno_node; /* By (dpif_class, dpif_port.port_no). */
> -    struct hmap_node ifindex_node; /* By (dpif_class, ifindex). */
> +    struct hmap_node portno_node; /* By (dpif_type, dpif_port.port_no). */
> +    struct hmap_node ifindex_node; /* By (dpif_type, ifindex). */
>      struct netdev *netdev;
>      struct dpif_port dpif_port;
> -    const struct dpif_class *dpif_class;
>      int ifindex;
>  };
> 
> @@ -410,13 +409,13 @@ netdev_is_flow_api_enabled(void)  }
> 
>  void
> -netdev_ports_flow_flush(const struct dpif_class *dpif_class)
> +netdev_ports_flow_flush(const char *dpif_type)
>  {
>      struct port_to_netdev_data *data;
> 
>      ovs_rwlock_rdlock(&netdev_hmap_rwlock);
>      HMAP_FOR_EACH (data, portno_node, &port_to_netdev) {
> -        if (data->dpif_class == dpif_class) {
> +        if (netdev_get_dpif_type(data->netdev) == dpif_type) {
>              netdev_flow_flush(data->netdev);
>          }
>      }
> @@ -424,7 +423,7 @@ netdev_ports_flow_flush(const struct dpif_class
> *dpif_class)  }
> 
>  struct netdev_flow_dump **
> -netdev_ports_flow_dump_create(const struct dpif_class *dpif_class, int
> *ports)
> +netdev_ports_flow_dump_create(const char *dpif_type, int *ports)
>  {
>      struct port_to_netdev_data *data;
>      struct netdev_flow_dump **dumps;
> @@ -433,7 +432,7 @@ netdev_ports_flow_dump_create(const struct
> dpif_class *dpif_class, int *ports)
> 
>      ovs_rwlock_rdlock(&netdev_hmap_rwlock);
>      HMAP_FOR_EACH (data, portno_node, &port_to_netdev) {
> -        if (data->dpif_class == dpif_class) {
> +        if (netdev_get_dpif_type(data->netdev) == dpif_type) {
>              count++;
>          }
>      }
> @@ -441,7 +440,7 @@ netdev_ports_flow_dump_create(const struct
> dpif_class *dpif_class, int *ports)
>      dumps = count ? xzalloc(sizeof *dumps * count) : NULL;
> 
>      HMAP_FOR_EACH (data, portno_node, &port_to_netdev) {
> -        if (data->dpif_class == dpif_class) {
> +        if (netdev_get_dpif_type(data->netdev) == dpif_type) {
>              if (netdev_flow_dump_create(data->netdev, &dumps[i])) {
>                  continue;
>              }
> @@ -457,15 +456,14 @@ netdev_ports_flow_dump_create(const struct
> dpif_class *dpif_class, int *ports)  }
> 
>  int
> -netdev_ports_flow_del(const struct dpif_class *dpif_class,
> -                      const ovs_u128 *ufid,
> +netdev_ports_flow_del(const char *dpif_type, const ovs_u128 *ufid,
>                        struct dpif_flow_stats *stats)  {
>      struct port_to_netdev_data *data;
> 
>      ovs_rwlock_rdlock(&netdev_hmap_rwlock);
>      HMAP_FOR_EACH (data, portno_node, &port_to_netdev) {
> -        if (data->dpif_class == dpif_class
> +        if (netdev_get_dpif_type(data->netdev) == dpif_type
>              && !netdev_flow_del(data->netdev, ufid, stats)) {
>              ovs_rwlock_unlock(&netdev_hmap_rwlock);
>              return 0;
> @@ -477,7 +475,7 @@ netdev_ports_flow_del(const struct dpif_class
> *dpif_class,  }
> 
>  int
> -netdev_ports_flow_get(const struct dpif_class *dpif_class, struct match
> *match,
> +netdev_ports_flow_get(const char *dpif_type, struct match *match,
>                        struct nlattr **actions, const ovs_u128 *ufid,
>                        struct dpif_flow_stats *stats,
>                        struct dpif_flow_attrs *attrs, struct ofpbuf *buf) @@ -486,7
> +484,7 @@ netdev_ports_flow_get(const struct dpif_class *dpif_class,
> struct match *match,
> 
>      ovs_rwlock_rdlock(&netdev_hmap_rwlock);
>      HMAP_FOR_EACH (data, portno_node, &port_to_netdev) {
> -        if (data->dpif_class == dpif_class
> +        if (netdev_get_dpif_type(data->netdev) == dpif_type
>              && !netdev_flow_get(data->netdev, match, actions,
>                                  ufid, stats, attrs, buf)) {
>              ovs_rwlock_unlock(&netdev_hmap_rwlock);
> @@ -498,21 +496,21 @@ netdev_ports_flow_get(const struct dpif_class
> *dpif_class, struct match *match,  }
> 
>  static uint32_t
> -netdev_ports_hash(odp_port_t port, const struct dpif_class *dpif_class)
> +netdev_ports_hash(odp_port_t port, const char *dpif_type)
>  {
> -    return hash_int(odp_to_u32(port), hash_pointer(dpif_class, 0));
> +    return hash_int(odp_to_u32(port), hash_pointer(dpif_type, 0));
>  }
> 
>  static struct port_to_netdev_data *
> -netdev_ports_lookup(odp_port_t port_no, const struct dpif_class
> *dpif_class)
> +netdev_ports_lookup(odp_port_t port_no, const char *dpif_type)
>      OVS_REQ_RDLOCK(netdev_hmap_rwlock)
>  {
>      struct port_to_netdev_data *data;
> 
>      HMAP_FOR_EACH_WITH_HASH (data, portno_node,
> -                             netdev_ports_hash(port_no, dpif_class),
> +                             netdev_ports_hash(port_no, dpif_type),
>                               &port_to_netdev) {
> -        if (data->dpif_class == dpif_class
> +        if (netdev_get_dpif_type(data->netdev) == dpif_type
>              && data->dpif_port.port_no == port_no) {
>              return data;
>          }
> @@ -521,7 +519,7 @@ netdev_ports_lookup(odp_port_t port_no, const
> struct dpif_class *dpif_class)  }
> 
>  int
> -netdev_ports_insert(struct netdev *netdev, const struct dpif_class
> *dpif_class,
> +netdev_ports_insert(struct netdev *netdev, const char *dpif_type,
>                      struct dpif_port *dpif_port)  {
>      struct port_to_netdev_data *data;
> @@ -532,19 +530,20 @@ netdev_ports_insert(struct netdev *netdev, const
> struct dpif_class *dpif_class,
>      }
> 
>      ovs_rwlock_wrlock(&netdev_hmap_rwlock);
> -    if (netdev_ports_lookup(dpif_port->port_no, dpif_class)) {
> +    if (netdev_ports_lookup(dpif_port->port_no, dpif_type)) {
>          ovs_rwlock_unlock(&netdev_hmap_rwlock);
>          return EEXIST;
>      }
> 
>      data = xzalloc(sizeof *data);
>      data->netdev = netdev_ref(netdev);
> -    data->dpif_class = dpif_class;
>      dpif_port_clone(&data->dpif_port, dpif_port);
>      data->ifindex = ifindex;
> 
> +    netdev_set_dpif_type(netdev, dpif_type);
> +
>      hmap_insert(&port_to_netdev, &data->portno_node,
> -                netdev_ports_hash(dpif_port->port_no, dpif_class));
> +                netdev_ports_hash(dpif_port->port_no, dpif_type));
>      hmap_insert(&ifindex_to_port, &data->ifindex_node, ifindex);
>      ovs_rwlock_unlock(&netdev_hmap_rwlock);
> 
> @@ -554,13 +553,13 @@ netdev_ports_insert(struct netdev *netdev, const
> struct dpif_class *dpif_class,  }
> 
>  struct netdev *
> -netdev_ports_get(odp_port_t port_no, const struct dpif_class *dpif_class)
> +netdev_ports_get(odp_port_t port_no, const char *dpif_type)
>  {
>      struct port_to_netdev_data *data;
>      struct netdev *ret = NULL;
> 
>      ovs_rwlock_rdlock(&netdev_hmap_rwlock);
> -    data = netdev_ports_lookup(port_no, dpif_class);
> +    data = netdev_ports_lookup(port_no, dpif_type);
>      if (data) {
>          ret = netdev_ref(data->netdev);
>      }
> @@ -570,13 +569,13 @@ netdev_ports_get(odp_port_t port_no, const
> struct dpif_class *dpif_class)  }
> 
>  int
> -netdev_ports_remove(odp_port_t port_no, const struct dpif_class
> *dpif_class)
> +netdev_ports_remove(odp_port_t port_no, const char *dpif_type)
>  {
>      struct port_to_netdev_data *data;
>      int ret = ENOENT;
> 
>      ovs_rwlock_wrlock(&netdev_hmap_rwlock);
> -    data = netdev_ports_lookup(port_no, dpif_class);
> +    data = netdev_ports_lookup(port_no, dpif_type);
>      if (data) {
>          dpif_port_destroy(&data->dpif_port);
>          netdev_close(data->netdev); /* unref and possibly close */ diff --git
> a/lib/netdev-offload.h b/lib/netdev-offload.h index 97a500647..c04845644
> 100644
> --- a/lib/netdev-offload.h
> +++ b/lib/netdev-offload.h
> @@ -62,7 +62,6 @@ struct netdev_flow_dump {
> 
>  /* Flow offloading. */
>  struct offload_info {
> -    const struct dpif_class *dpif_class;
>      ovs_be16 tp_dst_port; /* Destination port for tunnel in SET action */
>      uint8_t tunnel_csum_on; /* Tunnel header with checksum */
> 
> @@ -98,21 +97,20 @@ bool netdev_is_flow_api_enabled(void);  void
> netdev_set_flow_api_enabled(const struct smap *ovs_other_config);  bool
> netdev_is_offload_rebalance_policy_enabled(void);
> 
> -struct dpif_class;
>  struct dpif_port;
> -int netdev_ports_insert(struct netdev *, const struct dpif_class *,
> +int netdev_ports_insert(struct netdev *, const char *dpif_type,
>                          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 *);
> +struct netdev *netdev_ports_get(odp_port_t port, const char
> +*dpif_type); int netdev_ports_remove(odp_port_t port, const char
> +*dpif_type);
>  odp_port_t netdev_ifindex_to_odp_port(int ifindex);
> 
>  struct netdev_flow_dump **netdev_ports_flow_dump_create(
> -                                        const struct dpif_class *,
> +                                        const char *dpif_type,
>                                          int *ports); -void netdev_ports_flow_flush(const struct
> dpif_class *); -int netdev_ports_flow_del(const struct dpif_class *, const
> ovs_u128 *ufid,
> +void netdev_ports_flow_flush(const char *dpif_type); int
> +netdev_ports_flow_del(const char *dpif_type, const ovs_u128 *ufid,
>                            struct dpif_flow_stats *stats); -int
> netdev_ports_flow_get(const struct dpif_class *, struct match *match,
> +int netdev_ports_flow_get(const char *dpif_type, struct match *match,
>                            struct nlattr **actions,
>                            const ovs_u128 *ufid,
>                            struct dpif_flow_stats *stats, diff --git a/ofproto/ofproto-dpif-
> upcall.c b/ofproto/ofproto-dpif-upcall.c index a9059a6ff..2e3d6e927 100644
> --- a/ofproto/ofproto-dpif-upcall.c
> +++ b/ofproto/ofproto-dpif-upcall.c
> @@ -2509,8 +2509,7 @@ ukey_netdev_unref(struct udpif_key *ukey)  static
> void  ukey_to_flow_netdev(struct udpif *udpif, struct udpif_key *ukey)  {
> -    const struct dpif *dpif = udpif->dpif;
> -    const struct dpif_class *dpif_class = dpif->dpif_class;
> +    const char *dpif_type_str =
> + dpif_normalize_type(dpif_type(udpif->dpif));
>      const struct nlattr *k;
>      unsigned int left;
> 
> @@ -2523,7 +2522,7 @@ ukey_to_flow_netdev(struct udpif *udpif, struct
> udpif_key *ukey)
> 
>          if (type == OVS_KEY_ATTR_IN_PORT) {
>              ukey->in_netdev = netdev_ports_get(nl_attr_get_odp_port(k),
> -                                               dpif_class);
> +                                               dpif_type_str);
>          } else if (type == OVS_KEY_ATTR_TUNNEL) {
>              struct flow_tnl tnl;
>              enum odp_key_fitness res;
> --
> 2.17.1



More information about the dev mailing list