Jump to content

Recommended Posts

Posted

Доброго времени суток, уважаемые форумчане.

Задался целью собрать 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.

Posted (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 by tokra
Posted (edited)

Кстати, интересует вопрос, будут ли дружить iptables и ipfw на одной машине?

Будут и отлично, только сам наблюдал и не раз слышал что работа NAT от iptables при работающем ipfw ведет себя не совсем корректно.

Например делаю НАТ для 1 айпишника - работает, включаю для второго - обламываются оба. Выгружаю модуль ipfw - все работает.

Но это было еще в версиях 2010 года, возможно в новых излечили. Хотя я писал об этом Марте и она говорила что все должно работать.

Edited by Zohan
Posted

Кстати, интересует вопрос, будут ли дружить iptables и ipfw на одной машине?

Будут и отлично, только сам наблюдал и не раз слышал что работа NAT от iptables при работающем ipfw ведет себя не совсем корректно.

Например делаю НАТ для 1 айпишника - работает, включаю для второго - обламываются оба. Выгружаю модуль ipfw - все работает.

Но это было еще в версиях 2010 года, возможно в новых излечили. Хотя я писал об этом Марте и она говорила что все должно работать.

Спасибо за помощь. Нат не критичен, можно и на отдельную машину вынести:)

Posted

Кстати, у нас dummynet for Linux работает уже почти год в продакшене на разных ядрах: 2.6.32, 2.6.35, теперь и на 2.6.38.

Вы собирали ванильное ядро или из репов ubuntu ставили?

Кстати, как в продакшене себя ведет dummynet? Вы используете таблицы?

В tc построения правил с использованием хеш таблиц - просто вынос мозга, в dummynet, на первый взгляд, все намного проще:)

Posted (edited)

Ядра из репов. Но кажется пробовал собирать на ванильных ядрах, но из репа http://kernel.ubuntu.com/~kernel-ppa/mainline/

Если ядро не из стандартного для обновления репа для Убунты, то нужны исходники ядра и компилить: make KERNELPATH=...

Да, используем tablearg с хешами. Ведет себя более чем нормально.

Edited by Zohan
Posted

Если ядро не из стандартного для обновления репа для Убунты, то нужны исходники ядра и компилить: make KERNELPATH=...

В том-то и дело, что так и собирал

make KERNELPATH=/usr/srv/linux

linux - симлинк на /usr/srv/linux-2.6.39

 

Пробовал и указывать реальную папку - результат тот же.

Может это мое "еврейское счастье" или я не все заклинания знаю :)))

  • 2 months later...
Posted

Для ядер 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

  • 7 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.