10c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy/* 20c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy * Copyright (c) 2010-2013 Patrick McHardy <kaber@trash.net> 30c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy */ 40c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy 59fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy#include <stdio.h> 69fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy#include <string.h> 79fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy#include <xtables.h> 89fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy#include <linux/netfilter/nf_conntrack_common.h> 99fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy#include <linux/netfilter/xt_CT.h> 109fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 119fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic void ct_help(void) 129fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{ 139fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy printf( 149fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy"CT target options:\n" 159fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy" --notrack Don't track connection\n" 169fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy" --helper name Use conntrack helper 'name' for connection\n" 1789b6c32f88be47e83c3f6e7f8fee812088cb8c22Jan Engelhardt" --ctevents event[,event...] Generate specified conntrack events for connection\n" 189fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy" --expevents event[,event...] Generate specified expectation events for connection\n" 199fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy" --zone ID Assign/Lookup connection in zone ID\n" 209fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy ); 219fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy} 229fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 23e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic void ct_help_v1(void) 24e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso{ 25e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso printf( 26e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso"CT target options:\n" 27e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --notrack Don't track connection\n" 28e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --helper name Use conntrack helper 'name' for connection\n" 29e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --timeout name Use timeout policy 'name' for connection\n" 30e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --ctevents event[,event...] Generate specified conntrack events for connection\n" 31e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --expevents event[,event...] Generate specified expectation events for connection\n" 32e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso" --zone ID Assign/Lookup connection in zone ID\n" 33e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso ); 34e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso} 35e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso 36a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardtenum { 37a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt O_NOTRACK = 0, 38a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt O_HELPER, 39e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso O_TIMEOUT, 40a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt O_CTEVENTS, 41a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt O_EXPEVENTS, 42a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt O_ZONE, 439fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}; 449fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 45a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt#define s struct xt_ct_target_info 46a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardtstatic const struct xt_option_entry ct_opts[] = { 47a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt {.name = "notrack", .id = O_NOTRACK, .type = XTTYPE_NONE}, 48a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt {.name = "helper", .id = O_HELPER, .type = XTTYPE_STRING, 49a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt .flags = XTOPT_PUT, XTOPT_POINTER(s, helper)}, 50a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt {.name = "ctevents", .id = O_CTEVENTS, .type = XTTYPE_STRING}, 51a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt {.name = "expevents", .id = O_EXPEVENTS, .type = XTTYPE_STRING}, 52a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt {.name = "zone", .id = O_ZONE, .type = XTTYPE_UINT16, 53a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt .flags = XTOPT_PUT, XTOPT_POINTER(s, zone)}, 54a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt XTOPT_TABLEEND, 559fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}; 56a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt#undef s 579fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 58e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso#define s struct xt_ct_target_info_v1 59e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic const struct xt_option_entry ct_opts_v1[] = { 60e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso {.name = "notrack", .id = O_NOTRACK, .type = XTTYPE_NONE}, 61e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso {.name = "helper", .id = O_HELPER, .type = XTTYPE_STRING, 62e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .flags = XTOPT_PUT, XTOPT_POINTER(s, helper)}, 63e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso {.name = "timeout", .id = O_TIMEOUT, .type = XTTYPE_STRING, 64e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .flags = XTOPT_PUT, XTOPT_POINTER(s, timeout)}, 65e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso {.name = "ctevents", .id = O_CTEVENTS, .type = XTTYPE_STRING}, 66e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso {.name = "expevents", .id = O_EXPEVENTS, .type = XTTYPE_STRING}, 67e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso {.name = "zone", .id = O_ZONE, .type = XTTYPE_UINT16, 68e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .flags = XTOPT_PUT, XTOPT_POINTER(s, zone)}, 69e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso XTOPT_TABLEEND, 70e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso}; 71e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso#undef s 72e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso 739fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystruct event_tbl { 749fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy const char *name; 759fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy unsigned int event; 769fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}; 779fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 789fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic const struct event_tbl ct_event_tbl[] = { 799fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy { "new", IPCT_NEW }, 809fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy { "related", IPCT_RELATED }, 819fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy { "destroy", IPCT_DESTROY }, 829fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy { "reply", IPCT_REPLY }, 839fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy { "assured", IPCT_ASSURED }, 849fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy { "protoinfo", IPCT_PROTOINFO }, 859fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy { "helper", IPCT_HELPER }, 869fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy { "mark", IPCT_MARK }, 879fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy { "natseqinfo", IPCT_NATSEQADJ }, 889fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy { "secmark", IPCT_SECMARK }, 899fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}; 909fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 919fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic const struct event_tbl exp_event_tbl[] = { 929fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy { "new", IPEXP_NEW }, 939fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}; 949fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 959fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic uint32_t ct_parse_events(const struct event_tbl *tbl, unsigned int size, 969fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy const char *events) 979fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{ 989fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy char str[strlen(events) + 1], *e = str, *t; 999fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy unsigned int mask = 0, i; 1009fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 1019fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy strcpy(str, events); 1029fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy while ((t = strsep(&e, ","))) { 1039fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy for (i = 0; i < size; i++) { 104bed2ba957d545b50c3eae6fb28fc0decadbc0dcbPablo Neira Ayuso if (strcmp(t, tbl[i].name)) 1059fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy continue; 106bed2ba957d545b50c3eae6fb28fc0decadbc0dcbPablo Neira Ayuso mask |= 1 << tbl[i].event; 1079fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy break; 1089fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy } 1099fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 1109fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy if (i == size) 1119fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy xtables_error(PARAMETER_PROBLEM, "Unknown event type \"%s\"", t); 1129fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy } 1139fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 1149fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy return mask; 1159fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy} 1169fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 1179fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic void ct_print_events(const char *pfx, const struct event_tbl *tbl, 1189fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy unsigned int size, uint32_t mask) 1199fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{ 1209fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy const char *sep = ""; 1219fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy unsigned int i; 1229fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 12373866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf(" %s ", pfx); 1249fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy for (i = 0; i < size; i++) { 1259fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy if (mask & (1 << tbl[i].event)) { 1269fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy printf("%s%s", sep, tbl[i].name); 1279fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy sep = ","; 1289fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy } 1299fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy } 1309fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy} 1319fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 132a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardtstatic void ct_parse(struct xt_option_call *cb) 1339fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{ 134a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt struct xt_ct_target_info *info = cb->data; 1359fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 136a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt xtables_option_parse(cb); 137a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt switch (cb->entry->id) { 138a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt case O_NOTRACK: 1399fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy info->flags |= XT_CT_NOTRACK; 1409fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy break; 141a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt case O_CTEVENTS: 142a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt info->ct_events = ct_parse_events(ct_event_tbl, ARRAY_SIZE(ct_event_tbl), cb->arg); 1439fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy break; 144a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt case O_EXPEVENTS: 145a05562e1e2fb2e18f34d29ec57c4217a3014d1f2Jan Engelhardt info->exp_events = ct_parse_events(exp_event_tbl, ARRAY_SIZE(exp_event_tbl), cb->arg); 1469fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy break; 1479fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy } 1489fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy} 1499fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 150e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic void ct_parse_v1(struct xt_option_call *cb) 151e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso{ 152e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso struct xt_ct_target_info_v1 *info = cb->data; 153e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso 154e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso xtables_option_parse(cb); 155e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso switch (cb->entry->id) { 156e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso case O_NOTRACK: 157e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso info->flags |= XT_CT_NOTRACK; 158e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso break; 159e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso case O_CTEVENTS: 160e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso info->ct_events = ct_parse_events(ct_event_tbl, 161e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso ARRAY_SIZE(ct_event_tbl), 162e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso cb->arg); 163e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso break; 164e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso case O_EXPEVENTS: 165e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso info->exp_events = ct_parse_events(exp_event_tbl, 166e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso ARRAY_SIZE(exp_event_tbl), 167e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso cb->arg); 168e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso break; 169e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso } 170e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso} 171e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso 1729fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic void ct_print(const void *ip, const struct xt_entry_target *target, int numeric) 1739fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{ 1749fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy const struct xt_ct_target_info *info = 1759fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy (const struct xt_ct_target_info *)target->data; 1769fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 17773866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf(" CT"); 1789fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy if (info->flags & XT_CT_NOTRACK) 17973866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf(" notrack"); 1809fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy if (info->helper[0]) 18173866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf(" helper %s", info->helper); 1829fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy if (info->ct_events) 1839fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy ct_print_events("ctevents", ct_event_tbl, 1849fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy ARRAY_SIZE(ct_event_tbl), info->ct_events); 1859fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy if (info->exp_events) 1869fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy ct_print_events("expevents", exp_event_tbl, 1879fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy ARRAY_SIZE(exp_event_tbl), info->exp_events); 1889f27e6b6f8638bde93e9901e999287ad5118f17cPatrick McHardy if (info->zone) 1899f27e6b6f8638bde93e9901e999287ad5118f17cPatrick McHardy printf("zone %u ", info->zone); 1909fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy} 1919fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 192e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic void 193e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusoct_print_v1(const void *ip, const struct xt_entry_target *target, int numeric) 194e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso{ 195e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso const struct xt_ct_target_info_v1 *info = 196e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso (const struct xt_ct_target_info_v1 *)target->data; 197e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso 1987b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik if (info->flags & XT_CT_NOTRACK_ALIAS) { 1997b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik printf (" NOTRACK"); 2007b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik return; 2017b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik } 202e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso printf(" CT"); 203e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso if (info->flags & XT_CT_NOTRACK) 204e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso printf(" notrack"); 205e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso if (info->helper[0]) 206e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso printf(" helper %s", info->helper); 207e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso if (info->timeout[0]) 208e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso printf(" timeout %s", info->timeout); 209e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso if (info->ct_events) 210e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso ct_print_events("ctevents", ct_event_tbl, 211e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso ARRAY_SIZE(ct_event_tbl), info->ct_events); 212e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso if (info->exp_events) 213e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso ct_print_events("expevents", exp_event_tbl, 214e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso ARRAY_SIZE(exp_event_tbl), info->exp_events); 215e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso if (info->zone) 216e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso printf("zone %u ", info->zone); 217e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso} 218e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso 2199fdbaa71452edaac9d5906716c15937f670341faPatrick McHardystatic void ct_save(const void *ip, const struct xt_entry_target *target) 2209fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{ 2219fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy const struct xt_ct_target_info *info = 2229fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy (const struct xt_ct_target_info *)target->data; 2239fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 2247b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik if (info->flags & XT_CT_NOTRACK_ALIAS) 2257b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik return; 2269fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy if (info->flags & XT_CT_NOTRACK) 22773866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf(" --notrack"); 2289fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy if (info->helper[0]) 22973866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf(" --helper %s", info->helper); 2309fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy if (info->ct_events) 2319fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy ct_print_events("--ctevents", ct_event_tbl, 2329fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy ARRAY_SIZE(ct_event_tbl), info->ct_events); 2339fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy if (info->exp_events) 2349fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy ct_print_events("--expevents", exp_event_tbl, 2359fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy ARRAY_SIZE(exp_event_tbl), info->exp_events); 2369f27e6b6f8638bde93e9901e999287ad5118f17cPatrick McHardy if (info->zone) 23773866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf(" --zone %u", info->zone); 2389fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy} 2399fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 240e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic void ct_save_v1(const void *ip, const struct xt_entry_target *target) 241e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso{ 242e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso const struct xt_ct_target_info_v1 *info = 243e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso (const struct xt_ct_target_info_v1 *)target->data; 244e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso 2457b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik if (info->flags & XT_CT_NOTRACK_ALIAS) 2467b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik return; 247e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso if (info->flags & XT_CT_NOTRACK) 248e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso printf(" --notrack"); 249e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso if (info->helper[0]) 250e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso printf(" --helper %s", info->helper); 251e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso if (info->timeout[0]) 252e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso printf(" --timeout %s", info->timeout); 253e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso if (info->ct_events) 254e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso ct_print_events("--ctevents", ct_event_tbl, 255e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso ARRAY_SIZE(ct_event_tbl), info->ct_events); 256e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso if (info->exp_events) 257e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso ct_print_events("--expevents", exp_event_tbl, 258e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso ARRAY_SIZE(exp_event_tbl), info->exp_events); 259e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso if (info->zone) 260e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso printf(" --zone %u", info->zone); 261e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso} 262e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso 2637b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsikstatic const char * 2647b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsikct_print_name_alias(const struct xt_entry_target *target) 2657b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik{ 2667b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik struct xt_ct_target_info *info = (void *)target->data; 2677b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik 2687b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik return info->flags & XT_CT_NOTRACK_ALIAS ? "NOTRACK" : "CT"; 2697b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik} 2707b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik 27150f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardtstatic void notrack_ct0_tg_init(struct xt_entry_target *target) 27250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt{ 27350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt struct xt_ct_target_info *info = (void *)target->data; 27450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt 27550f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt info->flags = XT_CT_NOTRACK; 27650f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt} 27750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt 27850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardtstatic void notrack_ct1_tg_init(struct xt_entry_target *target) 27950f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt{ 28050f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt struct xt_ct_target_info_v1 *info = (void *)target->data; 28150f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt 28250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt info->flags = XT_CT_NOTRACK; 28350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt} 28450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt 2857b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsikstatic void notrack_ct2_tg_init(struct xt_entry_target *target) 2867b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik{ 2877b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik struct xt_ct_target_info_v1 *info = (void *)target->data; 2887b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik 2897b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik info->flags = XT_CT_NOTRACK | XT_CT_NOTRACK_ALIAS; 2907b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik} 2917b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik 292e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayusostatic struct xtables_target ct_target_reg[] = { 293e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso { 294e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .family = NFPROTO_UNSPEC, 295e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .name = "CT", 296e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .version = XTABLES_VERSION, 297e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .size = XT_ALIGN(sizeof(struct xt_ct_target_info)), 298e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .userspacesize = offsetof(struct xt_ct_target_info, ct), 299e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .help = ct_help, 300e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .print = ct_print, 301e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .save = ct_save, 302e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .x6_parse = ct_parse, 303e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .x6_options = ct_opts, 304e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso }, 305e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso { 306e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .family = NFPROTO_UNSPEC, 307e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .name = "CT", 308e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .revision = 1, 309e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .version = XTABLES_VERSION, 310e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .size = XT_ALIGN(sizeof(struct xt_ct_target_info_v1)), 311e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .userspacesize = offsetof(struct xt_ct_target_info_v1, ct), 312e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .help = ct_help_v1, 313e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .print = ct_print_v1, 314e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .save = ct_save_v1, 315e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .x6_parse = ct_parse_v1, 316e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso .x6_options = ct_opts_v1, 317e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso }, 31850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt { 3197b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .family = NFPROTO_UNSPEC, 3207b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .name = "CT", 3217b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .revision = 2, 3227b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .version = XTABLES_VERSION, 3237b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .size = XT_ALIGN(sizeof(struct xt_ct_target_info_v1)), 3247b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .userspacesize = offsetof(struct xt_ct_target_info_v1, ct), 3257b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .help = ct_help_v1, 3267b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .print = ct_print_v1, 3277b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .save = ct_save_v1, 3287b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .alias = ct_print_name_alias, 3297b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .x6_parse = ct_parse_v1, 3307b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .x6_options = ct_opts_v1, 3317b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik }, 3327b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik { 33350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .family = NFPROTO_UNSPEC, 33450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .name = "NOTRACK", 33550f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .real_name = "CT", 33650f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .revision = 0, 33750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .version = XTABLES_VERSION, 33850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .size = XT_ALIGN(sizeof(struct xt_ct_target_info)), 33950f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .userspacesize = offsetof(struct xt_ct_target_info, ct), 34050f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .init = notrack_ct0_tg_init, 34150f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt }, 34250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt { 34350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .family = NFPROTO_UNSPEC, 34450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .name = "NOTRACK", 34550f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .real_name = "CT", 34650f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .revision = 1, 34750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .version = XTABLES_VERSION, 34850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .size = XT_ALIGN(sizeof(struct xt_ct_target_info_v1)), 34950f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .userspacesize = offsetof(struct xt_ct_target_info_v1, ct), 35050f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .init = notrack_ct1_tg_init, 35150f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt }, 35250f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt { 35350f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .family = NFPROTO_UNSPEC, 35450f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .name = "NOTRACK", 3557b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .real_name = "CT", 3567b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .revision = 2, 3577b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .ext_flags = XTABLES_EXT_ALIAS, 3587b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .version = XTABLES_VERSION, 3597b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .size = XT_ALIGN(sizeof(struct xt_ct_target_info_v1)), 3607b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .userspacesize = offsetof(struct xt_ct_target_info_v1, ct), 3617b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .init = notrack_ct2_tg_init, 3627b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik }, 3637b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik { 3647b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .family = NFPROTO_UNSPEC, 3657b26bafb9be05a23b47653640aadbb61d0032665Jozsef Kadlecsik .name = "NOTRACK", 36650f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .revision = 0, 36750f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt .version = XTABLES_VERSION, 36850f19190a60ff7d69e88406a71a2f27e09008566Jan Engelhardt }, 3699fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy}; 3709fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy 3719fdbaa71452edaac9d5906716c15937f670341faPatrick McHardyvoid _init(void) 3729fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy{ 373e8f32983048d6aa4a908b6a92da55fa71c859623Pablo Neira Ayuso xtables_register_targets(ct_target_reg, ARRAY_SIZE(ct_target_reg)); 3749fdbaa71452edaac9d5906716c15937f670341faPatrick McHardy} 375