diff --git a/SOURCES/openvswitch-2.17.0.patch b/SOURCES/openvswitch-2.17.0.patch
index 9e4ec49..7720d72 100644
--- a/SOURCES/openvswitch-2.17.0.patch
+++ b/SOURCES/openvswitch-2.17.0.patch
@@ -50932,6 +50932,23 @@ index 3691a0eaf7..a185972e31 100644
 +void numa_set_preferred(int node);
 +
 +#endif /* <numa.h> for sparse. */
+diff --git a/include/sparse/rte_memcpy.h b/include/sparse/rte_memcpy.h
+index 5cd3f013ea..ec88500242 100644
+--- a/include/sparse/rte_memcpy.h
++++ b/include/sparse/rte_memcpy.h
+@@ -20,11 +20,8 @@
+ #error "Use this header only with sparse.  It is not a correct implementation."
+ #endif
+ 
+-/* Include the same headers as the real rte_memcpy(). */
+-#include <stdio.h>
++#include <stddef.h>
+ #include <stdint.h>
+-#include <string.h>
+-#include <rte_vect.h>
+ 
+ /* Declare the same functions as the real rte_memcpy.h, without defining them.
+  * This gives sparse the information it needs without provoking sparse's
 diff --git a/ipsec/ovs-monitor-ipsec.in b/ipsec/ovs-monitor-ipsec.in
 index a8b0705d9f..631a8fca80 100755
 --- a/ipsec/ovs-monitor-ipsec.in
@@ -56316,7 +56333,7 @@ index a921159667..2fe6c540a7 100644
   * key-value pairs, e.g.
   *
 diff --git a/lib/socket-util.c b/lib/socket-util.c
-index 4f1ffecf5d..38705cc51e 100644
+index 4f1ffecf5d..3eb3a3816b 100644
 --- a/lib/socket-util.c
 +++ b/lib/socket-util.c
 @@ -62,7 +62,8 @@ static bool parse_sockaddr_components(struct sockaddr_storage *ss,
@@ -56408,16 +56425,42 @@ index 4f1ffecf5d..38705cc51e 100644
          error = EAFNOSUPPORT;
          goto exit;
      }
-@@ -660,7 +672,7 @@ inet_parse_passive(const char *target_, int default_port,
+@@ -648,7 +660,8 @@ exit:
+  * zeros '*ss' and returns false. */
+ bool
+ inet_parse_passive(const char *target_, int default_port,
+-                   struct sockaddr_storage *ss)
++                   struct sockaddr_storage *ss,
++                   bool resolve_host, bool *dns_failure)
+ {
+     char *target = xstrdup(target_);
+     char *port, *host;
+@@ -660,7 +673,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);
++                                       target_, resolve_host, dns_failure);
      }
      if (!ok) {
          memset(ss, 0, sizeof *ss);
-@@ -783,7 +795,8 @@ inet_parse_address(const char *target_, struct sockaddr_storage *ss)
+@@ -698,8 +711,14 @@ inet_open_passive(int style, const char *target, int default_port,
+     struct sockaddr_storage ss;
+     int fd = 0, error;
+     unsigned int yes = 1;
++    bool dns_failure;
+ 
+-    if (!inet_parse_passive(target, default_port, &ss)) {
++    if (!inet_parse_passive(target, default_port, &ss, true, &dns_failure)) {
++        if (dns_failure) {
++            /* DNS failure means asynchronous DNS resolution is in progress,
++             * or that the name does currently not resolve. */
++            return -EAGAIN;
++        }
+         return -EAFNOSUPPORT;
+     }
+     kernel_chooses_port = ss_get_port(&ss) == 0;
+@@ -783,7 +802,8 @@ inet_parse_address(const char *target_, struct sockaddr_storage *ss)
  {
      char *target = xstrdup(target_);
      char *host = unbracket(target);
@@ -56428,10 +56471,10 @@ index 4f1ffecf5d..38705cc51e 100644
          memset(ss, 0, sizeof *ss);
      }
 diff --git a/lib/socket-util.h b/lib/socket-util.h
-index 9ccb7d4cc4..bf66393df9 100644
+index 9ccb7d4cc4..4eec627e3e 100644
 --- a/lib/socket-util.h
 +++ b/lib/socket-util.h
-@@ -49,7 +49,8 @@ ovs_be32 guess_netmask(ovs_be32 ip);
+@@ -49,12 +49,14 @@ 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,
@@ -56441,6 +56484,13 @@ index 9ccb7d4cc4..bf66393df9 100644
  int inet_open_active(int style, const char *target, int default_port,
                       struct sockaddr_storage *ssp, int *fdp, uint8_t dscp);
  
+ bool inet_parse_passive(const char *target, int default_port,
+-                        struct sockaddr_storage *ssp);
++                        struct sockaddr_storage *ssp,
++                        bool resolve_host, bool *dns_failure);
+ int inet_open_passive(int style, const char *target, int default_port,
+                       struct sockaddr_storage *ssp, uint8_t dscp,
+                       bool kernel_print_port);
 diff --git a/lib/sset.c b/lib/sset.c
 index b2e3f43ec9..6fbaa9d60d 100644
 --- a/lib/sset.c
@@ -59328,7 +59378,7 @@ index 9f44007d97..ca80c28235 100644
              break;
          }
 diff --git a/ovsdb/jsonrpc-server.c b/ovsdb/jsonrpc-server.c
-index 351c39d8aa..916a1f414e 100644
+index 351c39d8aa..17868f5b72 100644
 --- a/ovsdb/jsonrpc-server.c
 +++ b/ovsdb/jsonrpc-server.c
 @@ -197,9 +197,9 @@ ovsdb_jsonrpc_server_remove_db(struct ovsdb_jsonrpc_server *svr,
@@ -59355,7 +59405,60 @@ index 351c39d8aa..916a1f414e 100644
          struct ovsdb_jsonrpc_remote *remote = node->data;
          struct ovsdb_jsonrpc_options *options
              = shash_find_data(new_remotes, node->name);
-@@ -585,9 +585,9 @@ ovsdb_jsonrpc_session_set_options(struct ovsdb_jsonrpc_session *session,
+@@ -267,25 +267,36 @@ ovsdb_jsonrpc_server_add_remote(struct ovsdb_jsonrpc_server *svr,
+     int error;
+ 
+     error = jsonrpc_pstream_open(name, &listener, options->dscp);
+-    if (error && error != EAFNOSUPPORT) {
+-        VLOG_ERR_RL(&rl, "%s: listen failed: %s", name, ovs_strerror(error));
+-        return NULL;
+-    }
++    switch (error) {
++    case 0:
++    case EAFNOSUPPORT:
++        remote = xmalloc(sizeof *remote);
++        remote->server = svr;
++        remote->listener = listener;
++        ovs_list_init(&remote->sessions);
++        remote->dscp = options->dscp;
++        remote->read_only = options->read_only;
++        remote->role = nullable_xstrdup(options->role);
++        shash_add(&svr->remotes, name, remote);
++        if (!listener) {
++            /* Not a listener, attempt creation of active jsonrpc session. */
++            ovsdb_jsonrpc_session_create(remote,
++                                         jsonrpc_session_open(name, true),
++                                         svr->read_only || remote->read_only);
++        }
++        return remote;
+ 
+-    remote = xmalloc(sizeof *remote);
+-    remote->server = svr;
+-    remote->listener = listener;
+-    ovs_list_init(&remote->sessions);
+-    remote->dscp = options->dscp;
+-    remote->read_only = options->read_only;
+-    remote->role = nullable_xstrdup(options->role);
+-    shash_add(&svr->remotes, name, remote);
++    case EAGAIN:
++        VLOG_DBG_RL(&rl, "%s: listen failed: "
++                         "DNS resolution in progress or host not found", name);
++        return NULL;
+ 
+-    if (!listener) {
+-        ovsdb_jsonrpc_session_create(remote, jsonrpc_session_open(name, true),
+-                                      svr->read_only || remote->read_only);
++    default:
++        VLOG_ERR_RL(&rl, "%s: listen failed: %s", name,
++                    ovs_strerror(error));
++        return NULL;
+     }
+-    return remote;
++    OVS_NOT_REACHED();
+ }
+ 
+ static void
+@@ -585,9 +596,9 @@ ovsdb_jsonrpc_session_set_options(struct ovsdb_jsonrpc_session *session,
  static void
  ovsdb_jsonrpc_session_run_all(struct ovsdb_jsonrpc_remote *remote)
  {
@@ -59367,7 +59470,7 @@ index 351c39d8aa..916a1f414e 100644
          int error = ovsdb_jsonrpc_session_run(s);
          if (error) {
              ovsdb_jsonrpc_session_close(s);
-@@ -642,9 +642,9 @@ ovsdb_jsonrpc_session_get_memory_usage_all(
+@@ -642,9 +653,9 @@ ovsdb_jsonrpc_session_get_memory_usage_all(
  static void
  ovsdb_jsonrpc_session_close_all(struct ovsdb_jsonrpc_remote *remote)
  {
@@ -59379,7 +59482,7 @@ index 351c39d8aa..916a1f414e 100644
          ovsdb_jsonrpc_session_close(s);
      }
  }
-@@ -660,9 +660,9 @@ static void
+@@ -660,9 +671,9 @@ static void
  ovsdb_jsonrpc_session_reconnect_all(struct ovsdb_jsonrpc_remote *remote,
                                      bool force, const char *comment)
  {
@@ -59391,7 +59494,7 @@ index 351c39d8aa..916a1f414e 100644
          if (force || !s->db_change_aware) {
              jsonrpc_session_force_reconnect(s->js);
              if (comment && jsonrpc_session_is_connected(s->js)) {
-@@ -909,9 +909,9 @@ error:
+@@ -909,9 +920,9 @@ error:
  static void
  ovsdb_jsonrpc_session_unlock_all(struct ovsdb_jsonrpc_session *s)
  {
@@ -59403,7 +59506,7 @@ index 351c39d8aa..916a1f414e 100644
          ovsdb_jsonrpc_session_unlock__(waiter);
      }
  }
-@@ -1198,8 +1198,8 @@ static void
+@@ -1198,8 +1209,8 @@ static void
  ovsdb_jsonrpc_trigger_remove__(struct ovsdb_jsonrpc_session *s,
                                 struct ovsdb *db)
  {
@@ -59414,7 +59517,7 @@ index 351c39d8aa..916a1f414e 100644
          if (!db || t->trigger.db == db) {
              ovsdb_jsonrpc_trigger_complete(t);
          }
-@@ -1226,8 +1226,8 @@ ovsdb_jsonrpc_trigger_complete_all(struct ovsdb_jsonrpc_session *s)
+@@ -1226,8 +1237,8 @@ ovsdb_jsonrpc_trigger_complete_all(struct ovsdb_jsonrpc_session *s)
  static void
  ovsdb_jsonrpc_trigger_complete_done(struct ovsdb_jsonrpc_session *s)
  {
@@ -59425,7 +59528,7 @@ index 351c39d8aa..916a1f414e 100644
          ovsdb_jsonrpc_trigger_complete(trigger);
      }
  }
-@@ -1688,8 +1688,8 @@ ovsdb_jsonrpc_monitor_preremove_db(struct ovsdb_jsonrpc_session *s,
+@@ -1688,8 +1699,8 @@ ovsdb_jsonrpc_monitor_preremove_db(struct ovsdb_jsonrpc_session *s,
  {
      ovs_assert(db);
  
@@ -59436,7 +59539,7 @@ index 351c39d8aa..916a1f414e 100644
          if (m->db == db) {
              ovsdb_jsonrpc_monitor_destroy(m, true);
          }
-@@ -1700,9 +1700,9 @@ ovsdb_jsonrpc_monitor_preremove_db(struct ovsdb_jsonrpc_session *s,
+@@ -1700,9 +1711,9 @@ ovsdb_jsonrpc_monitor_preremove_db(struct ovsdb_jsonrpc_session *s,
  static void
  ovsdb_jsonrpc_monitor_remove_all(struct ovsdb_jsonrpc_session *s)
  {
diff --git a/SPECS/openvswitch2.17.spec b/SPECS/openvswitch2.17.spec
index 6746c7e..cb8a02b 100644
--- a/SPECS/openvswitch2.17.spec
+++ b/SPECS/openvswitch2.17.spec
@@ -57,7 +57,7 @@ Summary: Open vSwitch
 Group: System Environment/Daemons daemon/database/utilities
 URL: http://www.openvswitch.org/
 Version: 2.17.0
-Release: 76%{?dist}
+Release: 77%{?dist}
 
 # Nearly all of openvswitch is ASL 2.0.  The bugtool is LGPLv2+, and the
 # lib/sflow*.[ch] files are SISSL
@@ -743,6 +743,13 @@ exit 0
 %endif
 
 %changelog
+* Mon Feb 13 2023 Open vSwitch CI <ovs-ci@redhat.com> - 2.17.0-77
+- Merging upstream branch-2.17 [RH git: 5ba5bb6bf9]
+    Commit list:
+    6626562c53 sparse: Fix build with DPDK and GCC 12.
+    82dc71f808 ovsdb-server: Fix handling of DNS name for listener configuration.
+
+
 * Thu Feb 09 2023 Open vSwitch CI <ovs-ci@redhat.com> - 2.17.0-76
 - Merging upstream branch-2.17 [RH git: 10b09487e4]
     Commit list: