chiark / gitweb /
tripe-admin manpage: Generate a command and message summary.
[tripe] / peer.c
diff --git a/peer.c b/peer.c
index 5e4c4f9b1ac502b2fcf7240521ad28a9d3312b8e..50dec936a612aaf3795f990d2dab14f1a83c3224 100644 (file)
--- a/peer.c
+++ b/peer.c
@@ -53,17 +53,6 @@ const tunnel_ops *tunnels[] = {
 
 /*----- Main code ---------------------------------------------------------*/
 
 
 /*----- 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
 /* --- @p_pingtype@ --- *
  *
  * Arguments:  @unsigned msg@ = message type
@@ -111,7 +100,7 @@ static void p_ponged(peer *p, unsigned msg, buf *b)
   if (buf_getu32(b, &id) ||
       (magic = buf_get(b, sizeof(pg->magic))) == 0 ||
       BLEFT(b)) {
   if (buf_getu32(b, &id) ||
       (magic = buf_get(b, sizeof(pg->magic))) == 0 ||
       BLEFT(b)) {
-    a_warn("PEER %s malformed-%s", p->spec.name, p_pingtype(msg));
+    a_warn("PEER", "?PEER", p, "malformed-%s", p_pingtype(msg), A_END);
     return;
   }
 
     return;
   }
 
@@ -119,13 +108,16 @@ static void p_ponged(peer *p, unsigned msg, buf *b)
     if (pg->id == id)
       goto found;
   }
     if (pg->id == id)
       goto found;
   }
-  a_warn("PEER %s unexpected-%s 0x%08lx",
-        p->spec.name, p_pingtype(msg), (unsigned long)id);
+  a_warn("PEER",
+        "?PEER", p,
+        "unexpected-%s", p_pingtype(msg),
+        "0x%08lx", (unsigned long)id,
+        A_END);
   return;
 
 found:
   if (memcmp(magic, pg->magic, sizeof(pg->magic)) != 0) {
   return;
 
 found:
   if (memcmp(magic, pg->magic, sizeof(pg->magic)) != 0) {
-    a_warn("PEER %s corrupt-%s", p->spec.name, p_pingtype(msg));
+    a_warn("PEER", "?PEER", p, "corrupt-%s", p_pingtype(msg), A_END);
     return;
   }
   p_pingdone(pg, PING_OK);
     return;
   }
   p_pingdone(pg, PING_OK);
@@ -144,7 +136,7 @@ found:
 
 static void p_read(int fd, unsigned mode, void *v)
 {
 
 static void p_read(int fd, unsigned mode, void *v)
 {
-  peer *p;
+  peer *p = 0;
   addr a;
   size_t sz;
   ssize_t n;
   addr a;
   size_t sz;
   ssize_t n;
@@ -157,7 +149,29 @@ static void p_read(int fd, unsigned mode, void *v)
   sz = sizeof(addr);
   n = recvfrom(fd, buf_i, sizeof(buf_i), 0, &a.sa, &sz);
   if (n < 0) {
   sz = sizeof(addr);
   n = recvfrom(fd, buf_i, sizeof(buf_i), 0, &a.sa, &sz);
   if (n < 0) {
-    a_warn("PEER - socket-read-error -- %s", strerror(errno));
+    a_warn("PEER", "-", "socket-read-error", "?ERRNO", A_END);
+    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", A_END);
+      return;
+    }
+    a_notify("GREET",
+            "?B64", buf_i + 1, (size_t)(n - 1),
+            "?ADDR", &a,
+            A_END);
     return;
   }
 
     return;
   }
 
@@ -169,8 +183,7 @@ static void p_read(int fd, unsigned mode, void *v)
        p->spec.sa.sin.sin_port == a.sin.sin_port)
       goto found;
   }
        p->spec.sa.sin.sin_port == a.sin.sin_port)
       goto found;
   }
-  a_warn("PEER - unexpected-source INET %s %u",
-        inet_ntoa(a.sin.sin_addr), (unsigned)ntohs(a.sin.sin_port));
+  a_warn("PEER", "-", "unexpected-source", "?ADDR", &a, A_END);
   return;
 
 found:
   return;
 
 found:
@@ -186,20 +199,24 @@ found:
   p->st.sz_in += n;
   buf_init(&b, buf_i, n);
   if ((ch = buf_getbyte(&b)) < 0) {
   p->st.sz_in += n;
   buf_init(&b, buf_i, n);
   if ((ch = buf_getbyte(&b)) < 0) {
-    a_warn("PEER %s bad-packet no-type", p->spec.name);
+    a_warn("PEER", "?PEER", p, "bad-packet", "no-type", A_END);
     return;
   }
   switch (ch & MSG_CATMASK) {
     case MSG_PACKET:
       if (ch & MSG_TYPEMASK) {
     return;
   }
   switch (ch & MSG_CATMASK) {
     case MSG_PACKET:
       if (ch & MSG_TYPEMASK) {
-       a_warn("PEER %s bad-packet unknown-type 0x%02x", p->spec.name, ch);
+       a_warn("PEER",
+              "?PEER", p,
+              "bad-packet",
+              "unknown-type", "0x%02x", ch,
+              A_END);
        p->st.n_reject++;
        return;
       }
       buf_init(&bb, buf_o, sizeof(buf_o));
       if (ksl_decrypt(&p->ks, MSG_PACKET, &b, &bb)) {
        p->st.n_reject++;
        p->st.n_reject++;
        return;
       }
       buf_init(&bb, buf_o, sizeof(buf_o));
       if (ksl_decrypt(&p->ks, MSG_PACKET, &b, &bb)) {
        p->st.n_reject++;
-       a_warn("PEER %s decrypt-failed", p->spec.name);
+       a_warn("PEER", "?PEER", p, "decrypt-failed", A_END);
        return;
       }
       if (BOK(&bb)) {
        return;
       }
       if (BOK(&bb)) {
@@ -208,7 +225,7 @@ found:
        p->t->ops->inject(p->t, &bb);
       } else {
        p->st.n_reject++;
        p->t->ops->inject(p->t, &bb);
       } else {
        p->st.n_reject++;
-       a_warn("PEER %s packet-build-failed", p->spec.name);
+       a_warn("PEER", "?PEER", p, "packet-build-failed", A_END);
       }
       break;
     case MSG_KEYEXCH:
       }
       break;
     case MSG_KEYEXCH:
@@ -230,7 +247,7 @@ found:
          buf_init(&bb, buf_t, sizeof(buf_t));
          if (ksl_decrypt(&p->ks, ch, &b, &bb)) {
            p->st.n_reject++;
          buf_init(&bb, buf_t, sizeof(buf_t));
          if (ksl_decrypt(&p->ks, ch, &b, &bb)) {
            p->st.n_reject++;
-           a_warn("PEER %s decrypt-failed", p->spec.name);
+           a_warn("PEER", "?PEER", "decrypt-failed", A_END);
            return;
          }
          if (BOK(&bb)) {
            return;
          }
          if (BOK(&bb)) {
@@ -245,7 +262,7 @@ found:
          buf_init(&bb, buf_t, sizeof(buf_t));
          if (ksl_decrypt(&p->ks, ch, &b, &bb)) {
            p->st.n_reject++;
          buf_init(&bb, buf_t, sizeof(buf_t));
          if (ksl_decrypt(&p->ks, ch, &b, &bb)) {
            p->st.n_reject++;
-           a_warn("PEER %s decrypt-failed", p->spec.name);
+           a_warn("PEER", "?PEER", p, "decrypt-failed", A_END);
            return;
          }
          if (BOK(&bb)) {
            return;
          }
          if (BOK(&bb)) {
@@ -257,7 +274,11 @@ found:
       break;
     default:
       p->st.n_reject++;
       break;
     default:
       p->st.n_reject++;
-      a_warn("PEER %s bad-packet unknown-category 0x%02x", p->spec.name, ch);
+      a_warn("PEER",
+            "?PEER", p,
+            "bad-packet",
+            "unknown-category" "0x%02x", ch,
+            A_END);
       break;
   }
 }
       break;
   }
 }
@@ -294,15 +315,14 @@ static void p_setkatimer(peer *);
 static int p_dotxend(peer *p)
 {
   if (!BOK(&p->b)) {
 static int p_dotxend(peer *p)
 {
   if (!BOK(&p->b)) {
-    a_warn("PEER %s packet-build-failed", p->spec.name);
+    a_warn("PEER", "?PEER", p, "packet-build-failed", A_END);
     return (0);
   }
   IF_TRACING(T_PEER, trace_block(T_PACKET, "peer: sending packet",
                                 BBASE(&p->b), BLEN(&p->b)); )
   if (sendto(sock.fd, BBASE(&p->b), BLEN(&p->b),
             0, &p->spec.sa.sa, p->spec.sasz) < 0) {
     return (0);
   }
   IF_TRACING(T_PEER, trace_block(T_PACKET, "peer: sending packet",
                                 BBASE(&p->b), BLEN(&p->b)); )
   if (sendto(sock.fd, BBASE(&p->b), BLEN(&p->b),
             0, &p->spec.sa.sa, p->spec.sasz) < 0) {
-    a_warn("PEER %s socket-write-error -- %s",
-          p->spec.name, strerror(errno));
+    a_warn("PEER", "?PEER", p, "socket-write-error", "?ERRNO", A_END);
     return (0);
   } else {
     p->st.n_out++;
     return (0);
   } else {
     p->st.n_out++;
@@ -357,7 +377,6 @@ void p_pingdone(ping *p, int rc)
   if (rc != PING_TIMEOUT) sel_rmtimer(&p->t);
   T( trace(T_PEER, "peer: ping 0x%08lx done (rc = %d)",
           (unsigned long)p->id, rc); )
   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);
 }
 
   if (rc >= 0) p->func(rc, p->arg);
 }
 
@@ -435,12 +454,29 @@ int p_pingsend(peer *p, ping *pg, unsigned type,
   gettimeofday(&tv, 0);
   tv.tv_sec += timeout;
   sel_addtimer(&sel, &pg->t, &tv, p_pingtimeout, 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);
 }
 
   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
 /* --- @p_tun@ --- *
  *
  * Arguments:  @peer *p@ = pointer to peer block
@@ -659,19 +695,13 @@ peer *p_create(peerspec *spec)
   if (peers)
     peers->prev = p;
   peers = p;
   if (peers)
     peers->prev = p;
   peers = p;
-  switch (p->spec.sa.sa.sa_family) {
-    case AF_INET:
-      a_notify("ADD %s %s INET %s %u",
-              spec->name,
-              p->t->ops->ifname(p->t),
-              inet_ntoa(p->spec.sa.sin.sin_addr),
-              (unsigned)ntohs(p->spec.sa.sin.sin_port));
-      break;
-    default:
-      a_notify("ADD %s %s UNKNOWN", spec->name, p->t->ops->ifname(p->t));
-      break;
-  }
-  a_notify("KXSTART %s", spec->name);  /* Couldn't tell anyone before */
+  a_notify("ADD",
+           "?PEER", p,
+           "%s", p->t->ops->ifname(p->t),
+           "?ADDR", &p->spec.sa,
+           A_END);
+  a_notify("KXSTART", "?PEER", p, A_END);
+    /* Couldn't tell anyone before */
   return (p);
 
 tidy_1:
   return (p);
 
 tidy_1:
@@ -735,7 +765,7 @@ void p_destroy(peer *p)
   ping *pg, *ppg;
 
   T( trace(T_PEER, "peer: destroying peer `%s'", p->spec.name); )
   ping *pg, *ppg;
 
   T( trace(T_PEER, "peer: destroying peer `%s'", p->spec.name); )
-  a_notify("KILL %s", p->spec.name);
+  a_notify("KILL", "%s", p->spec.name, A_END);
   ksl_free(&p->ks);
   kx_free(&p->kx);
   p->t->ops->destroy(p->t);
   ksl_free(&p->ks);
   kx_free(&p->kx);
   p->t->ops->destroy(p->t);