From a5190d7352d31d4bd3c19dfc4aeddf96d59830a0 Mon Sep 17 00:00:00 2001 From: Daniel Salzman Date: Wed, 27 May 2026 18:07:28 +0200 Subject: [PATCH] y --- src/knot/common/hiredis.c | 4 ++-- src/knot/conf/conf.c | 15 ++++++++------- src/knot/conf/conf.h | 7 +++++-- src/knot/conf/tools.c | 18 +++++++++++------- src/knot/nameserver/query_module.c | 2 +- src/knot/server/server.c | 28 +++++++++++----------------- 6 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/knot/common/hiredis.c b/src/knot/common/hiredis.c index bcf4e2e0a..ea3f243c8 100644 --- a/src/knot/common/hiredis.c +++ b/src/knot/common/hiredis.c @@ -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) { diff --git a/src/knot/conf/conf.c b/src/knot/conf/conf.c index 8c21119a7..067274d30 100644 --- a/src/knot/conf/conf.c +++ b/src/knot/conf/conf.c @@ -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; } diff --git a/src/knot/conf/conf.h b/src/knot/conf/conf.h index f3a347ebe..78d97b4af 100644 --- a/src/knot/conf/conf.h +++ b/src/knot/conf/conf.h @@ -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); } /*! diff --git a/src/knot/conf/tools.c b/src/knot/conf/tools.c index 273d34c57..f26554165 100644 --- a/src/knot/conf/tools.c +++ b/src/knot/conf/tools.c @@ -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; diff --git a/src/knot/nameserver/query_module.c b/src/knot/nameserver/query_module.c index 1865168f6..a0b549e3f 100644 --- a/src/knot/nameserver/query_module.c +++ b/src/knot/nameserver/query_module.c @@ -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, diff --git a/src/knot/server/server.c b/src/knot/server/server.c index 9290912ab..48bed8777 100644 --- a/src/knot/server/server.c +++ b/src/knot/server/server.c @@ -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];