* Add 'static' before some functions and global variables. * Remove cleanup() function. * Remove useless comments. * Use SAFE_XXX(). * Modify the format of ptab[] and cstab[]. * Rewrite 'csum_test()' and 'isocketpair()'. * Some cleanup.
Signed-off-by: Zeng Linggang <zenglg...@cn.fujitsu.com> --- testcases/network/lib6/asapi_04.c | 286 ++++++++++++++++---------------------- 1 file changed, 117 insertions(+), 169 deletions(-) diff --git a/testcases/network/lib6/asapi_04.c b/testcases/network/lib6/asapi_04.c index 76de26b..5fd22ed 100644 --- a/testcases/network/lib6/asapi_04.c +++ b/testcases/network/lib6/asapi_04.c @@ -1,38 +1,21 @@ /* + * Copyright (c) 2015 Fujitsu Ltd. + * Copyright (c) International Business Machines Corp., 2001 * - * Copyright (c) International Business Machines Corp., 2001 + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* - * Test Name: asapi_04 - * - * Test Description: - * Verify that in6 and sockaddr fields are present. Most of these are - * "PASS" if they just compile. - * - * Usage: <for command-line> - * asapi_04 - * - * HISTORY - * 04/2005 written by David L Stevens - * - * RESTRICTIONS: - * None. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + * Author: David L Stevens */ #include <stdio.h> @@ -48,33 +31,34 @@ #include <netinet/in.h> #include "test.h" +#include "safe_macros.h" -char *TCID = "asapi_04"; /* Test program identifier. */ +char *TCID = "asapi_04"; -pid_t pid; +static pid_t pid; -struct { +static struct { char *prt_name; int prt_value; } ptab[] = { - { - "hopopt", 0}, { - "ipv6", 41}, { - "ipv6-route", 43}, { - "ipv6-frag", 44}, { - "esp", 50}, { - "ah", 51}, { - "ipv6-icmp", 58}, { - "ipv6-nonxt", 59}, { -"ipv6-opts", 60},}; - -#define PTCOUNT (sizeof(ptab)/sizeof(ptab[0])) + {"hopopt", 0}, + {"ipv6", 41}, + {"ipv6-route", 43}, + {"ipv6-frag", 44}, + {"esp", 50}, + {"ah", 51}, + {"ipv6-icmp", 58}, + {"ipv6-nonxt", 59}, + {"ipv6-opts", 60}, +}; + +#define PTCOUNT ARRAY_SIZE(ptab) #define READ_TIMEOUT 5 /* secs */ -void do_tests(void); -void setup(void), cleanup(void); -int csum_test(char *rhost); +static void do_tests(void); +static void setup(void); +static int csum_test(void); int main(int argc, char *argv[]) { @@ -89,45 +73,41 @@ int main(int argc, char *argv[]) for (lc = 0; TEST_LOOPING(lc); ++lc) do_tests(); - cleanup(); - tst_exit(); } -void do_tests(void) +static void do_tests(void) { - int i; + unsigned int i; /* RFC 3542, Section 2.3 */ #ifndef IN6_ARE_ADDR_EQUAL - tst_resm(TBROK, "IN6_ARE_ADDR_EQUAL not present"); + tst_resm(TCONF, "IN6_ARE_ADDR_EQUAL not present"); #else /* IN6_ARE_ADDR_EQUAL */ /* * set each bit in an address and check for unequal; then set * in the second address and check for equal. Covers all bits, all * combinations. */ - { - struct in6_addr a1, a2; - int word, bit; - int rv = 1; + struct in6_addr a1, a2; + int word, bit; + int rv = 1; - memset(&a1, 0, sizeof(a1)); - memset(&a2, 0, sizeof(a2)); + memset(&a1, 0, sizeof(a1)); + memset(&a2, 0, sizeof(a2)); - rv = IN6_ARE_ADDR_EQUAL(&a1, &a2); + rv = IN6_ARE_ADDR_EQUAL(&a1, &a2); - for (word = 0; word < 4; ++word) - for (bit = 0; bit < 32; ++bit) { - uint32_t newbit = 1 << bit; + for (word = 0; word < 4; ++word) + for (bit = 0; bit < 32; ++bit) { + uint32_t newbit = 1U << bit; - a1.s6_addr32[word] |= newbit; /* unequal */ - rv &= !IN6_ARE_ADDR_EQUAL(&a1, &a2); - a2.s6_addr32[word] |= newbit; /* equal */ - rv &= IN6_ARE_ADDR_EQUAL(&a1, &a2); - } - tst_resm(rv ? TPASS : TFAIL, "IN6_ARE_ADDR_EQUAL"); - } + a1.s6_addr32[word] |= newbit; /* unequal */ + rv &= !IN6_ARE_ADDR_EQUAL(&a1, &a2); + a2.s6_addr32[word] |= newbit; /* equal */ + rv &= IN6_ARE_ADDR_EQUAL(&a1, &a2); + } + tst_resm(rv ? TPASS : TFAIL, "IN6_ARE_ADDR_EQUAL"); #endif /* IN6_ARE_ADDR_EQUAL */ /* RFC 3542, Section 2.4 */ @@ -141,7 +121,7 @@ void do_tests(void) ptab[i].prt_name); } /* RFC 3542, Section 3.1 */ - csum_test("::1"); + csum_test(); } /* @@ -162,10 +142,10 @@ struct tprot { unsigned char tp_dat[0]; /* user data */ }; -unsigned char tpbuf[sizeof(struct tprot) + 2048]; -unsigned char rpbuf[sizeof(struct tprot) + 2048]; +static unsigned char tpbuf[sizeof(struct tprot) + 2048]; +static unsigned char rpbuf[sizeof(struct tprot) + 2048]; -struct csent { +static struct csent { int cs_offset; int cs_dlen; int cs_setresult; /* setsockopt expected result */ @@ -173,25 +153,24 @@ struct csent { int cs_sndresult; /* send expected result */ int cs_snderrno; /* send expected errno */ } cstab[] = { - { - 0, 5, 0, 0, 0, 0}, { - 6, 30, 0, 0, 0, 0}, { - 3, 20, -1, EINVAL, -1, -1}, /* non-aligned offset */ - { - 4, 5, 0, 0, -1, EINVAL}, /* not enough space */ - { - 50, 5, 0, 0, -1, EINVAL}, /* outside of packet */ - { - 22, 30, 0, 0, 0, 0}, { - 2000, 2004, 0, 0, 0, 0}, /* in a fragment (over Ethernet) */ + {0, 5, 0, 0, 0, 0}, + {6, 30, 0, 0, 0, 0}, + {3, 20, -1, EINVAL, -1, -1}, /* non-aligned offset */ + {4, 5, 0, 0, -1, EINVAL}, /* not enough space */ + {50, 5, 0, 0, -1, EINVAL}, /* outside of packet */ + {22, 30, 0, 0, 0, 0}, + {2000, 2004, 0, 0, 0, 0}, /* in a fragment (over Ethernet) */ }; -#define CSCOUNT (sizeof(cstab)/sizeof(cstab[0])) +#define CSCOUNT ARRAY_SIZE(cstab) + +int TST_TOTAL = PTCOUNT + CSCOUNT; -static int recvtprot(int sd, unsigned char *packet, int psize) +static int recvtprot(int sd, unsigned char *packet) { struct tprot *tpt; - int cc, total, expected; + int cc; + unsigned int total, expected; int gothead; tpt = (struct tprot *)packet; @@ -218,7 +197,8 @@ static int recvtprot(int sd, unsigned char *packet, int psize) return total; } -unsigned short csum(unsigned short partial, unsigned char *packet, int len) +static unsigned short csum(unsigned short partial, unsigned char *packet, + int len) { unsigned long sum = partial; unsigned short *ps; @@ -234,7 +214,7 @@ unsigned short csum(unsigned short partial, unsigned char *packet, int len) return ~sum; } -struct ph { +static struct ph { struct in6_addr ph_sa; struct in6_addr ph_da; uint32_t ph_len; @@ -242,13 +222,14 @@ struct ph { uint8_t ph_nh; } ph; -static int client(int prot, int sfd) +static int client(int sfd) { struct tprot *pttp = (struct tprot *)tpbuf; struct tprot *prtp = (struct tprot *)rpbuf; struct sockaddr_in6 rsin6; static int seq; - int i, sd, cc, cs; + unsigned int i; + int sd, cc, cs; memset(&rsin6, 0, sizeof(rsin6)); rsin6.sin6_family = AF_INET6; @@ -259,11 +240,8 @@ static int client(int prot, int sfd) ph.ph_da = rsin6.sin6_addr; ph.ph_nh = NH_TEST; - sd = socket(PF_INET6, SOCK_RAW, NH_TEST); - if (sd < 0) { - tst_resm(TBROK, "can't create raw socket: %s", strerror(errno)); - return -1; - } + sd = SAFE_SOCKET(NULL, PF_INET6, SOCK_RAW, NH_TEST); + for (i = 0; i < CSCOUNT; ++i) { int offset, len, xlen; int rv; @@ -289,17 +267,20 @@ static int client(int prot, int sfd) cstab[i].cs_setresult); continue; } + if (TEST_RETURN < 0) { tst_resm(TPASS, "IPV6_CHECKSUM offset %d len %d", offset, len); continue; } + if (TEST_RETURN && TEST_ERRNO != cstab[i].cs_seterrno) { tst_resm(TFAIL, "IPV6_CHECKSUM offset %d len %d " "- errno %d != %d", offset, len, TEST_ERRNO, cstab[i].cs_seterrno); continue; } + /* send packet */ TEST(sendto(sd, pttp, len, 0, (struct sockaddr *)&rsin6, sizeof(rsin6))); @@ -311,20 +292,23 @@ static int client(int prot, int sfd) TEST_RETURN, xlen); continue; } + if (TEST_RETURN < 0 && TEST_ERRNO != cstab[i].cs_snderrno) { tst_resm(TFAIL, "IPV6_CHECKSUM offset %d len %d " "- snderrno %d != %d", offset, len, TEST_ERRNO, cstab[i].cs_snderrno); continue; } + if (TEST_RETURN < 0) { tst_resm(TPASS, "IPV6_CHECKSUM offset %d len %d", offset, len); continue; } - while ((cc = recvtprot(sfd, rpbuf, sizeof(rpbuf)))) { - if (htonl(prtp->tp_pid) == pid && - htonl(prtp->tp_seq) == seq) + + while ((cc = recvtprot(sfd, rpbuf))) { + if (htonl(prtp->tp_pid) == (uint32_t)pid && + htonl(prtp->tp_seq) == (uint32_t)seq) break; } rv = 1; @@ -334,7 +318,7 @@ static int client(int prot, int sfd) continue; if (*p != 0xa5) { tst_resm(TFAIL, "IPV6_CHECKSUM corrupt data " - "0x%02x != 0xa5 at offset %d in packet", + "0x%02x != 0xa5 at offset %zd in packet", *p, p - rpbuf); rv = 0; break; @@ -358,7 +342,7 @@ static int client(int prot, int sfd) static int listen_fd, connect_fd; sem_t ilsem; -void *ilistener(void *arg) +static void *ilistener(void *arg LTP_ATTRIBUTE_UNUSED) { connect_fd = accept(listen_fd, 0, 0); close(listen_fd); @@ -366,7 +350,7 @@ void *ilistener(void *arg) return NULL; } -int isocketpair(int pf, int type, int proto, int fd[2]) +static void isocketpair(int pf, int type, int proto, int fd[2]) { pthread_t thid; struct sockaddr_in sin4; @@ -375,80 +359,51 @@ int isocketpair(int pf, int type, int proto, int fd[2]) /* restrict to PF_INET for now */ if (pf != PF_INET) { errno = EOPNOTSUPP; - return -1; + return; } + sem_init(&ilsem, 0, 0); - listen_fd = socket(pf, type, proto); - if (listen_fd < 0) { - perror("socket"); - return -1; - } + + listen_fd = SAFE_SOCKET(NULL, pf, type, proto); + memset(&sin4, 0, sizeof(sin4)); - if (bind(listen_fd, (struct sockaddr *)&sin4, sizeof(sin4)) < 0) { - perror("bind"); - return -1; - } - if (listen(listen_fd, 10) < 0) { - perror("listen"); - return -1; - } + + SAFE_BIND(NULL, listen_fd, (struct sockaddr *)&sin4, sizeof(sin4)); + + SAFE_LISTEN(NULL, listen_fd, 10); + namelen = sizeof(sin4); - if (getsockname(listen_fd, (struct sockaddr *)&sin4, &namelen) < 0) { - perror("getsockname"); - return -1; - } - if (pthread_create(&thid, 0, ilistener, 0) < 0) { - perror("pthread_create"); - return -1; - } + SAFE_GETSOCKNAME(NULL, listen_fd, (struct sockaddr *)&sin4, &namelen); + + if (pthread_create(&thid, 0, ilistener, 0) < 0) + tst_brkm(TBROK | TERRNO, NULL, "pthread_create error"); + + fd[0] = SAFE_SOCKET(NULL, pf, type, proto); - fd[0] = socket(pf, type, proto); - if (fd[0] < 0) { - perror("socket"); - return -1; - } sin4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - if (connect(fd[0], (struct sockaddr *)&sin4, sizeof(sin4)) < 0) { - perror("connect"); - return -1; - } + + SAFE_CONNECT(NULL, fd[0], (struct sockaddr *)&sin4, sizeof(sin4)); + sem_wait(&ilsem); fd[1] = connect_fd; sem_destroy(&ilsem); - return 0; } #ifndef MAX #define MAX(a, b) ((a) >= (b) ? (a) : (b)) #endif /* MAX */ -int csum_test(char *rhost) +static int csum_test(void) { fd_set rset, rset_save; int csd[2]; /* control sockets */ int sd, nfds, maxfd, cc; struct timeval tv; -/* rhost == loopback, for now */ - if (strcmp(rhost, "::1")) { - tst_resm(TBROK, "invalid rhost \"%s\"", rhost); - return -1; - } - if (isocketpair(PF_INET, SOCK_STREAM, 0, csd) < 0) { - tst_resm(TBROK, "socketpair: %s", strerror(errno)); - return -1; - } - sd = socket(PF_INET6, SOCK_RAW, NH_TEST); - if (sd < 0) { - int saved_errno = errno; - - if (errno == EPERM && geteuid()) - tst_resm(TBROK, "IPV6_CHECKSUM tests must run as root"); - else - tst_resm(TBROK, "All IPv6_CHECKSUM tests broken: " - "socket: %s", strerror(saved_errno)); - return -1; - } + isocketpair(PF_INET, SOCK_STREAM, 0, csd); + + sd = SAFE_SOCKET(NULL, PF_INET6, SOCK_RAW, NH_TEST); + FD_ZERO(&rset_save); FD_SET(sd, &rset_save); FD_SET(csd[1], &rset_save); @@ -457,16 +412,15 @@ int csum_test(char *rhost) /* server socket set; now start the client */ switch (fork()) { - case 0: /* child */ + case 0: close(csd[0]); break; case -1: - tst_resm(TBROK, "can't fork rserver"); - return -1; - default: /* parent */ + tst_brkm(TBROK, NULL, "can't fork rserver"); + default: close(sd); close(csd[1]); - return client(pid, csd[0]); + return client(csd[0]); } tv.tv_sec = READ_TIMEOUT; @@ -515,13 +469,7 @@ int csum_test(char *rhost) return 0; } -void setup(void) -{ - TEST_PAUSE; /* if -P option specified */ -} - -void cleanup(void) +static void setup(void) { + TEST_PAUSE; } - -int TST_TOTAL = PTCOUNT + CSCOUNT; -- 1.9.3 ------------------------------------------------------------------------------ _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list