From 5bb41301a3d2b183d260f41a9eff5819683f6fdc Mon Sep 17 00:00:00 2001 Message-Id: <5bb41301a3d2b183d260f41a9eff5819683f6fdc.1714074616.git.mdw@distorted.org.uk> From: Mark Wooding Date: Fri, 16 Feb 2001 21:40:24 +0000 Subject: [PATCH] Change key exchange message interface. Maintain statistics. Organization: Straylight/Edgeware From: mdw --- peer.c | 65 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/peer.c b/peer.c index 937d29f2..2f3d09ab 100644 --- a/peer.c +++ b/peer.c @@ -1,6 +1,6 @@ /* -*-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 * @@ -29,6 +29,9 @@ /*----- 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. * @@ -100,33 +103,41 @@ found: /* --- 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; } - switch (ch) { + switch (ch & MSG_CATMASK) { 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)); - 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; } - if (BOK(&bb)) + if (BOK(&bb)) { + p->st.n_ipin++; + p->st.sz_ipin += BSZ(&b); tun_inject(&p->t, &bb); - else + } else { + p->st.n_reject++; a_warn("packet build failed"); + } 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: + p->st.n_reject++; 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)); + else { + p->st.n_out++; + p->st.sz_out += BLEN(&p->b); + } } /* --- @p_tun@ --- * @@ -186,10 +201,13 @@ void p_tun(peer *p, buf *b) { 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); - if (BCUR(bb) > BBASE(bb)) + if (BOK(bb) && BLEN(bb)) { + p->st.n_ipout++; + p->st.sz_ipout += BLEN(bb); p_txend(p); + } } /* --- @p_interval@ --- * @@ -211,10 +229,19 @@ void p_interval(void) 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 @@ -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; + 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)) @@ -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); ) - ks_free(&p->ks); + ksl_free(&p->ks); kx_free(&p->kx); tun_destroy(&p->t); xfree(p->name); -- [mdw]