András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 1 | #include <stdio.h> |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 2 | #include <string.h> |
| 3 | #include <stdlib.h> |
Jan Engelhardt | 5d9678a | 2008-11-20 10:15:35 +0100 | [diff] [blame] | 4 | #include <xtables.h> |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 5 | #include <linux/netfilter_ipv6/ip6t_rt.h> |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 6 | #include <arpa/inet.h> |
Jan Engelhardt | ddac6c5 | 2008-09-01 14:22:19 +0200 | [diff] [blame] | 7 | |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 8 | enum { |
| 9 | O_RT_TYPE = 0, |
| 10 | O_RT_SEGSLEFT, |
| 11 | O_RT_LEN, |
| 12 | O_RT0RES, |
| 13 | O_RT0ADDRS, |
| 14 | O_RT0NSTRICT, |
| 15 | F_RT_TYPE = 1 << O_RT_TYPE, |
| 16 | F_RT0ADDRS = 1 << O_RT0ADDRS, |
| 17 | }; |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 18 | |
Jan Engelhardt | 997045f | 2007-10-04 16:29:21 +0000 | [diff] [blame] | 19 | static void rt_help(void) |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 20 | { |
| 21 | printf( |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 22 | "rt match options:\n" |
Jan Engelhardt | 9672792 | 2008-08-13 14:42:41 +0200 | [diff] [blame] | 23 | "[!] --rt-type type match the type\n" |
| 24 | "[!] --rt-segsleft num[:num] match the Segments Left field (range)\n" |
| 25 | "[!] --rt-len length total length of this header\n" |
Jan Engelhardt | 12a18d6 | 2011-02-18 01:45:05 +0100 | [diff] [blame] | 26 | " --rt-0-res check the reserved field too (type 0)\n" |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 27 | " --rt-0-addrs ADDR[,ADDR...] Type=0 addresses (list, max: %d)\n" |
| 28 | " --rt-0-not-strict List of Type=0 addresses not a strict list\n", |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 29 | IP6T_RT_HOPS); |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 30 | } |
| 31 | |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 32 | #define s struct ip6t_rt |
| 33 | static const struct xt_option_entry rt_opts[] = { |
Jan Engelhardt | 319046c | 2011-05-24 00:45:08 +0200 | [diff] [blame] | 34 | {.name = "rt-type", .id = O_RT_TYPE, .type = XTTYPE_UINT32, |
| 35 | .flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, rt_type)}, |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 36 | {.name = "rt-segsleft", .id = O_RT_SEGSLEFT, .type = XTTYPE_UINT32RC, |
| 37 | .flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, segsleft)}, |
| 38 | {.name = "rt-len", .id = O_RT_LEN, .type = XTTYPE_UINT32, |
| 39 | .flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hdrlen)}, |
| 40 | {.name = "rt-0-res", .id = O_RT0RES, .type = XTTYPE_NONE}, |
| 41 | {.name = "rt-0-addrs", .id = O_RT0ADDRS, .type = XTTYPE_STRING}, |
Jan Engelhardt | 65c0621 | 2011-05-13 01:53:07 +0200 | [diff] [blame] | 42 | {.name = "rt-0-not-strict", .id = O_RT0NSTRICT, .type = XTTYPE_NONE}, |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 43 | XTOPT_TABLEEND, |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 44 | }; |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 45 | #undef s |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 46 | |
Jan Engelhardt | dd6e4b9 | 2011-05-07 00:05:24 +0200 | [diff] [blame] | 47 | static const char * |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 48 | addr_to_numeric(const struct in6_addr *addrp) |
| 49 | { |
| 50 | static char buf[50+1]; |
Jan Engelhardt | dd6e4b9 | 2011-05-07 00:05:24 +0200 | [diff] [blame] | 51 | return inet_ntop(AF_INET6, addrp, buf, sizeof(buf)); |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 52 | } |
| 53 | |
| 54 | static struct in6_addr * |
| 55 | numeric_to_addr(const char *num) |
| 56 | { |
| 57 | static struct in6_addr ap; |
| 58 | int err; |
| 59 | |
| 60 | if ((err=inet_pton(AF_INET6, num, &ap)) == 1) |
| 61 | return ≈ |
| 62 | #ifdef DEBUG |
| 63 | fprintf(stderr, "\nnumeric2addr: %d\n", err); |
| 64 | #endif |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 65 | xtables_error(PARAMETER_PROBLEM, "bad address: %s", num); |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 66 | |
| 67 | return (struct in6_addr *)NULL; |
| 68 | } |
| 69 | |
| 70 | |
| 71 | static int |
| 72 | parse_addresses(const char *addrstr, struct in6_addr *addrp) |
| 73 | { |
| 74 | char *buffer, *cp, *next; |
| 75 | unsigned int i; |
| 76 | |
| 77 | buffer = strdup(addrstr); |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 78 | if (!buffer) xtables_error(OTHER_PROBLEM, "strdup failed"); |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 79 | |
| 80 | for (cp=buffer, i=0; cp && i<IP6T_RT_HOPS; cp=next,i++) |
| 81 | { |
| 82 | next=strchr(cp, ','); |
| 83 | if (next) *next++='\0'; |
| 84 | memcpy(&(addrp[i]), numeric_to_addr(cp), sizeof(struct in6_addr)); |
| 85 | #if DEBUG |
| 86 | printf("addr str: %s\n", cp); |
| 87 | printf("addr ip6: %s\n", addr_to_numeric((numeric_to_addr(cp)))); |
| 88 | printf("addr [%d]: %s\n", i, addr_to_numeric(&(addrp[i]))); |
| 89 | #endif |
| 90 | } |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 91 | if (cp) xtables_error(PARAMETER_PROBLEM, "too many addresses specified"); |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 92 | |
| 93 | free(buffer); |
| 94 | |
| 95 | #if DEBUG |
| 96 | printf("addr nr: %d\n", i); |
| 97 | #endif |
| 98 | |
| 99 | return i; |
| 100 | } |
| 101 | |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 102 | static void rt_parse(struct xt_option_call *cb) |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 103 | { |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 104 | struct ip6t_rt *rtinfo = cb->data; |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 105 | |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 106 | xtables_option_parse(cb); |
| 107 | switch (cb->entry->id) { |
| 108 | case O_RT_TYPE: |
| 109 | if (cb->invert) |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 110 | rtinfo->invflags |= IP6T_RT_INV_TYP; |
| 111 | rtinfo->flags |= IP6T_RT_TYP; |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 112 | break; |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 113 | case O_RT_SEGSLEFT: |
Jan Engelhardt | 6944f2c | 2011-05-24 23:50:29 +0200 | [diff] [blame] | 114 | if (cb->nvals == 1) |
| 115 | rtinfo->segsleft[1] = rtinfo->segsleft[0]; |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 116 | if (cb->invert) |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 117 | rtinfo->invflags |= IP6T_RT_INV_SGS; |
| 118 | rtinfo->flags |= IP6T_RT_SGS; |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 119 | break; |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 120 | case O_RT_LEN: |
| 121 | if (cb->invert) |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 122 | rtinfo->invflags |= IP6T_RT_INV_LEN; |
| 123 | rtinfo->flags |= IP6T_RT_LEN; |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 124 | break; |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 125 | case O_RT0RES: |
| 126 | if (!(cb->xflags & F_RT_TYPE) || rtinfo->rt_type != 0 || |
| 127 | rtinfo->invflags & IP6T_RT_INV_TYP) |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 128 | xtables_error(PARAMETER_PROBLEM, |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 129 | "`--rt-type 0' required before `--rt-0-res'"); |
| 130 | rtinfo->flags |= IP6T_RT_RES; |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 131 | break; |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 132 | case O_RT0ADDRS: |
| 133 | if (!(cb->xflags & F_RT_TYPE) || rtinfo->rt_type != 0 || |
| 134 | rtinfo->invflags & IP6T_RT_INV_TYP) |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 135 | xtables_error(PARAMETER_PROBLEM, |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 136 | "`--rt-type 0' required before `--rt-0-addrs'"); |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 137 | rtinfo->addrnr = parse_addresses(cb->arg, rtinfo->addrs); |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 138 | rtinfo->flags |= IP6T_RT_FST; |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 139 | break; |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 140 | case O_RT0NSTRICT: |
| 141 | if (!(cb->xflags & F_RT0ADDRS)) |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 142 | xtables_error(PARAMETER_PROBLEM, |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 143 | "`--rt-0-addr ...' required before `--rt-0-not-strict'"); |
| 144 | rtinfo->flags |= IP6T_RT_FST_NSTRICT; |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 145 | break; |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 146 | } |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 147 | } |
| 148 | |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 149 | static void |
Jan Engelhardt | 7ac4052 | 2011-01-07 12:34:04 +0100 | [diff] [blame] | 150 | print_nums(const char *name, uint32_t min, uint32_t max, |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 151 | int invert) |
| 152 | { |
| 153 | const char *inv = invert ? "!" : ""; |
| 154 | |
| 155 | if (min != 0 || max != 0xFFFFFFFF || invert) { |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 156 | printf(" %s", name); |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 157 | if (min == max) { |
| 158 | printf(":%s", inv); |
| 159 | printf("%u", min); |
| 160 | } else { |
| 161 | printf("s:%s", inv); |
| 162 | printf("%u",min); |
| 163 | printf(":"); |
| 164 | printf("%u",max); |
| 165 | } |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 166 | } |
| 167 | } |
| 168 | |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 169 | static void |
Jan Engelhardt | 7a236f4 | 2008-03-03 12:30:41 +0100 | [diff] [blame] | 170 | print_addresses(unsigned int addrnr, struct in6_addr *addrp) |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 171 | { |
| 172 | unsigned int i; |
| 173 | |
| 174 | for(i=0; i<addrnr; i++){ |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 175 | printf("%c%s", (i==0)?' ':',', addr_to_numeric(&(addrp[i]))); |
András Kis-Szabó | fce8699 | 2002-04-29 13:48:46 +0000 | [diff] [blame] | 176 | } |
| 177 | } |
| 178 | |
Jan Engelhardt | 997045f | 2007-10-04 16:29:21 +0000 | [diff] [blame] | 179 | static void rt_print(const void *ip, const struct xt_entry_match *match, |
| 180 | int numeric) |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 181 | { |
| 182 | const struct ip6t_rt *rtinfo = (struct ip6t_rt *)match->data; |
| 183 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 184 | printf(" rt"); |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 185 | if (rtinfo->flags & IP6T_RT_TYP) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 186 | printf(" type:%s%d", rtinfo->invflags & IP6T_RT_INV_TYP ? "!" : "", |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 187 | rtinfo->rt_type); |
| 188 | print_nums("segsleft", rtinfo->segsleft[0], rtinfo->segsleft[1], |
| 189 | rtinfo->invflags & IP6T_RT_INV_SGS); |
| 190 | if (rtinfo->flags & IP6T_RT_LEN) { |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 191 | printf(" length"); |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 192 | printf(":%s", rtinfo->invflags & IP6T_RT_INV_LEN ? "!" : ""); |
| 193 | printf("%u", rtinfo->hdrlen); |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 194 | } |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 195 | if (rtinfo->flags & IP6T_RT_RES) printf(" reserved"); |
| 196 | if (rtinfo->flags & IP6T_RT_FST) printf(" 0-addrs"); |
Fabrice MARIE | ae31bb6 | 2002-06-14 07:38:16 +0000 | [diff] [blame] | 197 | print_addresses(rtinfo->addrnr, (struct in6_addr *)rtinfo->addrs); |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 198 | if (rtinfo->flags & IP6T_RT_FST_NSTRICT) printf(" 0-not-strict"); |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 199 | if (rtinfo->invflags & ~IP6T_RT_INV_MASK) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 200 | printf(" Unknown invflags: 0x%X", |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 201 | rtinfo->invflags & ~IP6T_RT_INV_MASK); |
| 202 | } |
| 203 | |
Jan Engelhardt | 997045f | 2007-10-04 16:29:21 +0000 | [diff] [blame] | 204 | static void rt_save(const void *ip, const struct xt_entry_match *match) |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 205 | { |
| 206 | const struct ip6t_rt *rtinfo = (struct ip6t_rt *)match->data; |
| 207 | |
| 208 | if (rtinfo->flags & IP6T_RT_TYP) { |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 209 | printf("%s --rt-type %u", |
| 210 | (rtinfo->invflags & IP6T_RT_INV_TYP) ? " !" : "", |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 211 | rtinfo->rt_type); |
| 212 | } |
| 213 | |
| 214 | if (!(rtinfo->segsleft[0] == 0 |
| 215 | && rtinfo->segsleft[1] == 0xFFFFFFFF)) { |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 216 | printf("%s --rt-segsleft ", |
| 217 | (rtinfo->invflags & IP6T_RT_INV_SGS) ? " !" : ""); |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 218 | if (rtinfo->segsleft[0] |
| 219 | != rtinfo->segsleft[1]) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 220 | printf("%u:%u", |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 221 | rtinfo->segsleft[0], |
| 222 | rtinfo->segsleft[1]); |
| 223 | else |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 224 | printf("%u", |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 225 | rtinfo->segsleft[0]); |
| 226 | } |
| 227 | |
| 228 | if (rtinfo->flags & IP6T_RT_LEN) { |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 229 | printf("%s --rt-len %u", |
| 230 | (rtinfo->invflags & IP6T_RT_INV_LEN) ? " !" : "", |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 231 | rtinfo->hdrlen); |
| 232 | } |
| 233 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 234 | if (rtinfo->flags & IP6T_RT_RES) printf(" --rt-0-res"); |
| 235 | if (rtinfo->flags & IP6T_RT_FST) printf(" --rt-0-addrs"); |
Fabrice MARIE | ae31bb6 | 2002-06-14 07:38:16 +0000 | [diff] [blame] | 236 | print_addresses(rtinfo->addrnr, (struct in6_addr *)rtinfo->addrs); |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 237 | if (rtinfo->flags & IP6T_RT_FST_NSTRICT) printf(" --rt-0-not-strict"); |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 238 | |
| 239 | } |
| 240 | |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 241 | static struct xtables_match rt_mt6_reg = { |
Harald Welte | 02aa733 | 2005-02-01 15:38:20 +0000 | [diff] [blame] | 242 | .name = "rt", |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 243 | .version = XTABLES_VERSION, |
Jan Engelhardt | 03d9948 | 2008-11-18 12:27:54 +0100 | [diff] [blame] | 244 | .family = NFPROTO_IPV6, |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 245 | .size = XT_ALIGN(sizeof(struct ip6t_rt)), |
| 246 | .userspacesize = XT_ALIGN(sizeof(struct ip6t_rt)), |
Jan Engelhardt | 997045f | 2007-10-04 16:29:21 +0000 | [diff] [blame] | 247 | .help = rt_help, |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 248 | .x6_parse = rt_parse, |
Jan Engelhardt | 997045f | 2007-10-04 16:29:21 +0000 | [diff] [blame] | 249 | .print = rt_print, |
| 250 | .save = rt_save, |
Jan Engelhardt | 1f8e52e | 2011-05-08 12:53:20 +0200 | [diff] [blame] | 251 | .x6_options = rt_opts, |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 252 | }; |
| 253 | |
| 254 | void |
| 255 | _init(void) |
| 256 | { |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 257 | xtables_register_match(&rt_mt6_reg); |
András Kis-Szabó | a420416 | 2002-04-24 09:35:01 +0000 | [diff] [blame] | 258 | } |