Skip to content

Commit

Permalink
dpif: New function dpif_create_and_open().
Browse files Browse the repository at this point in the history
This function combines what dpif_create() and dpif_open() do.  It allows
us to factor a tiny amount of code out of the vswitch, but more importantly
this function is also useful in the following commit.
  • Loading branch information
blp committed Nov 23, 2009
1 parent 6bab379 commit efacbce
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 13 deletions.
24 changes: 23 additions & 1 deletion lib/dpif.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,13 +169,35 @@ dpif_open(const char *name, struct dpif **dpifp)
/* Tries to create and open a new datapath with the given 'name'. Will fail if
* a datapath named 'name' already exists. Returns 0 if successful, otherwise
* a positive errno value. On success stores a pointer to the datapath in
* '*dpifp', otherwise a null pointer.*/
* '*dpifp', otherwise a null pointer. */
int
dpif_create(const char *name, struct dpif **dpifp)
{
return do_open(name, true, dpifp);
}

/* Tries to open a datapath with the given 'name', creating it if it does not
* exist. Returns 0 if successful, otherwise a positive errno value. On
* success stores a pointer to the datapath in '*dpifp', otherwise a null
* pointer. */
int
dpif_create_and_open(const char *name, struct dpif **dpifp)
{
int error;

error = dpif_create(name, dpifp);
if (error == EEXIST || error == EBUSY) {
error = dpif_open(name, dpifp);
if (error) {
VLOG_WARN("datapath %s already exists but cannot be opened: %s",
name, strerror(error));
}
} else if (error) {
VLOG_WARN("failed to create datapath %s: %s", name, strerror(error));
}
return error;
}

/* Closes and frees the connection to 'dpif'. Does not destroy the datapath
* itself; call dpif_delete() first, instead, if that is desirable. */
void
Expand Down
1 change: 1 addition & 0 deletions lib/dpif.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ int dp_enumerate(struct svec *);

int dpif_open(const char *name, struct dpif **);
int dpif_create(const char *name, struct dpif **);
int dpif_create_and_open(const char *name, struct dpif **);
void dpif_close(struct dpif *);

const char *dpif_name(const struct dpif *);
Expand Down
15 changes: 3 additions & 12 deletions vswitchd/bridge.c
Original file line number Diff line number Diff line change
Expand Up @@ -968,21 +968,12 @@ bridge_create(const char *name)
assert(!bridge_lookup(name));
br = xcalloc(1, sizeof *br);

error = dpif_create(name, &br->dpif);
if (error == EEXIST || error == EBUSY) {
error = dpif_open(name, &br->dpif);
if (error) {
VLOG_ERR("datapath %s already exists but cannot be opened: %s",
name, strerror(error));
free(br);
return NULL;
}
dpif_flow_flush(br->dpif);
} else if (error) {
VLOG_ERR("failed to create datapath %s: %s", name, strerror(error));
error = dpif_create_and_open(name, &br->dpif);
if (error) {
free(br);
return NULL;
}
dpif_flow_flush(br->dpif);

error = ofproto_create(name, &bridge_ofhooks, br, &br->ofproto);
if (error) {
Expand Down

0 comments on commit efacbce

Please sign in to comment.