tokra Posted May 27, 2011 Posted May 27, 2011 Доброго времени суток, уважаемые форумчане. Задался целью собрать dummynet под Linux. В качестве системы используется ubuntu 11.04 с ванильным ядром 2.6.39 uname -a Linux user-System 2.6.39-vanilla #1 SMP Thu May 26 17:14:51 EEST 2011 i686 i686 i386 GNU/Linux dummynet брал здесь, а именно Source code and tools, 20100319. Заголовки ядра и исходники установлены, все делаю по инструкции из README. Через какое-то время после запуска make вываливается ошибка make echo target is all target is all (cd ipfw && make all ) make[1]: Вход в каталог `/home/user/install/ipfw3/ipfw' Makefile:9: Building userland ipfw for Linux echo "Done build for Linux VER " Done build for Linux VER make[1]: Выход из каталога `/home/user/install/ipfw3/ipfw' (cd dummynet2 && make all ) make[1]: Вход в каталог `/home/user/install/ipfw3/dummynet2' Makefile:30: including dummynet/Makefile Makefile:63: "---- Building dummynet kernel module for Version 2.6" Makefile:257: "---- Building Version 2.6 2.6 in /lib/modules/`uname -r`/build" make -C /lib/modules/`uname -r`/build V=1 M=`pwd` modules make[2]: Вход в каталог `/usr/src/linux-2.6.39' test -e include/generated/autoconf.h -a -e include/config/auto.conf || ( \ echo; \ echo " ERROR: Kernel configuration is invalid."; \ echo " include/generated/autoconf.h or include/config/auto.conf are missing.";\ echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; \ echo; \ /bin/false) mkdir -p /home/user/install/ipfw3/dummynet2/.tmp_versions ; rm -f /home/user/install/ipfw3/dummynet2/.tmp_versions/* make -f scripts/Makefile.build obj=/home/user/install/ipfw3/dummynet2 /home/user/install/ipfw3/dummynet2/Makefile:30: including dummynet/Makefile /home/user/install/ipfw3/dummynet2/Makefile:63: "---- Building dummynet kernel module for Version 2.6" /home/user/install/ipfw3/dummynet2/Makefile:257: "---- Building Version 2.6 2.6 in /lib/modules/`uname -r`/build" gcc -Wp,-MD,/home/user/install/ipfw3/dummynet2/.ip_fw2.o.d -nostdinc -isystem /usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/include -I/usr/src/linux-2.6.39/arch/x86/include -Iinclude -include include/generated/autoconf.h -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i686 -mtune=core2 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -g -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -DCC_HAVE_ASM_GOTO -O1 -Wall -Werror -DDEBUG_SPINLOCK -DDEBUG_MUTEXES -DIPFIREWALL_DEFAULT_TO_ACCEPT -D_BSD_SOURCE -DKERNEL_MODULE -I /home/user/install/ipfw3/dummynet2/include_e -I /home/user/install/ipfw3/dummynet2/include -include /home/user/install/ipfw3/dummynet2/../glue.h -include /home/user/install/ipfw3/dummynet2/missing.h -g -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(ip_fw2)" -D"KBUILD_MODNAME=KBUILD_STR(ipfw_mod)" -c -o /home/user/install/ipfw3/dummynet2/.tmp_ip_fw2.o /home/user/install/ipfw3/dummynet2/ip_fw2.c In file included from /home/user/install/ipfw3/dummynet2/include/netinet/tcp_var.h:3:0, from /home/user/install/ipfw3/dummynet2/ip_fw2.c:79: /home/user/install/ipfw3/dummynet2/include/netinet/tcp.h:51:8: error: redefinition of ‘struct tcphdr’ include/linux/tcp.h:24:8: note: originally defined here cc1: warnings being treated as errors /home/user/install/ipfw3/dummynet2/include/netinet/tcp.h:147:0: error: "TCP_NODELAY" redefined include/linux/tcp.h:91:0: note: this is the location of the previous definition /home/user/install/ipfw3/dummynet2/include/netinet/tcp.h:149:0: error: "TCP_MAXSEG" redefined include/linux/tcp.h:92:0: note: this is the location of the previous definition /home/user/install/ipfw3/dummynet2/include/netinet/tcp.h:152:0: error: "TCP_MD5SIG" redefined include/linux/tcp.h:104:0: note: this is the location of the previous definition /home/user/install/ipfw3/dummynet2/include/netinet/tcp.h:153:0: error: "TCP_INFO" redefined include/linux/tcp.h:101:0: note: this is the location of the previous definition /home/user/install/ipfw3/dummynet2/include/netinet/tcp.h:154:0: error: "TCP_CONGESTION" redefined include/linux/tcp.h:103:0: note: this is the location of the previous definition /home/user/install/ipfw3/dummynet2/include/netinet/tcp.h:158:0: error: "TCPI_OPT_TIMESTAMPS" redefined include/linux/tcp.h:111:0: note: this is the location of the previous definition /home/user/install/ipfw3/dummynet2/include/netinet/tcp.h:159:0: error: "TCPI_OPT_SACK" redefined include/linux/tcp.h:112:0: note: this is the location of the previous definition /home/user/install/ipfw3/dummynet2/include/netinet/tcp.h:160:0: error: "TCPI_OPT_WSCALE" redefined include/linux/tcp.h:113:0: note: this is the location of the previous definition /home/user/install/ipfw3/dummynet2/include/netinet/tcp.h:161:0: error: "TCPI_OPT_ECN" redefined include/linux/tcp.h:114:0: note: this is the location of the previous definition /home/user/install/ipfw3/dummynet2/include/netinet/tcp.h:176:8: error: redefinition of ‘struct tcp_info’ include/linux/tcp.h:129:8: note: originally defined here In file included from /home/user/install/ipfw3/dummynet2/ip_fw2.c:80:0: /home/user/install/ipfw3/dummynet2/include/netinet/udp.h:41:8: error: redefinition of ‘struct udphdr’ include/linux/udp.h:22:8: note: originally defined here /home/user/install/ipfw3/dummynet2/ip_fw2.c: In function ‘ipfw_chk’: /home/user/install/ipfw3/dummynet2/ip_fw2.c:1902:6: error: passing argument 3 of ‘ipfw_lookup_dyn_rule’ from incompatible pointer type /home/user/install/ipfw3/dummynet2/include/netinet/ipfw/ip_fw_private.h:184:16: note: expected ‘struct tcphdr *’ but argument is of type ‘struct tcphdr *’ make[3]: *** [/home/user/install/ipfw3/dummynet2/ip_fw2.o] Ошибка 1 make[2]: *** [_module_/home/user/install/ipfw3/dummynet2] Ошибка 2 make[2]: Выход из каталога `/usr/src/linux-2.6.39' make[1]: *** [all] Ошибка 2 make[1]: Выход из каталога `/home/user/install/ipfw3/dummynet2' make: *** [all] Ошибка 2 Настораживает вот эта часть test -e include/generated/autoconf.h -a -e include/config/auto.conf || ( \ echo; \ echo " ERROR: Kernel configuration is invalid."; \ echo " include/generated/autoconf.h or include/config/auto.conf are missing.";\ echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; \ echo; \ /bin/false) По указанным путям файлы autoconf.h и auto.conf присутствуют. Делал и "make oldconfig && make prepare" результат тот же. Подскажите где я накосячил, буду рад любой подсказке. Не хочется ради одного dummynet ставить freebsd. Вставить ник Quote
tokra Posted May 27, 2011 Author Posted May 27, 2011 Использовать make bindist Та же история... Вставить ник Quote
Zohan Posted May 28, 2011 Posted May 28, 2011 (edited) Новые версии у Марты http://info.iet.unipi.it/~marta/dummynet/ В частности последняя, у меня на 11.04 отлично работает http://info.iet.unipi.it/~marta/dummynet/ipfw3-20110510.tar.gz не используй старье Edited May 28, 2011 by Zohan Вставить ник Quote
tokra Posted May 28, 2011 Author Posted May 28, 2011 (edited) Новые версии у Марты http://info.iet.unipi.it/~marta/dummynet/ В частности последняя, у меня на 11.04 отлично работает http://info.iet.unipi.it/~marta/dummynet/ipfw3-20110510.tar.gz не используй старье Спасибо. ipfw3-20110510 собралось, но только на родном ядре, на ванильном собираться не захотело. Но все равное спасибо. Буду крутить. Кстати, интересует вопрос, будут ли дружить iptables и ipfw на одной машине? Edited May 28, 2011 by tokra Вставить ник Quote
Zohan Posted May 28, 2011 Posted May 28, 2011 (edited) Кстати, интересует вопрос, будут ли дружить iptables и ipfw на одной машине? Будут и отлично, только сам наблюдал и не раз слышал что работа NAT от iptables при работающем ipfw ведет себя не совсем корректно. Например делаю НАТ для 1 айпишника - работает, включаю для второго - обламываются оба. Выгружаю модуль ipfw - все работает. Но это было еще в версиях 2010 года, возможно в новых излечили. Хотя я писал об этом Марте и она говорила что все должно работать. Edited May 28, 2011 by Zohan Вставить ник Quote
tokra Posted May 28, 2011 Author Posted May 28, 2011 Кстати, интересует вопрос, будут ли дружить iptables и ipfw на одной машине? Будут и отлично, только сам наблюдал и не раз слышал что работа NAT от iptables при работающем ipfw ведет себя не совсем корректно. Например делаю НАТ для 1 айпишника - работает, включаю для второго - обламываются оба. Выгружаю модуль ipfw - все работает. Но это было еще в версиях 2010 года, возможно в новых излечили. Хотя я писал об этом Марте и она говорила что все должно работать. Спасибо за помощь. Нат не критичен, можно и на отдельную машину вынести:) Вставить ник Quote
Zohan Posted May 28, 2011 Posted May 28, 2011 Кстати, у нас dummynet for Linux работает уже почти год в продакшене на разных ядрах: 2.6.32, 2.6.35, теперь и на 2.6.38. Вставить ник Quote
tokra Posted May 28, 2011 Author Posted May 28, 2011 Кстати, у нас dummynet for Linux работает уже почти год в продакшене на разных ядрах: 2.6.32, 2.6.35, теперь и на 2.6.38. Вы собирали ванильное ядро или из репов ubuntu ставили? Кстати, как в продакшене себя ведет dummynet? Вы используете таблицы? В tc построения правил с использованием хеш таблиц - просто вынос мозга, в dummynet, на первый взгляд, все намного проще:) Вставить ник Quote
Zohan Posted May 28, 2011 Posted May 28, 2011 (edited) Ядра из репов. Но кажется пробовал собирать на ванильных ядрах, но из репа http://kernel.ubuntu.com/~kernel-ppa/mainline/ Если ядро не из стандартного для обновления репа для Убунты, то нужны исходники ядра и компилить: make KERNELPATH=... Да, используем tablearg с хешами. Ведет себя более чем нормально. Edited May 28, 2011 by Zohan Вставить ник Quote
tokra Posted May 29, 2011 Author Posted May 29, 2011 Если ядро не из стандартного для обновления репа для Убунты, то нужны исходники ядра и компилить: make KERNELPATH=... В том-то и дело, что так и собирал make KERNELPATH=/usr/srv/linux linux - симлинк на /usr/srv/linux-2.6.39 Пробовал и указывать реальную папку - результат тот же. Может это мое "еврейское счастье" или я не все заклинания знаю :))) Вставить ник Quote
aran Posted July 30, 2011 Posted July 30, 2011 Для ядер 2.6.39+ не собиралось. По 2-м причинам: 1.В dummynet2/Makefile есть строки: ipfw-cflags += -I $(M)/include_e ipfw-cflags += -I $(M)/include А в linux/Documentation/kbuild/modules.txt сказано: ccflags-y := -Iinclude Note that in the assignment there is no space between -I and the path. This is a limitation of kbuild: there must be no space present. 2. Начиная с ядра 2.6.39 изменены некоторые системные структуры и прототипы функций, используемые в dummynet2/ipfw2_mod.c. Вот патч, устраняющий вышеописанные проблемы. Тестировал на ядрах 2.6.39 и 3.0.0. На более ранних тоже должно работать (не проверял). --- dummynet2/Makefile 2011-05-10 21:31:05.000000000 +0300 +++ dummynet2/Makefile 2011-07-25 09:47:29.000000000 +0300 @@ -56,8 +56,8 @@ ipfw-cflags += -D_BSD_SOURCE ipfw-cflags += -DKERNEL_MODULE # build linux kernel module # the two header trees for empty and override files -ipfw-cflags += -I $(M)/include_e -ipfw-cflags += -I $(M)/include +ipfw-cflags += -I$(M)/include_e +ipfw-cflags += -I$(M)/include ipfw-cflags += -include $(M)/../glue.h # headers ipfw-cflags += -include $(M)/missing.h # headers --- dummynet2/ipfw2_mod.c 2011-05-10 21:31:05.000000000 +0300 +++ dummynet2/ipfw2_mod.c 2011-07-24 15:14:12.000000000 +0300 @@ -255,7 +255,9 @@ /* used to lookup the routing table */ struct rtable *r; struct flowi fl; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,39) int ret; +#endif struct ip *ip = mtod(m, struct ip *); @@ -269,19 +271,29 @@ /* fill flowi struct, we need just the dst addr, see XXX */ bzero(&fl, sizeof(fl)); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,39) fl.nl_u.ip4_u.daddr = ip->ip_dst.s_addr; +#else + fl.u.ip4.daddr = ip->ip_dst.s_addr; +#endif /* * ip_route_output_key() should increment * r->u.dst.__use and call a dst_hold(dst) * XXX verify how we release the resources. */ -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22) /* check boundary */ +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,22) /* check boundary */ + ret = ip_route_output_key(&r, &fl); + if (ret != 0 || r == NULL ) { +#else +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,39) ret = ip_route_output_key(&init_net, &r, &fl); + if (ret != 0 || r == NULL ) { #else - ret = ip_route_output_key(&r, &fl); + r = ip_route_output_key(&init_net, &fl.u.ip4); + if ( r == NULL ) { +#endif #endif - if (ret != 0 || r == NULL ) { printf("NO ROUTE FOUND\n"); return NULL; } Могу дать src.rpm для opensuse, в котором применяется этот патч, и, кроме того производится интеграция с DKMS для автоматической пересборки и инсталляции ipfw.mod при загрузке нового ядра. Собирался и тестировался под openSuSE 11.4 на ядрах 2.6.39 и 3.0.0 Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.