iptables выдает ошибку ввода/вывода

Я пытаюсь заставить iptables-1.4.3.2 работать с Linux-2.6.35.9 на нашей платформе на основе MIPS. Выданная команда

iptables -t mangle -A POSTROUTING -p udp -j <TC name> --map tos

iptables завершает работу с ошибкой ввода/вывода (эта же команда работала в Linux-2.6.28.8). Затем сделал то же самое для нашей цели и увидел проблему, как показано ниже:

socket(PF_INET, SOCK_RAW, IPPROTO_RAW)  = 3
getsockopt(3, SOL_IP, 0x40 /* IP_??? */, "mangle\0\0\0\0\0\34\200F\0\0\200\1\340   \244\200\1\340\244\200\7W\224\200\7W\f\0"..., [84]) = 0
getsockopt(3, SOL_IP, 0x41 /* IP_??? */, "mangle\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., [976]) = 0
setsockopt(3, SOL_IP, 0x40 /* IP_??? */, "mangle\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1240) = -1 EIO (Input/output error)
close(3)                                = 0
write(2, "iptables: "..., 10iptables: )           = 10
write(2, "Input/output error"..., 18Input/output error)   = 18
write(2, ".\n"..., 2.
)                   = 2
munmap(0x2ab9b000, 75264)               = 0
exit(1)                                

Приведенный выше код находится в libiptc.c; Любые предложения по дальнейшей отладке ошибки будут полезны. Спасибо.


person lxusr    schedule 27.12.2011    source источник


Ответы (2)


EIO означает, что ваш пользовательский целевой модуль «TC» (или что вы под этим подразумеваете), то есть xt_TC.c, не соответствует API. checkentry не должен возвращать значения больше нуля (им не присваивается значение) в 2.6.35 и выше.

person jørgensen    schedule 18.01.2012

Кажется, проблема решается путем изменения следующих строк в linux-2.6.35/net/netfilter/x_tables.c.

функция xt_check_match: изменены следующие строки:

if (par->match->checkentry != NULL) { ret = par->match->checkentry(par); if (ret < 0) return ret; else if (ret > 0) { /* Flag up potential errors. */ return -EIO; } }

to :

if (par->match->checkentry != NULL && !par->match->checkentry(par)) return -EINVAL;

Аналогично в функции xt_check_target: изменены строки из:

if (par->target->checkentry != NULL) { ret = par->target->checkentry(par); if (ret < 0) return ret; else if (ret > 0) { /* Flag up potential errors. */ return -EIO; } }

to:

if (par->target->checkentry != NULL && !par->target->checkentry(par)) return -EINVAL;

Это были проверки, присутствующие в предыдущих ядрах. наличие тех же проверок решает вышеуказанную проблему. Спасибо.

person lxusr    schedule 28.12.2011