Hi! > #include <stdio.h> > @@ -49,36 +37,27 @@ > > #include "test.h" > > -char *TCID = "asapi_04"; /* Test program identifier. */ > +#define READ_TIMEOUT 5 /* secs */ > > pid_t pid; > > -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])) > +static void setup(void); > +static void test_in6_are_addr_equal(void); > +static void test_protocols_entry(void); > +static int csum_test(char *rhost); > +static void test_ipv6_checksum(void); > > -#define READ_TIMEOUT 5 /* secs */ > > -void do_tests(void); > -void setup(void), cleanup(void); > -int csum_test(char *rhost); > +static void (*testfunc[])(void) = { test_in6_are_addr_equal, > + test_protocols_entry, test_ipv6_checksum }; > + > +char *TCID = "asapi_04"; > +int TST_TOTAL = ARRAY_SIZE(testfunc); > > int main(int argc, char *argv[]) > { > int lc; > + int i; > > tst_parse_opts(argc, argv, 0, 0); > > @@ -86,22 +65,27 @@ int main(int argc, char *argv[]) > > setup(); > > - for (lc = 0; TEST_LOOPING(lc); ++lc) > - do_tests(); > + for (lc = 0; TEST_LOOPING(lc); ++lc) { > + tst_count = 0; > > - cleanup(); > + for (i = 0; i < TST_TOTAL; i++) > + (*testfunc[i])(); > + } > > tst_exit(); > } > > -void do_tests(void) > +void setup(void) > { > - int i; > + TEST_PAUSE; > +} > > /* RFC 3542, Section 2.3 */ > +void test_in6_are_addr_equal(void) > +{ > #ifndef IN6_ARE_ADDR_EQUAL > tst_resm(TBROK, "IN6_ARE_ADDR_EQUAL not present"); > -#else /* IN6_ARE_ADDR_EQUAL */ > +#else > /* > * set each bit in an address and check for unequal; then set > * in the second address and check for equal. Covers all bits, all > @@ -128,30 +112,56 @@ void do_tests(void) > } > tst_resm(rv ? TPASS : TFAIL, "IN6_ARE_ADDR_EQUAL"); > } > -#endif /* IN6_ARE_ADDR_EQUAL */ > +#endif > +} > + > +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]))
ARRAY_SIZE() here as well > /* RFC 3542, Section 2.4 */ > +void test_protocols_entry(void) > +{ > + unsigned int i; > + > for (i = 0; i < PTCOUNT; ++i) { > struct protoent *pe; > int pass; > > pe = getprotobyname(ptab[i].prt_name); > pass = pe && pe->p_proto == ptab[i].prt_value; > - tst_resm(pass ? TPASS : TFAIL, "\"%s\" protocols entry", > - ptab[i].prt_name); > + if (pass) { > + tst_resm(TINFO, "\"%s\" protocols entry", > + ptab[i].prt_name); > + } else { > + tst_resm(TFAIL, "\"%s\" protocols entry", > + ptab[i].prt_name); > + return; > + } > } > + > + tst_resm(TPASS, "protocols entry tests succeed"); > +} I do not think this is a good idea. Why can we just do the PASS/FAIL on each testcase and adjust the test count variable accordingly? > /* RFC 3542, Section 3.1 */ > +void test_ipv6_checksum(void) > +{ > csum_test("::1"); > } > > -/* > - * this next-header value shouldn't be a real protocol!! > - * 0x9f = 01 0 11111 > - * | | | > - * | | |--- rest- ~0 > - * | |--------- chg - "no change enroute" > - * |----------- act - "discard unknown" > - */ > #define NH_TEST 0x9f I guess that this comment should rather stay as it explains the constant. > struct tprot { > @@ -173,17 +183,13 @@ 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])) > @@ -197,7 +203,7 @@ static int recvtprot(int sd, unsigned char *packet, int > psize) > tpt = (struct tprot *)packet; > total = cc = recv(sd, packet, sizeof(struct tprot), 0); > expected = sizeof(struct tprot); /* until we get tp_dlen */ > - gothead = total >= sizeof(struct tprot); > + gothead = (unsigned int)total >= sizeof(struct tprot); > if (gothead) > expected += ntohl(tpt->tp_dlen); > if (cc <= 0) > @@ -206,7 +212,8 @@ static int recvtprot(int sd, unsigned char *packet, int > psize) > cc = recv(sd, &packet[total], expected - total, 0); > if (cc >= 0) { > total += cc; > - if (!gothead && total >= sizeof(struct tprot)) { > + if (!gothead && (unsigned int)total >= > + sizeof(struct tprot)) { > gothead = 1; > expected += ntohl(tpt->tp_dlen); > } > @@ -248,7 +255,8 @@ static int client(int prot, int sfd) > 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; > @@ -261,8 +269,8 @@ static int client(int prot, int sfd) > > sd = socket(PF_INET6, SOCK_RAW, NH_TEST); > if (sd < 0) { > - tst_resm(TBROK, "can't create raw socket: %s", strerror(errno)); > - return -1; > + tst_brkm(TBROK | TERRNO, NULL, "can't create raw socket: %s", > + strerror(errno)); ^ You should remove the strerror() now, as it's not needed anymore with TERRNO. > } > for (i = 0; i < CSCOUNT; ++i) { > int offset, len, xlen; > @@ -287,10 +295,10 @@ static int client(int prot, int sfd) > "IPV6_CHECKSUM offset %d len %d " > "- result %ld != %d", offset, len, TEST_RETURN, > cstab[i].cs_setresult); > - continue; > + return -1; > } > if (TEST_RETURN < 0) { > - tst_resm(TPASS, "IPV6_CHECKSUM offset %d len %d", > + tst_resm(TINFO, "IPV6_CHECKSUM offset %d len %d", > offset, len); > continue; > } > @@ -298,7 +306,7 @@ static int client(int prot, int sfd) > tst_resm(TFAIL, "IPV6_CHECKSUM offset %d len %d " > "- errno %d != %d", offset, len, > TEST_ERRNO, cstab[i].cs_seterrno); > - continue; > + return -1; What is the reason for exitting the test on first failure? -- Cyril Hrubis chru...@suse.cz ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list