bfd: Add bfd_wake_time() function.
authorAlex Wang <alexw@nicira.com>
Wed, 16 Oct 2013 03:32:32 +0000 (03:32 +0000)
committerEthan Jackson <ethan@nicira.com>
Thu, 17 Oct 2013 01:08:05 +0000 (18:08 -0700)
This commit adds a new function "bfd_wake_time()" that returns the
next wakeup time associated with the "struct bfd".

Signed-off-by: Alex Wang <alexw@nicira.com>
Signed-off-by: Ethan Jackson <ethan@nicira.com>
Acked-by: Ethan Jackson <ethan@nicira.com>
lib/bfd.c
lib/bfd.h

index 6c9e920..115053b 100644 (file)
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -446,16 +446,30 @@ bfd_unref(struct bfd *bfd) OVS_EXCLUDED(mutex)
 void
 bfd_wait(const struct bfd *bfd) OVS_EXCLUDED(mutex)
 {
-    ovs_mutex_lock(&mutex);
-    if (bfd->flags & FLAG_FINAL) {
-        poll_immediate_wake();
+    poll_timer_wait_until(bfd_wake_time(bfd));
+}
+
+/* Returns the next wake up time. */
+long long int
+bfd_wake_time(const struct bfd *bfd) OVS_EXCLUDED(mutex)
+{
+    long long int retval;
+
+    if (!bfd) {
+        return LLONG_MAX;
     }
 
-    poll_timer_wait_until(bfd->next_tx);
-    if (bfd->state > STATE_DOWN) {
-        poll_timer_wait_until(bfd->detect_time);
+    ovs_mutex_lock(&mutex);
+    if (bfd->flags & FLAG_FINAL) {
+        retval = 0;
+    } else {
+        retval = bfd->next_tx;
+        if (bfd->state > STATE_DOWN) {
+            retval = MIN(bfd->detect_time, retval);
+        }
     }
     ovs_mutex_unlock(&mutex);
+    return retval;
 }
 
 void
index 0e1e33d..f49a3d6 100644 (file)
--- a/lib/bfd.h
+++ b/lib/bfd.h
@@ -49,5 +49,5 @@ void bfd_unref(struct bfd *);
 bool bfd_forwarding(const struct bfd *);
 void bfd_get_status(const struct bfd *, struct smap *);
 void bfd_set_netdev(struct bfd *, const struct netdev *);
-
+long long int bfd_wake_time(const struct bfd *);
 #endif /* bfd.h */