Skip to content

Commit

Permalink
bfd: Reference count 'struct bfd'.
Browse files Browse the repository at this point in the history
Signed-off-by: Ethan Jackson <[email protected]>
Acked-by: Ben Pfaff <[email protected]>
  • Loading branch information
ejj committed Jun 28, 2013
1 parent 8e9a73f commit 92cfab8
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 5 deletions.
33 changes: 28 additions & 5 deletions lib/bfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,8 @@ struct bfd {
long long int last_tx; /* Last TX time. */
long long int next_tx; /* Next TX time. */
long long int detect_time; /* RFC 5880 6.8.4 Detection time. */

int ref_cnt;
};

static bool bfd_in_poll(const struct bfd *);
Expand Down Expand Up @@ -248,11 +250,7 @@ bfd_configure(struct bfd *bfd, const char *name,
}

if (!cfg || !smap_get_bool(cfg, "enable", false)) {
if (bfd) {
hmap_remove(&all_bfds, &bfd->node);
free(bfd->name);
free(bfd);
}
bfd_unref(bfd);
return NULL;
}

Expand All @@ -265,6 +263,7 @@ bfd_configure(struct bfd *bfd, const char *name,
bfd->diag = DIAG_NONE;
bfd->min_tx = 1000;
bfd->mult = 3;
bfd->ref_cnt = 1;

/* RFC 5881 section 4
* The source port MUST be in the range 49152 through 65535. The same
Expand Down Expand Up @@ -309,6 +308,30 @@ bfd_configure(struct bfd *bfd, const char *name,
return bfd;
}

struct bfd *
bfd_ref(const struct bfd *bfd_)
{
struct bfd *bfd = CONST_CAST(struct bfd *, bfd_);
if (bfd) {
ovs_assert(bfd->ref_cnt > 0);
bfd->ref_cnt++;
}
return bfd;
}

void
bfd_unref(struct bfd *bfd)
{
if (bfd) {
ovs_assert(bfd->ref_cnt > 0);
if (!--bfd->ref_cnt) {
hmap_remove(&all_bfds, &bfd->node);
free(bfd->name);
free(bfd);
}
}
}

void
bfd_wait(const struct bfd *bfd)
{
Expand Down
2 changes: 2 additions & 0 deletions lib/bfd.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ void bfd_process_packet(struct bfd *, const struct flow *,

struct bfd *bfd_configure(struct bfd *, const char *name,
const struct smap *smap);
struct bfd *bfd_ref(const struct bfd *);
void bfd_unref(struct bfd *);

bool bfd_forwarding(const struct bfd *);
void bfd_get_status(const struct bfd *, struct smap *);
Expand Down

0 comments on commit 92cfab8

Please sign in to comment.