Перестала работать команда pppoe interface add (1.12.0, master)

Bug reports
s.lobanov
Posts: 29
Joined: 11 Oct 2014, 08:28
Contact:

Перестала работать команда pppoe interface add (1.12.0, master)

Post by s.lobanov »

Конфиг:
Спойлер
[modules]
log_file
pppoe
auth_pap
ippool
[core]
log-error=/var/log/accel-ppp/core.log
thread-count=4
[ppp]
verbose=1
min-mtu=1280
mtu=1400
mru=1400
ipv4=require
ipv6=deny
ipv6-intf-id=0:0:0:1
ipv6-peer-intf-id=0:0:0:2
ipv6-accept-peer-intf-id=1
lcp-echo-interval=20
lcp-echo-timeout=120
unit-cache=1
[auth]
any-login=1
noauth=1
[pppoe]
verbose=1
interface=enp0s3
[ip-pool]
gw-ip-address=192.168.0.1
192.168.0.2-255
[log]
log-file=/var/log/accel-ppp/accel-ppp.log
log-emerg=/var/log/accel-ppp/emerg.log
log-fail-file=/var/log/accel-ppp/auth-fail.log
log-debug=/dev/stdout
copy=1
level=5
[cli]
verbose=1
telnet=127.0.0.1:2000
tcp=127.0.0.1:2001
На версии из master (commit a4fe1168dda707a2836f6d74c7a6610645b20152) и версии 1.12.0 при попытке выполнить команду "accel-cmd pppoe interface add veth0" команда выполянется, но при этом интерфейс не добавляется, в выводе "accel-cmd pppoe interface show" по-прежнему один интерфейс из конфига (enp0s3)

В версии 1.11.2 команда работает нормально (интерфейс добавляется, трафик на нём начинает приниматься).

Логи, которые появляются при попытке добавить интерфейс в версии a4fe1168dda707a2836f6d74c7a6610645b20152:

Code: Select all

[2019-11-10 23:20:44.203] cli: tcp: new connection from 127.0.0.1
[2019-11-10 23:20:44.211] accel-ppp version a4fe1168dda707a2836f6d74c7a6610645b20152
[2019-11-10 23:20:44.212] open ns (null)
[2019-11-10 23:20:44.216] failed to load vlan_mon module
[2019-11-10 23:20:44.221] libnetlink: RTNETLINK answers: No such file or directory
[2019-11-10 23:20:44.221] genl: error talking to kernel
[2019-11-10 23:20:44.221] vlan_mon: kernel module is not loaded
Особенность - не появляется сообщение "cli: disconnect", которое обычное появляется при выполнении команд через CLI.

veth-интерфейсы создавал так: "ip link add veth0 type veth peer name veth1"
вывод ip l:

Code: Select all

# ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:e9:4a:f7 brd ff:ff:ff:ff:ff:ff
3: veth1@veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 62:8d:5b:0d:65:d6 brd ff:ff:ff:ff:ff:ff
4: veth0@veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 6a:c9:39:be:b7:13 brd ff:ff:ff:ff:ff:ff
ОС и ядро:

Code: Select all

# cat /etc/debian_version 
10.1
# uname -a
Linux deb10 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u1 (2019-09-20) x86_64 GNU/Linux
Если прописать "interface=veth0" сразу в конфиг, то версии a4fe1168dda707a2836f6d74c7a6610645b20152 и 1.12.0 работают с ним (используют для приёма pppoe-трафика, показывают его в "pppoe interface show"

Пробовал на более старых ядрах и ОС (debian7, kernel 3.2) - тоже самое, на 1.11.2 работает динамическое добавление pppoe-интерфейса на лету, на 1.12.0 и выше - нет
s.lobanov
Posts: 29
Joined: 11 Oct 2014, 08:28
Contact:

Re: Перестала работать команда pppoe interface add (1.12.0, master)

Post by s.lobanov »

Если добавлять "нормальные" интерфейсы (не veth), а обычные (например, enp0s8), то тоже самое - не добавляется на лету в версиях 1.12.0+
s.lobanov
Posts: 29
Joined: 11 Oct 2014, 08:28
Contact:

Re: Перестала работать команда pppoe interface add (1.12.0, master)

Post by s.lobanov »

Немного подебажил.

Суть проблемы в следующем. Когда интерфейсы добавляются из конфига, вызывается функция load_interfaces, которая выполняется в основной ните (thread) и работает нормально, а когда добавляю интерфейс через accel-cmd, то вызывается pppoe_server_start в другой нити и там она падает в segfault на функции def_sock_ioctl потому что не инициализирована переменная net:

вывод с добавленными дебагами при добавлении через accel-cmd:

Code: Select all

[2019-11-12 01:14:05.649] __pppoe_server_start opt=enp0s1 ifname=enp0s1 parent_ifindex=-1 vid=0 vlan_mon=0 cli=139695421922096
[2019-11-12 01:14:05.649] __pppoe_server_start net=94744890911328
[2019-11-12 01:14:05.649] __pppoe_server_start ifr.ifr_name= ifname=enp0s1 sizeof=16
[2019-11-12 01:14:05.649] __pppoe_server_start ifr.ifr_name=enp0s1 ifname=enp0s1 sizeof=16
def_sock_ioctl getpid: [b]31870[/b] getpthread_self: 139695543158528 tid:[b]31877[/b]
[2019-11-12 01:14:05.649] def_sock_ioctl n=0
[2019-11-12 01:14:05.649] def_sock_ioctl net=0
[2019-11-12 01:14:05.649] def_sock_ioctl request=35091
[2019-11-12 01:14:05.649] def_sock_ioctl arg=139695543154688
Segmentation fault (core dumped)
А вот что происходит когда делается тоже самое через load_interfaces:

Code: Select all

[2019-11-12 01:13:49.662] __pppoe_server_start opt=enp0s3 ifname=enp0s3 parent_ifindex=-1 vid=0 vlan_mon=0 cli=0
[2019-11-12 01:13:49.663] __pppoe_server_start net=94744890911328
[2019-11-12 01:13:49.663] __pppoe_server_start ifr.ifr_name= ifname=enp0s3 sizeof=16
[2019-11-12 01:13:49.664] __pppoe_server_start ifr.ifr_name=enp0s3 ifname=enp0s3 sizeof=16
def_sock_ioctl getpid: [b]31870[/b] getpthread_self: 139695560226944 tid:[b]31870[/b]
[2019-11-12 01:13:49.664] def_sock_ioctl n=94744890911328
[2019-11-12 01:13:49.664] def_sock_ioctl net=94744890911328
[2019-11-12 01:13:49.664] def_sock_ioctl request=35091
[2019-11-12 01:13:49.664] def_sock_ioctl arg=140736547172464

Если добавить такой костыль в начало def_sock_ioctl:

Code: Select all

        if(!net)
            net = def_net;
То динамическое добавление интерфейса начинает работать, но судя по всему это является полноценным решением
dimka88
Posts: 861
Joined: 13 Oct 2014, 05:51
Contact:

Re: Перестала работать команда pppoe interface add (1.12.0, master)

Post by dimka88 »

Не получается воспроизвести на Debian9. Это же вы на Debian 7 пробовали?
s.lobanov
Posts: 29
Joined: 11 Oct 2014, 08:28
Contact:

Re: Перестала работать команда pppoe interface add (1.12.0, master)

Post by s.lobanov »

dimka88 wrote: 12 Nov 2019, 16:14 Не получается воспроизвести на Debian9. Это же вы на Debian 7 пробовали?
Проблема воспроизводится на debian7, 8, 10 (воспроизводил в virtualbox)
s.lobanov
Posts: 29
Joined: 11 Oct 2014, 08:28
Contact:

Re: Перестала работать команда pppoe interface add (1.12.0, master)

Post by s.lobanov »

Предложенный пользователем @themiron патч (в аттаче) никак не помог (потому что функции pppoe_conn_ctx_switch и pppoe_serv_ctx_switch не вызываются при операции добавления eth-интерфейса для pppoe-подключений)
Attachments
git-20191112-113043_PczOnN.diff.gz
(536 Bytes) Downloaded 218 times
s.lobanov
Posts: 29
Joined: 11 Oct 2014, 08:28
Contact:

Re: Перестала работать команда pppoe interface add (1.12.0, master)

Post by s.lobanov »

Вычислил коммит в master, который ломает команду accel-cmd pppoe interface add ethXXX:

Code: Select all

commit e0cca4344f70b9c9e23e3c6a7e17c8e93c765184
Author: Dmitry Kozlov <xeb@mail.ru>
Date:   Mon Jul 11 09:47:04 2016 +0300

    implemented support for network namespace
    ...
На предыдущем коммите в мастере (6fb04941ca41312909208938bfac4f753d3c277c = 1.11.0 relase) команда работает отлично

Не очень понятно что с этим делать, в этом коммите очень сильно переделан net.c под netns'ы. простой реверт тут явно не подходит ибо это одна из основных фиче 1.12+ версий
dimka88
Posts: 861
Joined: 13 Oct 2014, 05:51
Contact:

Re: Перестала работать команда pppoe interface add (1.12.0, master)

Post by dimka88 »

accel-ppp был собран без поддержки vlan-mon? Мне необходимо воспроизвести данное поведение на стенде, буду признателен за подробности в сборке.
s.lobanov
Posts: 29
Joined: 11 Oct 2014, 08:28
Contact:

Re: Перестала работать команда pppoe interface add (1.12.0, master)

Post by s.lobanov »

dimka88 wrote: 12 Nov 2019, 21:59 accel-ppp был собран без поддержки vlan-mon? Мне необходимо воспроизвести данное поведение на стенде, буду признателен за подробности в сборке.
Вот как собиралось (проверялось debian 10 (также и на других версиях debian (7,8,9)):
git clone https://github.com/xebd/accel-ppp.git
cd accel-ppp
mkdir build
cmake -DBUILD_DRIVER=FALSE -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug -DLOG_PGSQL=FALSE -DSHAPER=TRUE -DRADIUS=TRUE -DNETSNMP=TRUE -DCMAKE_C_FLAGS_DEBUG='-g' -DBUILD_IPOE_DRIVER=FALSE -DBUILD_VLAN_MON_DRIVER=FALSE .
make
make install

Запуск:
accel-pppd -c /etc/accel-ppp.conf --no-sigsegv &
конфиг в первом посте (только interface= надо заменить на реально существующий в системе)

Далее выполняем команду accel-cmd pppoe interface add xxxx (где xxxx - любой другой ethernet/veth-интерфейс, на самом деле вместо xxxx можно что угодно написать) и после этого accel-pppd падает в segfault в функции def_sock_ioctl
s.lobanov
Posts: 29
Joined: 11 Oct 2014, 08:28
Contact:

Re: Перестала работать команда pppoe interface add (1.12.0, master)

Post by s.lobanov »

dimka88 wrote: 12 Nov 2019, 16:14 Не получается воспроизвести на Debian9. Это же вы на Debian 7 пробовали?
получилось в итоге воспроизвести?
Post Reply