libxt_physdev.c revision 181dead3f13befe02769ef479bcbb51801b7fc4e
11254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer/* Shared library add-on to iptables to add bridge port matching support. */ 21254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer#include <stdio.h> 31254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer#include <string.h> 41254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer#include <stdlib.h> 51254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer#include <getopt.h> 61254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer#include <ctype.h> 7fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI#include <xtables.h> 8fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI#include <linux/netfilter/xt_physdev.h> 91254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer#if defined(__GLIBC__) && __GLIBC__ == 2 101254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer#include <net/ethernet.h> 111254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer#else 121254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer#include <linux/if_ether.h> 131254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer#endif 141254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 15181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic void physdev_help(void) 161254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer{ 171254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer printf( 181254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer"physdev v%s options:\n" 1930596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer" --physdev-in [!] input name[+] bridge port name ([+] for wildcard)\n" 201254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer" --physdev-out [!] output name[+] bridge port name ([+] for wildcard)\n" 2130596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer" [!] --physdev-is-in arrived on a bridge device\n" 2230596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer" [!] --physdev-is-out will leave on a bridge device\n" 2330596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer" [!] --physdev-is-bridged it's a bridged packet\n" 241254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer"\n", IPTABLES_VERSION); 251254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer} 261254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 27181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic const struct option physdev_opts[] = { 28500f483fff529dcd88ec96b9d5054be6cd6363a0Patrick McHardy { "physdev-in", 1, NULL, '1' }, 29500f483fff529dcd88ec96b9d5054be6cd6363a0Patrick McHardy { "physdev-out", 1, NULL, '2' }, 30500f483fff529dcd88ec96b9d5054be6cd6363a0Patrick McHardy { "physdev-is-in", 0, NULL, '3' }, 31500f483fff529dcd88ec96b9d5054be6cd6363a0Patrick McHardy { "physdev-is-out", 0, NULL, '4' }, 32500f483fff529dcd88ec96b9d5054be6cd6363a0Patrick McHardy { "physdev-is-bridged", 0, NULL, '5' }, 33500f483fff529dcd88ec96b9d5054be6cd6363a0Patrick McHardy { } 341254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer}; 351254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 361254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymerstatic int 37181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtphysdev_parse(int c, char **argv, int invert, unsigned int *flags, 38181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt const void *entry, struct xt_entry_match **match) 391254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer{ 40fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI struct xt_physdev_info *info = 41fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI (struct xt_physdev_info*)(*match)->data; 421254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 431254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer switch (c) { 441254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer case '1': 45fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (*flags & XT_PHYSDEV_OP_IN) 4630596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer goto multiple_use; 471254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer check_inverse(optarg, &invert, &optind, 0); 48efa8fc2123a2a9fc229ab471edd2b2688ce1da3aHarald Welte parse_interface(argv[optind-1], info->physindev, 49efa8fc2123a2a9fc229ab471edd2b2688ce1da3aHarald Welte (unsigned char *)info->in_mask); 501254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer if (invert) 51fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->invert |= XT_PHYSDEV_OP_IN; 52fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->bitmask |= XT_PHYSDEV_OP_IN; 53fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI *flags |= XT_PHYSDEV_OP_IN; 541254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer break; 551254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 561254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer case '2': 57fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (*flags & XT_PHYSDEV_OP_OUT) 5830596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer goto multiple_use; 591254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer check_inverse(optarg, &invert, &optind, 0); 601254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer parse_interface(argv[optind-1], info->physoutdev, 61efa8fc2123a2a9fc229ab471edd2b2688ce1da3aHarald Welte (unsigned char *)info->out_mask); 621254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer if (invert) 63fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->invert |= XT_PHYSDEV_OP_OUT; 64fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->bitmask |= XT_PHYSDEV_OP_OUT; 65fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI *flags |= XT_PHYSDEV_OP_OUT; 6630596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer break; 6730596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer 6830596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer case '3': 69fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (*flags & XT_PHYSDEV_OP_ISIN) 7030596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer goto multiple_use; 7130596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer check_inverse(optarg, &invert, &optind, 0); 72fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->bitmask |= XT_PHYSDEV_OP_ISIN; 7330596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer if (invert) 74fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->invert |= XT_PHYSDEV_OP_ISIN; 75fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI *flags |= XT_PHYSDEV_OP_ISIN; 7630596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer break; 7730596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer 7830596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer case '4': 79fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (*flags & XT_PHYSDEV_OP_ISOUT) 8030596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer goto multiple_use; 8130596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer check_inverse(optarg, &invert, &optind, 0); 82fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->bitmask |= XT_PHYSDEV_OP_ISOUT; 8330596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer if (invert) 84fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->invert |= XT_PHYSDEV_OP_ISOUT; 85fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI *flags |= XT_PHYSDEV_OP_ISOUT; 8630596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer break; 8730596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer 8830596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer case '5': 89fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (*flags & XT_PHYSDEV_OP_BRIDGED) 9030596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer goto multiple_use; 9130596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer check_inverse(optarg, &invert, &optind, 0); 9230596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer if (invert) 93fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->invert |= XT_PHYSDEV_OP_BRIDGED; 94fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI *flags |= XT_PHYSDEV_OP_BRIDGED; 95fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->bitmask |= XT_PHYSDEV_OP_BRIDGED; 961254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer break; 971254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 981254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer default: 991254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer return 0; 1001254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer } 1011254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 1021254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer return 1; 10330596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymermultiple_use: 10430596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer exit_error(PARAMETER_PROBLEM, 10530596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer "multiple use of the same physdev option is not allowed"); 1061254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 1071254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer} 1081254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 109181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic void physdev_check(unsigned int flags) 1101254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer{ 11130596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer if (flags == 0) 11230596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer exit_error(PARAMETER_PROBLEM, "PHYSDEV: no physdev option specified"); 1131254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer} 1141254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 1151254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymerstatic void 116181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtphysdev_print(const void *ip, const struct xt_entry_match *match, int numeric) 1171254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer{ 118fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI struct xt_physdev_info *info = 119fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI (struct xt_physdev_info*)match->data; 1201254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 1211254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer printf("PHYSDEV match"); 122fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (info->bitmask & XT_PHYSDEV_OP_ISIN) 12330596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer printf("%s --physdev-is-in", 124fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->invert & XT_PHYSDEV_OP_ISIN ? " !":""); 125fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (info->bitmask & XT_PHYSDEV_OP_IN) 12630596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer printf("%s --physdev-in %s", 127fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI (info->invert & XT_PHYSDEV_OP_IN) ? " !":"", info->physindev); 12830596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer 129fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (info->bitmask & XT_PHYSDEV_OP_ISOUT) 13030596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer printf("%s --physdev-is-out", 131fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->invert & XT_PHYSDEV_OP_ISOUT ? " !":""); 132fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (info->bitmask & XT_PHYSDEV_OP_OUT) 13330596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer printf("%s --physdev-out %s", 134fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI (info->invert & XT_PHYSDEV_OP_OUT) ? " !":"", info->physoutdev); 135fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (info->bitmask & XT_PHYSDEV_OP_BRIDGED) 13630596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer printf("%s --physdev-is-bridged", 137fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->invert & XT_PHYSDEV_OP_BRIDGED ? " !":""); 1381254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer printf(" "); 1391254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer} 1401254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 141181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic void physdev_save(const void *ip, const struct xt_entry_match *match) 1421254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer{ 143fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI struct xt_physdev_info *info = 144fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI (struct xt_physdev_info*)match->data; 1451254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 146fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (info->bitmask & XT_PHYSDEV_OP_ISIN) 14730596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer printf("%s --physdev-is-in", 148fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->invert & XT_PHYSDEV_OP_ISIN ? " !":""); 149fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (info->bitmask & XT_PHYSDEV_OP_IN) 15030596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer printf("%s --physdev-in %s", 151fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI (info->invert & XT_PHYSDEV_OP_IN) ? " !":"", info->physindev); 15230596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer 153fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (info->bitmask & XT_PHYSDEV_OP_ISOUT) 15430596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer printf("%s --physdev-is-out", 155fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->invert & XT_PHYSDEV_OP_ISOUT ? " !":""); 156fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (info->bitmask & XT_PHYSDEV_OP_OUT) 15730596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer printf("%s --physdev-out %s", 158fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI (info->invert & XT_PHYSDEV_OP_OUT) ? " !":"", info->physoutdev); 159fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI if (info->bitmask & XT_PHYSDEV_OP_BRIDGED) 16030596a5e7ae8c518a8a0bbf3aa891728e9f9ec1bBart De Schuymer printf("%s --physdev-is-bridged", 161fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI info->invert & XT_PHYSDEV_OP_BRIDGED ? " !":""); 1621254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer printf(" "); 1631254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer} 1641254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 165181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic struct xtables_match physdev_match = { 166fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI .family = AF_INET, 1678caee8b9e34fed4562fcff553197c161fc9d9979Pablo Neira .name = "physdev", 1688caee8b9e34fed4562fcff553197c161fc9d9979Pablo Neira .version = IPTABLES_VERSION, 169fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI .size = XT_ALIGN(sizeof(struct xt_physdev_info)), 170fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI .userspacesize = XT_ALIGN(sizeof(struct xt_physdev_info)), 171181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .help = physdev_help, 172181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .parse = physdev_parse, 173181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .final_check = physdev_check, 174181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .print = physdev_print, 175181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .save = physdev_save, 176181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .extra_opts = physdev_opts, 177fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI}; 178fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI 179181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic struct xtables_match physdev_match6 = { 180fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI .family = AF_INET6, 181fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI .name = "physdev", 182fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI .version = IPTABLES_VERSION, 183fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI .size = XT_ALIGN(sizeof(struct xt_physdev_info)), 184fec77fed67feb55aba4c33ae2367178c57ce83deYasuyuki KOZAKAI .userspacesize = XT_ALIGN(sizeof(struct xt_physdev_info)), 185181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .help = physdev_help, 186181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .parse = physdev_parse, 187181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .final_check = physdev_check, 188181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .print = physdev_print, 189181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .save = physdev_save, 190181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .extra_opts = physdev_opts, 1911254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer}; 1921254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer 1931254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymervoid _init(void) 1941254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer{ 195181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt xtables_register_match(&physdev_match); 196181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt xtables_register_match(&physdev_match6); 1971254871c88483cc1a0adc448a83cab6a9d4510a1Bart De Schuymer} 198