+ case MISC_WGT:
+ if (!p) goto unexp;
+ if (!(p->spec.f&PSF_EPHEM))
+ { a_warn("PEER", "?PEER", p, "unexpected-wgt", A_END); break; }
+ n = BLEFT(&b); if (n > WGTLEN) n = WGTLEN;
+ now = time(0);
+ q = buf_get(&b, n); assert(q);
+ for (i = 0; i < NWGT; i++) {
+ if (p->wgt[i].when != (time_t)-1 &&
+ now - p->wgt[i].when <= T_WGT &&
+ p->wgt[i].sz == n &&
+ MEMCMP(p->wgt[i].msg, ==, q, n))
+ goto found_wgt;
+ }
+ a_warn("PEER", "?PEER", p, "unrecognized-wgt", A_END);
+ break;
+ found_wgt:
+ if (p->spec.knock) {
+ T( trace(T_PEER, "peer: who-goes-there from peer: knocking"); )
+ kx_start(&p->kx, 0);
+ } else {
+ T( trace(T_PEER, "peer: who-goes-there from peer: notifying"); )
+ a_notify("WGT", "?PEER", p, A_END);
+ }
+ break;