Jump to content
Sign in to follow this  
jakushev

Проблема поднять SLIP соединение

Recommended Posts

Встала у меня на половину академическая задача изучения и написания стека протоколов TCP/IP для микроконтроллера. Пока неохота ковырятся с железом (долго и для начала нет смысла), решил промоделировать все на компьютере. Для этого создал простенький стенд: В машине под Федорой 13 установлена PCI платка с 2 COM портами, перепаянными 3х проводным нуль-модемом. Устройства /dev/ttyS1 и /dev/ttyS2. К устройствам применяю chmod, дабы из под простого пользователя работать можно было. Проверяю 2мя терминалами, на аппаратном уровне все работает, данные передаются. Далее пытаюсь поднять SLIP на ttyS1. Для этого делаю следующие под рутом:

slattach -L -p slip -s 115200 /dev/ttyS1 &

Вроде как пролетает устпешно (и при запуске не в фоне ошибок нет), устройство sl0 создается. Пытаюсь его сконфигурировать:

ifconfig sl0 192.168.0.10 pointopoint 192.168.0.20 up

Все тоже без ошибок, в листе ifconfig появляется устройство sl0 с настроенными параметрами.

Команда ping -с1 192.168.0.20, соответственно, возвращает 100% потерю пакетов, но при этом на слушающем (/dev/ttyS2) терминале глухо, как в танке... Вызов ifconfig показывает, что на sl0 устройстве происходит попытка передачи (параметр TX Byte увиличивается с каждым пингом на 84).

Уже перебрал все варианты, route пытался настроить. Результат 0.

Люди, помогите! Где засада? Я уже ядро подозревать стал:(

Share this post


Link to post
Share on other sites

Попробуйте запустить slattach на отдельном терминале в режиме отладки. Похоже, ядро отдает ему пакеты.

Share this post


Link to post
Share on other sites

Попробовал. Странная ситуация. slattach прогружается в дебаге и встает как вкопанный:

[1]+ Stopped man slattach

[root@mainpc all]# slattach -d -L -p slip -s 115200 /dev/ttyS1

slattach: tty_open: looking for lock

slattach: tty_open: trying to open /dev/ttyS1

slattach: tty_open: /dev/ttyS1 (fd=3) slattach: tty_set_speed: 115200

slattach: tty_set_databits: 8

slattach: tty_set_stopbits: 1

slattach: tty_set_parity: N

slip started on /dev/ttyS1 interface sl0

Далее конфигурю сеть:

[root@mainpc all]# ifconfig sl0 192.168.0.10 pointopoint 192.168.0.20 up

и пытаюсь пропинговать:

[root@mainpc all]# ping -c3 192.168.0.20

PING 192.168.0.20 (192.168.0.20) 56(84) bytes of data.

--- 192.168.0.20 ping statistics ---

3 packets transmitted, 0 received, 100% packet loss, time 11999ms

И тут начинается интересная вещичка. После того, как ping отработал, просматриваю состояние сети. Количество переданных данных по sl0 увеличиваются в течении нескольких секунд, достигая 252 (как раз передача 3х пинговых пакетов). К тому же появляется ошибка ядра:

Package: kernel

Latest Crash: Вск 29 Авг 2010 17:53:31

Command: not_applicable

Reason: WARNING: at net/sched/sch_generic.c:255 dev_watchdog+0xf0/0x192()

Comment: None

Bug Reports:

что наталкивает меня на проблему с ядром. Может кто подскажет, как посмотреть, скомпилированно ли ядро с модулем SLIP. В Федоре сырцы ядра не загружены, только каталоги и служебная информация. Команда make menuconfig выполняется. И, вроде как, SLIP скомпилирован как модуль. Надо ли его подключать вручную, или он автоматом грузится?

Share this post


Link to post
Share on other sites

Попробовал подгрузить модуль slip до slattach

modprobe slip

Все загрузилось, lsmod отображает его.

После выполнения slattach счетчик использования модуля увеличился на 1. Вроде, все как положенно. Но, все равно, конфигурю сеть, пингую 1 пакетом. Гдето через минуту появляется ошибка ядра:(

Share this post


Link to post
Share on other sites

Цитата:

Может кто подскажет, как посмотреть, скомпилированно ли ядро с модулем SLIP

grep SLIP /boot/config-`uname -r`

У меня тоже 13, скомпилен как модуль.

Share this post


Link to post
Share on other sites

С модулем я разобрался. Нормально подгружается по необходимости и заранее вручную. И процесс его подхватывает. Ядро сейчас текущее 2.6.33.8. Попробовал на медиацентре, там 12 Федора стоит. Ядро 2.6.31.5 Никаких ошибок аналогичные действия не вызывают. Правда, порт наружу не выведен и всего один. Надо за паяльник браться и проводами запасаться. Жалко, что осциллоскопа в наличии дома сейчас нет. Проще было бы проверить... Уважаемый AccessD, если Вам не сложно, не могли бы Вы проверить на совей системе последовательность, вызывающую ошибку:

slattach -L -p slip -s 115200 /dev/ttyS0 &

ifconfig sl0 192.168.0.10 pointopoint 192.168.0.20 up

ping -c4 192.168.0.20

Ошибка ядра появляется где то через минуту после пинга...

От ttySx и IP адресов это не зависит. Заранее благодарен.

Share this post


Link to post
Share on other sites

Спасибо. Подозрение у меня на ядро. Буду нового ждать. Или, если получится, в виртуалке попробую что нибудь поднять... Так провода пока не протянул от другого компа.

Share this post


Link to post
Share on other sites

А что в dmesg по поводу slip'а говорится? Я такую схему когда поднимал между Debian Etch(если не ошибаюсь, там было ядро 2.6.18) и Slackware 12.1(версию ядра не помню, но там стандартное было - не самосборное). Поэтому очень странно, по-моему, что сейчас из-за ядра что-то может не работать.

У себя попробовал просто поднять интерфейс(к сожалению, кабеля нульмодемного нет под рукой, поэтому пинга проверить не могу, но выглядит всё так, будто поднялось без проблем). Никаких ошибок. Сейчас пробовал на Debian Lenny(2.6.26-2-686, slip модулем).

Share this post


Link to post
Share on other sites

После slattach -L -p slip -s 9600 /dev/ttyS1 &

Ядро:

SLIP: version 0.8.4-NET3.019-NEWTTY (dynamic channels, max=256).

CSLIP: code copyright 1989 Regents of the University of California.

SLIP linefill/keepalive option.

Далее поднимаю sl0:

ifconfig sl0 192.168.0.10 pointopoint 192.168.0.20 up

ifconfig sl0

sl0 Link encap:Serial Line IP

inet addr:192.168.0.10 P-t-P:192.168.0.20 Mask:255.255.255.255

UP POINTOPOINT RUNNING NOARP MULTICAST MTU:296 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:10

RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

Вроде все нормально...

Далее пингую:

ping -c3 192.168.0.20

PING 192.168.0.20 (192.168.0.20) 56(84) bytes of data.

--- 192.168.0.20 ping statistics ---

3 packets transmitted, 0 received, 100% packet loss, time 11999ms

Понятно, что ничего нет в ответ, так как /dev/ttyS2 у меня на терминале. Но и на терминале ничего не вижу.

Пока идет пинг, по таймауту вылезают следующие сообщения ядра:

[root@mainpc all]# dmesg | tail -n 11

[<ffffffff814529f0>] smp_apic_timer_interrupt+0x8d/0x9b

[<ffffffff8100a613>] apic_timer_interrupt+0x13/0x20

<EOI> [<ffffffff8102a615>] ? native_safe_halt+0xb/0xd

[<ffffffff810115a5>] default_idle+0x36/0x53

[<ffffffff810116bd>] c1e_idle+0xfb/0x102

[<ffffffff81008c22>] cpu_idle+0xaa/0xe4

[<ffffffff8144597e>] start_secondary+0x253/0x294

---[ end trace 976e326b52916c58 ]---

sl0: transmit timed out, bad line quality?

sl0: transmit timed out, bad line quality?

sl0: transmit timed out, bad line quality?

apic отключать, думаю, плохая идея. Многоядерная конфигурация. Но, ща попробую. Порты работают. между двумя терминалами связь есть.

Если я правильно понимаю, ядро должно "обрамить" IP пакет в SLIP пакет и передать на нужный порт.

Платка с портами следующая: 03:06.0 Serial controller: NetMos Technology PCI 9835 Multi-I/O Controller (rev 01)

При работе с портом на материнке, ситуация аналогичная...

Share this post


Link to post
Share on other sites

Извиняюсь, не все сообщения послал. Попробовал noapic, микросхема портов подцепилась на 5 прерывание, терминалы нормально работают. И ошибка никуда не делась:(

SLIP: version 0.8.4-NET3.019-NEWTTY (dynamic channels, max=256).

CSLIP: code copyright 1989 Regents of the University of California.

SLIP linefill/keepalive option.

------------[ cut here ]------------

WARNING: at net/sched/sch_generic.c:256 dev_watchdog+0xf5/0x197()

Hardware name: GA-MA74GM-S2

NETDEV WATCHDOG: sl0 (): transmit queue 0 timed out

Modules linked in: slip slhc fuse ebtable_nat ebtables ipt_MASQUERADE iptable_nat nf_nat bridge stp llc sunrpc xt_physdev ip6t_REJECT nf_conntrack_ipv6 ip6table_filter ip6_tables ipv6 vboxnetadp vboxnetflt vboxdrv kvm_amd kvm uinput r8169 ppdev mii edac_core edac_mce_amd k10temp parport_pc shpchp parport microcode i2c_piix4 pata_acpi ata_generic pata_atiixp radeon ttm drm_kms_helper drm i2c_algo_bit i2c_core [last unloaded: freq_table]

Pid: 0, comm: swapper Not tainted 2.6.34.6-47.fc13.x86_64 #1

Call Trace:

<IRQ> [<ffffffff8104d12f>] warn_slowpath_common+0x7c/0x94

[<ffffffff8104d19e>] warn_slowpath_fmt+0x41/0x43

[<ffffffff813ba06f>] ? netif_tx_lock+0x44/0x6d

[<ffffffff813ba18d>] dev_watchdog+0xf5/0x197

[<ffffffff8106b22d>] ? sched_clock_local+0x1c/0x82

[<ffffffff8105920c>] ? internal_add_timer+0xcf/0xd1

[<ffffffff810592db>] ? cascade+0x6a/0x86

[<ffffffff810594b6>] run_timer_softirq+0x1bf/0x263

[<ffffffff8106e3d7>] ? ktime_get+0x65/0xbe

[<ffffffff81053265>] __do_softirq+0xe5/0x1a6

[<ffffffff810726b0>] ? tick_program_event+0x2a/0x2c

[<ffffffff8100ab5c>] call_softirq+0x1c/0x30

[<ffffffff8100c342>] do_softirq+0x46/0x83

[<ffffffff810530d6>] irq_exit+0x3b/0x7d

[<ffffffff814529f0>] smp_apic_timer_interrupt+0x8d/0x9b

[<ffffffff8100a613>] apic_timer_interrupt+0x13/0x20

<EOI> [<ffffffff8102a615>] ? native_safe_halt+0xb/0xd

[<ffffffff810115a5>] default_idle+0x36/0x53

[<ffffffff810116bd>] c1e_idle+0xfb/0x102

[<ffffffff81008c22>] cpu_idle+0xaa/0xe4

[<ffffffff8144597e>] start_secondary+0x253/0x294

---[ end trace c6c9eb803300da35 ]---

sl0: transmit timed out, bad line quality?

sl0: transmit timed out, bad line quality?

sl0: transmit timed out, bad line quality?

Share this post


Link to post
Share on other sites

jakushev писал(а) Mon, 06 September 2010 19:31

Если я правильно понимаю, ядро должно "обрамить" IP пакет в SLIP пакет и передать на нужный порт.

ция аналогичная...

Не совсем. В случае виртуального интерфейса, как я понимаю, ядро должно передать пакет не в сеть, а программе slattach, запущенной в режимк даемона (для отладки можно и на консоли). А она обрамляет и передает в порт /dev/ttyS..., т.е. снова ядру, а то в физический сериал порт.

По делу. Очень похоже, что дело действительно в ядре. Попробуйте в своем дистрибутиве установить несколько ядер, в том числе и стабильное от редхат (сентос) и грузить по очереди. Скорее всего они уже есть в репозитории. Если нет, это легко сделать вручную.

Share this post


Link to post
Share on other sites

Сейчас проверил на Федоре 12 на другом компьютере, там ядро 2.6.31.5. Тоже самое. Может быть есть возможность перенаправить slattach в файл, чтоб отделить зерна от плевил? Сейчас попробую, но не думаю, что это получится...

Share this post


Link to post
Share on other sites

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.

Loading...
Sign in to follow this  

×
×
  • Create New...