bool deser_msg_addr(unsigned int protover, struct msg_addr *ma, struct const_buffer *buf) { memset(ma, 0, sizeof(*ma)); uint32_t vlen; if (!deser_varlen(&vlen, buf)) return false; ma->addrs = parr_new(vlen, free); unsigned int i; for (i = 0; i < vlen; i++) { struct bp_address *addr; addr = calloc(1, sizeof(*addr)); if (!deser_bp_addr(protover, addr, buf)) { free(addr); goto err_out; } parr_add(ma->addrs, addr); } return true; err_out: msg_addr_free(ma); return false; }
/** *struct msg_addr { parr *addrs; //bp_address array }; */ static bool nc_msg_addr(struct nc_conn *conn) { struct const_buffer buf = { conn->msg.data, conn->msg.hdr.data_len }; struct msg_addr ma; bool rc = false; msg_addr_init(&ma);/* just a memset 0*/ if (!deser_msg_addr(conn->protover, &ma, &buf)) goto out; unsigned int i; time_t cutoff = time(NULL) - (7 * 24 * 60 * 60); if (debugging) { unsigned int old = 0; for (i = 0; i < ma.addrs->len; i++) { struct bp_address *addr = parr_idx(ma.addrs, i); if (addr->nTime < cutoff) old++; } fprintf(plog, "net: %s addr(%zu addresses, %u old)\n", conn->addr_str, ma.addrs->len, old); } /* ignore ancient addresses */ if (conn->protover < CADDR_TIME_VERSION){ LOG("all addresses rejected because protover < CADDR_TIME_VERSION"); goto out_ok; } /* feed addresses to peer manager */ int l_cnt = 0; for (i = 0; i < ma.addrs->len; i++) { struct bp_address *addr = parr_idx(ma.addrs, i); if (addr->nTime > cutoff){ l_cnt++; peerman_add_addr(conn->nci->peers, addr, false); } } LOG("number of addresses added from peer:%d", l_cnt); out_ok: rc = true; out: msg_addr_free(&ma); return rc; }
static bool nc_msg_addr(struct nc_conn *conn) { struct const_buffer buf = { conn->msg.data, conn->msg.hdr.data_len }; struct msg_addr ma; bool rc = false; msg_addr_init(&ma); if (!deser_msg_addr(conn->protover, &ma, &buf)) goto out; unsigned int i; time_t cutoff = time(NULL) - (7 * 24 * 60 * 60); if (log_state->debug) { unsigned int old = 0; for (i = 0; i < ma.addrs->len; i++) { struct bp_address *addr = parr_idx(ma.addrs, i); if (addr->nTime < cutoff) old++; } log_debug("net: %s addr(%zu addresses, %u old)", conn->addr_str, ma.addrs->len, old); } /* ignore ancient addresses */ if (conn->protover < CADDR_TIME_VERSION) goto out_ok; /* feed addresses to peer manager */ for (i = 0; i < ma.addrs->len; i++) { struct bp_address *addr = parr_idx(ma.addrs, i); if (addr->nTime > cutoff) peerman_add_addr(conn->nci->peers, addr, false); } out_ok: rc = true; out: msg_addr_free(&ma); return rc; }