// Copyright 2008 Google Inc. Released under the GPL v2. // // This test performs numerous connects (with auto-binding), to a server // listening on all local addresses using an IPv6 socket, by connecting to // 127.0.0.1, ::ffff:127.0.0.1 and ::1. // // The code is really three tests: // // - RunWithOneServer, using CreateServer and ConnectAndAccept, // uses one server socket and repeatedly connects to it. // // - RunWithOneShotServers, using CreateServerConnectAndAccept, // creates servers, connects to them and then discards them. // // - RunMultiThreaded, using ThreadedCreateServerConnectAndAccept, // ThreadedStartServer and ThreadedGetServerFD, is equivalent to // RunWithOneShotServers but uses multiple threads, one for the // server and one for the client. // // Each of these tests triggers error conditions on different kernels // to a different extent. #include #include #include #include #include #include #include #include #include #include // Which loopback address to connect to. enum LoopbackAddr { V4_LOOPBACK, V6_LOOPBACK, V6_MAPPED_V4_LOOPBACK }; // Connect to a listening TCP socket, and accept the connection. static void ConnectAndAccept(enum LoopbackAddr addr, int server_fd, int port) { struct sockaddr_in6 sa; socklen_t addr_len; int client_fd, accepted_fd; if (addr == V6_LOOPBACK || addr == V6_MAPPED_V4_LOOPBACK) { char buf[INET6_ADDRSTRLEN]; memset(&sa, 0, sizeof(sa)); if ((client_fd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)) == -1) { perror("socket"); exit(1); } if (addr == V6_LOOPBACK) { inet_pton(AF_INET6, "::1", &sa.sin6_addr); } else if (addr == V6_MAPPED_V4_LOOPBACK) { inet_pton(AF_INET6, "::ffff:127.0.0.1", &sa.sin6_addr); } if (!inet_ntop(AF_INET6, &sa.sin6_addr, buf, INET6_ADDRSTRLEN)) { perror("inet_ntop"); exit(1); } addr_len = sizeof(sa); sa.sin6_family = AF_INET6; sa.sin6_port = port; if (connect(client_fd, (struct sockaddr*)(&sa), sizeof(struct sockaddr_in6)) == -1) { perror("connect"); exit(1); } write(2, (addr == V6_LOOPBACK) ? "+" : "-", 1); } else { struct sockaddr_in sa4; if ((client_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { perror("socket"); exit(1); } memset(&sa4, 0, sizeof(sa4)); sa4.sin_family = AF_INET; inet_pton(AF_INET, "127.0.0.1", &sa4.sin_addr); sa4.sin_port = port; if (connect(client_fd, (struct sockaddr*)(&sa4), sizeof(struct sockaddr_in)) == -1) { perror("connect"); exit(1); } write(2, ".", 1); } addr_len = sizeof(sa); if ((accepted_fd = accept(server_fd, (struct sockaddr*)(&sa), &addr_len)) == -1) { perror("accept"); exit(1); } close(client_fd); close(accepted_fd); } // Create a listening TCP socket. static void CreateServer(int* server_fd, int* port) { struct sockaddr_in6 sa; socklen_t addr_len; memset(&sa, 0, sizeof(sa)); if ((*server_fd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)) == -1) { perror("socket"); exit(1); } addr_len = sizeof(sa); sa.sin6_family = AF_INET6; sa.sin6_addr = in6addr_any; sa.sin6_port = 0; if (bind(*server_fd, (struct sockaddr*)(&sa), sizeof(sa)) == -1) { perror("bind"); exit(1); } if (getsockname(*server_fd, (struct sockaddr*)(&sa), &addr_len) == -1) { perror("getsockname"); exit(1); } if (listen(*server_fd, 10) == -1) { perror("listen"); exit(1); } *port = sa.sin6_port; } // Create a socket, connect to it, accept, and discard both. static void CreateServerConnectAndAccept(enum LoopbackAddr addr) { struct sockaddr_in6 sa; socklen_t addr_len; int server_fd, client_fd, accepted_fd, connect_rc; if ((server_fd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)) == -1) { perror("socket"); exit(1); } addr_len = sizeof(sa); memset(&sa, 0, sizeof(sa)); sa.sin6_family = AF_INET6; sa.sin6_addr = in6addr_any; sa.sin6_port = 0; if (bind(server_fd, (struct sockaddr*)(&sa), sizeof(sa)) == -1) { perror("bind"); exit(1); } if (getsockname(server_fd, (struct sockaddr*)(&sa), &addr_len) == -1) { perror("getsockname"); exit(1); } if (listen(server_fd, 10) == -1) { perror("listen"); exit(1); } if (addr == V6_LOOPBACK || addr == V6_MAPPED_V4_LOOPBACK) { char buf[INET6_ADDRSTRLEN]; if ((client_fd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)) == -1) { perror("socket"); exit(1); } if (addr == V6_LOOPBACK) { inet_pton(AF_INET6, "::1", &sa.sin6_addr); } else if (addr == V6_MAPPED_V4_LOOPBACK) { inet_pton(AF_INET6, "::ffff:127.0.0.1", &sa.sin6_addr); } if (!inet_ntop(AF_INET6, &sa.sin6_addr, buf, INET6_ADDRSTRLEN)) { perror("inet_ntop"); exit(1); } connect_rc = connect(client_fd, (struct sockaddr*)(&sa), sizeof(struct sockaddr_in6)); write(2, (addr == V6_MAPPED_V4_LOOPBACK) ? "-" : "+", 1); } else { struct sockaddr_in sa4; if ((client_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { perror("socket"); exit(1); } memset(&sa4, 0, sizeof(sa4)); sa4.sin_family = AF_INET; inet_pton(AF_INET, "127.0.0.1", &sa4.sin_addr); sa4.sin_port = sa.sin6_port; connect_rc = connect(client_fd, (struc
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote fetch="https://github.com/01org/" name="01org"/>
  <remote fetch="https://gerrit.automotivelinux.org/gerrit/" name="agl" pushurl="ssh://gerrit.automotivelinux.org:29418" review="https://gerrit.automotivelinux.org/gerrit/"/>
  <remote fetch="git://git.freescale.com/imx" name="fsl-release"/>
  <remote fetch="https://github.com/" name="github"/>
  <remote fetch="git://git.openembedded.org/" name="openembedded"/>
  <remote fetch="git://git.yoctoproject.org/" name="yocto"/>
  
  <default remote="agl" revision="master" sync-j="4"/>
  
  <project name="AGL/meta-agl" path="meta-agl" revision="1a70e5e8f48f17f604ab243dfb3ff01f7aa435f6" upstream="master"/>
  <project name="AGL/meta-agl-demo" path="meta-agl-demo" revision="e416218176328ef20ac8ff130af5bff5da51b284" upstream="master"