More support scripts and other cool stuff.
[tripe] / peer.c
diff --git a/peer.c b/peer.c
index 1542b35..5e4c4f9 100644 (file)
--- a/peer.c
+++ b/peer.c
@@ -53,6 +53,17 @@ const tunnel_ops *tunnels[] = {
 
 /*----- Main code ---------------------------------------------------------*/
 
+static void checktimers(void)
+{
+  sel_timer *t, **tt;
+
+  tt = &sel.timers;
+  while (*tt) {
+    assert((*tt)->prev == tt);
+    tt = &(*tt)->next;
+  }
+}
+
 /* --- @p_pingtype@ --- *
  *
  * Arguments:  @unsigned msg@ = message type
@@ -226,7 +237,7 @@ found:
            buf_flip(&bb);
            if (ksl_encrypt(&p->ks, MSG_MISC | MISC_EPONG, &bb,
                            p_txstart(p, MSG_MISC | MISC_EPONG)))
-             kx_start(&p->kx);
+             kx_start(&p->kx, 0);
            p_txend(p);
          }
          break;
@@ -340,12 +351,13 @@ static void p_pingwrite(ping *p, buf *b)
 
 void p_pingdone(ping *p, int rc)
 {
-  if (!p->p) return;
   if (p->prev) p->prev->next = p->next;
   else p->p->pings = p->next;
   if (p->next) p->next->prev = p->prev;
   if (rc != PING_TIMEOUT) sel_rmtimer(&p->t);
-  p->p = 0;
+  T( trace(T_PEER, "peer: ping 0x%08lx done (rc = %d)",
+          (unsigned long)p->id, rc); )
+checktimers();
   if (rc >= 0) p->func(rc, p->arg);
 }
 
@@ -389,8 +401,6 @@ int p_pingsend(peer *p, ping *pg, unsigned type,
   buf *b, bb;
   struct timeval tv;
 
-  assert(!pg->p);
-
   switch (type) {
     case MISC_PING:
       pg->msg = MISC_PONG;
@@ -405,7 +415,7 @@ int p_pingsend(peer *p, ping *pg, unsigned type,
       p_pingwrite(pg, &bb);
       buf_flip(&bb);
       if (ksl_encrypt(&p->ks, MSG_MISC | MISC_EPING, &bb, b))
-       kx_start(&p->kx);
+       kx_start(&p->kx, 0);
       if (!BOK(b))
        return (-1);
       p_txend(p);
@@ -420,10 +430,12 @@ int p_pingsend(peer *p, ping *pg, unsigned type,
   pg->p = p;
   pg->func = func;
   pg->arg = arg;
+  if (p->pings) p->pings->prev = pg;
   p->pings = pg;
   gettimeofday(&tv, 0);
   tv.tv_sec += timeout;
   sel_addtimer(&sel, &pg->t, &tv, p_pingtimeout, pg);
+checktimers();
   T( trace(T_PEER, "peer: send %s 0x%08lx to %s",
           p_pingtype(type), (unsigned long)pg->id, p->spec.name); )
   return (0);
@@ -445,7 +457,7 @@ void p_tun(peer *p, buf *b)
 
   TIMER;
   if (ksl_encrypt(&p->ks, MSG_PACKET, b, bb))
-    kx_start(&p->kx);
+    kx_start(&p->kx, 0);
   if (BOK(bb) && BLEN(bb)) {
     p->st.n_ipout++;
     p->st.sz_ipout += BLEN(bb);
@@ -453,6 +465,25 @@ void p_tun(peer *p, buf *b)
   }
 }
 
+/* --- @p_keyreload@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Forces a check of the daemon's keyring files.
+ */
+
+void p_keyreload(void)
+{
+  peer *p;
+
+  if (km_reload()) {
+    for (p = peers; p; p = p->next)
+      kx_newkeys(&p->kx);
+  }
+}
+
 /* --- @p_interval@ --- *
  *
  * Arguments:  ---
@@ -464,16 +495,11 @@ void p_tun(peer *p, buf *b)
 
 void p_interval(void)
 {
-  peer *p, *pp;
-  int reload;
+  peer *p;
 
-  reload = km_interval();
-  for (p = peers; p; p = pp) {
-    pp = p->next;
-    if (reload)
-      kx_newkeys(&p->kx);
+  p_keyreload();
+  for (p = peers; p; p = p->next)
     ksl_prune(&p->ks);
-  }
 }
 
 /* --- @p_stats@ --- *
@@ -667,6 +693,15 @@ tidy_0:
 
 const char *p_name(peer *p) { return (p->spec.name); }
 
+/* --- @p_spec@ --- *
+ *
+ * Arguments:  @peer *p@ = pointer to a peer block
+ *
+ * Returns:    Pointer to the peer's specification
+ */
+
+const peerspec *p_spec(peer *p) { return (&p->spec); }
+
 /* --- @p_find@ --- *
  *
  * Arguments:  @const char *name@ = name to look up