X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdpif.c;h=4475913cea42037780271697f938d9c311c2c70e;hb=8850d6d2d1bc3629627d7f70005c8fe08415c4f7;hp=73ad5df00e26530bbdbc0aec5f556f52bf930331;hpb=064af42167bf4fc9aaea2702d80ce08074b889c0;p=openvswitch diff --git a/lib/dpif.c b/lib/dpif.c index 73ad5df0..4475913c 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -1,17 +1,17 @@ /* * Copyright (c) 2008, 2009 Nicira Networks. * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ #include @@ -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)