X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/c71be7580b0f818492f5ceecb1a2b6ccb87c0712..1b9a78583fbff3967b91e128dd7f57fcbcdc8db9:/server/peer.c diff --git a/server/peer.c b/server/peer.c index 02fceed5..75f7acba 100644 --- a/server/peer.c +++ b/server/peer.c @@ -215,20 +215,21 @@ static int p_decrypt(peer **pp, addr *a, size_t n, /* --- See whether any mobile peer is interested --- */ - FOREACH_PEER(pp, { - if (pp == q || !(pp->spec.f & PSF_MOBILE)) continue; - if ((err = ksl_decrypt(&pp->ks, ty, bin, bout)) == KSERR_DECRYPT) { + p = 0; + FOREACH_PEER(qq, { + if (qq == q || !(qq->spec.f & PSF_MOBILE)) continue; + if ((err = ksl_decrypt(&qq->ks, ty, bin, bout)) == KSERR_DECRYPT) { T( trace(T_PEER, "peer: peer `%s' failed to decrypt", - p_name(pp)); ) + p_name(qq)); ) continue; } else { - p = pp; + p = qq; IF_TRACING(T_PEER, { if (!err) - trace(T_PEER, "peer: peer `%s' reports success", p_name(pp)); + trace(T_PEER, "peer: peer `%s' reports success", p_name(qq)); else { trace(T_PEER, "peer: peer `%s' reports decryption error %d", - p_name(pp), err); + p_name(qq), err); } }) break; @@ -239,7 +240,13 @@ static int p_decrypt(peer **pp, addr *a, size_t n, searched: if (!p) { - a_warn("PEER", "-", "unexpected-source", "?ADDR", a, A_END); + if (!q) + a_warn("PEER", "-", "unexpected-source", "?ADDR", a, A_END); + else { + a_warn("PEER", "?PEER", p, "decrypt-failed", + "error-code", "%d", err, A_END); + p_rxupdstats(q, n); + } return (-1); } @@ -252,6 +259,7 @@ searched: */ if (!err) { + *pp = p; if (!q) { T( trace(T_PEER, "peer: updating address for `%s'", p_name(p)); ) pa = am_find(&byaddr, a, sizeof(peer_byaddr), &f); assert(!f); @@ -812,6 +820,7 @@ unsigned p_port(void) static void p_keepalive(struct timeval *now, void *pv) { peer *p = pv; + p_txstart(p, MSG_MISC | MISC_NOP); p_dotxend(p); T( trace(T_PEER, "peer: sent keepalive to %s", p->spec.name); ) p_setkatimer(p); @@ -863,8 +872,8 @@ peer *p_create(peerspec *spec) T( trace(T_PEER, "peer: creating new peer `%s'", spec->name); ) p->spec = *spec; p->spec.name = (/*unconst*/ char *)SYM_NAME(p->byname); - if (spec->tag) - p->spec.tag = xstrdup(spec->tag); + if (spec->tag) p->spec.tag = xstrdup(spec->tag); + if (spec->privtag) p->spec.privtag = xstrdup(spec->privtag); p->ks = 0; p->pings = 0; p->ifname = 0; @@ -894,8 +903,7 @@ peer *p_create(peerspec *spec) return (p); tidy_4: - if (spec->t_ka) - sel_rmtimer(&p->tka); + if (spec->t_ka) sel_rmtimer(&p->tka); xfree(p->ifname); p->t->ops->destroy(p->t); tidy_3: @@ -903,6 +911,7 @@ tidy_3: tidy_2: am_remove(&byaddr, p->byaddr); if (p->spec.tag) xfree(p->spec.tag); + if (p->spec.privtag) xfree(p->spec.privtag); tidy_1: sym_remove(&byname, p->byname); tidy_0: @@ -930,6 +939,16 @@ const char *p_name(peer *p) const char *p_tag(peer *p) { return (p->spec.tag ? p->spec.tag : p->spec.name); } +/* --- @p_privtag@ --- * + * + * Arguments: @peer *p@ = pointer to a peer block + * + * Returns: A pointer to the peer's private key tag. + */ + +const char *p_privtag(peer *p) + { return (p->spec.privtag ? p->spec.privtag : tag_priv); } + /* --- @p_spec@ --- * * * Arguments: @peer *p@ = pointer to a peer block @@ -994,15 +1013,12 @@ void p_destroy(peer *p) a_notify("KILL", "%s", p->spec.name, A_END); ksl_free(&p->ks); kx_free(&p->kx); - if (p->spec.f & PSF_MOBILE) - nmobile--; - if (p->ifname) - xfree(p->ifname); - if (p->spec.tag) - xfree(p->spec.tag); + if (p->spec.f & PSF_MOBILE) nmobile--; + if (p->ifname) xfree(p->ifname); + if (p->spec.tag) xfree(p->spec.tag); + if (p->spec.privtag) xfree(p->spec.privtag); p->t->ops->destroy(p->t); - if (p->spec.t_ka) - sel_rmtimer(&p->tka); + if (p->spec.t_ka) sel_rmtimer(&p->tka); for (pg = p->pings; pg; pg = ppg) { ppg = pg->next; p_pingdone(pg, PING_PEERDIED);