chiark / gitweb /
Allow admin clients to filter out async messages. Send notifications
[tripe] / peer.c
diff --git a/peer.c b/peer.c
index e9fd280ce665df81fe6e999093dbe8e67434a4be..1469a3a86340995a4baa6340d46821e1d6977e0f 100644 (file)
--- a/peer.c
+++ b/peer.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: peer.c,v 1.9 2003/07/13 11:19:49 mdw Exp $
+ * $Id$
  *
  * Communication with the peer
  *
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Revision history --------------------------------------------------* 
- *
- * $Log: peer.c,v $
- * Revision 1.9  2003/07/13 11:19:49  mdw
- * Incopatible protocol fix!  Include message type code under MAC tag to prevent
- * cut-and-paste from key-exchange messages to general packet transport.
- *
- * Revision 1.8  2003/05/16 12:09:03  mdw
- * Allow binding to a chosen address.
- *
- * Revision 1.7  2003/04/15 14:12:05  mdw
- * Insert a newline to improve readability.
- *
- * Revision 1.6  2001/06/19 22:07:59  mdw
- * Use magic number for packet size.
- *
- * Revision 1.5  2001/03/03 11:15:19  mdw
- * Set the socket send and receive buffers to maximum.  At least this way,
- * we won't drop large packets on the floor.  If the administrator wants to
- * prevent fragmentation of TrIPE messages, he can lower the MTU on the
- * tunnel interface.  Getting path-MTU stuff out of the kernel is too much
- * system-specific hard work for this program.
- *
- * Revision 1.4  2001/02/16 21:40:24  mdw
- * Change key exchange message interface.  Maintain statistics.
- *
- * Revision 1.3  2001/02/04 17:10:58  mdw
- * Make file descriptors be nonblocking and close-on-exec.
- *
- * Revision 1.2  2001/02/03 22:40:29  mdw
- * Put timer information into the entropy pool when packets are received
- * and on similar events.  Reseed the generator on the interval timer.
- *
- * Revision 1.1  2001/02/03 20:26:37  mdw
- * Initial checkin.
- *
- */
-
 /*----- Header files ------------------------------------------------------*/
 
 #include "tripe.h"
@@ -101,7 +63,7 @@ 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) {
-    a_warn("error reading socket: %s", strerror(errno));
+    a_warn("PEER - socket-read-error -- %s", strerror(errno));
     return;
   }
 
@@ -113,8 +75,8 @@ static void p_read(int fd, unsigned mode, void *v)
        p->peer.sin.sin_port == a.sin.sin_port)
       goto found;
   }
-  a_warn("packet from unexpected peer: %s:%u",
-       inet_ntoa(a.sin.sin_addr), (unsigned)ntohs(a.sin.sin_port));
+  a_warn("PEER - unexpected-source INET %s %u",
+        inet_ntoa(a.sin.sin_addr), (unsigned)ntohs(a.sin.sin_port));
   return;
 
 found:
@@ -128,20 +90,20 @@ found:
   p->st.sz_in += n;
   buf_init(&b, buf_i, n);
   if ((ch = buf_getbyte(&b)) < 0) {
-    a_warn("bad packet from `%s': no type byte", p->name);
+    a_warn("PEER %s bad-packet no-type", p->name);
     return;
   }
   switch (ch & MSG_CATMASK) {
     case MSG_PACKET:
       if (ch & MSG_TYPEMASK) {
-       a_warn("unknown packet type from `%s'", p->name);
+       a_warn("PEER %s bad-packet unknown-type 0x%02x", p->name, ch);
        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("couldn't decrypt inbound packet from `%s'", p->name);
+       a_warn("PEER %s decrypt-failed", p->name);
        return;
       }
       if (BOK(&bb)) {
@@ -150,7 +112,7 @@ found:
        tun_inject(&p->t, &bb);
       } else {
        p->st.n_reject++;
-       a_warn("packet build failed");
+       a_warn("PEER %s packet-build-failed", p->name);
       }
       break;
     case MSG_KEYEXCH:
@@ -158,7 +120,7 @@ found:
       break;
     default:
       p->st.n_reject++;
-      a_warn("bad packet from `%s': unknown packet type", p->name);
+      a_warn("PEER %s bad-packet unknown-category 0x%02x", p->name, ch);
       break;
   }
 }
@@ -193,14 +155,14 @@ buf *p_txstart(peer *p, unsigned msg)
 void p_txend(peer *p)
 {
   if (!BOK(&p->b)) {
-    a_warn("packet build failed");
+    a_warn("PEER %s packet-build-failed", p->name);
     return;
   }
   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->peer.sa, p->sasz) < 0)
-    a_warn("packet send to `%s' failed: %s", p->name, strerror(errno));
+    a_warn("PEER %s socket-write-error -- %s", p->name, strerror(errno));
   else {
     p->st.n_out++;
     p->st.sz_out += BLEN(&p->b);
@@ -373,6 +335,17 @@ peer *p_create(const char *name, struct sockaddr *sa, size_t sz)
   if (peers)
     peers->prev = p;
   peers = p;
+  switch (p->peer.sa.sa_family) {
+    case AF_INET:
+      a_notify("ADD %s INET %s %u",
+              name,
+              inet_ntoa(p->peer.sin.sin_addr),
+              (unsigned)ntohs(p->peer.sin.sin_port));
+      break;
+    default:
+      a_notify("ADD %s UNKNOWN", name);
+      break;
+  }
   return (p);
 
 tidy_1:
@@ -423,6 +396,7 @@ peer *p_find(const char *name)
 void p_destroy(peer *p)
 {
   T( trace(T_PEER, "peer: destroying peer `%s'", p->name); )
+  a_notify("KILL %s", p->name);
   ksl_free(&p->ks);
   kx_free(&p->kx);
   tun_destroy(&p->t);