Print this page
dccp: options and features


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);