52 lines
2.0 KiB
C
52 lines
2.0 KiB
C
/* Профиль конкретного endpoint: изменение адреса и доступность входа независимы.
|
|
* Измерение ETCP действует до изменения endpoint или нового результата; STUN — временная оценка того же IP/netif.
|
|
* Профиль помогает выбирать попытки; работоспособность подтверждает транспорт. */
|
|
#ifndef ADDRESS_PROFILE_H
|
|
#define ADDRESS_PROFILE_H
|
|
|
|
#include <stdint.h>
|
|
|
|
enum address_mapping {
|
|
ADDRESS_MAP_UNKNOWN,
|
|
ADDRESS_MAP_UNCHANGED,
|
|
ADDRESS_MAP_EIM,
|
|
ADDRESS_MAP_DEPENDENT
|
|
};
|
|
|
|
enum address_inbound {
|
|
ADDRESS_IN_UNKNOWN,
|
|
ADDRESS_IN_OPEN,
|
|
ADDRESS_IN_CONTACT
|
|
};
|
|
|
|
enum address_profile_source { ADDRESS_SOURCE_NONE, ADDRESS_SOURCE_ETCP, ADDRESS_SOURCE_STUN };
|
|
|
|
struct address_profile {
|
|
uint8_t mapping;
|
|
uint8_t inbound;
|
|
uint8_t source; /* ETCP — измерение рабочего endpoint; STUN — предварительный EIM? с неизвестным входом. */
|
|
};
|
|
|
|
static inline const char *address_mapping_name(uint8_t value) {
|
|
static const char *const names[] = {"UNKNOWN", "UNCHANGED", "EIM", "DEPENDENT"};
|
|
return value <= ADDRESS_MAP_DEPENDENT ? names[value] : "INVALID";
|
|
}
|
|
|
|
static inline const char *address_inbound_name(uint8_t value) {
|
|
static const char *const names[] = {"UNKNOWN", "OPEN", "CONTACT_REQUIRED"};
|
|
return value <= ADDRESS_IN_CONTACT ? names[value] : "INVALID";
|
|
}
|
|
|
|
static inline const char *address_profile_source_name(uint8_t value) {
|
|
static const char *const names[] = {"NONE", "ETCP", "STUN"};
|
|
return value <= ADDRESS_SOURCE_STUN ? names[value] : "INVALID";
|
|
}
|
|
|
|
static inline int address_profile_valid(const struct address_profile *profile) {
|
|
return profile && profile->mapping <= ADDRESS_MAP_DEPENDENT && profile->inbound <= ADDRESS_IN_CONTACT &&
|
|
profile->source <= ADDRESS_SOURCE_STUN &&
|
|
(profile->source || (!profile->mapping && !profile->inbound));
|
|
}
|
|
|
|
#endif
|