uint8_t enc_key[CURVE25519_KEY_SIZE];
void *ret;
+ if (timestamp)
+ *timestamp = 0;
*data_len = 0;
if (op == PEX_MSG_UPDATE_RESPONSE) {
const struct pex_update_response *res = data;
data += sizeof(*res);
len -= sizeof(*res);
- } else if (op == PEX_MSG_UPDATE_RESPONSE_NO_DATA) {
+ } else if (op == PEX_MSG_UPDATE_RESPONSE_NO_DATA ||
+ op == PEX_MSG_UPDATE_RESPONSE_REFUSED) {
const struct pex_update_response_no_data *res = data;
if (len < sizeof(*res) || !res->cur_version)
if (!ctx)
return NULL;
+ if (timestamp)
+ *timestamp = be64_to_cpu(res->cur_version);
goto error;
} else {
return NULL;
D("receive update request, local version=%"PRIu64", remote version=%"PRIu64, net->net_data_version, req_version);
- if (req_version && req_version >= net->net_data_version) {
+ if (peer && req_version && req_version >= net->net_data_version) {
struct pex_update_response_no_data *res;
pex_msg_init_ext(net, PEX_MSG_UPDATE_RESPONSE_NO_DATA, !!addr);
if (req_version > net->net_data_version)
network_pex_send_update_request(net, peer, addr);
+ else if (!peer && net->net_data_len) {
+ struct pex_update_response_no_data *res;
+
+ pex_msg_init_ext(net, PEX_MSG_UPDATE_RESPONSE_REFUSED, !!addr);
+ res = pex_msg_append(sizeof(*res));
+ res->req_id = req->req_id;
+ res->cur_version = cpu_to_be64(net->net_data_version);
+ pex_msg_send_ext(net, peer, addr);
+ }
if (!peer || !net->net_data_len)
return;
return;
net_data = pex_msg_update_response_recv(data, len, op, &net_data_len, &version);
- if (!net_data)
+ if (!net_data) {
+ if (op == PEX_MSG_UPDATE_RESPONSE_REFUSED && net_data_len == -1 &&
+ version > net->net_data_version)
+ net->update_refused++;
return;
+ }
if (version <= net->net_data_version) {
free(net_data);
case PEX_MSG_UPDATE_RESPONSE:
case PEX_MSG_UPDATE_RESPONSE_DATA:
case PEX_MSG_UPDATE_RESPONSE_NO_DATA:
+ case PEX_MSG_UPDATE_RESPONSE_REFUSED:
network_pex_recv_update_response(net, data, hdr->len,
NULL, hdr->opcode);
break;
fallthrough;
case PEX_MSG_UPDATE_RESPONSE_DATA:
case PEX_MSG_UPDATE_RESPONSE_NO_DATA:
+ case PEX_MSG_UPDATE_RESPONSE_REFUSED:
network_pex_recv_update_response(net, data, hdr->len, addr, hdr->opcode);
break;
case PEX_MSG_ENDPOINT_PORT_NOTIFY:
str = blobmsg_alloc_string_buffer(buf, "local_address", INET6_ADDRSTRLEN);
inet_ntop(AF_INET6, &local->peer.local_addr.in6, str, INET6_ADDRSTRLEN);
blobmsg_add_string_buffer(buf);
+ } else {
+ if (net->net_data_len)
+ blobmsg_add_u8(buf, "no_local_host", true);
}
+ if (net->update_refused)
+ blobmsg_add_u32(buf, "update_refused", net->update_refused);
c = blobmsg_open_table(buf, "peers");
vlist_for_each_element(&net->peers, peer, node) {