struct inet_addr connect_to;
        struct inet_addr listen_at;
        enum server accept_on;
+       bool reuseport_has_conns; /* Add a connected socket to reuseport group */
 };
 
 static __u32 duration;         /* for CHECK macro */
 
 static void run_lookup_prog(const struct test *t)
 {
-       int client_fd, server_fds[MAX_SERVERS] = { -1 };
+       int server_fds[MAX_SERVERS] = { -1 };
+       int client_fd, reuse_conn_fd = -1;
        struct bpf_link *lookup_link;
        int i, err;
 
                        break;
        }
 
+       /* Regular UDP socket lookup with reuseport behaves
+        * differently when reuseport group contains connected
+        * sockets. Check that adding a connected UDP socket to the
+        * reuseport group does not affect how reuseport works with
+        * BPF socket lookup.
+        */
+       if (t->reuseport_has_conns) {
+               struct sockaddr_storage addr = {};
+               socklen_t len = sizeof(addr);
+
+               /* Add an extra socket to reuseport group */
+               reuse_conn_fd = make_server(t->sotype, t->listen_at.ip,
+                                           t->listen_at.port,
+                                           t->reuseport_prog);
+               if (reuse_conn_fd < 0)
+                       goto close;
+
+               /* Connect the extra socket to itself */
+               err = getsockname(reuse_conn_fd, (void *)&addr, &len);
+               if (CHECK(err, "getsockname", "errno %d\n", errno))
+                       goto close;
+               err = connect(reuse_conn_fd, (void *)&addr, len);
+               if (CHECK(err, "connect", "errno %d\n", errno))
+                       goto close;
+       }
+
        client_fd = make_client(t->sotype, t->connect_to.ip, t->connect_to.port);
        if (client_fd < 0)
                goto close;
 
        close(client_fd);
 close:
+       if (reuse_conn_fd != -1)
+               close(reuse_conn_fd);
        for (i = 0; i < ARRAY_SIZE(server_fds); i++) {
                if (server_fds[i] != -1)
                        close(server_fds[i]);
                        .listen_at      = { INT_IP4, INT_PORT },
                        .accept_on      = SERVER_B,
                },
+               {
+                       .desc           = "UDP IPv4 redir and reuseport with conns",
+                       .lookup_prog    = skel->progs.select_sock_a,
+                       .reuseport_prog = skel->progs.select_sock_b,
+                       .sock_map       = skel->maps.redir_map,
+                       .sotype         = SOCK_DGRAM,
+                       .connect_to     = { EXT_IP4, EXT_PORT },
+                       .listen_at      = { INT_IP4, INT_PORT },
+                       .accept_on      = SERVER_B,
+                       .reuseport_has_conns = true,
+               },
                {
                        .desc           = "UDP IPv4 redir skip reuseport",
                        .lookup_prog    = skel->progs.select_sock_a_no_reuseport,
                        .listen_at      = { INT_IP6, INT_PORT },
                        .accept_on      = SERVER_B,
                },
+               {
+                       .desc           = "UDP IPv6 redir and reuseport with conns",
+                       .lookup_prog    = skel->progs.select_sock_a,
+                       .reuseport_prog = skel->progs.select_sock_b,
+                       .sock_map       = skel->maps.redir_map,
+                       .sotype         = SOCK_DGRAM,
+                       .connect_to     = { EXT_IP6, EXT_PORT },
+                       .listen_at      = { INT_IP6, INT_PORT },
+                       .accept_on      = SERVER_B,
+                       .reuseport_has_conns = true,
+               },
                {
                        .desc           = "UDP IPv6 redir skip reuseport",
                        .lookup_prog    = skel->progs.select_sock_a_no_reuseport,