X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdpif.c;h=78e8ec3cfadde1a7db620b971ca97783320808ac;hb=8ddb3f376d06374525cea4aa647462d8f520ed78;hp=21f1173fa8fe132479e1e03255aad9db7a20d0d9;hpb=a14bc59fb8f27db193d74662dc9c5cb8237177ef;p=openvswitch diff --git a/lib/dpif.c b/lib/dpif.c index 21f1173f..78e8ec3c 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -43,6 +43,7 @@ #include "ofpbuf.h" #include "packets.h" #include "poll-loop.h" +#include "svec.h" #include "util.h" #include "valgrind.h" @@ -64,6 +65,35 @@ static int open_by_minor(unsigned int minor, struct dpif *); static int make_openvswitch_device(unsigned int minor, char **fnp); static void check_rw_odp_flow(struct odp_flow *); + +/* Clears 'all_dps' and enumerates the names of all known created + * datapaths into it. Returns 0 if successful, otherwise a positive + * errno value. */ +int +dp_enumerate(struct svec *all_dps) +{ + int error; + int i; + + svec_clear(all_dps); + error = 0; + for (i = 0; i < ODP_MAX; i++) { + struct dpif dpif; + char devname[16]; + int retval; + + sprintf(devname, "dp%d", i); + retval = dpif_open(devname, &dpif); + if (!retval) { + svec_add(all_dps, devname); + dpif_close(&dpif); + } else if (retval != ENODEV && !error) { + error = retval; + } + } + return error; +} + int dpif_open(const char *name, struct dpif *dpif) { @@ -322,6 +352,28 @@ dpif_port_query_by_name(const struct dpif *dpif, const char *devname, } } +/* Looks up port number 'port_no' in 'dpif'. On success, returns 0 and copies + * the port's name into the 'name_size' bytes in 'name', ensuring that the + * result is null-terminated. On failure, returns a positive errno value and + * makes 'name' the empty string. */ +int +dpif_port_get_name(struct dpif *dpif, uint16_t port_no, + char *name, size_t name_size) +{ + struct odp_port port; + int error; + + assert(name_size > 0); + + error = dpif_port_query_by_number(dpif, port_no, &port); + if (!error) { + ovs_strlcpy(name, port.devname, name_size); + } else { + *name = '\0'; + } + return error; +} + int dpif_port_list(const struct dpif *dpif, struct odp_port **ports, size_t *n_ports) @@ -654,7 +706,7 @@ dpif_recv(struct dpif *dpif, struct ofpbuf **bufp) return 0; } else { VLOG_WARN_RL(&error_rl, "dp%u: discarding message truncated " - "from %zu bytes to %d", + "from %"PRIu32" bytes to %d", dpif->minor, msg->length, retval); error = ERANGE; }