diff --git a/SOURCES/openvswitch-2.13.0.patch b/SOURCES/openvswitch-2.13.0.patch index 8741dc9..5746669 100644 --- a/SOURCES/openvswitch-2.13.0.patch +++ b/SOURCES/openvswitch-2.13.0.patch @@ -81873,6 +81873,19 @@ index 7e48630f0e..4e2874c22e 100644 } } else if (retval < 0) { VLOG_FATAL("waitpid failed (%s)", ovs_strerror(errno)); +diff --git a/lib/dns-resolve.c b/lib/dns-resolve.c +index 1ff58960fe..6a6b24d981 100644 +--- a/lib/dns-resolve.c ++++ b/lib/dns-resolve.c +@@ -253,7 +253,7 @@ resolve_callback__(void *req_, int err, struct ub_result *result) + if (err != 0 || (result->qtype == ns_t_aaaa && !result->havedata)) { + ub_resolve_free(result); + req->state = RESOLVE_ERROR; +- VLOG_ERR_RL(&rl, "%s: failed to resolve", req->name); ++ VLOG_WARN_RL(&rl, "%s: failed to resolve", req->name); + return; + } + diff --git a/lib/dp-packet.c b/lib/dp-packet.c index cd2623500e..1e3b0ec609 100644 --- a/lib/dp-packet.c @@ -86472,6 +86485,132 @@ index eda265dfc5..a635ff7689 100644 #define SHA1_FMT \ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" \ +diff --git a/lib/socket-util.c b/lib/socket-util.c +index 4f1ffecf5d..38705cc51e 100644 +--- a/lib/socket-util.c ++++ b/lib/socket-util.c +@@ -62,7 +62,8 @@ static bool parse_sockaddr_components(struct sockaddr_storage *ss, + const char *port_s, + uint16_t default_port, + const char *s, +- bool resolve_host); ++ bool resolve_host, ++ bool *dns_failure); + + /* Sets 'fd' to non-blocking mode. Returns 0 if successful, otherwise a + * positive errno value. */ +@@ -438,7 +439,7 @@ parse_sockaddr_components_dns(struct sockaddr_storage *ss OVS_UNUSED, + dns_resolve(host_s, &tmp_host_s); + if (tmp_host_s != NULL) { + parse_sockaddr_components(ss, tmp_host_s, port_s, +- default_port, s, false); ++ default_port, s, false, NULL); + free(tmp_host_s); + return true; + } +@@ -450,11 +451,15 @@ parse_sockaddr_components(struct sockaddr_storage *ss, + char *host_s, + const char *port_s, uint16_t default_port, + const char *s, +- bool resolve_host) ++ bool resolve_host, bool *dns_failure) + { + struct sockaddr_in *sin = sin_cast(sa_cast(ss)); + int port; + ++ if (dns_failure) { ++ *dns_failure = false; ++ } ++ + if (port_s && port_s[0]) { + if (!str_to_int(port_s, 10, &port) || port < 0 || port > 65535) { + VLOG_ERR("%s: bad port number \"%s\"", s, port_s); +@@ -501,10 +506,15 @@ parse_sockaddr_components(struct sockaddr_storage *ss, + return true; + + resolve: +- if (resolve_host && parse_sockaddr_components_dns(ss, host_s, port_s, +- default_port, s)) { +- return true; +- } else if (!resolve_host) { ++ if (resolve_host) { ++ if (parse_sockaddr_components_dns(ss, host_s, port_s, ++ default_port, s)) { ++ return true; ++ } ++ if (dns_failure) { ++ *dns_failure = true; ++ } ++ } else { + VLOG_ERR("%s: bad IP address \"%s\"", s, host_s); + } + exit: +@@ -521,10 +531,12 @@ exit: + * It resolves the host if 'resolve_host' is true. + * + * On success, returns true and stores the parsed remote address into '*ss'. +- * On failure, logs an error, stores zeros into '*ss', and returns false. */ ++ * On failure, logs an error, stores zeros into '*ss', and returns false, ++ * '*dns_failure' indicates if the host resolution failed. */ + bool + inet_parse_active(const char *target_, int default_port, +- struct sockaddr_storage *ss, bool resolve_host) ++ struct sockaddr_storage *ss, ++ bool resolve_host, bool *dns_failure) + { + char *target = xstrdup(target_); + char *port, *host; +@@ -539,7 +551,7 @@ inet_parse_active(const char *target_, int default_port, + ok = false; + } else { + ok = parse_sockaddr_components(ss, host, port, default_port, +- target_, resolve_host); ++ target_, resolve_host, dns_failure); + } + if (!ok) { + memset(ss, 0, sizeof *ss); +@@ -576,7 +588,7 @@ inet_open_active(int style, const char *target, int default_port, + int error; + + /* Parse. */ +- if (!inet_parse_active(target, default_port, &ss, true)) { ++ if (!inet_parse_active(target, default_port, &ss, true, NULL)) { + error = EAFNOSUPPORT; + goto exit; + } +@@ -660,7 +672,7 @@ inet_parse_passive(const char *target_, int default_port, + ok = false; + } else { + ok = parse_sockaddr_components(ss, host, port, default_port, +- target_, true); ++ target_, true, NULL); + } + if (!ok) { + memset(ss, 0, sizeof *ss); +@@ -783,7 +795,8 @@ inet_parse_address(const char *target_, struct sockaddr_storage *ss) + { + char *target = xstrdup(target_); + char *host = unbracket(target); +- bool ok = parse_sockaddr_components(ss, host, NULL, 0, target_, false); ++ bool ok = parse_sockaddr_components(ss, host, NULL, 0, ++ target_, false, NULL); + if (!ok) { + memset(ss, 0, sizeof *ss); + } +diff --git a/lib/socket-util.h b/lib/socket-util.h +index 9ccb7d4cc4..bf66393df9 100644 +--- a/lib/socket-util.h ++++ b/lib/socket-util.h +@@ -49,7 +49,8 @@ ovs_be32 guess_netmask(ovs_be32 ip); + void inet_parse_host_port_tokens(char *s, char **hostp, char **portp); + void inet_parse_port_host_tokens(char *s, char **portp, char **hostp); + bool inet_parse_active(const char *target, int default_port, +- struct sockaddr_storage *ssp, bool resolve_host); ++ struct sockaddr_storage *ssp, ++ bool resolve_host, bool *dns_failure); + int inet_open_active(int style, const char *target, int default_port, + struct sockaddr_storage *ssp, int *fdp, uint8_t dscp); + diff --git a/lib/stopwatch.c b/lib/stopwatch.c index f5602163bc..1c71df1a12 100644 --- a/lib/stopwatch.c @@ -86547,6 +86686,19 @@ index 809b405a52..a869b5f390 100644 p->error_count++; goto out; } +diff --git a/lib/stream.c b/lib/stream.c +index e246b37735..99559fde91 100644 +--- a/lib/stream.c ++++ b/lib/stream.c +@@ -763,7 +763,7 @@ stream_parse_target_with_default_port(const char *target, int default_port, + struct sockaddr_storage *ss) + { + return ((!strncmp(target, "tcp:", 4) || !strncmp(target, "ssl:", 4)) +- && inet_parse_active(target + 4, default_port, ss, true)); ++ && inet_parse_active(target + 4, default_port, ss, true, NULL)); + } + + /* Attempts to guess the content type of a stream whose first few bytes were diff --git a/lib/tc.c b/lib/tc.c index 12af0192b6..de3fc50dbb 100644 --- a/lib/tc.c @@ -87578,10 +87730,20 @@ index 147ef9c333..97699cb905 100644 memcpy(flow->regs, md->regs, sizeof flow->regs); flow->in_port.ofp_port = md->in_port; diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c -index f9ea47a2f1..6324e74d52 100644 +index f9ea47a2f1..2f0d3795b5 100644 --- a/ofproto/ofproto-dpif-sflow.c +++ b/ofproto/ofproto-dpif-sflow.c -@@ -1291,10 +1291,10 @@ dpif_sflow_received(struct dpif_sflow *ds, const struct dp_packet *packet, +@@ -468,7 +468,8 @@ sflow_choose_agent_address(const char *agent_device, + const char *target; + SSET_FOR_EACH (target, targets) { + struct sockaddr_storage ss; +- if (inet_parse_active(target, SFL_DEFAULT_COLLECTOR_PORT, &ss, true)) { ++ if (inet_parse_active(target, SFL_DEFAULT_COLLECTOR_PORT, ++ &ss, true, NULL)) { + /* sFlow only supports target in default routing table with + * packet mark zero. + */ +@@ -1291,10 +1292,10 @@ dpif_sflow_received(struct dpif_sflow *ds, const struct dp_packet *packet, ovs_be16 vlan_tci; ovs_mutex_lock(&mutex); @@ -88870,10 +89032,18 @@ index 338f3bc299..b8bd1c2d57 100644 .so lib/vlog-unixctl.man .so lib/memory-unixctl.man diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c -index b6957d7300..2bc0a69066 100644 +index b6957d7300..ef558efb38 100644 --- a/ovsdb/ovsdb-server.c +++ b/ovsdb/ovsdb-server.c -@@ -76,8 +76,12 @@ static char *ssl_protocols; +@@ -26,6 +26,7 @@ + #include "command-line.h" + #include "daemon.h" + #include "dirs.h" ++#include "dns-resolve.h" + #include "openvswitch/dynamic-string.h" + #include "fatal-signal.h" + #include "file.h" +@@ -76,8 +77,12 @@ static char *ssl_protocols; static char *ssl_ciphers; static bool bootstrap_ca_cert; @@ -88886,7 +89056,7 @@ index b6957d7300..2bc0a69066 100644 static unixctl_cb_func ovsdb_server_reconnect; static unixctl_cb_func ovsdb_server_perf_counters_clear; static unixctl_cb_func ovsdb_server_perf_counters_show; -@@ -242,7 +246,7 @@ main_loop(struct server_config *config, +@@ -242,7 +247,7 @@ main_loop(struct server_config *config, xasprintf("removing database %s because storage " "disconnected permanently", node->name)); } else if (ovsdb_storage_should_snapshot(db->db->storage)) { @@ -88895,7 +89065,15 @@ index b6957d7300..2bc0a69066 100644 } } if (run_process) { -@@ -409,6 +413,9 @@ main(int argc, char *argv[]) +@@ -314,6 +319,7 @@ main(int argc, char *argv[]) + service_start(&argc, &argv); + fatal_ignore_sigpipe(); + process_init(); ++ dns_resolve_init(true); + + bool active = false; + parse_options(argc, argv, &db_filenames, &remotes, &unixctl_path, +@@ -409,6 +415,9 @@ main(int argc, char *argv[]) unixctl_command_register("exit", "", 0, 0, ovsdb_server_exit, &exiting); unixctl_command_register("ovsdb-server/compact", "", 0, 1, ovsdb_server_compact, &all_dbs); @@ -88905,7 +89083,15 @@ index b6957d7300..2bc0a69066 100644 unixctl_command_register("ovsdb-server/reconnect", "", 0, 0, ovsdb_server_reconnect, jsonrpc); -@@ -540,7 +547,7 @@ close_db(struct server_config *config, struct db *db, char *comment) +@@ -490,6 +499,7 @@ main(int argc, char *argv[]) + run_command, process_status_msg(status)); + } + } ++ dns_resolve_destroy(); + perf_counters_destroy(); + service_stop(); + return 0; +@@ -540,7 +550,7 @@ close_db(struct server_config *config, struct db *db, char *comment) static struct ovsdb_error * OVS_WARN_UNUSED_RESULT parse_txn(struct server_config *config, struct db *db, @@ -88914,7 +89100,7 @@ index b6957d7300..2bc0a69066 100644 const struct uuid *txnid) { if (schema) { -@@ -548,7 +555,9 @@ parse_txn(struct server_config *config, struct db *db, +@@ -548,7 +558,9 @@ parse_txn(struct server_config *config, struct db *db, * (first grabbing its storage), then replace it with the new schema. * The transaction must also include the replacement data. * @@ -88925,7 +89111,7 @@ index b6957d7300..2bc0a69066 100644 ovs_assert(txn_json); ovs_assert(ovsdb_storage_is_clustered(db->db->storage)); -@@ -558,13 +567,17 @@ parse_txn(struct server_config *config, struct db *db, +@@ -558,13 +570,17 @@ parse_txn(struct server_config *config, struct db *db, return error; } @@ -88949,7 +89135,7 @@ index b6957d7300..2bc0a69066 100644 /* Force update to schema in _Server database. */ db->row_uuid = UUID_ZERO; -@@ -613,6 +626,7 @@ read_db(struct server_config *config, struct db *db) +@@ -613,6 +629,7 @@ read_db(struct server_config *config, struct db *db) } else { error = parse_txn(config, db, schema, txn_json, &txnid); json_destroy(txn_json); @@ -88957,7 +89143,7 @@ index b6957d7300..2bc0a69066 100644 if (error) { break; } -@@ -637,8 +651,6 @@ add_db(struct server_config *config, struct db *db) +@@ -637,8 +654,6 @@ add_db(struct server_config *config, struct db *db) static struct ovsdb_error * OVS_WARN_UNUSED_RESULT open_db(struct server_config *config, const char *filename) { @@ -88966,7 +89152,7 @@ index b6957d7300..2bc0a69066 100644 /* If we know that the file is already open, return a good error message. * Otherwise, if the file is open, we'll fail later on with a harder to * interpret file locking error. */ -@@ -653,9 +665,6 @@ open_db(struct server_config *config, const char *filename) +@@ -653,9 +668,6 @@ open_db(struct server_config *config, const char *filename) return error; } @@ -88976,7 +89162,7 @@ index b6957d7300..2bc0a69066 100644 struct ovsdb_schema *schema; if (ovsdb_storage_is_clustered(storage)) { schema = NULL; -@@ -668,6 +677,9 @@ open_db(struct server_config *config, const char *filename) +@@ -668,6 +680,9 @@ open_db(struct server_config *config, const char *filename) } ovs_assert(schema && !txn_json); } @@ -88986,7 +89172,7 @@ index b6957d7300..2bc0a69066 100644 db->db = ovsdb_create(schema, storage); ovsdb_jsonrpc_server_add_db(config->jsonrpc, db->db); -@@ -1481,7 +1493,8 @@ ovsdb_server_compact(struct unixctl_conn *conn, int argc, +@@ -1481,7 +1496,8 @@ ovsdb_server_compact(struct unixctl_conn *conn, int argc, VLOG_INFO("compacting %s database by user request", node->name); @@ -88996,7 +89182,7 @@ index b6957d7300..2bc0a69066 100644 if (error) { char *s = ovsdb_error_to_string(error); ds_put_format(&reply, "%s\n", s); -@@ -1504,6 +1517,35 @@ ovsdb_server_compact(struct unixctl_conn *conn, int argc, +@@ -1504,6 +1520,35 @@ ovsdb_server_compact(struct unixctl_conn *conn, int argc, ds_destroy(&reply); } @@ -89142,6 +89328,22 @@ index 32e5333163..72e127c847 100644 void ovsdb_replace(struct ovsdb *dst, struct ovsdb *src); +diff --git a/ovsdb/raft-private.c b/ovsdb/raft-private.c +index 26d39a087f..7b7bcd74ac 100644 +--- a/ovsdb/raft-private.c ++++ b/ovsdb/raft-private.c +@@ -33,7 +33,10 @@ raft_address_validate(const char *address) + return NULL; + } else if (!strncmp(address, "ssl:", 4) || !strncmp(address, "tcp:", 4)) { + struct sockaddr_storage ss; +- if (!inet_parse_active(address + 4, -1, &ss, true)) { ++ bool dns_failure = false; ++ ++ if (!inet_parse_active(address + 4, -1, &ss, true, &dns_failure) ++ && !dns_failure) { + return ovsdb_error(NULL, "%s: syntax error in address", address); + } + return NULL; diff --git a/ovsdb/raft-private.h b/ovsdb/raft-private.h index ac8656d42f..76b097b891 100644 --- a/ovsdb/raft-private.h diff --git a/SPECS/openvswitch2.13.spec b/SPECS/openvswitch2.13.spec index 2c32f1f..121e9b8 100644 --- a/SPECS/openvswitch2.13.spec +++ b/SPECS/openvswitch2.13.spec @@ -59,7 +59,7 @@ Summary: Open vSwitch Group: System Environment/Daemons daemon/database/utilities URL: http://www.openvswitch.org/ Version: 2.13.0 -Release: 169%{?commit0:.%{date}git%{shortcommit0}}%{?commit1:dpdk%{shortcommit1}}%{?dist} +Release: 170%{?commit0:.%{date}git%{shortcommit0}}%{?commit1:dpdk%{shortcommit1}}%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL @@ -715,6 +715,12 @@ exit 0 %endif %changelog +* Wed Mar 30 2022 Open vSwitch CI - 2.13.0-170 +- Merging upstream branch-2.13 [RH git: 7ec8e5d0e5] + Commit list: + 3ceb5dbe92 ovsdb: raft: Fix inability to read the database with DNS host names. (#2055097) + + * Fri Mar 25 2022 Open vSwitch CI - 2.13.0-169 - Merging upstream branch-2.13 [RH git: 81f1610a56] Commit list: