libip6t_frag.c revision e88a7c2c7175742b58b6aa03f2b5aba2d80330a1
19085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org/* Shared library add-on to ip6tables to add Fragmentation header support. */ 29085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include <stdbool.h> 39085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include <stdio.h> 45ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#include <netdb.h> 55ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#include <string.h> 65ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#include <stdlib.h> 75ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#include <getopt.h> 89085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include <errno.h> 99085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include <xtables.h> 109085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include <linux/netfilter_ipv6/ip6t_frag.h> 119085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 129085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgstatic void frag_help(void) 139085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org{ 149085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org printf( 159085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org"frag match options:\n" 169085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org"[!] --fragid id[:id] match the id (range)\n" 179085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org"[!] --fraglen length total length of this header\n" 189085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org" --fragres check the reserved field too\n" 199085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org" --fragfirst matches on the first fragment\n" 209085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org" [--fragmore|--fraglast] there are more fragments or this\n" 219085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org" is the last one\n"); 229085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org} 239085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 249085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgstatic const struct option frag_opts[] = { 259085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org {.name = "fragid", .has_arg = true, .val = '1'}, 269085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org {.name = "fraglen", .has_arg = true, .val = '2'}, 279085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org {.name = "fragres", .has_arg = false, .val = '3'}, 289085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org {.name = "fragfirst", .has_arg = false, .val = '4'}, 299085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org {.name = "fragmore", .has_arg = false, .val = '5'}, 309085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org {.name = "fraglast", .has_arg = false, .val = '6'}, 319085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org XT_GETOPT_TABLEEND, 329085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org}; 3356454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org 349085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgstatic uint32_t 359085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgparse_frag_id(const char *idstr, const char *typestr) 369085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org{ 379085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org unsigned long int id; 389085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org char* ep; 399085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 40c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org id = strtoul(idstr, &ep, 0); 41c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 4271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if ( idstr == ep ) { 4371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org xtables_error(PARAMETER_PROBLEM, 449085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org "FRAG no valid digits in %s `%s'", typestr, idstr); 45e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org } 46e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org if ( id == ULONG_MAX && errno == ERANGE ) { 479085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org xtables_error(PARAMETER_PROBLEM, 489085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org "%s `%s' specified too big: would overflow", 499085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org typestr, idstr); 509085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 519085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org if ( *idstr != '\0' && *ep != '\0' ) { 529085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org xtables_error(PARAMETER_PROBLEM, 539085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org "FRAG error parsing %s `%s'", typestr, idstr); 549085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 559085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org return id; 569085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org} 579085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 589085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgstatic void 599085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgparse_frag_ids(const char *idstring, uint32_t *ids) 609085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org{ 619085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org char *buffer; 629085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org char *cp; 639085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 649085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org buffer = strdup(idstring); 659085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org if ((cp = strchr(buffer, ':')) == NULL) 669085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org ids[0] = ids[1] = parse_frag_id(buffer,"id"); 679085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org else { 689085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org *cp = '\0'; 699085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org cp++; 70a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 71a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ids[0] = buffer[0] ? parse_frag_id(buffer,"id") : 0; 72a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ids[1] = cp[0] ? parse_frag_id(cp,"id") : 0xFFFFFFFF; 73a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 74b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org free(buffer); 75a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 76935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org 77a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgstatic void frag_init(struct xt_entry_match *m) 78a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org{ 79a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org struct ip6t_frag *fraginfo = (struct ip6t_frag *)m->data; 80a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 81a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org fraginfo->ids[1] = 0xFFFFFFFF; 82c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 84c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgstatic int frag_parse(int c, char **argv, int invert, unsigned int *flags, 85c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org const void *entry, struct xt_entry_match **match) 86c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org{ 87a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org struct ip6t_frag *fraginfo = (struct ip6t_frag *)(*match)->data; 883a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 89c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org switch (c) { 90c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org case '1': 91c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (*flags & IP6T_FRAG_IDS) 92a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org xtables_error(PARAMETER_PROBLEM, 93a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org "Only one `--fragid' allowed"); 94a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org xtables_check_inverse(optarg, &invert, &optind, 0, argv); 95a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org parse_frag_ids(optarg, fraginfo->ids); 96a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (invert) 97c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org fraginfo->invflags |= IP6T_FRAG_INV_IDS; 98c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org fraginfo->flags |= IP6T_FRAG_IDS; 99935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org *flags |= IP6T_FRAG_IDS; 100a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org break; 101a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org case '2': 102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (*flags & IP6T_FRAG_LEN) 103a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org xtables_error(PARAMETER_PROBLEM, 104c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org "Only one `--fraglen' allowed"); 105b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org xtables_check_inverse(optarg, &invert, &optind, 0, argv); 106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org fraginfo->hdrlen = parse_frag_id(optarg, "length"); 107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (invert) 108a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org fraginfo->invflags |= IP6T_FRAG_INV_LEN; 109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org fraginfo->flags |= IP6T_FRAG_LEN; 11084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org *flags |= IP6T_FRAG_LEN; 111eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org break; 112755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org case '3': 113755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (*flags & IP6T_FRAG_RES) 114a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org xtables_error(PARAMETER_PROBLEM, 1154a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org "Only one `--fragres' allowed"); 11656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org fraginfo->flags |= IP6T_FRAG_RES; 11756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org *flags |= IP6T_FRAG_RES; 1184a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org break; 1199085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org case '4': 1209085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org if (*flags & IP6T_FRAG_FST) 1219085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org xtables_error(PARAMETER_PROBLEM, 1224a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org "Only one `--fragfirst' allowed"); 123eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org fraginfo->flags |= IP6T_FRAG_FST; 1249085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org *flags |= IP6T_FRAG_FST; 1259085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org break; 1265aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org case '5': 1275aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org if (*flags & (IP6T_FRAG_MF|IP6T_FRAG_NMF)) 1285aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org xtables_error(PARAMETER_PROBLEM, 1295aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org "Only one `--fragmore' or `--fraglast' allowed"); 1305aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org fraginfo->flags |= IP6T_FRAG_MF; 1315aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org *flags |= IP6T_FRAG_MF; 1325aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org break; 1335aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org case '6': 1345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org if (*flags & (IP6T_FRAG_MF|IP6T_FRAG_NMF)) 1355aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org xtables_error(PARAMETER_PROBLEM, 1365aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org "Only one `--fragmore' or `--fraglast' allowed"); 1375c838251403b0be9a882540f1922577abba4c872ager@chromium.org fraginfo->flags |= IP6T_FRAG_NMF; 1385c838251403b0be9a882540f1922577abba4c872ager@chromium.org *flags |= IP6T_FRAG_NMF; 1399085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org break; 1400ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } 141c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 142a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return 1; 1433a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org} 1449085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1459085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgstatic void 1461456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgprint_ids(const char *name, uint32_t min, uint32_t max, 1471456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org int invert) 1481456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org{ 1491456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org const char *inv = invert ? "!" : ""; 1501456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 1511456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org if (min != 0 || max != 0xFFFFFFFF || invert) { 1521456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org printf("%s", name); 1531456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org if (min == max) 1541456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org printf(":%s%u", inv, min); 1551456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org else 1561456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org printf("s:%s%u:%u", inv, min, max); 1571456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 1581456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org} 1591456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 1601456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgstatic void frag_print(const void *ip, const struct xt_entry_match *match, 1611456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org int numeric) 1621456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org{ 1631456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org const struct ip6t_frag *frag = (struct ip6t_frag *)match->data; 1641456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 1651456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org printf(" frag "); 1661456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org print_ids("id", frag->ids[0], frag->ids[1], 1671456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org frag->invflags & IP6T_FRAG_INV_IDS); 1681456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 1691456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org if (frag->flags & IP6T_FRAG_LEN) { 1701456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org printf(" length:%s%u", 1711456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org frag->invflags & IP6T_FRAG_INV_LEN ? "!" : "", 1721456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org frag->hdrlen); 1731456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 1741456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 1751456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org if (frag->flags & IP6T_FRAG_RES) 1761456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org printf(" reserved"); 1771456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 1781456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org if (frag->flags & IP6T_FRAG_FST) 1791456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org printf(" first"); 1801456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 1815aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org if (frag->flags & IP6T_FRAG_MF) 182ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org printf(" more"); 183ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 1846b0169a99e75f4821ce4168e5e0d3cc8f6526a83danno@chromium.org if (frag->flags & IP6T_FRAG_NMF) 1856b0169a99e75f4821ce4168e5e0d3cc8f6526a83danno@chromium.org printf(" last"); 1866b0169a99e75f4821ce4168e5e0d3cc8f6526a83danno@chromium.org 1876b0169a99e75f4821ce4168e5e0d3cc8f6526a83danno@chromium.org if (frag->invflags & ~IP6T_FRAG_INV_MASK) 188ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org printf(" Unknown invflags: 0x%X", 189ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org frag->invflags & ~IP6T_FRAG_INV_MASK); 1906b0169a99e75f4821ce4168e5e0d3cc8f6526a83danno@chromium.org} 1916b0169a99e75f4821ce4168e5e0d3cc8f6526a83danno@chromium.org 1926b0169a99e75f4821ce4168e5e0d3cc8f6526a83danno@chromium.orgstatic void frag_save(const void *ip, const struct xt_entry_match *match) 1936b0169a99e75f4821ce4168e5e0d3cc8f6526a83danno@chromium.org{ 194ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org const struct ip6t_frag *fraginfo = (struct ip6t_frag *)match->data; 1955aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 1969085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org if (!(fraginfo->ids[0] == 0 19794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org && fraginfo->ids[1] == 0xFFFFFFFF)) { 198a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org printf("%s --fragid ", 199a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org (fraginfo->invflags & IP6T_FRAG_INV_IDS) ? " !" : ""); 200a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org if (fraginfo->ids[0] 201a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org != fraginfo->ids[1]) 202a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org printf("%u:%u", 203a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org fraginfo->ids[0], 204a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org fraginfo->ids[1]); 205a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org else 206a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org printf("%u", 207a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org fraginfo->ids[0]); 208c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 209a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 210c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (fraginfo->flags & IP6T_FRAG_LEN) { 211c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org printf("%s --fraglen %u", 212c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org (fraginfo->invflags & IP6T_FRAG_INV_LEN) ? " !" : "", 213c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org fraginfo->hdrlen); 214a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 215a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 216a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (fraginfo->flags & IP6T_FRAG_RES) 217a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org printf(" --fragres"); 218a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 219a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (fraginfo->flags & IP6T_FRAG_FST) 220a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org printf(" --fragfirst"); 221a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 222a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (fraginfo->flags & IP6T_FRAG_MF) 223a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org printf(" --fragmore"); 224a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 225a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (fraginfo->flags & IP6T_FRAG_NMF) 226a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org printf(" --fraglast"); 227a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 228a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 229a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgstatic struct xtables_match frag_mt6_reg = { 230a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org .name = "frag", 231a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org .version = XTABLES_VERSION, 232a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org .family = NFPROTO_IPV6, 233a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org .size = XT_ALIGN(sizeof(struct ip6t_frag)), 234a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org .userspacesize = XT_ALIGN(sizeof(struct ip6t_frag)), 235a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org .help = frag_help, 236c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com .init = frag_init, 237c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com .parse = frag_parse, 23894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org .print = frag_print, 239c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com .save = frag_save, 240c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com .extra_opts = frag_opts, 241c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}; 24294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org 243c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgvoid 2444a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org_init(void) 2459085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org{ 2469085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org xtables_register_match(&frag_mt6_reg); 2479085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org} 2489085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org