Keep detection attempt counters and network fixtures group-aware
This commit is contained in:
1 parent
0ee431b490
commit
96fa1990b0
2 files changed
+21
-5
No files matched your search
@@ -1060,9 +1060,9 @@ static void owner_start(struct nat_socket *state) {
|
|||||||
state->using_fallback = 0; state->prefer_fresh = 1;
|
state->using_fallback = 0; state->prefer_fresh = 1;
|
||||||
}
|
}
|
||||||
history_load(state);
|
history_load(state);
|
||||||
if (select_pair(state)) { owner_finish(state, state->reason); return; }
|
|
||||||
if (random_id(&state->round)) { owner_finish(state, NAT_REASON_SEND_ERROR); return; }
|
if (random_id(&state->round)) { owner_finish(state, NAT_REASON_SEND_ERROR); return; }
|
||||||
state->rounds++;
|
state->rounds++;
|
||||||
|
if (select_pair(state)) { owner_finish(state, state->reason); return; }
|
||||||
memset(&state->helper_seen, 0, sizeof(state->helper_seen)); memset(&state->alternate_seen, 0, sizeof(state->alternate_seen));
|
memset(&state->helper_seen, 0, sizeof(state->helper_seen)); memset(&state->alternate_seen, 0, sizeof(state->alternate_seen));
|
||||||
state->retries = 0; state->pre_received = 0; state->post_received = 0; state->filter_clean = 0; state->pre_healthy = 0;
|
state->retries = 0; state->pre_received = 0; state->post_received = 0; state->filter_clean = 0; state->pre_healthy = 0;
|
||||||
state->deadline = get_time_tb() + NAT_ROUND_TB; state->reason = NAT_REASON_NONE;
|
state->deadline = get_time_tb() + NAT_ROUND_TB; state->reason = NAT_REASON_NONE;
|
||||||
|
|||||||
@@ -199,9 +199,9 @@ static void statistics(struct lab *lab, uint64_t id, int loads) {
|
|||||||
stun.members, stun.generation, stun.evidence_id);
|
stun.members, stun.generation, stun.evidence_id);
|
||||||
json_string(sockaddr_storage_to_str(&stun.local).str); printf("}");
|
json_string(sockaddr_storage_to_str(&stun.local).str); printf("}");
|
||||||
}
|
}
|
||||||
printf(",\"phase\":%u,\"reason\":\"%s\",\"observer\":\"%" PRIu64 "\",\"helper\":\"%" PRIu64 "\","
|
printf(",\"phase\":%u,\"reason\":\"%s\",\"group\":\"%" PRIu64 "\",\"observer\":\"%" PRIu64 "\",\"helper\":\"%" PRIu64 "\","
|
||||||
"\"rounds\":%u,\"helper_reselections\":%u,\"history_complete\":%u,\"contacts\":[", status.phase,
|
"\"rounds\":%u,\"helper_reselections\":%u,\"history_complete\":%u,\"contacts\":[", status.phase,
|
||||||
nat_check_reason_name(status.reason), status.observer, status.helper, status.rounds,
|
nat_check_reason_name(status.reason), status.group_id, status.observer, status.helper, status.rounds,
|
||||||
status.helper_reselections, status.history_complete);
|
status.helper_reselections, status.history_complete);
|
||||||
uint8_t local[ROUTE_ADDR_WIRE_SIZE]; sqlite3_stmt *contacts = NULL; int contact_separator = 0;
|
uint8_t local[ROUTE_ADDR_WIRE_SIZE]; sqlite3_stmt *contacts = NULL; int contact_separator = 0;
|
||||||
if (!socket->is_tcp && !route_ping_addr_encode(local, &socket->local_addr) &&
|
if (!socket->is_tcp && !route_ping_addr_encode(local, &socket->local_addr) &&
|
||||||
@@ -322,6 +322,16 @@ static struct TOPO_NODE *parse_snapshot(struct lab *lab, const char *json) {
|
|||||||
|
|
||||||
/* Стенд переносит подписанные снимки через RPC только до запуска группы.
|
/* Стенд переносит подписанные снимки через RPC только до запуска группы.
|
||||||
* NCD handshake, наблюдения и весь трафик всё равно проходят по настоящей сети. */
|
* NCD handshake, наблюдения и весь трафик всё равно проходят по настоящей сети. */
|
||||||
|
/* NAT-стенд имеет настоящую общую группу; UP прямого транспорта начинает групповой обмен. */
|
||||||
|
static void nat_link_ready(struct NODE_CONN_DIRECT *handle, enum ncd_event event, void *arg) {
|
||||||
|
struct lab *lab = arg;
|
||||||
|
if (event != NCD_EVENT_UP) return;
|
||||||
|
struct TOPO_GROUP *group = topo_groups_find(lab->inst->topo_groups, TOPO_GROUP_UTUN);
|
||||||
|
struct ETCP_CONN *connection = node_conn_direct_get_conn(handle);
|
||||||
|
if (!group || !connection || topo_group_new_conn(group, connection))
|
||||||
|
DEBUG_ERROR(DEBUG_CATEGORY_NAT, "lab: NAT group connection unavailable");
|
||||||
|
}
|
||||||
|
|
||||||
static int nat_command(struct lab *lab, const char *json, const char *operation, uint64_t id) {
|
static int nat_command(struct lab *lab, const char *json, const char *operation, uint64_t id) {
|
||||||
if (!strcmp(operation, "chat_start")) {
|
if (!strcmp(operation, "chat_start")) {
|
||||||
int result = chat_service_start(lab->inst);
|
int result = chat_service_start(lab->inst);
|
||||||
@@ -329,6 +339,7 @@ static int nat_command(struct lab *lab, const char *json, const char *operation,
|
|||||||
reply(id, result); return 1;
|
reply(id, result); return 1;
|
||||||
}
|
}
|
||||||
if (!strcmp(operation, "nat_release")) {
|
if (!strcmp(operation, "nat_release")) {
|
||||||
|
if (topo_groups_find(lab->inst->topo_groups, TOPO_GROUP_UTUN)) topo_groups_remove_group(lab->inst->topo_groups, TOPO_GROUP_UTUN);
|
||||||
for (unsigned i = 0; i < lab->nat_handle_count; i++) node_conn_direct_close(lab->nat_handles[i]);
|
for (unsigned i = 0; i < lab->nat_handle_count; i++) node_conn_direct_close(lab->nat_handles[i]);
|
||||||
for (unsigned i = 0; i < lab->nat_record_count; i++) topo_node_registry_unref(lab->inst->topo_groups, lab->nat_records[i]);
|
for (unsigned i = 0; i < lab->nat_record_count; i++) topo_node_registry_unref(lab->inst->topo_groups, lab->nat_records[i]);
|
||||||
lab->nat_handle_count = lab->nat_record_count = 0; reply(id, 0); return 1;
|
lab->nat_handle_count = lab->nat_record_count = 0; reply(id, 0); return 1;
|
||||||
@@ -369,7 +380,7 @@ static int nat_command(struct lab *lab, const char *json, const char *operation,
|
|||||||
if (!socket) { DEBUG_ERROR(DEBUG_CATEGORY_NAT, "lab: native link source/handle unavailable"); result = -1; }
|
if (!socket) { DEBUG_ERROR(DEBUG_CATEGORY_NAT, "lab: native link source/handle unavailable"); result = -1; }
|
||||||
else {
|
else {
|
||||||
struct NODE_CONN_DIRECT *handle = NULL;
|
struct NODE_CONN_DIRECT *handle = NULL;
|
||||||
int opened = node_conn_direct_open_node(lab->inst, node->node_id, NULL, NULL, &handle, node, socket);
|
int opened = node_conn_direct_open_node(lab->inst, node->node_id, nat_link_ready, lab, &handle, node, socket);
|
||||||
if (opened == NCD_ERR || !handle) result = -1;
|
if (opened == NCD_ERR || !handle) result = -1;
|
||||||
else lab->nat_handles[lab->nat_handle_count++] = handle;
|
else lab->nat_handles[lab->nat_handle_count++] = handle;
|
||||||
}
|
}
|
||||||
@@ -518,7 +529,12 @@ int main(int argc, char **argv) {
|
|||||||
if (!lab->inst || utun_core_start(lab->inst) || (!core_only && chat_service_start(lab->inst))) {
|
if (!lab->inst || utun_core_start(lab->inst) || (!core_only && chat_service_start(lab->inst))) {
|
||||||
DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "lab: service startup failed"); return 1;
|
DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "lab: service startup failed"); return 1;
|
||||||
}
|
}
|
||||||
if (core_only) nat_detection_set_automatic(lab->inst->nat_det, 0);
|
if (core_only) {
|
||||||
|
nat_detection_set_automatic(lab->inst->nat_det, 0);
|
||||||
|
if (!topo_groups_create_group(lab->inst->topo_groups, TOPO_GROUP_UTUN, TOPO_GROUP_TYPE_UTUN, "")) {
|
||||||
|
DEBUG_ERROR(DEBUG_CATEGORY_NAT, "lab: NAT control group creation failed"); return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
debug_enable_console(0);
|
debug_enable_console(0);
|
||||||
if (!core_only) stream_set_event_callback(lab->inst, event, lab);
|
if (!core_only) stream_set_event_callback(lab->inst, event, lab);
|
||||||
if (fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | O_NONBLOCK) < 0) {
|
if (fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | O_NONBLOCK) < 0) {
|
||||||
|
|||||||
Reference in new issue
Block a user