chiark / gitweb /
Change key exchange message interface. Maintain statistics.
authormdw <mdw>
Fri, 16 Feb 2001 21:40:24 +0000 (21:40 +0000)
committermdw <mdw>
Fri, 16 Feb 2001 21:40:24 +0000 (21:40 +0000)
peer.c

diff --git a/peer.c b/peer.c
index 937d29f2b3c66b4b034f3bb2c8334f9eba9e8c6a..2f3d09ab2308bb5eee508d262c5059865d5379e7 100644 (file)
--- a/peer.c
+++ b/peer.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
 /* -*-c-*-
  *
- * $Id: peer.c,v 1.3 2001/02/04 17:10:58 mdw Exp $
+ * $Id: peer.c,v 1.4 2001/02/16 21:40:24 mdw Exp $
  *
  * Communication with the peer
  *
  *
  * Communication with the peer
  *
@@ -29,6 +29,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: peer.c,v $
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: peer.c,v $
+ * 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.3  2001/02/04 17:10:58  mdw
  * Make file descriptors be nonblocking and close-on-exec.
  *
@@ -100,33 +103,41 @@ found:
 
   /* --- Pick the packet apart --- */
 
 
   /* --- Pick the packet apart --- */
 
+  p->st.t_last = time(0);
+  p->st.n_in++;
+  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);
     return;
   }
   buf_init(&b, buf_i, n);
   if ((ch = buf_getbyte(&b)) < 0) {
     a_warn("bad packet from `%s': no type byte", p->name);
     return;
   }
-  switch (ch) {
+  switch (ch & MSG_CATMASK) {
     case MSG_PACKET:
     case MSG_PACKET:
+      if (ch & MSG_TYPEMASK) {
+       a_warn("unknown packet type from `%s'", p->name);
+       p->st.n_reject++;
+       return;
+      }
       buf_init(&bb, buf_o, sizeof(buf_o));
       buf_init(&bb, buf_o, sizeof(buf_o));
-      if (ks_decrypt(&p->ks, &b, &bb)) {
-       a_warn("couldn't decrypt inbound packet");
+      if (ksl_decrypt(&p->ks, &b, &bb)) {
+       p->st.n_reject++;
+       a_warn("couldn't decrypt inbound packet from `%s'", p->name);
        return;
       }
        return;
       }
-      if (BOK(&bb))
+      if (BOK(&bb)) {
+       p->st.n_ipin++;
+       p->st.sz_ipin += BSZ(&b);
        tun_inject(&p->t, &bb);
        tun_inject(&p->t, &bb);
-      else
+      } else {
+       p->st.n_reject++;
        a_warn("packet build failed");
        a_warn("packet build failed");
+      }
       break;
       break;
-    case MSG_PRECHALLENGE:
-      kx_prechallenge(&p->kx, &b);
-      break;
-    case MSG_CHALLENGE:
-      kx_challenge(&p->kx, &b);
-      break;
-    case MSG_RESPONSE:
-      kx_response(&p->kx, &b);
+    case MSG_KEYEXCH:
+      kx_message(&p->kx, ch & MSG_TYPEMASK, &b);
       break;
     default:
       break;
     default:
+      p->st.n_reject++;
       a_warn("bad packet from `%s': unknown packet type", p->name);
       break;
   }
       a_warn("bad packet from `%s': unknown packet type", p->name);
       break;
   }
@@ -170,6 +181,10 @@ void p_txend(peer *p)
   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));
   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));
+  else {
+    p->st.n_out++;
+    p->st.sz_out += BLEN(&p->b);
+  }
 }
 
 /* --- @p_tun@ --- *
 }
 
 /* --- @p_tun@ --- *
@@ -186,10 +201,13 @@ void p_tun(peer *p, buf *b)
 {
   buf *bb = p_txstart(p, MSG_PACKET);
   TIMER;
 {
   buf *bb = p_txstart(p, MSG_PACKET);
   TIMER;
-  if (ks_encrypt(&p->ks, b, bb))
+  if (ksl_encrypt(&p->ks, b, bb))
     kx_start(&p->kx);
     kx_start(&p->kx);
-  if (BCUR(bb) > BBASE(bb))
+  if (BOK(bb) && BLEN(bb)) {
+    p->st.n_ipout++;
+    p->st.sz_ipout += BLEN(bb);
     p_txend(p);
     p_txend(p);
+  }
 }
 
 /* --- @p_interval@ --- *
 }
 
 /* --- @p_interval@ --- *
@@ -211,10 +229,19 @@ void p_interval(void)
     pp = p->next;
     if (reload)
       kx_newkeys(&p->kx);
     pp = p->next;
     if (reload)
       kx_newkeys(&p->kx);
-    ks_prune(&p->ks);
+    ksl_prune(&p->ks);
   }
 }
 
   }
 }
 
+/* --- @p_stats@ --- *
+ *
+ * Arguments:  @peer *p@ = pointer to a peer block
+ *
+ * Returns:    A pointer to the peer's statistics.
+ */
+
+stats *p_stats(peer *p) { return (&p->st); }
+
 /* --- @p_ifname@ --- *
  *
  * Arguments:  @peer *p@ = pointer to a peer block
 /* --- @p_ifname@ --- *
  *
  * Arguments:  @peer *p@ = pointer to a peer block
@@ -300,6 +327,8 @@ peer *p_create(const char *name, struct sockaddr *sa, size_t sz)
   p->prev = 0;
   memcpy(&p->peer.sa, sa, sz);
   p->sasz = sz;
   p->prev = 0;
   memcpy(&p->peer.sa, sa, sz);
   p->sasz = sz;
+  memset(&p->st, 0, sizeof(stats));
+  p->st.t_start = time(0);
   if (kx_init(&p->kx, p, &p->ks))
     goto tidy_0;
   if (tun_create(&p->t, p))
   if (kx_init(&p->kx, p, &p->ks))
     goto tidy_0;
   if (tun_create(&p->t, p))
@@ -358,7 +387,7 @@ peer *p_find(const char *name)
 void p_destroy(peer *p)
 {
   T( trace(T_PEER, "peer: destroying peer `%s'", p->name); )
 void p_destroy(peer *p)
 {
   T( trace(T_PEER, "peer: destroying peer `%s'", p->name); )
-  ks_free(&p->ks);
+  ksl_free(&p->ks);
   kx_free(&p->kx);
   tun_destroy(&p->t);
   xfree(p->name);
   kx_free(&p->kx);
   tun_destroy(&p->t);
   xfree(p->name);