X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdpif-netdev.c;h=1d496177e22a337a204cffdf7101e1adc1839b8c;hb=181aba2eb0dc0b2235eee33f8d87edd804362533;hp=816d4025f9d4bd770305b0f139f028182309411c;hpb=58fda1dab104041fc693032475ec4662c1a52849;p=openvswitch diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 816d4025..1d496177 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009 Nicira Networks. + * Copyright (c) 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -237,7 +237,7 @@ create_dp_netdev(const char *name, int dp_idx, struct dpif **dpifp) error = do_add_port(dp, name, ODP_PORT_INTERNAL, ODPP_LOCAL); if (error) { dp_netdev_free(dp); - return error; + return ENODEV; } *dpifp = create_dpif_netdev(dp); @@ -363,6 +363,7 @@ do_add_port(struct dp_netdev *dp, const char *devname, uint16_t flags, { bool internal = (flags & ODP_PORT_INTERNAL) != 0; struct dp_netdev_port *port; + struct netdev_options netdev_options; struct netdev *netdev; int mtu; int error; @@ -370,17 +371,17 @@ do_add_port(struct dp_netdev *dp, const char *devname, uint16_t flags, /* XXX reject devices already in some dp_netdev. */ /* Open and validate network device. */ - if (!internal) { - error = netdev_open(devname, NETDEV_ETH_TYPE_ANY, &netdev); + memset(&netdev_options, 0, sizeof netdev_options); + netdev_options.name = devname; + netdev_options.ethertype = NETDEV_ETH_TYPE_ANY; + netdev_options.may_create = true; + if (internal) { + netdev_options.type = "tap"; } else { - error = netdev_create(devname, "tap", NULL); - if (!error) { - error = netdev_open(devname, NETDEV_ETH_TYPE_ANY, &netdev); - if (error) { - netdev_destroy(devname); - } - } + netdev_options.may_open = true; } + + error = netdev_open(&netdev_options, &netdev); if (error) { return error; } @@ -487,9 +488,7 @@ do_del_port(struct dp_netdev *dp, uint16_t port_no) name = xstrdup(netdev_get_name(port->netdev)); netdev_close(port->netdev); - if (port->internal) { - netdev_destroy(name); - } + free(name); free(port);