/*----- 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
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;
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);
}
buf *b, bb;
struct timeval tv;
- assert(!pg->p);
-
switch (type) {
case MISC_PING:
pg->msg = MISC_PONG;
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);
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);
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);
}
}
+/* --- @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: ---
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@ --- *
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