Я пытаюсь использовать dhclient для получения IP-адреса от модуля сотового модема LTE, а dhclient не распознает входящие ответы DHCP.
Этимодули отображаются как интерфейс wwan0 в Linux.Это похоже на обычный интерфейс Ethernet, однако, поскольку они являются двухточечными интерфейсами, они не связываются с MAC-адресами и используют формат фрейма link-raw.
Это означает, что нет 14-байтового заголовка Ethernet , и у них установлен флаг NOARP :
wwan0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet6 addr: fe80::619f:fc5a:2124:a16a/64 Scope:Link
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:101 errors:0 dropped:0 overruns:0 frame:0
TX packets:155 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
dhclient требуется незначительное исправление, чтобы справиться с интерфейсами NOARP,но затем он отправит действительный DHCP REQUEST
и введет select()
для ожидания ответа.
DHCP OFFER
возвращается из модуля LTE, но select()
никогда не возвращается.Время истекло, и я не могу понять, почему.Вот что я узнал до сих пор:
- не имеет значения, компилирую ли я dhclient с возможностью использования
select()
или epoll()
, оба ведут себя одинаково.
Вот tcpdump типичного запроса / ответа DHCP:
$ sudo /usr/sbin/tcpdump -nXXs 1600 -vv -i wwan0
tcpdump: listening on wwan0, link-type RAW (Raw IP), capture size 1600 bytes
10:49:54.532975 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request, length 300, htype 254, hlen 0, xid 0x72731a0f, Flags [none] (0x0000)
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Discover
Parameter-Request Option 55, length 9:
Subnet-Mask, BR, Time-Zone, Default-Gateway
Domain-Name, Domain-Name-Server, Hostname, Netbios-Name-Server
Netbios-Scope
0x0000: 4510 0148 0000 0000 8011 3996 0000 0000 E..H......9.....
0x0010: ffff ffff 0044 0043 0134 2813 01fe 0000 .....D.C.4(.....
0x0020: 7273 1a0f 0000 0000 0000 0000 0000 0000 rs..............
0x0030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
[... all zeros ...]
0x00f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0100: 0000 0000 0000 0000 6382 5363 3501 0137 ........c.Sc5..7
0x0110: 0901 1c02 030f 060c 2c2f ff00 0000 0000 ........,/......
0x0120: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0130: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0140: 0000 0000 0000 0000 ........
10:49:54.540519 IP (tos 0x0, ttl 255, id 178, offset 0, flags [none], proto UDP (17), length 306)
10.176.3.160.67 > 10.176.3.159.68: [udp sum ok] BOOTP/DHCP, Reply, length 278, htype 254, hlen 0, xid 0x72731a0f, Flags [none] (0x0000)
Your-IP 10.176.3.159
Server-IP 10.176.3.160
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Offer
Subnet-Mask Option 1, length 4: 255.255.255.192
Default-Gateway Option 3, length 4: 10.176.3.160
Domain-Name-Server Option 6, length 8: 199.7.156.169,199.7.156.168
Lease-Time Option 51, length 4: 7200
Server-ID Option 54, length 4: 10.176.3.160
0x0000: 4500 0132 00b2 0000 ff11 9d6a 0ab0 03a0 E..2.......j....
0x0010: 0ab0 039f 0043 0044 011e 4a14 02fe 0000 .....C.D..J.....
0x0020: 7273 1a0f 0000 0000 0000 0000 0ab0 039f rs..............
0x0030: 0ab0 03a0 0000 0000 0000 0000 0000 0000 ................
0x0040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
[... all zeros ...]
0x00f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
0x0100: 0000 0000 0000 0000 6382 5363 3501 0201 ........c.Sc5...
0x0110: 04ff ffff c003 040a b003 a006 08c7 079c ................
0x0120: a9c7 079c a833 0400 001c 2036 040a b003 .....3.....6....
0x0130: a0ff ..
Есть ли у кого-нибудь идеи, почему select()
/ epoll()
не подхватитDHCP ответ?Это потому, что нет ни MAC-адреса, ни IP-адреса, который он может использовать для сопоставления входящих кадров?ИМХО не удовлетворительное объяснение, учитывая, что сокет связан с IP 0.0.0.0
.
Если это имеет значение, эти модули LTE являются USB-устройствами.Они используют фреймворк usbnet и драйвер qmi-wwan.
Ниже приведен фрагмент кода ftrace, который показывает, что входящий пакет обрабатывается qmi_wwan_rx_fixup()
, но впоследствии выдает ошибки в ip_route_input_rcu()
.Есть идеи?
0) | irq_exit() {
0) | __do_softirq() {
0) | tasklet_action() {
0) | usbnet_bh() {
0) | skb_dequeue() {
0) 0.539 us | _raw_spin_lock_irqsave();
0) 0.461 us | _raw_spin_unlock_irqrestore();
0) 7.077 us | }
0) 1.000 us | qmi_wwan_rx_fixup();
0) | usbnet_skb_return() {
0) 0.615 us | skb_defer_rx_timestamp();
0) | netif_rx() {
0) | netif_rx_internal() {
0) | enqueue_to_backlog() {
0) 0.615 us | _raw_spin_lock();
0) 0.539 us | __raise_softirq_irqoff();
0) 8.615 us | }
0) + 12.077 us | }
0) + 15.307 us | }
0) + 22.923 us | }
0) | skb_dequeue() {
0) 0.462 us | _raw_spin_lock_irqsave();
0) 0.538 us | _raw_spin_unlock_irqrestore();
0) 7.154 us | }
0) 0.846 us | netif_tx_wake_queue();
0) + 55.847 us | }
0) + 60.231 us | }
0) 0.770 us | rcu_bh_qs();
0) | net_rx_action() {
0) 0.616 us | __usecs_to_jiffies();
0) | process_backlog() {
0) 0.462 us | _raw_spin_lock();
0) | __netif_receive_skb() {
0) | __netif_receive_skb_core() {
0) | packet_rcv() {
0) | run_filter() {
0) | __bpf_prog_run32() {
0) 3.000 us | ___bpf_prog_run();
0) 6.308 us | }
0) + 10.616 us | }
0) 1.077 us | consume_skb();
0) + 19.000 us | }
0) | ip_rcv() {
0) | nf_hook_slow() {
0) 0.846 us | ipv4_conntrack_defrag();
0) | iptable_raw_hook() {
0) | ipt_do_table() {
0) 1.308 us | udp_mt();
0) 0.538 us | __local_bh_enable_ip();
0) + 19.692 us | }
0) + 23.307 us | }
0) | ipv4_conntrack_in() {
[...]
0) ! 126.384 us | }
0) | iptable_mangle_hook() {
0) | ipt_do_table() {
0) 0.384 us | __local_bh_enable_ip();
0) 5.385 us | }
0) 8.769 us | }
0) | iptable_nat_ipv4_in() {
[...]
0) + 80.539 us | }
0) ! 255.923 us | }
0) | ip_rcv_finish() {
0) | udp_v4_early_demux() {
0) 0.615 us | udp4_portaddr_hash();
0) 4.693 us | }
0) | ip_route_input_noref() {
0) | ip_route_input_rcu() {
0) 0.615 us | make_kuid();
0) | __fib_lookup() {
0) | l3mdev_update_flow() {
0) 0.615 us | dev_get_by_index_rcu();
0) 0.462 us | l3mdev_master_ifindex_rcu();
0) 7.077 us | }
0) | fib_rules_lookup() {
[...]
0) + 51.769 us | }
0) + 64.769 us | }
0) | rt_dst_alloc() {
0) | dst_alloc() {
0) 0.615 us | kmem_cache_alloc();
0) 1.462 us | dst_init();
0) 8.461 us | }
0) + 12.384 us | }
0) + 89.153 us | }
0) + 92.538 us | }
0) | ip_error() {
0) 0.615 us | __local_bh_enable_ip();
0) 0.462 us | l3mdev_master_ifindex_rcu();
0) | inet_getpeer() {
0) 2.384 us | lookup();
0) 6.230 us | }
0) 0.615 us | inet_putpeer();
0) | icmp_send() {
[...]
0) ! 457.462 us | }
0) | kfree_skb() {