This commit is contained in:
Daniel Salzman 2026-05-27 18:07:28 +02:00
parent 44f94129af
commit a5190d7352
6 changed files with 38 additions and 36 deletions

View file

@ -321,7 +321,7 @@ redisContext *rdb_connect(conf_t *conf, bool require_master, const char *info)
conf_val_t db_listen = conf_db_param(conf, C_ZONE_DB_LISTEN);
while (db_listen.code == KNOT_EOK) {
struct sockaddr_storage addr = conf_addr(&db_listen, NULL);
struct sockaddr_storage addr = conf_addr(&db_listen, NULL, NULL);
rdb = (void *)conn_pool_get(global_redis_pool, &addr, &addr);
if (rdb != NULL && (intptr_t)rdb != CONN_POOL_FD_INVALID) {
@ -337,7 +337,7 @@ redisContext *rdb_connect(conf_t *conf, bool require_master, const char *info)
conf_val_reset(&db_listen);
while (db_listen.code == KNOT_EOK) {
struct sockaddr_storage addr = conf_addr(&db_listen, NULL);
struct sockaddr_storage addr = conf_addr(&db_listen, NULL, NULL);
if (rdb_addr_to_str(&addr, addr_str, sizeof(addr_str), &port) != KNOT_EOK ||
(rdb = connect_addr(conf, addr_str, port)) == NULL) {

View file

@ -724,6 +724,7 @@ const uint8_t* conf_data(
struct sockaddr_storage conf_addr_alt(
conf_val_t *val,
const char *sock_base_dir,
const char **dev_name,
bool alternative)
{
assert(val != NULL && val->item != NULL);
@ -737,7 +738,7 @@ struct sockaddr_storage conf_addr_alt(
bool no_port;
conf_val(val);
assert(val->data);
out = yp_addr(val->data, &no_port, NULL);
out = yp_addr(val->data, &no_port, dev_name);
if (out.ss_family == AF_UNIX) {
// val->data[0] is socket type identifier!
@ -779,7 +780,7 @@ bool conf_addr_match(
}
while (match->code == KNOT_EOK) {
struct sockaddr_storage maddr = conf_addr(match, NULL);
struct sockaddr_storage maddr = conf_addr(match, NULL, NULL);
if (sockaddr_cmp(&maddr, addr, true) == 0) {
return true;
}
@ -1268,7 +1269,7 @@ size_t conf_xdp_threads_txn(
conf_val_t val = conf_get_txn(conf, txn, C_XDP, C_LISTEN);
while (val.code == KNOT_EOK) {
struct sockaddr_storage addr = conf_addr(&val, NULL);
struct sockaddr_storage addr = conf_addr(&val, NULL, NULL);
conf_xdp_iface_t iface;
int ret = conf_xdp_iface(&addr, &iface);
if (ret == KNOT_EOK) {
@ -1405,22 +1406,22 @@ conf_remote_t conf_remote_txn(
conf_val(&val);
}
struct sockaddr_storage addr = conf_addr(&val, rundir);
struct sockaddr_storage addr = conf_addr(&val, rundir, NULL);
assert(addr.ss_family <= AF_INET6);
addr_skipped[addr.ss_family]++;
conf_val_next(&val);
}
// Index overflow causes empty socket.
out.addr = conf_addr_alt(&val, rundir, out.quic || out.tls);
out.addr = conf_addr_alt(&val, rundir, NULL, out.quic || out.tls);
// Get outgoing address if family matches (optional).
uint16_t via_pos = 0;
val = conf_id_get_txn(conf, txn, C_RMT, C_VIA, id);
while (val.code == KNOT_EOK) {
struct sockaddr_storage via = conf_addr(&val, rundir);
struct sockaddr_storage via = conf_addr(&val, rundir, NULL);
if (via.ss_family == out.addr.ss_family) {
out.via = conf_addr(&val, rundir); // Use this candidate.
out.via = conf_addr(&val, rundir, NULL); // Use this candidate.
if (addr_skipped[out.addr.ss_family] <= via_pos++) {
break;
}

View file

@ -556,6 +556,7 @@ const uint8_t* conf_data(
*
* \param[in] val Item value.
* \param[in] sock_base_dir Path prefix for a relative UNIX socket location.
* \param[out] dev_name Device name.
* \param[in] alternative Use alternative default port if port not specified.
*
* \return Socket address.
@ -563,13 +564,15 @@ const uint8_t* conf_data(
struct sockaddr_storage conf_addr_alt(
conf_val_t *val,
const char *sock_base_dir,
const char **dev_name,
bool alternative
);
inline static struct sockaddr_storage conf_addr(
conf_val_t *val,
const char *sock_base_dir)
const char *sock_base_dir,
const char **dev_name)
{
return conf_addr_alt(val, sock_base_dir, false);
return conf_addr_alt(val, sock_base_dir, dev_name, false);
}
/*!

View file

@ -338,7 +338,7 @@ int check_xdp_listen(
C_LISTEN);
size_t count = conf_val_count(&xdp);
while (xdp.code == KNOT_EOK && count-- > 1) {
struct sockaddr_storage addr = conf_addr(&xdp, NULL);
struct sockaddr_storage addr = conf_addr(&xdp, NULL, NULL);
conf_xdp_iface_t if_prev;
ret = conf_xdp_iface(&addr, &if_prev);
if (ret != KNOT_EOK) {
@ -579,7 +579,7 @@ static void check_mtu(knotd_conf_check_args_t *args, conf_val_t *xdp_listen)
}
while (xdp_listen->code == KNOT_EOK) {
struct sockaddr_storage addr = conf_addr(xdp_listen, NULL);
struct sockaddr_storage addr = conf_addr(xdp_listen, NULL, NULL);
conf_xdp_iface_t iface;
int ret = conf_xdp_iface(&addr, &iface);
if (ret != KNOT_EOK) {
@ -603,8 +603,10 @@ static void check_mtu(knotd_conf_check_args_t *args, conf_val_t *xdp_listen)
}
static bool listen_hit(const struct sockaddr_storage *ss1,
const struct sockaddr_storage *ss2)
const struct sockaddr_storage *ss2,
const char *dev1, const char *dev2)
{
// TODO
if (sockaddr_is_any(ss1) || sockaddr_is_any(ss2)) {
return ss1->ss_family == ss2->ss_family &&
sockaddr_port(ss1) == sockaddr_port(ss2);
@ -623,11 +625,13 @@ static bool listen_overlaps(
size_t listen_count = conf_val_count(&listen_val);
for (size_t i = 0; listen_count > 0 && i < chk_listen_count; i++) {
struct sockaddr_storage chk_addr = conf_addr(chk_listen, NULL);
const char *chk_dev = NULL;
struct sockaddr_storage chk_addr = conf_addr(chk_listen, NULL, &chk_dev);
for (size_t j = 0; j < listen_count; j++) {
struct sockaddr_storage listen_addr = conf_addr(&listen_val, NULL);
if (listen_hit(&chk_addr, &listen_addr)) {
const char *listen_dev = NULL;
struct sockaddr_storage listen_addr = conf_addr(&listen_val, NULL, &listen_dev);
if (listen_hit(&chk_addr, &listen_addr, chk_dev, listen_dev)) {
return true;
}
conf_val_next(&listen_val);
@ -715,7 +719,7 @@ int check_xdp(
while (xdp_listen.code == KNOT_EOK) {
conf_xdp_iface_t iface;
struct sockaddr_storage udp_addr = conf_addr(&xdp_listen, NULL);
struct sockaddr_storage udp_addr = conf_addr(&xdp_listen, NULL, NULL);
if (conf_xdp_iface(&udp_addr, &iface) == KNOT_EOK && iface.port == quic_port) {
args->err_str = "QUIC has to listen on different port than UDP";
return KNOT_EINVAL;

View file

@ -456,7 +456,7 @@ static void set_val(yp_type_t type, knotd_conf_val_t *item, conf_val_t *val)
item->dname = conf_dname(val);
break;
case YP_TADDR:
item->addr = conf_addr(val, NULL);
item->addr = conf_addr(val, NULL, NULL);
break;
case YP_TNET:
item->addr = conf_addr_range(val, &item->addr_max,

View file

@ -704,18 +704,12 @@ static int configure_sockets(conf_t *conf, server_t *s)
bool socket_affinity = conf->cache.srv_socket_affinity;
char *rundir = conf_abs_path(&rundir_val, NULL);
while (listen_val.code == KNOT_EOK) {
struct sockaddr_storage addr = conf_addr(&listen_val, NULL);
if (addr.ss_family == AF_UNIX) {
conf_xdp_iface_t iface;
if (conf_xdp_iface(&addr, &iface) != KNOT_EOK ||
if_nametoindex(iface.name) == 0) {
addr = conf_addr(&listen_val, rundir);
}
}
const char *dev = NULL;
struct sockaddr_storage addr = conf_addr(&listen_val, NULL, &dev);
char addr_str[SOCKADDR_STRLEN] = { 0 };
sockaddr_tostr(addr_str, sizeof(addr_str), &addr);
log_info("binding to interface %s", addr_str);
log_info("binding to interface %s%s%s", addr_str,
(dev != NULL ? " on " : ""), (dev != NULL ? dev : ""));
iface_t *new_if = server_init_iface(&addr, false, size_udp, size_tcp,
tcp_reuseport, socket_affinity);
@ -730,7 +724,7 @@ static int configure_sockets(conf_t *conf, server_t *s)
conf_val_next(&listen_val);
}
while (liquic_val.code == KNOT_EOK) {
struct sockaddr_storage addr = conf_addr(&liquic_val, rundir);
struct sockaddr_storage addr = conf_addr(&liquic_val, rundir, NULL);
char addr_str[SOCKADDR_STRLEN] = { 0 };
sockaddr_tostr(addr_str, sizeof(addr_str), &addr);
log_info("binding to QUIC interface %s", addr_str);
@ -749,7 +743,7 @@ static int configure_sockets(conf_t *conf, server_t *s)
conf_val_next(&liquic_val);
}
while (listls_val.code == KNOT_EOK) {
struct sockaddr_storage addr = conf_addr(&listls_val, rundir);
struct sockaddr_storage addr = conf_addr(&listls_val, rundir, NULL);
char addr_str[SOCKADDR_STRLEN] = { 0 };
sockaddr_tostr(addr_str, sizeof(addr_str), &addr);
log_info("binding to TLS interface %s", addr_str);
@ -780,7 +774,7 @@ static int configure_sockets(conf_t *conf, server_t *s)
unsigned thread_id = s->handlers[IO_UDP].handler.unit->size +
s->handlers[IO_TCP].handler.unit->size;
while (lisxdp_val.code == KNOT_EOK) {
struct sockaddr_storage addr = conf_addr(&lisxdp_val, NULL);
struct sockaddr_storage addr = conf_addr(&lisxdp_val, NULL, NULL);
char addr_str[SOCKADDR_STRLEN] = { 0 };
sockaddr_tostr(addr_str, sizeof(addr_str), &addr);
log_info("binding to XDP interface %s", addr_str);
@ -1355,7 +1349,7 @@ static bool listen_changed(conf_t *conf, server_t *server)
/* Find matching interfaces. */
while (listen_val.code == KNOT_EOK) {
struct sockaddr_storage addr = conf_addr(&listen_val, rundir);
struct sockaddr_storage addr = conf_addr(&listen_val, rundir, NULL);
bool found = false;
for (size_t i = 0; i < server->n_ifaces; i++) {
iface_t *iface = &server->ifaces[i];
@ -1372,7 +1366,7 @@ static bool listen_changed(conf_t *conf, server_t *server)
conf_val_next(&listen_val);
}
while (liquic_val.code == KNOT_EOK) {
struct sockaddr_storage addr = conf_addr(&liquic_val, rundir);
struct sockaddr_storage addr = conf_addr(&liquic_val, rundir, NULL);
bool found = false;
for (size_t i = 0; i < server->n_ifaces; i++) {
iface_t *iface = &server->ifaces[i];
@ -1389,7 +1383,7 @@ static bool listen_changed(conf_t *conf, server_t *server)
conf_val_next(&liquic_val);
}
while (listls_val.code == KNOT_EOK) {
struct sockaddr_storage addr = conf_addr(&listls_val, rundir);
struct sockaddr_storage addr = conf_addr(&listls_val, rundir, NULL);
bool found = false;
for (size_t i = 0; i < server->n_ifaces; i++) {
iface_t *iface = &server->ifaces[i];
@ -1408,7 +1402,7 @@ static bool listen_changed(conf_t *conf, server_t *server)
free(rundir);
while (lisxdp_val.code == KNOT_EOK) {
struct sockaddr_storage addr = conf_addr(&lisxdp_val, NULL);
struct sockaddr_storage addr = conf_addr(&lisxdp_val, NULL, NULL);
bool found = false;
for (size_t i = 0; i < server->n_ifaces; i++) {
iface_t *iface = &server->ifaces[i];