/*
 *
 *   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_03
 *
 * 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_03
 *
 * HISTORY
 *	03/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_03";	/* 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.2.3, MLDv1 */
	{
		"MLD_LISTENER_QUERY", VALUE, ICMP6_H, "MLD_LISTENER_QUERY",
		    NULL, NULL, {
	"130"}}, {
		"MLD_LISTENER_REPORT", VALUE, ICMP6_H, "MLD_LISTENER_REPORT",
		    NULL, NULL, {
	"131"}}, {
		"MLD_LISTENER_REDUCTION", VALUE, ICMP6_H,
		    "MLD_LISTENER_REDUCTION", NULL, NULL, {
	"132"}}, {
		"mld_hdr mld_icmp6_hdr", EXISTS, ICMP6_H, "mld_hdr",
		    "mld_icmp6_hdr", "0", {
	"sizeof(struct icmp6_hdr)"}}, {
		"mld_hdr mld_addr", EXISTS, ICMP6_H, "mld_hdr", "mld_addr",
		    "sizeof(struct icmp6_hdr)", {
	"sizeof(struct in6_addr)"}}, {
		"mld_hdr mld_type define", ALIAS, ICMP6_H, "mld_hdr",
		    "mld_icmp6_hdr.icmp6_type", NULL, {
	"mld_type"}}, {
		"mld_hdr mld_code define", ALIAS, ICMP6_H, "mld_hdr",
		    "mld_icmp6_hdr.icmp6_code", NULL, {
	"mld_code"}}, {
		"mld_hdr mld_cksum define", ALIAS, ICMP6_H, "mld_hdr",
		    "mld_icmp6_hdr.icmp6_cksum", NULL, {
	"mld_cksum"}}, {
		"mld_hdr mld_maxdelay define", ALIAS, ICMP6_H, "mld_hdr",
		    "mld_icmp6_hdr.icmp6_data16[0]", NULL, {
	"mld_maxdelay"}}, {
		"mld_hdr mld_reserved define", ALIAS, ICMP6_H, "mld_hdr",
		    "mld_icmp6_hdr.icmp6_data16[1]", NULL, {
	"mld_reserved"}},
/* section 2.2.4, Router renumbering */
	{
		"ICMP6_ROUTER_RENUMBERING", VALUE, ICMP6_H,
		    "ICMP6_ROUTER_RENUMBERING", NULL, NULL, {
	"138"}}, {
		"icmp6_router_renum rr_hdr", EXISTS, ICMP6_H,
		    "icmp6_router_renum", "rr_hdr", "0", {
	"sizeof(struct icmp6_hdr)"}}, {
		"icmp6_router_renum rr_segnum", EXISTS, ICMP6_H,
		    "icmp6_router_renum", "rr_segnum",
		    "sizeof(struct icmp6_hdr)", {
	"1"}}, {
		"icmp6_router_renum rr_flags", EXISTS, ICMP6_H,
		    "icmp6_router_renum", "rr_flags",
		    "sizeof(struct icmp6_hdr)+1", {
	"1"}}, {
		"icmp6_router_renum rr_maxdelay", EXISTS, ICMP6_H,
		    "icmp6_router_renum", "rr_maxdelay",
		    "sizeof(struct icmp6_hdr)+2", {
	"2"}}, {
		"icmp6_router_renum rr_reserved", EXISTS, ICMP6_H,
		    "icmp6_router_renum", "rr_reserved",
		    "sizeof(struct icmp6_hdr)+4", {
	"4"}}, {
		"icmp6_router_renum rr_type define", ALIAS, ICMP6_H,
		    "icmp6_router_renum", "rr_hdr.icmp6_type", NULL, {
	"rr_type"}}, {
		"icmp6_router_renum rr_code define", ALIAS, ICMP6_H,
		    "icmp6_router_renum", "rr_hdr.icmp6_code", NULL, {
	"rr_code"}}, {
		"icmp6_router_renum rr_cksum define", ALIAS, ICMP6_H,
		    "icmp6_router_renum", "rr_hdr.icmp6_cksum", NULL, {
	"rr_cksum"}}, {
		"icmp6_router_renum rr_seqnum define", ALIAS, ICMP6_H,
		    "icmp6_router_renum", "rr_hdr.icmp6_data32[0]", NULL, {
	"rr_seqnum"}}, {
		"ICMP6_RR_FLAGS_TEST", VALUE, ICMP6_H, "ICMP6_RR_FLAGS_TEST",
		    NULL, NULL, {
	"0x80"}}, {
		"ICMP6_RR_FLAGS_REQRESULT", VALUE, ICMP6_H,
		    "ICMP6_RR_FLAGS_REQRESULT", NULL, NULL, {
	"0x40"}}, {
		"ICMP6_RR_FLAGS_FORCEAPPLY", VALUE, ICMP6_H,
		    "ICMP6_RR_FLAGS_FORCEAPPLY", NULL, NULL, {
	"0x20"}}, {
		"ICMP6_RR_FLAGS_SPECSITE", VALUE, ICMP6_H,
		    "ICMP6_RR_FLAGS_SPECSITE", NULL, NULL, {
	"0x10"}}, {
		"ICMP6_RR_FLAGS_PREVDONE", VALUE, ICMP6_H,
		    "ICMP6_RR_FLAGS_PREVDONE", NULL, NULL, {
	"0x08"}}, {
		"rr_pco_match rpm_code", EXISTS, ICMP6_H, "rr_pco_match",
		    "rpm_code", "0", {
	"1"}}, {
		"rr_pco_match rpm_len", EXISTS, ICMP6_H, "rr_pco_match",
		    "rpm_len", "1", {
	"1"}}, {
		"rr_pco_match rpm_ordinal", EXISTS, ICMP6_H, "rr_pco_match",
		    "rpm_ordinal", "2", {
	"1"}}, {
		"rr_pco_match rpm_matchlen", EXISTS, ICMP6_H, "rr_pco_match",
		    "rpm_matchlen", "3", {
	"1"}}, {
		"rr_pco_match rpm_minlen", EXISTS, ICMP6_H, "rr_pco_match",
		    "rpm_minlen", "4", {
	"1"}}, {
		"rr_pco_match rpm_maxlen", EXISTS, ICMP6_H, "rr_pco_match",
		    "rpm_maxlen", "5", {
	"1"}}, {
		"rr_pco_match rpm_reserved", EXISTS, ICMP6_H, "rr_pco_match",
		    "rpm_reserved", "6", {
	"2"}}, {
		"rr_pco_match rpm_prefix", EXISTS, ICMP6_H, "rr_pco_match",
		    "rpm_prefix", "8", {
	"sizeof(struct in6_addr)"}}, {
		"RPM_PCO_ADD", VALUE, ICMP6_H, "RPM_PCO_ADD", NULL, NULL, {
	"1"}}, {
		"RPM_PCO_CHANGE", VALUE, ICMP6_H, "RPM_PCO_CHANGE", NULL, NULL, {
	"2"}}, {
		"RPM_PCO_SETGLOBAL", VALUE, ICMP6_H, "RPM_PCO_SETGLOBAL", NULL,
		    NULL, {
	"3"}}, {
		"rr_pco_use rpu_uselen", EXISTS, ICMP6_H, "rr_pco_use",
		    "rpu_uselen", "0", {
	"1"}}, {
		"rr_pco_use rpu_keeplen", EXISTS, ICMP6_H, "rr_pco_use",
		    "rpu_keeplen", "1", {
	"1"}}, {
		"rr_pco_use rpu_ramask", EXISTS, ICMP6_H, "rr_pco_use",
		    "rpu_ramask", "2", {
	"1"}}, {
		"rr_pco_use rpu_raflags", EXISTS, ICMP6_H, "rr_pco_use",
		    "rpu_raflags", "3", {
	"1"}}, {
		"rr_pco_use rpu_vltime", EXISTS, ICMP6_H, "rr_pco_use",
		    "rpu_vltime", "4", {
	"4"}}, {
		"rr_pco_use rpu_pltime", EXISTS, ICMP6_H, "rr_pco_use",
		    "rpu_pltime", "8", {
	"4"}}, {
		"rr_pco_use rpu_flags", EXISTS, ICMP6_H, "rr_pco_use",
		    "rpu_flags", "12", {
	"4"}}, {
		"rr_pco_use rpu_prefix", EXISTS, ICMP6_H, "rr_pco_use",
		    "rpu_prefix", "16", {
	"sizeof(struct in6_addr)"}}, {
		"ICMP6_RR_PCOUSE_RAFLAGS_ONLINK", VALUE, ICMP6_H,
		    "ICMP6_RR_PCOUSE_RAFLAGS_ONLINK", NULL, NULL, {
	"0x20"}}, {
		"ICMP6_RR_PCOUSE_RAFLAGS_AUTO", VALUE, ICMP6_H,
		    "ICMP6_RR_PCOUSE_RAFLAGS_AUTO", NULL, NULL, {
	"0x10"}}, {
		"ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME", VALUE, ICMP6_H,
		    "ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME", NULL, NULL, {
	"htonl(0x80000000)"}}, {
		"ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME", VALUE, ICMP6_H,
		    "ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME", NULL, NULL, {
	"htonl(0x40000000)"}}, {
		"rr_result rrr_flags", EXISTS, ICMP6_H, "rr_result",
		    "rrr_flags", "0", {
	"2"}}, {
		"rr_result rrr_ordinal", EXISTS, ICMP6_H, "rr_result",
		    "rrr_ordinal", "2", {
	"1"}}, {
		"rr_result rrr_matchedlen", EXISTS, ICMP6_H, "rr_result",
		    "rrr_matchedlen", "3", {
	"1"}}, {
		"rr_result rrr_ifid", EXISTS, ICMP6_H, "rr_result",
		    "rrr_ifid", "4", {
	"4"}}, {
		"rr_result rrr_prefix", EXISTS, ICMP6_H, "rr_result",
		    "rrr_prefix", "8", {
	"sizeof(struct in6_addr)"}}, {
		"ICMP6_RR_RESULT_FLAGS_OOB", VALUE, ICMP6_H,
		    "ICMP6_RR_RESULT_FLAGS_OOB", NULL, NULL, {
	"htons(0x0002)"}}, {
		"ICMP6_RR_RESULT_FLAGS_FORBIDDEN", VALUE, ICMP6_H,
		    "ICMP6_RR_RESULT_FLAGS_FORBIDDEN", NULL, NULL, {
"htons(0x0001)"}},};

#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)
{
}
