|
|
|
|
@ -419,7 +419,8 @@ static void owner_finish(struct nat_socket *state, uint8_t reason) {
|
|
|
|
|
state->active_ping = 0; state->phase = NAT_IDLE; state->reason = reason; |
|
|
|
|
if (reason == NAT_REASON_NO_OBSERVER || reason == NAT_REASON_NO_HELPER) state->fallback_allowed = 1; |
|
|
|
|
state->preferred_observer = 0; |
|
|
|
|
state->due = get_time_tb() + (state->socket->address_profile.source || !reason ? NAT_REFRESH_TB : NAT_RETRY_TB); |
|
|
|
|
state->due = get_time_tb() + (reason == NAT_REASON_ADDRESS_CHANGED ? 2500 : |
|
|
|
|
state->socket->address_profile.source || !reason ? NAT_REFRESH_TB : NAT_RETRY_TB); |
|
|
|
|
if (reason) { |
|
|
|
|
DEBUG_WARN(DEBUG_CATEGORY_NAT, "NAT round incomplete socket=%s generation=%016llx round=%016llx reason=%s", |
|
|
|
|
state->socket->name, (unsigned long long)state->socket->generation, |
|
|
|
|
@ -496,7 +497,8 @@ static void owner_ping_cb(int success, uint16_t rtt, void *arg, uint64_t nonce,
|
|
|
|
|
state->socket->name, state->phase, (unsigned long long)state->round, sockaddr_storage_to_str(&observed).str); |
|
|
|
|
if (state->phase == NAT_OBSERVE_B) { |
|
|
|
|
state->baseline = observed; |
|
|
|
|
if (state->socket->nat_addr.ss_family && !route_ping_addr_equal(&state->socket->nat_addr, &observed, 1)) |
|
|
|
|
if ((state->measured_profile.mapping == ADDRESS_MAP_UNCHANGED && !route_ping_addr_equal(&state->local, &observed, 1)) || |
|
|
|
|
(state->socket->nat_addr.ss_family && !route_ping_addr_equal(&state->socket->nat_addr, &observed, 1))) |
|
|
|
|
clear_profile(state, NAT_REASON_ADDRESS_CHANGED); |
|
|
|
|
if (owner_find(state)) owner_finish(state, NAT_REASON_CONTROL_LOST); |
|
|
|
|
return; |
|
|
|
|
@ -879,9 +881,13 @@ static void owner_start(struct nat_socket *state) {
|
|
|
|
|
} |
|
|
|
|
if (select_observer(state)) { |
|
|
|
|
if (state->reason != NAT_REASON_NO_OBSERVER) |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_NAT, "NAT profile remains UNKNOWN: no live observer socket=%s", state->socket->name); |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_NAT, "NAT recheck has no live observer socket=%s retained=%s/%s source=%s", state->socket->name, |
|
|
|
|
address_mapping_name(state->socket->address_profile.mapping), |
|
|
|
|
address_inbound_name(state->socket->address_profile.inbound), |
|
|
|
|
address_profile_source_name(state->socket->address_profile.source)); |
|
|
|
|
state->reason = NAT_REASON_NO_OBSERVER; state->fallback_allowed = 1; |
|
|
|
|
state->due = get_time_tb() + NAT_RETRY_TB; select_profile(state); return; |
|
|
|
|
select_profile(state); |
|
|
|
|
state->due = get_time_tb() + (state->socket->address_profile.source ? NAT_REFRESH_TB : NAT_RETRY_TB); return; |
|
|
|
|
} |
|
|
|
|
if (random_id(&state->round)) { state->reason = NAT_REASON_SEND_ERROR; state->due = get_time_tb() + NAT_RETRY_TB; return; } |
|
|
|
|
history_load(state); |
|
|
|
|
@ -972,8 +978,11 @@ void nat_detection_observed_by_peer(struct NAT_DETECTION *detector, struct ETCP_
|
|
|
|
|
if (!state) return; |
|
|
|
|
if ((state->measured_profile.mapping == ADDRESS_MAP_UNCHANGED && |
|
|
|
|
!route_ping_addr_equal(&state->local, observed, 1)) || |
|
|
|
|
(link->conn->nat_addr.ss_family && !route_ping_addr_equal(&link->conn->nat_addr, observed, 1))) |
|
|
|
|
(link->conn->nat_addr.ss_family && !route_ping_addr_equal(&link->conn->nat_addr, observed, 1))) { |
|
|
|
|
if (state->phase) owner_finish(state, NAT_REASON_ADDRESS_CHANGED); |
|
|
|
|
clear_profile(state, NAT_REASON_ADDRESS_CHANGED); |
|
|
|
|
state->due = get_time_tb() + 2500; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void nat_detection_socket_removed(struct NAT_DETECTION *detector, struct ETCP_SOCKET *socket) { |
|
|
|
|
|