asapi_03.c revision aabb8340f63ed31afe995fd97795e542dc68b93c
1/*
2 *
3 *   Copyright (c) International Business Machines  Corp., 2001
4 *
5 *   This program is free software;  you can redistribute it and/or modify
6 *   it under the terms of the GNU General Public License as published by
7 *   the Free Software Foundation; either version 2 of the License, or
8 *   (at your option) any later version.
9 *
10 *   This program is distributed in the hope that it will be useful,
11 *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13 *   the GNU General Public License for more details.
14 *
15 *   You should have received a copy of the GNU General Public License
16 *   along with this program;  if not, write to the Free Software
17 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20/*
21 * Test Name: asapi_03
22 *
23 * Test Description:
24 *  These tests are for the "Advanced Sockets API" (RFC 3542)
25 *  Verify that in6 and sockaddr fields are present.
26 *
27 * Usage:  <for command-line>
28 *  asapi_03
29 *
30 * HISTORY
31 *	03/2005 written by David L Stevens
32 *
33 * RESTRICTIONS:
34 *  None.
35 *
36 */
37
38#include <stdio.h>
39#include <unistd.h>
40#include <errno.h>
41
42#include <sys/wait.h>
43
44#include <netinet/ip6.h>
45
46#include "test.h"
47#include "runcc.h"
48
49char *TCID = "asapi_03";	/* Test program identifier.    */
50
51void setup(void), cleanup(void);
52
53enum ttype { EXISTS, ALIAS, VALUE };
54
55struct ftent {
56	char *ft_tname;		/* test name */
57	int ft_type;		/* test type */
58	char *ft_incl;		/* include file list */
59	char *ft_struct;	/* structure name */
60	char *ft_field;		/* field name */
61	char *ft_offset;	/* field offset */
62	union {
63		char *fu_value;	/* field size or value */
64		char *fu_dname;	/* #define name */
65	} ftun;
66#define ft_value	ftun.fu_value
67#define ft_dname	ftun.fu_dname
68} ftab[] = {
69/* section 2.2.3, MLDv1 */
70	{
71		"MLD_LISTENER_QUERY", VALUE, ICMP6_H, "MLD_LISTENER_QUERY",
72		    NULL, NULL, {
73	"130"}}, {
74		"MLD_LISTENER_REPORT", VALUE, ICMP6_H, "MLD_LISTENER_REPORT",
75		    NULL, NULL, {
76	"131"}}, {
77		"MLD_LISTENER_REDUCTION", VALUE, ICMP6_H,
78		    "MLD_LISTENER_REDUCTION", NULL, NULL, {
79	"132"}}, {
80		"mld_hdr mld_icmp6_hdr", EXISTS, ICMP6_H, "mld_hdr",
81		    "mld_icmp6_hdr", "0", {
82	"sizeof(struct icmp6_hdr)"}}, {
83		"mld_hdr mld_addr", EXISTS, ICMP6_H, "mld_hdr", "mld_addr",
84		    "sizeof(struct icmp6_hdr)", {
85	"sizeof(struct in6_addr)"}}, {
86		"mld_hdr mld_type define", ALIAS, ICMP6_H, "mld_hdr",
87		    "mld_icmp6_hdr.icmp6_type", NULL, {
88	"mld_type"}}, {
89		"mld_hdr mld_code define", ALIAS, ICMP6_H, "mld_hdr",
90		    "mld_icmp6_hdr.icmp6_code", NULL, {
91	"mld_code"}}, {
92		"mld_hdr mld_cksum define", ALIAS, ICMP6_H, "mld_hdr",
93		    "mld_icmp6_hdr.icmp6_cksum", NULL, {
94	"mld_cksum"}}, {
95		"mld_hdr mld_maxdelay define", ALIAS, ICMP6_H, "mld_hdr",
96		    "mld_icmp6_hdr.icmp6_data16[0]", NULL, {
97	"mld_maxdelay"}}, {
98		"mld_hdr mld_reserved define", ALIAS, ICMP6_H, "mld_hdr",
99		    "mld_icmp6_hdr.icmp6_data16[1]", NULL, {
100	"mld_reserved"}},
101/* section 2.2.4, Router renumbering */
102	{
103		"ICMP6_ROUTER_RENUMBERING", VALUE, ICMP6_H,
104		    "ICMP6_ROUTER_RENUMBERING", NULL, NULL, {
105	"138"}}, {
106		"icmp6_router_renum rr_hdr", EXISTS, ICMP6_H,
107		    "icmp6_router_renum", "rr_hdr", "0", {
108	"sizeof(struct icmp6_hdr)"}}, {
109		"icmp6_router_renum rr_segnum", EXISTS, ICMP6_H,
110		    "icmp6_router_renum", "rr_segnum",
111		    "sizeof(struct icmp6_hdr)", {
112	"1"}}, {
113		"icmp6_router_renum rr_flags", EXISTS, ICMP6_H,
114		    "icmp6_router_renum", "rr_flags",
115		    "sizeof(struct icmp6_hdr)+1", {
116	"1"}}, {
117		"icmp6_router_renum rr_maxdelay", EXISTS, ICMP6_H,
118		    "icmp6_router_renum", "rr_maxdelay",
119		    "sizeof(struct icmp6_hdr)+2", {
120	"2"}}, {
121		"icmp6_router_renum rr_reserved", EXISTS, ICMP6_H,
122		    "icmp6_router_renum", "rr_reserved",
123		    "sizeof(struct icmp6_hdr)+4", {
124	"4"}}, {
125		"icmp6_router_renum rr_type define", ALIAS, ICMP6_H,
126		    "icmp6_router_renum", "rr_hdr.icmp6_type", NULL, {
127	"rr_type"}}, {
128		"icmp6_router_renum rr_code define", ALIAS, ICMP6_H,
129		    "icmp6_router_renum", "rr_hdr.icmp6_code", NULL, {
130	"rr_code"}}, {
131		"icmp6_router_renum rr_cksum define", ALIAS, ICMP6_H,
132		    "icmp6_router_renum", "rr_hdr.icmp6_cksum", NULL, {
133	"rr_cksum"}}, {
134		"icmp6_router_renum rr_seqnum define", ALIAS, ICMP6_H,
135		    "icmp6_router_renum", "rr_hdr.icmp6_data32[0]", NULL, {
136	"rr_seqnum"}}, {
137		"ICMP6_RR_FLAGS_TEST", VALUE, ICMP6_H, "ICMP6_RR_FLAGS_TEST",
138		    NULL, NULL, {
139	"0x80"}}, {
140		"ICMP6_RR_FLAGS_REQRESULT", VALUE, ICMP6_H,
141		    "ICMP6_RR_FLAGS_REQRESULT", NULL, NULL, {
142	"0x40"}}, {
143		"ICMP6_RR_FLAGS_FORCEAPPLY", VALUE, ICMP6_H,
144		    "ICMP6_RR_FLAGS_FORCEAPPLY", NULL, NULL, {
145	"0x20"}}, {
146		"ICMP6_RR_FLAGS_SPECSITE", VALUE, ICMP6_H,
147		    "ICMP6_RR_FLAGS_SPECSITE", NULL, NULL, {
148	"0x10"}}, {
149		"ICMP6_RR_FLAGS_PREVDONE", VALUE, ICMP6_H,
150		    "ICMP6_RR_FLAGS_PREVDONE", NULL, NULL, {
151	"0x08"}}, {
152		"rr_pco_match rpm_code", EXISTS, ICMP6_H, "rr_pco_match",
153		    "rpm_code", "0", {
154	"1"}}, {
155		"rr_pco_match rpm_len", EXISTS, ICMP6_H, "rr_pco_match",
156		    "rpm_len", "1", {
157	"1"}}, {
158		"rr_pco_match rpm_ordinal", EXISTS, ICMP6_H, "rr_pco_match",
159		    "rpm_ordinal", "2", {
160	"1"}}, {
161		"rr_pco_match rpm_matchlen", EXISTS, ICMP6_H, "rr_pco_match",
162		    "rpm_matchlen", "3", {
163	"1"}}, {
164		"rr_pco_match rpm_minlen", EXISTS, ICMP6_H, "rr_pco_match",
165		    "rpm_minlen", "4", {
166	"1"}}, {
167		"rr_pco_match rpm_maxlen", EXISTS, ICMP6_H, "rr_pco_match",
168		    "rpm_maxlen", "5", {
169	"1"}}, {
170		"rr_pco_match rpm_reserved", EXISTS, ICMP6_H, "rr_pco_match",
171		    "rpm_reserved", "6", {
172	"2"}}, {
173		"rr_pco_match rpm_prefix", EXISTS, ICMP6_H, "rr_pco_match",
174		    "rpm_prefix", "8", {
175	"sizeof(struct in6_addr)"}}, {
176		"RPM_PCO_ADD", VALUE, ICMP6_H, "RPM_PCO_ADD", NULL, NULL, {
177	"1"}}, {
178		"RPM_PCO_CHANGE", VALUE, ICMP6_H, "RPM_PCO_CHANGE", NULL, NULL, {
179	"2"}}, {
180		"RPM_PCO_SETGLOBAL", VALUE, ICMP6_H, "RPM_PCO_SETGLOBAL", NULL,
181		    NULL, {
182	"3"}}, {
183		"rr_pco_use rpu_uselen", EXISTS, ICMP6_H, "rr_pco_use",
184		    "rpu_uselen", "0", {
185	"1"}}, {
186		"rr_pco_use rpu_keeplen", EXISTS, ICMP6_H, "rr_pco_use",
187		    "rpu_keeplen", "1", {
188	"1"}}, {
189		"rr_pco_use rpu_ramask", EXISTS, ICMP6_H, "rr_pco_use",
190		    "rpu_ramask", "2", {
191	"1"}}, {
192		"rr_pco_use rpu_raflags", EXISTS, ICMP6_H, "rr_pco_use",
193		    "rpu_raflags", "3", {
194	"1"}}, {
195		"rr_pco_use rpu_vltime", EXISTS, ICMP6_H, "rr_pco_use",
196		    "rpu_vltime", "4", {
197	"4"}}, {
198		"rr_pco_use rpu_pltime", EXISTS, ICMP6_H, "rr_pco_use",
199		    "rpu_pltime", "8", {
200	"4"}}, {
201		"rr_pco_use rpu_flags", EXISTS, ICMP6_H, "rr_pco_use",
202		    "rpu_flags", "12", {
203	"4"}}, {
204		"rr_pco_use rpu_prefix", EXISTS, ICMP6_H, "rr_pco_use",
205		    "rpu_prefix", "16", {
206	"sizeof(struct in6_addr)"}}, {
207		"ICMP6_RR_PCOUSE_RAFLAGS_ONLINK", VALUE, ICMP6_H,
208		    "ICMP6_RR_PCOUSE_RAFLAGS_ONLINK", NULL, NULL, {
209	"0x20"}}, {
210		"ICMP6_RR_PCOUSE_RAFLAGS_AUTO", VALUE, ICMP6_H,
211		    "ICMP6_RR_PCOUSE_RAFLAGS_AUTO", NULL, NULL, {
212	"0x10"}}, {
213		"ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME", VALUE, ICMP6_H,
214		    "ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME", NULL, NULL, {
215	"htonl(0x80000000)"}}, {
216		"ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME", VALUE, ICMP6_H,
217		    "ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME", NULL, NULL, {
218	"htonl(0x40000000)"}}, {
219		"rr_result rrr_flags", EXISTS, ICMP6_H, "rr_result",
220		    "rrr_flags", "0", {
221	"2"}}, {
222		"rr_result rrr_ordinal", EXISTS, ICMP6_H, "rr_result",
223		    "rrr_ordinal", "2", {
224	"1"}}, {
225		"rr_result rrr_matchedlen", EXISTS, ICMP6_H, "rr_result",
226		    "rrr_matchedlen", "3", {
227	"1"}}, {
228		"rr_result rrr_ifid", EXISTS, ICMP6_H, "rr_result",
229		    "rrr_ifid", "4", {
230	"4"}}, {
231		"rr_result rrr_prefix", EXISTS, ICMP6_H, "rr_result",
232		    "rrr_prefix", "8", {
233	"sizeof(struct in6_addr)"}}, {
234		"ICMP6_RR_RESULT_FLAGS_OOB", VALUE, ICMP6_H,
235		    "ICMP6_RR_RESULT_FLAGS_OOB", NULL, NULL, {
236	"htons(0x0002)"}}, {
237		"ICMP6_RR_RESULT_FLAGS_FORBIDDEN", VALUE, ICMP6_H,
238		    "ICMP6_RR_RESULT_FLAGS_FORBIDDEN", NULL, NULL, {
239"htons(0x0001)"}},};
240
241#define FTCOUNT	(sizeof(ftab)/sizeof(ftab[0]))
242
243int TST_TOTAL = FTCOUNT;
244
245int main(int argc, char *argv[])
246{
247	int i, lc;
248	const char *msg;
249
250	/* Parse standard options given to run the test. */
251	msg = parse_opts(argc, argv, NULL, NULL);
252	if (msg != NULL) {
253		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
254	}
255
256	setup();
257
258	for (lc = 0; TEST_LOOPING(lc); ++lc) {
259		for (i = 0; i < FTCOUNT; ++i) {
260			switch (ftab[i].ft_type) {
261			case EXISTS:
262				structcheck(ftab[i].ft_tname, ftab[i].ft_incl,
263					    ftab[i].ft_struct, ftab[i].ft_field,
264					    ftab[i].ft_offset,
265					    ftab[i].ft_value);
266				break;
267			case ALIAS:
268				aliascheck(ftab[i].ft_tname, ftab[i].ft_incl,
269					   ftab[i].ft_struct, ftab[i].ft_field,
270					   ftab[i].ft_dname);
271				break;
272			case VALUE:
273				valuecheck(ftab[i].ft_tname, ftab[i].ft_incl,
274					   ftab[i].ft_struct, ftab[i].ft_dname);
275				break;
276			default:
277				tst_resm(TBROK, "invalid type %d",
278					 ftab[i].ft_type);
279				break;
280			}
281		}
282	}
283
284	cleanup();
285
286	tst_exit();
287}
288
289void setup(void)
290{
291	TEST_PAUSE;		/* if -P option specified */
292}
293
294void cleanup(void)
295{
296}
297