The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Проблема с USNNET в ядре 2.6.32 под arm"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Портирование)
Изначальное сообщение [ Отслеживать ]

"Проблема с USNNET в ядре 2.6.32 под arm"  +/
Сообщение от dassinion email(ok) on 21-Окт-11, 17:23 
Привет всем.
Для начала немного истории:

Мне захотелось портировать linux под свой телефон Glofiish x500+
В просторах интернета были найдены несколько проектов, которые занимались портированием линукса, и патчили ядро для работы с процессором s3c2442 под armv4t.
http://gnufiish.org/trac/wiki/X500
Этот проект добился больших успехов, ядро с патчем запускается и загружает систему. По USB можно создать сеть и подключиться для работы в шеле. Но проект уже заморожен и версия ядра в репозитории - 2.6.29.
Я долго игрался и этим ядром, но потом мне захотелось ядро поновее с новыми драйверами.
Я нашел проект: mini2440, который также патчил ядро для процессора s3c2442, но в его репозитории git://repo.or.cz/linux-2.6/mini2440.git
было более новое ядро 2.6.32-rc8.
Я взялся его патчить, перенес все патчи на новое ядро, исправил некоторые появившиеся баги, и в итоге также смог запустить это ядро на своем телефоне. Ядро прогружается на телефоне и выполняет /init.

А теперь проблема.
С ядром 2.6.29 я мог загрузиться, поднять сеть и подключиться к телефону.
Детально про ядро:
Linux version 2.6.29-X500_master-mokodev (root@localhost) (gcc version 4.4.3 (GCC) ) #40 PREEMPT Sun Oct 9 09:09:10 MSK 2011
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177


С ядром 2.6.32 я не могу подключиться к телефону.
Ядро:
Linux version 2.6.32-rc8-mokodev (root@localhost) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) ) #21 PREEMPT Thu Oct 20 19:49:12 MSD 2011
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177

После старта /init скрипт поднимает сетевые интерфейсы (USNNET собран в ядре),
для интерфейса usb0 задается подсеть (192.168.0.202) и маска(255.255.255.0).
Проверяю что все поднялось, ifconfig -a на телефоне:

usb0      Link encap:Ethernet  HWaddr C6:63:93:87:4C:FC
          inet addr:192.168.0.202  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  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:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Внутренние интерфейсы (lo и сам usb0) пингуются нормально, пакеты возвращаются корректные.
Но когда я пытаюсь пинговать телефон, ICMP пакеты не возвращаются.
а tcpdump показывает только:
tcpdump -l -n -i usb0  -vv
tcpdump: listening on usb0, link-type EN10MB (Ethernet), capture size 96 bytes
17:34:19.781787 arp who-has 192.168.0.202 tell 192.168.0.200
17:34:20.783787 arp who-has 192.168.0.202 tell 192.168.0.200
17:34:21.785768 arp who-has 192.168.0.202 tell 192.168.0.200
Ошибок при этом нет никаких ни на телефоне в dmesg, ни на локальном компьютере.

Для локализации проблемы я выполнил следующее:
В скрипт на телефоне, который запускается после загрузки ядра я добавил стоку
ping 192.168.0.200
а на локальном компьютере на интерфейсе usb0 поднимаю сеть (192.168.0.200 netmask 255.255.255.0) и вешаю на него tcpdupm чтобы посмотреть, приходят ли мне ICMP пакеты от телефона.
И в итоге я получил вот что:

tcpdump -i usb0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on usb0, link-type EN10MB (Ethernet), capture size 96 bytes
19:17:35.921404 ff:ff:16:5d:9c:3c (oui Unknown) > 2e:40:ff:ff:ff:ff (oui Unknown), ethertype Unknown (0x774a), length 48:
        0x0000:  0806 0001 0800 0604 0001 165d 9c3c 774a  ...........].<wJ
        0x0010:  c0a8 00ca 0000 0000 0000 c0a8 00c8 dead  ................
        0x0020:  beef                                     ..
19:17:36.920445 ff:ff:16:5d:9c:3c (oui Unknown) > 2e:40:ff:ff:ff:ff (oui Unknown), ethertype Unknown (0x774a), length 48:
        0x0000:  0806 0001 0800 0604 0001 165d 9c3c 774a  ...........].<wJ
        0x0010:  c0a8 00ca 0000 0000 0000 c0a8 00c8 dead  ................
        0x0020:  beef                                     ..

После перезагрузки телефона и повторения процедуры строки немного меняются:
tcpdump -i usb0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on usb0, link-type EN10MB (Ethernet), capture size 96 bytes
19:51:02.479062 ff:ff:c6:63:93:87 (oui Unknown) > 2e:40:ff:ff:ff:ff (oui Unknown), ethertype Unknown (0x4cfc), length 48:
        0x0000:  0806 0001 0800 0604 0001 c663 9387 4cfc  ...........c..L.
        0x0010:  c0a8 00ca 0000 0000 0000 c0a8 00c8 dead  ................
        0x0020:  beef                                     ..
19:51:03.480324 ff:ff:c6:63:93:87 (oui Unknown) > 2e:40:ff:ff:ff:ff (oui Unknown), ethertype Unknown (0x4cfc), length 48:
        0x0000:  0806 0001 0800 0604 0001 c663 9387 4cfc  ...........c..L.
        0x0010:  c0a8 00ca 0000 0000 0000 c0a8 00c8 dead  ................
        0x0020:  beef

Вопрос:
Где искать корни проблемы?
Я понимаю, что проблема может быть где угодно, но из-за маленького опыта работы с ядром я не знаю с чего начать поиск.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Проблема с USNNET в ядре 2.6.32 под arm"  +/
Сообщение от тень_pavel_simple on 22-Окт-11, 16:17 
>[оверквотинг удален]
> Внутренние интерфейсы (lo и сам usb0) пингуются нормально, пакеты возвращаются корректные.
> Но когда я пытаюсь пинговать телефон, ICMP пакеты не возвращаются.
> а tcpdump показывает только:
> tcpdump -l -n -i usb0  -vv
> tcpdump: listening on usb0, link-type EN10MB (Ethernet), capture size 96 bytes
> 17:34:19.781787 arp who-has 192.168.0.202 tell 192.168.0.200
> 17:34:20.783787 arp who-has 192.168.0.202 tell 192.168.0.200
> 17:34:21.785768 arp who-has 192.168.0.202 tell 192.168.0.200
> Ошибок при этом нет никаких ни на телефоне в dmesg, ни на
> локальном компьютере.

это от того что машина не может определить mac адрес, водимо из-за того что ниже видно что пакеты возвращаются битыми в стёк.

1. прописать ститическую arp запись
2. посмотреть какие пакеты будут приходить


>[оверквотинг удален]
> Unknown (0x4cfc), length 48:
>         0x0000:  0806 0001
> 0800 0604 0001 c663 9387 4cfc  ...........c..L.
>         0x0010:  c0a8 00ca
> 0000 0000 0000 c0a8 00c8 dead  ................
>         0x0020:  beef
> Вопрос:
> Где искать корни проблемы?
> Я понимаю, что проблема может быть где угодно, но из-за маленького опыта
> работы с ядром я не знаю с чего начать поиск.

проблемы искать учитывая отсутствие эмулятора с помощью ping'а см. опции -p , но судя по всему проблема с размещением пакета в памяти, смотреть в районе передача dev -> sk_buff. dead beef'же

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Проблема с USNNET в ядре 2.6.32 под arm"  +/
Сообщение от dassinion (ok) on 24-Окт-11, 00:04 
> проблемы искать учитывая отсутствие эмулятора с помощью ping'а см. опции -p ,
> но судя по всему проблема с размещением пакета в памяти, смотреть
> в районе передача dev -> sk_buff. dead beef'же

Огромное спасибо за подсказку. Проблема разрешилась.
Установка статических MAC адресов не помогла, ICMP пакеты также приходили неверными.

Далее я решил отыскать файлы в ядре, где добавлялись магические символы "deadbeef" к ICMP пакету. Этим файлом оказался drivers/usb/gadget/f_eem.c
Он отсутствовал в более раннем ядре версии 2.6.29
После небольшого изучения файла я понял что он эмулирует "CDC mode".
Далее я в конфиге ядра просто отключил опцию CONFIG_USB_ETH_EEM
и после пересборки ядра все стало работать корректно.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру