1329 "ip6", 0, 2, ETHERTYPE_IPV6, -1, OP_OFFSET_ETHERTYPE,
1330 "arp", 0, 2, ETHERTYPE_ARP, -1, OP_OFFSET_ETHERTYPE,
1331 "rarp", 0, 2, ETHERTYPE_REVARP, -1, OP_OFFSET_ETHERTYPE,
1332 "pppoed", 0, 2, ETHERTYPE_PPPOED, -1, OP_OFFSET_ETHERTYPE,
1333 "pppoes", 0, 2, ETHERTYPE_PPPOES, -1, OP_OFFSET_ETHERTYPE,
1334 "tcp", 9, 1, IPPROTO_TCP, 0, OP_OFFSET_LINK,
1335 "tcp", 6, 1, IPPROTO_TCP, 1, OP_OFFSET_LINK,
1336 "udp", 9, 1, IPPROTO_UDP, 0, OP_OFFSET_LINK,
1337 "udp", 6, 1, IPPROTO_UDP, 1, OP_OFFSET_LINK,
1338 "icmp", 9, 1, IPPROTO_ICMP, 0, OP_OFFSET_LINK,
1339 "icmp6", 6, 1, IPPROTO_ICMPV6, 1, OP_OFFSET_LINK,
1340 "ospf", 9, 1, IPPROTO_OSPF, 0, OP_OFFSET_LINK,
1341 "ospf", 6, 1, IPPROTO_OSPF, 1, OP_OFFSET_LINK,
1342 "ip-in-ip", 9, 1, IPPROTO_ENCAP, 0, OP_OFFSET_LINK,
1343 "esp", 9, 1, IPPROTO_ESP, 0, OP_OFFSET_LINK,
1344 "esp", 6, 1, IPPROTO_ESP, 1, OP_OFFSET_LINK,
1345 "ah", 9, 1, IPPROTO_AH, 0, OP_OFFSET_LINK,
1346 "ah", 6, 1, IPPROTO_AH, 1, OP_OFFSET_LINK,
1347 "sctp", 9, 1, IPPROTO_SCTP, 0, OP_OFFSET_LINK,
1348 "sctp", 6, 1, IPPROTO_SCTP, 1, OP_OFFSET_LINK,
1349 0, 0, 0, 0, 0, 0
1350 };
1351
1352 static match_type_t ipnet_match_types[] = {
1353 /*
1354 * Table initialized assuming Ethernet data link headers.
1355 * m_offset is an offset beyond the offset op, which is why
1356 * the offset is zero for when snoop needs to check an ethertype.
1357 */
1358 "ip", 0, 1, IPV4_VERSION, -1, OP_OFFSET_ETHERTYPE,
1359 "ip6", 0, 1, IPV6_VERSION, -1, OP_OFFSET_ETHERTYPE,
1360 "tcp", 9, 1, IPPROTO_TCP, 0, OP_OFFSET_LINK,
1361 "tcp", 6, 1, IPPROTO_TCP, 1, OP_OFFSET_LINK,
1362 "udp", 9, 1, IPPROTO_UDP, 0, OP_OFFSET_LINK,
1363 "udp", 6, 1, IPPROTO_UDP, 1, OP_OFFSET_LINK,
1364 "icmp", 9, 1, IPPROTO_ICMP, 0, OP_OFFSET_LINK,
1365 "icmp6", 6, 1, IPPROTO_ICMPV6, 1, OP_OFFSET_LINK,
1366 "ospf", 9, 1, IPPROTO_OSPF, 0, OP_OFFSET_LINK,
1367 "ospf", 6, 1, IPPROTO_OSPF, 1, OP_OFFSET_LINK,
1368 "ip-in-ip", 9, 1, IPPROTO_ENCAP, 0, OP_OFFSET_LINK,
1369 "esp", 9, 1, IPPROTO_ESP, 0, OP_OFFSET_LINK,
1370 "esp", 6, 1, IPPROTO_ESP, 1, OP_OFFSET_LINK,
1371 "ah", 9, 1, IPPROTO_AH, 0, OP_OFFSET_LINK,
1372 "ah", 6, 1, IPPROTO_AH, 1, OP_OFFSET_LINK,
1373 "sctp", 9, 1, IPPROTO_SCTP, 0, OP_OFFSET_LINK,
1374 "sctp", 6, 1, IPPROTO_SCTP, 1, OP_OFFSET_LINK,
1375 0, 0, 0, 0, 0, 0
1376 };
1377
1378 static match_type_t iptun_match_types[] = {
1379 "ip", 0, 1, IPPROTO_ENCAP, -1, OP_OFFSET_ETHERTYPE,
1380 "ip6", 0, 1, IPPROTO_IPV6, -1, OP_OFFSET_ETHERTYPE,
1381 "tcp", 9, 1, IPPROTO_TCP, 0, OP_OFFSET_LINK,
1382 "tcp", 6, 1, IPPROTO_TCP, 1, OP_OFFSET_LINK,
1383 "udp", 9, 1, IPPROTO_UDP, 0, OP_OFFSET_LINK,
1384 "udp", 6, 1, IPPROTO_UDP, 1, OP_OFFSET_LINK,
1385 "icmp", 9, 1, IPPROTO_ICMP, 0, OP_OFFSET_LINK,
1386 "icmp6", 6, 1, IPPROTO_ICMPV6, 1, OP_OFFSET_LINK,
1387 "ospf", 9, 1, IPPROTO_OSPF, 0, OP_OFFSET_LINK,
1388 "ospf", 6, 1, IPPROTO_OSPF, 1, OP_OFFSET_LINK,
1389 "ip-in-ip", 9, 1, IPPROTO_ENCAP, 0, OP_OFFSET_LINK,
1390 "esp", 9, 1, IPPROTO_ESP, 0, OP_OFFSET_LINK,
1391 "esp", 6, 1, IPPROTO_ESP, 1, OP_OFFSET_LINK,
1392 "ah", 9, 1, IPPROTO_AH, 0, OP_OFFSET_LINK,
1393 "ah", 6, 1, IPPROTO_AH, 1, OP_OFFSET_LINK,
1394 "sctp", 9, 1, IPPROTO_SCTP, 0, OP_OFFSET_LINK,
1395 "sctp", 6, 1, IPPROTO_SCTP, 1, OP_OFFSET_LINK,
1396 0, 0, 0, 0, 0, 0
1397 };
1398
1399 static void
1400 generate_check(match_type_t match_types[], int index, int type)
1401 {
1402 match_type_t *mtp = &match_types[index];
1403 /*
1404 * Note: this code assumes the above dependencies are
1405 * not cyclic. This *should* always be true.
1406 */
1407 if (mtp->m_depend != -1)
1408 generate_check(match_types, mtp->m_depend, type);
1409
1410 emitop(mtp->m_optype);
1411 load_value(mtp->m_offset, mtp->m_size);
1412 load_const(mtp->m_value);
1413 emitop(OP_OFFSET_POP);
1414
1415 emitop(OP_EQ);
|
1329 "ip6", 0, 2, ETHERTYPE_IPV6, -1, OP_OFFSET_ETHERTYPE,
1330 "arp", 0, 2, ETHERTYPE_ARP, -1, OP_OFFSET_ETHERTYPE,
1331 "rarp", 0, 2, ETHERTYPE_REVARP, -1, OP_OFFSET_ETHERTYPE,
1332 "pppoed", 0, 2, ETHERTYPE_PPPOED, -1, OP_OFFSET_ETHERTYPE,
1333 "pppoes", 0, 2, ETHERTYPE_PPPOES, -1, OP_OFFSET_ETHERTYPE,
1334 "tcp", 9, 1, IPPROTO_TCP, 0, OP_OFFSET_LINK,
1335 "tcp", 6, 1, IPPROTO_TCP, 1, OP_OFFSET_LINK,
1336 "udp", 9, 1, IPPROTO_UDP, 0, OP_OFFSET_LINK,
1337 "udp", 6, 1, IPPROTO_UDP, 1, OP_OFFSET_LINK,
1338 "icmp", 9, 1, IPPROTO_ICMP, 0, OP_OFFSET_LINK,
1339 "icmp6", 6, 1, IPPROTO_ICMPV6, 1, OP_OFFSET_LINK,
1340 "ospf", 9, 1, IPPROTO_OSPF, 0, OP_OFFSET_LINK,
1341 "ospf", 6, 1, IPPROTO_OSPF, 1, OP_OFFSET_LINK,
1342 "ip-in-ip", 9, 1, IPPROTO_ENCAP, 0, OP_OFFSET_LINK,
1343 "esp", 9, 1, IPPROTO_ESP, 0, OP_OFFSET_LINK,
1344 "esp", 6, 1, IPPROTO_ESP, 1, OP_OFFSET_LINK,
1345 "ah", 9, 1, IPPROTO_AH, 0, OP_OFFSET_LINK,
1346 "ah", 6, 1, IPPROTO_AH, 1, OP_OFFSET_LINK,
1347 "sctp", 9, 1, IPPROTO_SCTP, 0, OP_OFFSET_LINK,
1348 "sctp", 6, 1, IPPROTO_SCTP, 1, OP_OFFSET_LINK,
1349 "dccp", 9, 1, IPPROTO_DCCP, 0, OP_OFFSET_LINK,
1350 "dccp", 6, 1, IPPROTO_DCCP, 1, OP_OFFSET_LINK,
1351 0, 0, 0, 0, 0, 0
1352 };
1353
1354 static match_type_t ipnet_match_types[] = {
1355 /*
1356 * Table initialized assuming Ethernet data link headers.
1357 * m_offset is an offset beyond the offset op, which is why
1358 * the offset is zero for when snoop needs to check an ethertype.
1359 */
1360 "ip", 0, 1, IPV4_VERSION, -1, OP_OFFSET_ETHERTYPE,
1361 "ip6", 0, 1, IPV6_VERSION, -1, OP_OFFSET_ETHERTYPE,
1362 "tcp", 9, 1, IPPROTO_TCP, 0, OP_OFFSET_LINK,
1363 "tcp", 6, 1, IPPROTO_TCP, 1, OP_OFFSET_LINK,
1364 "udp", 9, 1, IPPROTO_UDP, 0, OP_OFFSET_LINK,
1365 "udp", 6, 1, IPPROTO_UDP, 1, OP_OFFSET_LINK,
1366 "icmp", 9, 1, IPPROTO_ICMP, 0, OP_OFFSET_LINK,
1367 "icmp6", 6, 1, IPPROTO_ICMPV6, 1, OP_OFFSET_LINK,
1368 "ospf", 9, 1, IPPROTO_OSPF, 0, OP_OFFSET_LINK,
1369 "ospf", 6, 1, IPPROTO_OSPF, 1, OP_OFFSET_LINK,
1370 "ip-in-ip", 9, 1, IPPROTO_ENCAP, 0, OP_OFFSET_LINK,
1371 "esp", 9, 1, IPPROTO_ESP, 0, OP_OFFSET_LINK,
1372 "esp", 6, 1, IPPROTO_ESP, 1, OP_OFFSET_LINK,
1373 "ah", 9, 1, IPPROTO_AH, 0, OP_OFFSET_LINK,
1374 "ah", 6, 1, IPPROTO_AH, 1, OP_OFFSET_LINK,
1375 "sctp", 9, 1, IPPROTO_SCTP, 0, OP_OFFSET_LINK,
1376 "sctp", 6, 1, IPPROTO_SCTP, 1, OP_OFFSET_LINK,
1377 "dccp", 9, 1, IPPROTO_DCCP, 0, OP_OFFSET_LINK,
1378 "dccp", 6, 1, IPPROTO_DCCP, 1, OP_OFFSET_LINK,
1379 0, 0, 0, 0, 0, 0
1380 };
1381
1382 static match_type_t iptun_match_types[] = {
1383 "ip", 0, 1, IPPROTO_ENCAP, -1, OP_OFFSET_ETHERTYPE,
1384 "ip6", 0, 1, IPPROTO_IPV6, -1, OP_OFFSET_ETHERTYPE,
1385 "tcp", 9, 1, IPPROTO_TCP, 0, OP_OFFSET_LINK,
1386 "tcp", 6, 1, IPPROTO_TCP, 1, OP_OFFSET_LINK,
1387 "udp", 9, 1, IPPROTO_UDP, 0, OP_OFFSET_LINK,
1388 "udp", 6, 1, IPPROTO_UDP, 1, OP_OFFSET_LINK,
1389 "icmp", 9, 1, IPPROTO_ICMP, 0, OP_OFFSET_LINK,
1390 "icmp6", 6, 1, IPPROTO_ICMPV6, 1, OP_OFFSET_LINK,
1391 "ospf", 9, 1, IPPROTO_OSPF, 0, OP_OFFSET_LINK,
1392 "ospf", 6, 1, IPPROTO_OSPF, 1, OP_OFFSET_LINK,
1393 "ip-in-ip", 9, 1, IPPROTO_ENCAP, 0, OP_OFFSET_LINK,
1394 "esp", 9, 1, IPPROTO_ESP, 0, OP_OFFSET_LINK,
1395 "esp", 6, 1, IPPROTO_ESP, 1, OP_OFFSET_LINK,
1396 "ah", 9, 1, IPPROTO_AH, 0, OP_OFFSET_LINK,
1397 "ah", 6, 1, IPPROTO_AH, 1, OP_OFFSET_LINK,
1398 "sctp", 9, 1, IPPROTO_SCTP, 0, OP_OFFSET_LINK,
1399 "sctp", 6, 1, IPPROTO_SCTP, 1, OP_OFFSET_LINK,
1400 "dccp", 9, 1, IPPROTO_DCCP, 0, OP_OFFSET_LINK,
1401 "dccp", 6, 1, IPPROTO_DCCP, 1, OP_OFFSET_LINK,
1402 0, 0, 0, 0, 0, 0
1403 };
1404
1405 static void
1406 generate_check(match_type_t match_types[], int index, int type)
1407 {
1408 match_type_t *mtp = &match_types[index];
1409 /*
1410 * Note: this code assumes the above dependencies are
1411 * not cyclic. This *should* always be true.
1412 */
1413 if (mtp->m_depend != -1)
1414 generate_check(match_types, mtp->m_depend, type);
1415
1416 emitop(mtp->m_optype);
1417 load_value(mtp->m_offset, mtp->m_size);
1418 load_const(mtp->m_value);
1419 emitop(OP_OFFSET_POP);
1420
1421 emitop(OP_EQ);
|