chiark
/
gitweb
/
~mdw
/
tripe
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
426c0bc
)
Change key exchange message interface. Maintain statistics.
author
mdw
<mdw>
Fri, 16 Feb 2001 21:40:24 +0000
(21:40 +0000)
committer
mdw
<mdw>
Fri, 16 Feb 2001 21:40:24 +0000
(21:40 +0000)
peer.c
patch
|
blob
|
blame
|
history
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 (ks
l
_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);
+ ks
l
_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);
+ ks
l
_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);