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