/*
 *
 *   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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 "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;
	const 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)
{
}
