Не получается передать много данных в модуль ядра iptables через расширение для iptables.
Модуль назвал iptable (таблица ip адресов) для фильтрации перебором. На входе имя файла списка IP c флагами SRC или DST
Ошибка при добавлении правила: dmesg: x_tables: ip_tables: iptable.1 match: invalid size 135176 (kernel) != (user) 4104
В модуле ядра объявлено:
struct xt_iptable_mtinfo {
__u8 iptable0[0x10000];
__u8 flags;
};
описано как:
static struct xt_match iptable_mt4_reg[] __read_mostly = {
{
.name = "iptable",
.revision = 1,
.family = NFPROTO_IPV4,
.match = iptable_mt4,
.matchsize = sizeof(struct xt_iptable_mtinfo),
.me = THIS_MODULE,
},
};
Дальше расширение для iptables
libxt_iptables.c Повторное описание структуры:
struct ipt_iptable_info {
__u8 iptable0[0x10000];
/* Flags from above */
__u8 flags;
};
static const struct xt_option_entry iptable_mt_opts[] =
{
{.name = "src-maskfile", .id = O_SRC_MASK, .type = XTTYPE_STRING, .flags = XTOPT_INVERT},
{.name = "dst-maskfile", .id = O_DST_MASK, .type = XTTYPE_STRING, .flags = XTOPT_INVERT},
XTOPT_TABLEEND,
};
Описано:
static struct xtables_match iptable_mt_reg[] = {
{
.next = NULL,
.version = XTABLES_VERSION,
.name = "iptable",
.revision = 1,
.family = NFPROTO_UNSPEC,
.size = XT_ALIGN(sizeof(struct ipt_iptable_info)),
.userspacesize = XT_ALIGN(sizeof(struct ipt_iptable_info)),
.help = iptable_help,
.print = iptable_print,
.parse = iptable_parse,
.save = iptable_save,
.x6_options = iptable_mt_opts,
.final_check = iptable_mt_check,
},
};
Зарегано:
xtables_register_matches(iptable_mt_reg, ARRAY_SIZE(iptable_mt_reg));
Почему то ядро хочет больший размер конфигурации, а iptables выдает мало. Как будто обрезает структуру при работе с libiptc.
Возможно связано с ограничениями системных вызовов или чем то другим. Может кто сталкивался с написанием match - ей.