mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 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 |
Wanlong Gao | 4548c6c | 2012-10-19 18:03:36 +0800 | [diff] [blame] | 17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 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" |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 47 | #include "runcc.h" |
| 48 | |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 49 | char *TCID = "asapi_03"; /* Test program identifier. */ |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 50 | |
| 51 | void setup(void), cleanup(void); |
| 52 | |
| 53 | enum ttype { EXISTS, ALIAS, VALUE }; |
| 54 | |
| 55 | struct ftent { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 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 */ |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 62 | union { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 63 | char *fu_value; /* field size or value */ |
| 64 | char *fu_dname; /* #define name */ |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 65 | } ftun; |
| 66 | #define ft_value ftun.fu_value |
| 67 | #define ft_dname ftun.fu_dname |
| 68 | } ftab[] = { |
| 69 | /* section 2.2.3, MLDv1 */ |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 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"}}, |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 101 | /* section 2.2.4, Router renumbering */ |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 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)"}},}; |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 240 | |
| 241 | #define FTCOUNT (sizeof(ftab)/sizeof(ftab[0])) |
| 242 | |
| 243 | int TST_TOTAL = FTCOUNT; |
| 244 | |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 245 | int main(int argc, char *argv[]) |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 246 | { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 247 | int i, lc; |
Cyril Hrubis | 0b9589f | 2014-05-27 17:40:33 +0200 | [diff] [blame] | 248 | const char *msg; |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 249 | |
| 250 | /* Parse standard options given to run the test. */ |
Garrett Cooper | df3eb16 | 2010-11-28 22:44:32 -0800 | [diff] [blame] | 251 | msg = parse_opts(argc, argv, NULL, NULL); |
| 252 | if (msg != NULL) { |
Garrett Cooper | 5374050 | 2010-12-16 00:04:01 -0800 | [diff] [blame] | 253 | tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 254 | } |
| 255 | |
| 256 | setup(); |
| 257 | |
| 258 | for (lc = 0; TEST_LOOPING(lc); ++lc) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 259 | for (i = 0; i < FTCOUNT; ++i) { |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 260 | switch (ftab[i].ft_type) { |
| 261 | case EXISTS: |
| 262 | structcheck(ftab[i].ft_tname, ftab[i].ft_incl, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 263 | ftab[i].ft_struct, ftab[i].ft_field, |
| 264 | ftab[i].ft_offset, |
| 265 | ftab[i].ft_value); |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 266 | break; |
| 267 | case ALIAS: |
| 268 | aliascheck(ftab[i].ft_tname, ftab[i].ft_incl, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 269 | ftab[i].ft_struct, ftab[i].ft_field, |
| 270 | ftab[i].ft_dname); |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 271 | break; |
| 272 | case VALUE: |
| 273 | valuecheck(ftab[i].ft_tname, ftab[i].ft_incl, |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 274 | ftab[i].ft_struct, ftab[i].ft_dname); |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 275 | break; |
| 276 | default: |
| 277 | tst_resm(TBROK, "invalid type %d", |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 278 | ftab[i].ft_type); |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 279 | break; |
| 280 | } |
| 281 | } |
| 282 | } |
| 283 | |
| 284 | cleanup(); |
Garrett Cooper | 2c28215 | 2010-12-16 00:55:50 -0800 | [diff] [blame] | 285 | |
| 286 | tst_exit(); |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 287 | } |
| 288 | |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 289 | void setup(void) |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 290 | { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 291 | TEST_PAUSE; /* if -P option specified */ |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 292 | } |
| 293 | |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 294 | void cleanup(void) |
mridge | 949c5b1 | 2006-01-03 23:01:28 +0000 | [diff] [blame] | 295 | { |
Chris Dearman | ec6edca | 2012-10-17 19:54:01 -0700 | [diff] [blame] | 296 | } |