mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-25 07:07:52 +01:00
Split client-specific and server-specific parts of port_cfg_t
Also, apply this cocci script to transform accesses. (Plus manual migration for accesses inside smartlist_foreach loops.) @@ port_cfg_t *cfgx; @@ cfgx-> +server_cfg. \( no_advertise \| no_listen \| all_addrs \| bind_ipv4_only \| bind_ipv6_only \) @@ port_cfg_t *cfgx; @@ cfgx-> +entry_cfg. \( isolation_flags \| session_group \| socks_prefer_no_auth \| ipv4_traffic \| ipv6_traffic \| prefer_ipv6 \| cache_ipv4_answers \| cache_ipv6_answers \| use_cached_ipv4_answers \| use_cached_ipv6_answers \| prefer_ipv6_virtaddr \)
This commit is contained in:
parent
fc0febc5c6
commit
f444f2b1d3
4 changed files with 82 additions and 72 deletions
|
@ -5476,9 +5476,9 @@ static port_cfg_t *
|
|||
port_cfg_new(void)
|
||||
{
|
||||
port_cfg_t *cfg = tor_malloc_zero(sizeof(port_cfg_t));
|
||||
cfg->ipv4_traffic = 1;
|
||||
cfg->cache_ipv4_answers = 1;
|
||||
cfg->prefer_ipv6_virtaddr = 1;
|
||||
cfg->entry_cfg.ipv4_traffic = 1;
|
||||
cfg->entry_cfg.cache_ipv4_answers = 1;
|
||||
cfg->entry_cfg.prefer_ipv6_virtaddr = 1;
|
||||
return cfg;
|
||||
}
|
||||
|
||||
|
@ -5685,10 +5685,10 @@ parse_port_config(smartlist_t *out,
|
|||
cfg->type = listener_type;
|
||||
cfg->port = mainport;
|
||||
tor_addr_make_unspec(&cfg->addr); /* Server ports default to 0.0.0.0 */
|
||||
cfg->no_listen = 1;
|
||||
cfg->bind_ipv4_only = 1;
|
||||
cfg->ipv4_traffic = 1;
|
||||
cfg->prefer_ipv6_virtaddr = 1;
|
||||
cfg->server_cfg.no_listen = 1;
|
||||
cfg->server_cfg.bind_ipv4_only = 1;
|
||||
cfg->entry_cfg.ipv4_traffic = 1;
|
||||
cfg->entry_cfg.prefer_ipv6_virtaddr = 1;
|
||||
smartlist_add(out, cfg);
|
||||
}
|
||||
|
||||
|
@ -5705,9 +5705,9 @@ parse_port_config(smartlist_t *out,
|
|||
cfg->type = listener_type;
|
||||
cfg->port = port ? port : mainport;
|
||||
tor_addr_copy(&cfg->addr, &addr);
|
||||
cfg->session_group = SESSION_GROUP_UNSET;
|
||||
cfg->isolation_flags = ISO_DEFAULT;
|
||||
cfg->no_advertise = 1;
|
||||
cfg->entry_cfg.session_group = SESSION_GROUP_UNSET;
|
||||
cfg->entry_cfg.isolation_flags = ISO_DEFAULT;
|
||||
cfg->server_cfg.no_advertise = 1;
|
||||
smartlist_add(out, cfg);
|
||||
}
|
||||
}
|
||||
|
@ -5731,8 +5731,8 @@ parse_port_config(smartlist_t *out,
|
|||
cfg->type = listener_type;
|
||||
cfg->port = defaultport;
|
||||
tor_addr_parse(&cfg->addr, defaultaddr);
|
||||
cfg->session_group = SESSION_GROUP_UNSET;
|
||||
cfg->isolation_flags = ISO_DEFAULT;
|
||||
cfg->entry_cfg.session_group = SESSION_GROUP_UNSET;
|
||||
cfg->entry_cfg.isolation_flags = ISO_DEFAULT;
|
||||
smartlist_add(out, cfg);
|
||||
}
|
||||
return 0;
|
||||
|
@ -5962,24 +5962,24 @@ parse_port_config(smartlist_t *out,
|
|||
tor_addr_copy(&cfg->addr, &addr);
|
||||
cfg->port = port;
|
||||
cfg->type = listener_type;
|
||||
cfg->isolation_flags = isolation;
|
||||
cfg->session_group = sessiongroup;
|
||||
cfg->no_advertise = no_advertise;
|
||||
cfg->no_listen = no_listen;
|
||||
cfg->all_addrs = all_addrs;
|
||||
cfg->bind_ipv4_only = bind_ipv4_only;
|
||||
cfg->bind_ipv6_only = bind_ipv6_only;
|
||||
cfg->ipv4_traffic = ipv4_traffic;
|
||||
cfg->ipv6_traffic = ipv6_traffic;
|
||||
cfg->prefer_ipv6 = prefer_ipv6;
|
||||
cfg->cache_ipv4_answers = cache_ipv4;
|
||||
cfg->cache_ipv6_answers = cache_ipv6;
|
||||
cfg->use_cached_ipv4_answers = use_cached_ipv4;
|
||||
cfg->use_cached_ipv6_answers = use_cached_ipv6;
|
||||
cfg->prefer_ipv6_virtaddr = prefer_ipv6_automap;
|
||||
cfg->socks_prefer_no_auth = prefer_no_auth;
|
||||
cfg->entry_cfg.isolation_flags = isolation;
|
||||
cfg->entry_cfg.session_group = sessiongroup;
|
||||
cfg->server_cfg.no_advertise = no_advertise;
|
||||
cfg->server_cfg.no_listen = no_listen;
|
||||
cfg->server_cfg.all_addrs = all_addrs;
|
||||
cfg->server_cfg.bind_ipv4_only = bind_ipv4_only;
|
||||
cfg->server_cfg.bind_ipv6_only = bind_ipv6_only;
|
||||
cfg->entry_cfg.ipv4_traffic = ipv4_traffic;
|
||||
cfg->entry_cfg.ipv6_traffic = ipv6_traffic;
|
||||
cfg->entry_cfg.prefer_ipv6 = prefer_ipv6;
|
||||
cfg->entry_cfg.cache_ipv4_answers = cache_ipv4;
|
||||
cfg->entry_cfg.cache_ipv6_answers = cache_ipv6;
|
||||
cfg->entry_cfg.use_cached_ipv4_answers = use_cached_ipv4;
|
||||
cfg->entry_cfg.use_cached_ipv6_answers = use_cached_ipv6;
|
||||
cfg->entry_cfg.prefer_ipv6_virtaddr = prefer_ipv6_automap;
|
||||
cfg->entry_cfg.socks_prefer_no_auth = prefer_no_auth;
|
||||
if (! (isolation & ISO_SOCKSAUTH))
|
||||
cfg->socks_prefer_no_auth = 1;
|
||||
cfg->entry_cfg.socks_prefer_no_auth = 1;
|
||||
|
||||
smartlist_add(out, cfg);
|
||||
}
|
||||
|
@ -6041,7 +6041,7 @@ count_real_listeners(const smartlist_t *ports, int listenertype)
|
|||
{
|
||||
int n = 0;
|
||||
SMARTLIST_FOREACH_BEGIN(ports, port_cfg_t *, port) {
|
||||
if (port->no_listen || port->is_unix_addr)
|
||||
if (port->server_cfg.no_listen || port->is_unix_addr)
|
||||
continue;
|
||||
if (port->type != listenertype)
|
||||
continue;
|
||||
|
@ -6217,25 +6217,25 @@ check_server_ports(const smartlist_t *ports,
|
|||
|
||||
SMARTLIST_FOREACH_BEGIN(ports, const port_cfg_t *, port) {
|
||||
if (port->type == CONN_TYPE_DIR_LISTENER) {
|
||||
if (! port->no_advertise)
|
||||
if (! port->server_cfg.no_advertise)
|
||||
++n_dirport_advertised;
|
||||
if (! port->no_listen)
|
||||
if (! port->server_cfg.no_listen)
|
||||
++n_dirport_listeners;
|
||||
} else if (port->type == CONN_TYPE_OR_LISTENER) {
|
||||
if (! port->no_advertise) {
|
||||
if (! port->server_cfg.no_advertise) {
|
||||
++n_orport_advertised;
|
||||
if (tor_addr_family(&port->addr) == AF_INET ||
|
||||
(tor_addr_family(&port->addr) == AF_UNSPEC &&
|
||||
!port->bind_ipv6_only))
|
||||
!port->server_cfg.bind_ipv6_only))
|
||||
++n_orport_advertised_ipv4;
|
||||
}
|
||||
if (! port->no_listen)
|
||||
if (! port->server_cfg.no_listen)
|
||||
++n_orport_listeners;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
#ifndef _WIN32
|
||||
if (!port->no_listen && port->port < 1024)
|
||||
if (!port->server_cfg.no_listen && port->port < 1024)
|
||||
++n_low_port;
|
||||
#endif
|
||||
} SMARTLIST_FOREACH_END(port);
|
||||
|
@ -6313,7 +6313,7 @@ get_first_listener_addrport_string(int listener_type)
|
|||
return NULL;
|
||||
|
||||
SMARTLIST_FOREACH_BEGIN(configured_ports, const port_cfg_t *, cfg) {
|
||||
if (cfg->no_listen)
|
||||
if (cfg->server_cfg.no_listen)
|
||||
continue;
|
||||
|
||||
if (cfg->type == listener_type &&
|
||||
|
@ -6360,12 +6360,12 @@ get_first_advertised_port_by_type_af(int listener_type, int address_family)
|
|||
return 0;
|
||||
SMARTLIST_FOREACH_BEGIN(configured_ports, const port_cfg_t *, cfg) {
|
||||
if (cfg->type == listener_type &&
|
||||
!cfg->no_advertise &&
|
||||
!cfg->server_cfg.no_advertise &&
|
||||
(tor_addr_family(&cfg->addr) == address_family ||
|
||||
tor_addr_family(&cfg->addr) == AF_UNSPEC)) {
|
||||
if (tor_addr_family(&cfg->addr) != AF_UNSPEC ||
|
||||
(address_family == AF_INET && !cfg->bind_ipv6_only) ||
|
||||
(address_family == AF_INET6 && !cfg->bind_ipv4_only)) {
|
||||
(address_family == AF_INET && !cfg->server_cfg.bind_ipv6_only) ||
|
||||
(address_family == AF_INET6 && !cfg->server_cfg.bind_ipv4_only)) {
|
||||
return cfg->port;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1198,10 +1198,10 @@ connection_listener_new(const struct sockaddr *listensockaddr,
|
|||
conn->port = gotPort;
|
||||
tor_addr_copy(&conn->addr, &addr);
|
||||
|
||||
if (port_cfg->isolation_flags) {
|
||||
lis_conn->isolation_flags = port_cfg->isolation_flags;
|
||||
if (port_cfg->session_group >= 0) {
|
||||
lis_conn->session_group = port_cfg->session_group;
|
||||
if (port_cfg->entry_cfg.isolation_flags) {
|
||||
lis_conn->isolation_flags = port_cfg->entry_cfg.isolation_flags;
|
||||
if (port_cfg->entry_cfg.session_group >= 0) {
|
||||
lis_conn->session_group = port_cfg->entry_cfg.session_group;
|
||||
} else {
|
||||
/* This can wrap after around INT_MAX listeners are opened. But I don't
|
||||
* believe that matters, since you would need to open a ridiculous
|
||||
|
@ -1213,19 +1213,19 @@ connection_listener_new(const struct sockaddr *listensockaddr,
|
|||
}
|
||||
}
|
||||
if (type == CONN_TYPE_AP_LISTENER) {
|
||||
lis_conn->socks_ipv4_traffic = port_cfg->ipv4_traffic;
|
||||
lis_conn->socks_ipv6_traffic = port_cfg->ipv6_traffic;
|
||||
lis_conn->socks_prefer_ipv6 = port_cfg->prefer_ipv6;
|
||||
lis_conn->socks_ipv4_traffic = port_cfg->entry_cfg.ipv4_traffic;
|
||||
lis_conn->socks_ipv6_traffic = port_cfg->entry_cfg.ipv6_traffic;
|
||||
lis_conn->socks_prefer_ipv6 = port_cfg->entry_cfg.prefer_ipv6;
|
||||
} else {
|
||||
lis_conn->socks_ipv4_traffic = 1;
|
||||
lis_conn->socks_ipv6_traffic = 1;
|
||||
}
|
||||
lis_conn->cache_ipv4_answers = port_cfg->cache_ipv4_answers;
|
||||
lis_conn->cache_ipv6_answers = port_cfg->cache_ipv6_answers;
|
||||
lis_conn->use_cached_ipv4_answers = port_cfg->use_cached_ipv4_answers;
|
||||
lis_conn->use_cached_ipv6_answers = port_cfg->use_cached_ipv6_answers;
|
||||
lis_conn->prefer_ipv6_virtaddr = port_cfg->prefer_ipv6_virtaddr;
|
||||
lis_conn->socks_prefer_no_auth = port_cfg->socks_prefer_no_auth;
|
||||
lis_conn->cache_ipv4_answers = port_cfg->entry_cfg.cache_ipv4_answers;
|
||||
lis_conn->cache_ipv6_answers = port_cfg->entry_cfg.cache_ipv6_answers;
|
||||
lis_conn->use_cached_ipv4_answers = port_cfg->entry_cfg.use_cached_ipv4_answers;
|
||||
lis_conn->use_cached_ipv6_answers = port_cfg->entry_cfg.use_cached_ipv6_answers;
|
||||
lis_conn->prefer_ipv6_virtaddr = port_cfg->entry_cfg.prefer_ipv6_virtaddr;
|
||||
lis_conn->socks_prefer_no_auth = port_cfg->entry_cfg.socks_prefer_no_auth;
|
||||
|
||||
if (connection_add(conn) < 0) { /* no space, forget it */
|
||||
log_warn(LD_NET,"connection_add for listener failed. Giving up.");
|
||||
|
@ -2184,7 +2184,7 @@ retry_listener_ports(smartlist_t *old_conns,
|
|||
(conn->socket_family == AF_UNIX && ! wanted->is_unix_addr))
|
||||
continue;
|
||||
|
||||
if (wanted->no_listen)
|
||||
if (wanted->server_cfg.no_listen)
|
||||
continue; /* We don't want to open a listener for this one */
|
||||
|
||||
if (wanted->is_unix_addr) {
|
||||
|
@ -2225,7 +2225,7 @@ retry_listener_ports(smartlist_t *old_conns,
|
|||
connection_t *conn;
|
||||
int real_port = port->port == CFG_AUTO_PORT ? 0 : port->port;
|
||||
tor_assert(real_port <= UINT16_MAX);
|
||||
if (port->no_listen)
|
||||
if (port->server_cfg.no_listen)
|
||||
continue;
|
||||
|
||||
if (port->is_unix_addr) {
|
||||
|
|
40
src/or/or.h
40
src/or/or.h
|
@ -3334,30 +3334,17 @@ typedef enum invalid_router_usage_t {
|
|||
/** First automatically allocated session group number */
|
||||
#define SESSION_GROUP_FIRST_AUTO -4
|
||||
|
||||
/** Configuration for a single port that we're listening on. */
|
||||
typedef struct port_cfg_t {
|
||||
tor_addr_t addr; /**< The actual IP to listen on, if !is_unix_addr. */
|
||||
int port; /**< The configured port, or CFG_AUTO_PORT to tell Tor to pick its
|
||||
* own port. */
|
||||
uint8_t type; /**< One of CONN_TYPE_*_LISTENER */
|
||||
unsigned is_unix_addr : 1; /**< True iff this is an AF_UNIX address. */
|
||||
|
||||
typedef struct entry_port_cfg_t {
|
||||
/* Client port types (socks, dns, trans, natd) only: */
|
||||
uint8_t isolation_flags; /**< Zero or more isolation flags */
|
||||
int session_group; /**< A session group, or -1 if this port is not in a
|
||||
* session group. */
|
||||
|
||||
/* Socks only: */
|
||||
/** When both no-auth and user/pass are advertised by a SOCKS client, select
|
||||
* no-auth. */
|
||||
unsigned int socks_prefer_no_auth : 1;
|
||||
|
||||
/* Server port types (or, dir) only: */
|
||||
unsigned int no_advertise : 1;
|
||||
unsigned int no_listen : 1;
|
||||
unsigned int all_addrs : 1;
|
||||
unsigned int bind_ipv4_only : 1;
|
||||
unsigned int bind_ipv6_only : 1;
|
||||
|
||||
/* Client port types only: */
|
||||
unsigned int ipv4_traffic : 1;
|
||||
unsigned int ipv6_traffic : 1;
|
||||
|
@ -3381,6 +3368,29 @@ typedef struct port_cfg_t {
|
|||
* do we prefer IPv6? */
|
||||
unsigned int prefer_ipv6_virtaddr : 1;
|
||||
|
||||
} entry_port_cfg_t;
|
||||
|
||||
typedef struct server_port_cfg_t {
|
||||
/* Server port types (or, dir) only: */
|
||||
unsigned int no_advertise : 1;
|
||||
unsigned int no_listen : 1;
|
||||
unsigned int all_addrs : 1;
|
||||
unsigned int bind_ipv4_only : 1;
|
||||
unsigned int bind_ipv6_only : 1;
|
||||
} server_port_cfg_t;
|
||||
|
||||
/** Configuration for a single port that we're listening on. */
|
||||
typedef struct port_cfg_t {
|
||||
tor_addr_t addr; /**< The actual IP to listen on, if !is_unix_addr. */
|
||||
int port; /**< The configured port, or CFG_AUTO_PORT to tell Tor to pick its
|
||||
* own port. */
|
||||
uint8_t type; /**< One of CONN_TYPE_*_LISTENER */
|
||||
unsigned is_unix_addr : 1; /**< True iff this is an AF_UNIX address. */
|
||||
|
||||
entry_port_cfg_t entry_cfg;
|
||||
|
||||
server_port_cfg_t server_cfg;
|
||||
|
||||
/* Unix sockets only: */
|
||||
/** Path for an AF_UNIX address */
|
||||
char unix_addr[FLEXIBLE_ARRAY_MEMBER];
|
||||
|
|
|
@ -1835,8 +1835,8 @@ router_rebuild_descriptor(int force)
|
|||
const port_cfg_t *ipv6_orport = NULL;
|
||||
SMARTLIST_FOREACH_BEGIN(get_configured_ports(), const port_cfg_t *, p) {
|
||||
if (p->type == CONN_TYPE_OR_LISTENER &&
|
||||
! p->no_advertise &&
|
||||
! p->bind_ipv4_only &&
|
||||
! p->server_cfg.no_advertise &&
|
||||
! p->server_cfg.bind_ipv4_only &&
|
||||
tor_addr_family(&p->addr) == AF_INET6) {
|
||||
if (! tor_addr_is_internal(&p->addr, 0)) {
|
||||
ipv6_orport = p;
|
||||
|
|
Loading…
Add table
Reference in a new issue