blob: 6d968fb2f96891afaaa978939b4d7dbabb11cb8c [file] [log] [blame]
/*
*
* 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 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.
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Test Name: asapi_01
*
* Test Description:
* These tests are for the "Advanced Sockets API" (RFC 3542)
* Verify that in6 and sockaddr fields are present.
*
* Usage: <for command-line>
* asapi_01
*
* HISTORY
* 01/2005 written by David L Stevens
*
* RESTRICTIONS:
* None.
*
*/
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
#include <netinet/ip6.h>
#include "test.h"
#include "usctest.h"
#include "runcc.h"
char *TCID="asapi_01"; /* Test program identifier. */
void setup(void), cleanup(void);
enum ttype { EXISTS, ALIAS, VALUE };
struct ftent {
char *ft_tname; /* test name */
int ft_type; /* test type */
char *ft_incl; /* include file list */
char *ft_struct; /* structure name */
char *ft_field; /* field name */
char *ft_offset; /* field offset */
union {
char *fu_value; /* field size or value */
char *fu_dname; /* #define name */
} ftun;
#define ft_value ftun.fu_value
#define ft_dname ftun.fu_dname
} ftab[] = {
/* section 2.1 structure & field definitions */
{ "ip6_hdr un1_flow", EXISTS, IP6_H, "ip6_hdr",
"ip6_ctlun.ip6_un1.ip6_un1_flow", "0", {"4"} },
{ "ip6_hdr ip6_flow", ALIAS, IP6_H, "ip6_hdr",
"ip6_ctlun.ip6_un1.ip6_un1_flow", NULL, {"ip6_flow"} },
{ "ip6_hdr un1_plen", EXISTS, IP6_H, "ip6_hdr",
"ip6_ctlun.ip6_un1.ip6_un1_plen", "4", {"2"} },
{ "ip6_hdr ip6_plen", ALIAS, IP6_H, "ip6_hdr",
"ip6_ctlun.ip6_un1.ip6_un1_plen", "4", {"ip6_plen"} },
{ "ip6_hdr un1_nxt", EXISTS, IP6_H, "ip6_hdr",
"ip6_ctlun.ip6_un1.ip6_un1_nxt", "6", {"1"} },
{ "ip6_hdr ip6_nxt", ALIAS, IP6_H, "ip6_hdr",
"ip6_ctlun.ip6_un1.ip6_un1_nxt", NULL, {"ip6_nxt"} },
{ "ip6_hdr un1_hlim", EXISTS, IP6_H, "ip6_hdr",
"ip6_ctlun.ip6_un1.ip6_un1_hlim", "7", {"1"} },
{ "ip6_hdr ip6_hlim", ALIAS, IP6_H, "ip6_hdr",
"ip6_ctlun.ip6_un1.ip6_un1_hlim", NULL, {"ip6_hlim"} },
{ "ip6_hdr un1_vfc", EXISTS, IP6_H, "ip6_hdr",
"ip6_ctlun.ip6_un2_vfc", "0",
{"1"} },
{ "ip6_hdr ip6_src", EXISTS, IP6_H, "ip6_hdr", "ip6_src",
"sizeof(struct ip6_hdrctl)",
{"sizeof(struct in6_addr)"} },
{ "ip6_hdr ip6_dst", EXISTS, IP6_H, "ip6_hdr", "ip6_dst",
"(sizeof(struct ip6_hdrctl)+sizeof(struct in6_addr))",
{"sizeof(struct in6_addr)"} },
/* section 2.2 structure and field definitions */
{ "IPPROTO_HOPOPTS", VALUE, IN_H, "IPPROTO_HOPOPTS",
NULL, NULL, {"0"} },
{ "IPPROTO_IPV6", VALUE, IN_H, "IPPROTO_IPV6",
NULL, NULL, {"41"} },
{ "IPPROTO_ROUTING", VALUE, IN_H, "IPPROTO_ROUTING",
NULL, NULL, {"43"} },
{ "IPPROTO_FRAGMENT", VALUE, IN_H, "IPPROTO_FRAGMENT",
NULL, NULL, {"44"} },
{ "IPPROTO_ESP", VALUE, IN_H, "IPPROTO_ESP",
NULL, NULL, {"50"} },
{ "IPPROTO_AH", VALUE, IN_H, "IPPROTO_AH",
NULL, NULL, {"51"} },
{ "IPPROTO_ICMPV6", VALUE, IN_H, "IPPROTO_ICMPV6",
NULL, NULL, {"58"} },
{ "IPPROTO_NONE", VALUE, IN_H, "IPPROTO_NONE",
NULL, NULL, {"59"} },
{ "IPPROTO_DSTOPTS", VALUE, IN_H, "IPPROTO_DSTOPTS",
NULL, NULL, {"60"} },
/* ip6_hbh */
{ "ip6_hbh ip6h_nxt", EXISTS, IP6_H, "ip6_hbh",
"ip6h_nxt", "0", {"1"} },
{ "ip6_hbh ip6h_nxt", EXISTS, IP6_H, "ip6_hbh",
"ip6h_len", "1", {"1"} },
/* ip6_dest */
{ "ip6_dest ip6d_nxt", EXISTS, IP6_H, "ip6_dest",
"ip6d_nxt", "0", {"1"} },
{ "ip6_dest ip6d_nxt", EXISTS, IP6_H, "ip6_dest",
"ip6d_len", "1", {"1"} },
/* ip6_rthdr0 */
{ "ip6_rthdr0 ip6r0_nxt", EXISTS, IP6_H, "ip6_rthdr0",
"ip6r0_nxt", "0", {"1"} },
{ "ip6_rthdr0 ip6r0_len", EXISTS, IP6_H, "ip6_rthdr0",
"ip6r0_len", "1", {"1"} },
{ "ip6_rthdr0 ip6r0_type", EXISTS, IP6_H, "ip6_rthdr0",
"ip6r0_type", "2", {"1"} },
{ "ip6_rthdr0 ip6r0_segleft", EXISTS, IP6_H, "ip6_rthdr0",
"ip6r0_segleft", "3", {"1"} },
{ "ip6_rthdr0 ip6r0_reserved", EXISTS, IP6_H, "ip6_rthdr0",
"ip6r0_reserved", "4", {"1"} },
/* ip6_frag */
{ "ip6_frag ip6f_nxt", EXISTS, IP6_H, "ip6_frag",
"ip6f_nxt", "0", {"1"} },
{ "ip6_frag ip6f_reserved", EXISTS, IP6_H, "ip6_frag",
"ip6f_reserved", "1", {"1"} },
{ "ip6_frag ip6f_offlg", EXISTS, IP6_H, "ip6_frag",
"ip6f_offlg", "2", {"2"} },
{ "ip6_frag ip6f_ident", EXISTS, IP6_H, "ip6_frag",
"ip6f_ident", "4", {"4"} },
{ "IP6F_OFF_MASK", VALUE, IP6_H, "IP6F_OFF_MASK",
NULL, NULL, {"htons(0xfff8)"} },
{ "IP6F_RESERVED_MASK", VALUE, IP6_H, "IP6F_RESERVED_MASK",
NULL, NULL, {"htons(0x0006)"} },
{ "IP6F_MORE_FRAG", VALUE, IP6_H, "IP6F_MORE_FRAG",
NULL, NULL, {"htons(0x0001)"} },
{ "IP6OPT_TYPE", VALUE, IP6_H, "IP6OPT_TYPE(0xff)",
NULL, NULL, {"0xc0"} },
{ "IP6OPT_TYPE_SKIP", VALUE, IP6_H, "IP6OPT_TYPE_SKIP",
NULL, NULL, {"0x00"} },
{ "IP6OPT_TYPE_DISCARD", VALUE, IP6_H, "IP6OPT_TYPE_DISCARD",
NULL, NULL, {"0x40"} },
{ "IP6OPT_TYPE_FORCEICMP", VALUE, IP6_H, "IP6OPT_TYPE_FORCEICMP",
NULL, NULL, {"0x80"} },
{ "IP6OPT_TYPE_ICMP", VALUE, IP6_H, "IP6OPT_TYPE_ICMP",
NULL, NULL, {"0xc0"} },
{ "IP6OPT_TYPE_MUTABLE", VALUE, IP6_H, "IP6OPT_TYPE_MUTABLE",
NULL, NULL, {"0x20"} },
{ "IP6OPT_PAD1", VALUE, IP6_H, "IP6OPT_PAD1",
NULL, NULL, {"0x00"} },
{ "IP6OPT_PADN", VALUE, IP6_H, "IP6OPT_PADN",
NULL, NULL, {"0x01"} },
{ "IP6OPT_JUMBO", VALUE, IP6_H, "IP6OPT_JUMBO",
NULL, NULL, {"0xc2"} },
{ "IP6OPT_NSAP_ADDR", VALUE, IP6_H, "IP6OPT_NSAP_ADDR",
NULL, NULL, {"0xc3"} },
{ "IP6OPT_TUNNEL_LIMIT", VALUE, IP6_H, "IP6OPT_TUNNEL_LIMIT",
NULL, NULL, {"0x04"} },
{ "IP6OPT_ROUTER_ALERT", VALUE, IP6_H, "IP6OPT_ROUTER_ALERT",
NULL, NULL, {"0x05"} },
/* ip6_opt_jumbo */
{ "ip6_opt_jumbo ip6oj_type", EXISTS, IP6_H, "ip6_opt_jumbo",
"ip6oj_type", "0", {"1"} },
{ "ip6_opt_jumbo ip6oj_len", EXISTS, IP6_H, "ip6_opt_jumbo",
"ip6oj_len", "1", {"1"} },
{ "ip6_opt_jumbo ip6oj_jumbo_len element", EXISTS, IP6_H,
"ip6_opt_jumbo", "ip6oj_jumbo_len[0]", "2", {"1"} },
{ "ip6_opt_jumbo ip6oj_jumbo_len array", EXISTS, IP6_H,
"ip6_opt_jumbo", "ip6oj_jumbo_len", "2", {"4"} },
/* ip6_opt_nsap */
{ "ip6_opt_nsap ip6on_type", EXISTS, IP6_H, "ip6_opt_nsap",
"ip6on_type", "0", {"1"} },
{ "ip6_opt_nsap ip6on_len", EXISTS, IP6_H, "ip6_opt_nsap",
"ip6on_len", "1", {"1"} },
{ "ip6_opt_nsap ip6on_src_nsap_len", EXISTS, IP6_H, "ip6_opt_nsap",
"ip6on_src_nsap_len", "2", {"1"} },
{ "ip6_opt_nsap ip6on_dst_nsap_len", EXISTS, IP6_H, "ip6_opt_nsap",
"ip6on_dst_nsap_len", "3", {"1"} },
/* ip6_opt_tunnel */
{ "ip6_opt_tunnel ip6ot_type", EXISTS, IP6_H, "ip6_opt_tunnel",
"ip6ot_type", "0", {"1"} },
{ "ip6_opt_tunnel ip6ot_len", EXISTS, IP6_H, "ip6_opt_tunnel",
"ip6ot_len", "1", {"1"} },
{ "ip6_opt_tunnel ip6ot_encap_limit", EXISTS, IP6_H, "ip6_opt_tunnel",
"ip6ot_encap_limit", "2", {"1"} },
/* ip6_opt_router */
{ "ip6_opt_router ip6or_type", EXISTS, IP6_H, "ip6_opt_router",
"ip6or_type", "0", {"1"} },
{ "ip6_opt_router ip6or_len", EXISTS, IP6_H, "ip6_opt_router",
"ip6or_len", "1", {"1"} },
{ "ip6_opt_router ip6or_value element", EXISTS, IP6_H,
"ip6_opt_router", "ip6or_value[0]", "2", {"1"} },
{ "ip6_opt_router ip6or_value array", EXISTS, IP6_H, "ip6_opt_router",
"ip6or_value", "2", {"2"} },
/* IP6_ALERT_* definitions */
{ "IP6_ALERT_MLD", VALUE, IP6_H, "IP6_ALERT_MLD",
NULL, NULL, {"0"} },
{ "IP6_ALERT_RSVP", VALUE, IP6_H, "IP6_ALERT_RSVP",
NULL, NULL, {"htons(1)"} },
{ "IP6_ALERT_AN", VALUE, IP6_H, "IP6_ALERT_AN",
NULL, NULL, {"htons(2)"} },
};
#define FTCOUNT (sizeof(ftab)/sizeof(ftab[0]))
int TST_TOTAL = FTCOUNT;
int
main(int argc, char *argv[])
{
int i, lc;
char *msg;
/* Parse standard options given to run the test. */
msg = parse_opts(argc, argv, NULL, NULL);
if (msg != NULL) {
tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
}
setup();
for (lc = 0; TEST_LOOPING(lc); ++lc) {
for (i=0; i<FTCOUNT; ++i) {
switch (ftab[i].ft_type) {
case EXISTS:
structcheck(ftab[i].ft_tname, ftab[i].ft_incl,
ftab[i].ft_struct, ftab[i].ft_field,
ftab[i].ft_offset, ftab[i].ft_value);
break;
case ALIAS:
aliascheck(ftab[i].ft_tname, ftab[i].ft_incl,
ftab[i].ft_struct, ftab[i].ft_field,
ftab[i].ft_dname);
break;
case VALUE:
valuecheck(ftab[i].ft_tname, ftab[i].ft_incl,
ftab[i].ft_struct, ftab[i].ft_dname);
break;
default:
tst_resm(TBROK, "invalid type %d",
ftab[i].ft_type);
break;
}
}
}
cleanup();
tst_exit();
}
void
setup(void)
{
TEST_PAUSE; /* if -P option specified */
}
void
cleanup(void)
{
TEST_CLEANUP;
}