Не собирается модуль ядра IPOE под MIPS

Compilation and installation questions and stories
Post Reply
feanor
Posts: 7
Joined: 18 Nov 2015, 07:09

Не собирается модуль ядра IPOE под MIPS

Post by feanor »

Собираем accel под ubiquity edgerouter lite. Там mips архитектура.
Под MIPS вообще сложно собраться, но в целом сам аксель собрался и запустился нормально. Остановились на сборке модуля ядра для ipoe.

Code: Select all

скачали ядро https://www.ubnt.com/download/edgemax/edgerouter-lite/erlite3/er-e100v1414648309tar
распаковали, выполнили make oldconfig && make prepare && make scripts
взяли git clone git://git.code.sf.net/p/accel-ppp/code accel-ppp-code
выполнили
# cmake -DCMAKE_BUILD_TYPE=Release -DLOG_PGSQL=FALSE -DSHAPER=TRUE -DRADIUS=TRUE -DNETSNMP=FALSE -DLIB_SUFFIX="" -DBUILD_IPOE_DRIVER=TRUE -DLUA=TRUE -DCMAKE_INSTALL_PREFIX=/usr
# make ipoe_drv
[100%] Generating driver/ipoe.ko

  WARNING: Symbol version dump /usr/src/kernel/Module.symvers
           is missing; modules will have no dependencies and modversions.

[100%] Built target ipoe_drv

# ls -l drivers/ipoe/driver/
total 0
lrwxrwxrwx 1 root root 47 Nov 18 14:28 CMakeFiles -> /usr/src/accel-ppp-code/drivers/ipoe/CMakeFiles
lrwxrwxrwx 1 root root 51 Nov 18 14:28 CMakeLists.txt -> /usr/src/accel-ppp-code/drivers/ipoe/CMakeLists.txt
lrwxrwxrwx 1 root root 45 Nov 18 14:28 Makefile -> /usr/src/accel-ppp-code/drivers/ipoe/Makefile
-rw-r--r-- 1 root root  0 Nov 18 14:28 Module.symvers
lrwxrwxrwx 1 root root 56 Nov 18 14:28 cmake_install.cmake -> /usr/src/accel-ppp-code/drivers/ipoe/cmake_install.cmake
lrwxrwxrwx 1 root root 43 Nov 18 14:28 driver -> /usr/src/accel-ppp-code/drivers/ipoe/driver
lrwxrwxrwx 1 root root 43 Nov 18 14:28 ipoe.c -> /usr/src/accel-ppp-code/drivers/ipoe/ipoe.c
lrwxrwxrwx 1 root root 43 Nov 18 14:28 ipoe.h -> /usr/src/accel-ppp-code/drivers/ipoe/ipoe.h
-rw-r--r-- 1 root root  0 Nov 18 14:28 modules.order
Очень странное поведение, в выводе говорит что все ок, собрался, но в папках с драйером ничего нет, куда копать - идеи кончились.
Dmitry
Администратор
Posts: 954
Joined: 09 Oct 2014, 10:06

Re: Не собирается модуль ядра IPOE под MIPS

Post by Dmitry »

писалось неоднократно, собирать нужно в отдельном от исходников каталоге
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLOG_PGSQL=FALSE -DSHAPER=TRUE -DRADIUS=TRUE -DNETSNMP=FALSE -DLIB_SUFFIX="" -DBUILD_IPOE_DRIVER=TRUE -DLUA=TRUE -DCMAKE_INSTALL_PREFIX=/usr ..
make
feanor
Posts: 7
Joined: 18 Nov 2015, 07:09

Re: Не собирается модуль ядра IPOE под MIPS

Post by feanor »

Dmitry wrote:писалось неоднократно, собирать нужно в отдельном от исходников каталоге
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLOG_PGSQL=FALSE -DSHAPER=TRUE -DRADIUS=TRUE -DNETSNMP=FALSE -DLIB_SUFFIX="" -DBUILD_IPOE_DRIVER=TRUE -DLUA=TRUE -DCMAKE_INSTALL_PREFIX=/usr ..
make
Угу, все получилось, спасибо за наводку.
Мы так тоже пробовали (в отдельной папке), но т.к. делали сборку не на чистых исходниках - ничего не происходило. Видимо мозги отключились после настройки сборочного окружения для mips. Собирали аксель в deb пакет, поэтому сборка самого акселя делалась dpkg билдом, а как туда прикрутить сборку в отдельной папке - пока не придумали.
feanor
Posts: 7
Joined: 18 Nov 2015, 07:09

Re: Не собирается модуль ядра IPOE под MIPS

Post by feanor »

Вобщем с модулем ядра не заработало. Видимо, нужна еще раз ваша подсказка.
В логах только одна строчка
[2015-11-20 11:12:38.338] ipoe: start interface eth1 (giaddr=10.128.0.1)
Что отсылает нас к коду:

Code: Select all

accel-ppp-code/accel-pppd/main.c
        if (triton_load_modules("modules"))
                return EXIT_FAILURE;

        log_msg("accel-ppp version %s\n", ACCEL_PPP_VERSION);

        triton_run();
Если бы модули не загрузились - вылетел бы с ошибкой, если бы загрузились - написал версию.
Проверили вот так

Code: Select all

accel-ppp-code/accel-pppd/ctrl/ipoe/ipoe.c
static void ipoe_init(void)
{
...
        connlimit_loaded = triton_module_loaded("connlimit");
        radius_loaded = triton_module_loaded("radius");
        log_debug("test");
}
В лог тест записал.

В логах strace видно, что не может прочитать ответ из сокета.
strace -e trace=network /usr/sbin/accel-pppd -c /etc/accel-ppp/accel-ppp.conf
socket(PF_PACKET, SOCK_DGRAM, 0) = 10
setsockopt(10, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
bind(10, {sa_family=AF_PACKET, proto=0x806, if0, pkttype=PACKET_HOST, addr(0)={0, }, 20) = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 11
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 12
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 14
setsockopt(14, SOL_SOCKET, SO_REUSEADDR, [14], 4) = 0
bind(14, {sa_family=AF_INET, sin_port=htons(2000), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
listen(14, 1) = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 15
setsockopt(15, SOL_SOCKET, SO_REUSEADDR, [15], 4) = 0
bind(15, {sa_family=AF_INET, sin_port=htons(2001), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
listen(15, 1) = 0
socket(PF_NETLINK, SOCK_RAW, 16) = 16
setsockopt(16, SOL_SOCKET, SO_SNDBUF, [32768], 4) = 0
setsockopt(16, SOL_SOCKET, SO_RCVBUF, [1048576], 4) = 0
bind(16, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(16, {sa_family=AF_NETLINK, pid=31833, groups=00000000}, [12]) = 0
sendmsg(16, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\0\0\0 \0\20\0\5VO\4\r\0\0\0\0\3\0\0\0\0\t\0\2IPoE\0\0\0\0", 32}], msg_controllen=0, msg_flags=0}, 0) = 32
recvmsg(16, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\0\0\1x\0\20\0\0VO\4\r\0\0|Y\1\2\0\0\0\t\0\2IPoE\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 376
socket(PF_NETLINK, SOCK_RAW, 16) = 16
setsockopt(16, SOL_SOCKET, SO_SNDBUF, [32768], 4) = 0
setsockopt(16, SOL_SOCKET, SO_RCVBUF, [1048576], 4) = 0
bind(16, {sa_family=AF_NETLINK, pid=0, groups=00000001}, 12) = 0
getsockname(16, {sa_family=AF_NETLINK, pid=31833, groups=00000001}, [12]) = 0
socket(PF_NETLINK, SOCK_RAW, 16) = 17
setsockopt(17, SOL_SOCKET, SO_SNDBUF, [32768], 4) = 0
setsockopt(17, SOL_SOCKET, SO_RCVBUF, [1048576], 4) = 0
bind(17, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(17, {sa_family=AF_NETLINK, pid=-4139, groups=00000000}, [12]) = 0
sendmsg(17, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\0\0\0\34\0\0\0\5VO\4\r\0\0\1\0\17\377\220\24\0\10\0\1\0\0\0\0", 28}], msg_controllen=0, msg_flags=0}, 0) = 28
recvmsg(17, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\0\0\0$\0\2\0\0VO\4\r\377\377\357\325\0\0\0\0\0\0\0\34\0\0\0\5VO\4\r"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 36
sendmsg(16, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\0\0\0\34\0\0\0\5VO\4\r\0D\312\214\10\0\0\0\0\10\0\6\377\377\377\377", 28}], msg_controllen=0, msg_flags=0}, 0) = 28
recvmsg(16, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\0\0\0$\0\2\0\0VO\4\r\0\0|Y\0\0\0\0\0\0\0\34\0\0\0\5VO\4\r"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 36
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 17
setsockopt(17, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
setsockopt(17, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
setsockopt(17, SOL_SOCKET, SO_NO_CHECK, [1], 4) = 0
bind(17, {sa_family=AF_INET, sin_port=htons(67), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
setsockopt(17, SOL_SOCKET, SO_BINDTODEVICE, [1702127665], 4) = 0
sendmsg(16, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\0\0\0\34\0\0\0\5VO\4\16\0D\272}\6\0\0\0\0\10\0\1\0\0\0\0", 28}], msg_controllen=0, msg_flags=0}, 0) = 28
recvmsg(16, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\0\0\0$\0\2\0\0VO\4\16\0\0|Y\0\0\0\0\0\0\0\34\0\0\0\5VO\4\16"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 36
sendmsg(16, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\0\0\0\34\0\0\0\5VO\4\17\0\0\0\0\v\0\0\0\0\10\0\6\377\377\377\377", 28}], msg_controllen=0, msg_flags=0}, 0) = 28
recvmsg(16, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\0\0\0$\0\2\0\0VO\4\17\0\0|Y\0\0\0\0\0\0\0\34\0\0\0\5VO\4\17"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 36
send(16, "\0\0\0\24\0\0\3\1VO\4\20\0\0\0\0\4\0\0\0", 20, 0) = 20
recvmsg(16, 0x7f7c6194, 0) = -1 EAGAIN (Resource temporarily unavailable)
и далее recvmsg с аналогичной ошибкой
Как я понимаю это проверка общения модуля ipoe с модулем ядра - отправить сообщение, получить ответ и проверить что это ответ типа ОК
В исходниках вызов этот похоже в ./accel-pppd/libnetlink/libnetlink.c в функции rtnl_send_check, но ее вызов самой этой функции не нашел, может и другой конечно, strace на x86 в этом месте дает не send(int,buf,int,int) а sendto(int,buf,int,int,NULL,0), может в коде это sendmsg и искать стоит в другом месте, но пока что дебаг встал на этом месте, будем продолжать в понедельник. Думаю с вашими комментариями будет легче.
Dmitry
Администратор
Posts: 954
Joined: 09 Oct 2014, 10:06

Re: Не собирается модуль ядра IPOE под MIPS

Post by Dmitry »

тут дело в чём-то другом
надо зайти отладчиком и посмотреть где виснет
feanor
Posts: 7
Joined: 18 Nov 2015, 07:09

Re: Не собирается модуль ядра IPOE под MIPS

Post by feanor »

Dmitry wrote:тут дело в чём-то другом
надо зайти отладчиком и посмотреть где виснет
(gdb) backtrace
#0 0x77f78ae8 in recvmsg () from /lib/mips-linux-gnu/libpthread.so.0
#1 0x0041d624 in rtnl_dump_filter_l ()
#2 0x0041d93c in rtnl_dump_filter ()
#3 0x77af4138 in ipoe_nl_get_sessions () from /usr/lib/accel-ppp/libipoe.so
#4 0x77af4604 in init () from /usr/lib/accel-ppp/libipoe.so
#5 0x77fafa08 in triton_load_modules () from /usr/lib/accel-ppp/libtriton.so
#6 0x00403c74 in main ()
Dmitry
Администратор
Posts: 954
Joined: 09 Oct 2014, 10:06

Re: Не собирается модуль ядра IPOE под MIPS

Post by Dmitry »

ssh можно сделать ?
напиши в icq 337258064 или жабу dima@accel-ppp.org
feanor
Posts: 7
Joined: 18 Nov 2015, 07:09

Re: Не собирается модуль ядра IPOE под MIPS

Post by feanor »

Dmitry wrote:ssh можно сделать ?
напиши в icq 337258064 или жабу dima@accel-ppp.org
Дмитрий вчера сделал коммит с фиксом, за что ему спасибо большое. Аксель в итоге запустился, но возникла проблема с выдачей айпишника по dhcp.
Ошибку нашли и исправили грязным хаком.
Проблема c байтордером - у нас там литлэндиан, поэтому 53 опция (тип ответа) в пакете dhcp длиной в 1 байт выставлялась в первый байт 4 байтового инта, в котором были нули (Т.е. на discover мы должны были ответить offer со значением 02, но отвечали 00, т.к. у нас 2 это 0x00000002)
Вот наш грязный хак, Дмитрий, я думаю вы придумаете как это лучше сделать.

Code: Select all

git diff accel-pppd/ctrl/ipoe/dhcpv4.c
diff --git a/accel-pppd/ctrl/ipoe/dhcpv4.c b/accel-pppd/ctrl/ipoe/dhcpv4.c
index 94d3917..4243931 100644
--- a/accel-pppd/ctrl/ipoe/dhcpv4.c
+++ b/accel-pppd/ctrl/ipoe/dhcpv4.c
@@ -683,6 +683,8 @@ int dhcpv4_packet_add_opt(struct dhcpv4_packet *pack, int type, const void *data
        pack->ptr += len;

        memcpy(opt->data, data, len);
+       if (type == 53)
+               memcpy(opt->data, data+3, len);

        list_add_tail(&opt->entry, &pack->options);
В итоге сейчас сессии создаются, айпишники назначаются, но трафика не было. Завелось с конфигом proxy-arp = 1
Dmitry
Администратор
Posts: 954
Joined: 09 Oct 2014, 10:06

Re: Не собирается модуль ядра IPOE под MIPS

Post by Dmitry »

commit 2f8813816fe1180bf712d7ec022ab7c2b315bdb7
Post Reply