X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fdpif.c;h=69d9c3464af2f6c58466f508904ed1c67ee238cb;hb=d978fa4832bbc5176e05edd05bcdf2452a8dded2;hp=952a502d60f26cadaacf4d688084d6701fbeb967;hpb=4afba28d559511a5ee03e005b65be8323bf26ad3;p=sliver-openvswitch.git diff --git a/lib/dpif.c b/lib/dpif.c index 952a502d6..69d9c3464 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -17,7 +17,6 @@ #include #include "dpif-provider.h" -#include #include #include #include @@ -62,6 +61,7 @@ static const struct dpif_class *base_dpif_classes[] = { &dpif_linux_class, #endif &dpif_netdev_class, + &dpif_planetlab_class, }; struct registered_dpif_class { @@ -265,7 +265,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) { - assert(dpif->dpif_class == registered_class->dpif_class); + ovs_assert(dpif->dpif_class == registered_class->dpif_class); registered_class->refcount++; } @@ -329,8 +329,8 @@ dpif_close(struct dpif *dpif) registered_class = shash_find_data(&dpif_classes, dpif->dpif_class->type); - assert(registered_class); - assert(registered_class->refcount); + ovs_assert(registered_class); + ovs_assert(registered_class->refcount); registered_class->refcount--; dpif_uninit(dpif, true); @@ -372,6 +372,13 @@ dpif_base_name(const struct dpif *dpif) return dpif->base_name; } +/* Returns the type of datapath 'dpif'. */ +const char * +dpif_type(const struct dpif *dpif) +{ + return dpif->dpif_class->type; +} + /* Returns the fully spelled out name for the given datapath 'type'. * * Normalized type string can be compared with strcmp(). Unnormalized type @@ -410,6 +417,23 @@ dpif_get_dp_stats(const struct dpif *dpif, struct dpif_dp_stats *stats) return error; } +const char * +dpif_port_open_type(const char *datapath_type, const char *port_type) +{ + struct registered_dpif_class *registered_class; + + datapath_type = dpif_normalize_type(datapath_type); + + registered_class = shash_find_data(&dpif_classes, datapath_type); + if (!registered_class + || !registered_class->dpif_class->port_open_type) { + return port_type; + } + + return registered_class->dpif_class->port_open_type( + registered_class->dpif_class, port_type); +} + /* Attempts to add 'netdev' as a port on 'dpif'. If 'port_nop' is * non-null and its value is not UINT32_MAX, then attempts to use the * value as the port number. @@ -492,7 +516,7 @@ bool dpif_port_exists(const struct dpif *dpif, const char *devname) { int error = dpif->dpif_class->port_query_by_name(dpif, devname, NULL); - if (error != 0 && error != ENODEV) { + if (error != 0 && error != ENOENT && error != ENODEV) { VLOG_WARN_RL(&error_rl, "%s: failed to query port %s: %s", dpif_name(dpif), devname, strerror(error)); } @@ -590,7 +614,7 @@ dpif_port_get_name(struct dpif *dpif, uint32_t port_no, struct dpif_port port; int error; - assert(name_size > 0); + ovs_assert(name_size > 0); error = dpif_port_query_by_number(dpif, port_no, &port); if (!error) { @@ -797,8 +821,8 @@ dpif_flow_put__(struct dpif *dpif, const struct dpif_flow_put *put) int error; COVERAGE_INC(dpif_flow_put); - assert(!(put->flags & ~(DPIF_FP_CREATE | DPIF_FP_MODIFY - | DPIF_FP_ZERO_STATS))); + ovs_assert(!(put->flags & ~(DPIF_FP_CREATE | DPIF_FP_MODIFY + | DPIF_FP_ZERO_STATS))); error = dpif->dpif_class->flow_put(dpif, put); if (error && put->stats) {