/*----- 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
static void p_read(int fd, unsigned mode, void *v)
{
- peer *p;
+ peer *p = 0;
addr a;
size_t sz;
ssize_t n;
return;
}
+ /* --- If the packet is a greeting, don't check peers --- */
+
+ if (n && buf_i[0] == (MSG_MISC | MISC_GREET)) {
+ IF_TRACING(T_PEER, {
+ trace(T_PEER, "peer: greeting received from INET %s %u",
+ inet_ntoa(a.sin.sin_addr),
+ (unsigned)ntohs(a.sin.sin_port));
+ trace_block(T_PACKET, "peer: greeting contents", buf_i, n);
+ })
+ buf_init(&b, buf_i, n);
+ buf_getbyte(&b);
+ if (c_check(&b) || BLEFT(&b)) {
+ a_warn("PEER - invalid-greeting");
+ return;
+ }
+ a_notify("GREET %s INET %s %u",
+ b64_encode(buf_i + 1, n - 1),
+ inet_ntoa(a.sin.sin_addr),
+ (unsigned)ntohs(a.sin.sin_port));
+ return;
+ }
+
/* --- Find the appropriate peer --- */
assert(a.sa.sa_family == AF_INET);
if (rc != PING_TIMEOUT) sel_rmtimer(&p->t);
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);
}
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);
}
+/* --- @p_greet@ --- *
+ *
+ * Arguments: @peer *p@ = peer to send to
+ * @const void *c@ = pointer to challenge
+ * @size_t sz@ = size of challenge
+ *
+ * Returns: ---
+ *
+ * Use: Sends a greeting packet.
+ */
+
+void p_greet(peer *p, const void *c, size_t sz)
+{
+ buf *b = p_txstart(p, MSG_MISC | MISC_GREET);
+ buf_put(b, c, sz);
+ p_txend(p);
+}
+
/* --- @p_tun@ --- *
*
* Arguments: @peer *p@ = pointer to peer block