PDA

View Full Version : проблема с udhcpc


AndrewN
25-02-2008, 00:10
С какого-то момента udhcpc перестал выставлять IP адрес. Попробывал уже все. Не могу понять в чем дело. Запускал в ручную с параметром -s <свой скрипт>: udhcpc выдает leasefail.
Смотрю в tcpdump - провадеровский сервер адрес выдает.

tcpdump:

04:10:13.365399 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], length: 576) 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 00:0c:6e:38:42:81, length: 548, xid:0xf31a165d, secs:3, flags: [none] (0x0000)
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:DISCOVER
CID:[ether]00:0c:6e:38:42:81
PR:SM+DG+NS+HN+DN+BR+SR+YD+YS+NTP+T249
04:10:13.369404 IP (tos 0x0, ttl 63, id 39006, offset 0, flags [DF], length: 578) 10.6.1.1.67 > 10.6.4.106.68: [udp sum ok] BOOTP/DHCP, Reply, length: 550, hops:2, xid:0xf31a165d, secs:3, flags: [none] (0x0000)
Your IP: 10.6.4.106
Gateway IP: 10.6.1.1
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:OFFER
SID:10.100.0.11
LT:54000
SM:255.255.240.0
DG:10.6.1.1
NS:10.100.0.11
DN:"psk-net.ru"


Где грабли?

AndrewN
25-02-2008, 00:41
UP чтоли!!!

AndrewN
25-02-2008, 01:02
Неужели вернулась старая болячка?

# 0.9.7 (020526)
# Use add_lease in read_leases, sanitizes leases more, and clears out exprired ones if there is no more room (me)
# Moved udhcpd.leases to /var/lib/misc/udhcpd.leases (Debian bug #147747)
# Change (obsolete) AF_INET in arping.c to PF_PACKET (Debian bug #127049)
# Added script hook for DHCPNAK (nak), as well as providing the message option (me)
# Generate the paramaters request list by seeing what options in options.c are ored with OPTION_REQ in options.c
# Fix dhcp renew forgetfullness on client (bug #1230)
# Fix dhcp release bug on client (bug #1231)
# Set option request list for DHCP renew (bug #1233)
# Set BOOTREQUEST/REPLY properly
# Change client-identifier field to popularly expected behavior (me)
# Only reopen port on errors (me)
# Change fork/close/setsid structures to daemon() (me)
# Allow user to specify udhcpd config file at run time (Steven, me)
# Write pidfile after changing it (Steven CTR Carr)
# Added env var docs to udhcpc man page (Matt)
# Standardized lowercase udhcp in documentation (me)
# Accept packets without a UDP checksum (me)
# Accept packets with extra garbage (me)
# Better error handling in files.c (me)
# Combined read_interface function to reduce COMBINED_BINARY size (me)
# Drop calc_length(), some servers choke on smaller packets (me)
# Try to clean some fat out (me)

avk
25-02-2008, 01:04
А вот это ягодки не одного ли поля?
Вопрос к спецам по WL-500G Premium (http://wl500g.info/showthread.php?t=84710&p=84710)

AndrewN
25-02-2008, 07:01
А вот это ягодки не одного ли поля?
Вопрос к спецам по WL-500G Premium (http://wl500g.info/showthread.php?t=84710&p=84710)
К сожалению, нет. У меня нет VPN.

Oleg
25-02-2008, 07:09
10.6.1.1.67 > 10.6.4.106.68

Где грабли?

С какого перепою они шлют ответ 10.6.4.106, если адрес ещё не присвоен?

AndrewN
25-02-2008, 07:16
С какого перепою они шлют ответ 10.6.4.106, если адрес ещё не присвоен?

Так шлют, то они его по правильному маку. И с опцией -r адрес не подбирает.

Oleg
25-02-2008, 07:19
Значит дело в чём-то другом. DN тут никаким боком.

AndrewN
25-02-2008, 07:21
Значит дело в чём-то другом. DN тут никаким боком.

В ответах сервера есть ещё T249. Я так понимаю это маршруты?

Oleg
25-02-2008, 07:22
Да, маршруты.

Oleg
25-02-2008, 07:23
Только в ответах я их не вижу. В запросе вижу.

AndrewN
25-02-2008, 07:25
Да, маршруты.

Ясно. Значит и не в них, т.к. раньше работало. Пробывал несколько прошивок (8, 8.12, 8.14, 8.19). Одна и та же петрушка на всех.

AndrewN
25-02-2008, 07:27
Только в ответах я их не вижу. В запросе вижу.

Их там много. Я не стал их вставлять. Если это важно, то могу ещё раз ответ запостить.

AndrewN
25-02-2008, 07:36
Ответ полностью:

09:28:13.414577 IP (tos 0x0, ttl 63, id 106, offset 0, flags [DF], length: 578) 10.6.1.1.67 > 10.6.4.106.68: [udp sum ok] BOOTP/DHCP, Reply, length: 550, hops:2, xid:0x6d2cd001, secs:3, flags: [none] (0x0000)
Your IP: 10.6.4.106
Gateway IP: 10.6.1.1
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:OFFER
SID:10.100.0.11
LT:54000
SM:255.255.240.0
DG:10.6.1.1
NS:10.100.0.11
DN:"psk-net.ru"
T249:6336,43208,2566,257,6154,25600,2566,257,5130, 256,2566,257,5130,512,2566,257,5130,768,2566,257,5 130,1280,2566,257,5130,1792,2566,257,7690,65021,33 802,1537,269,2760,2566,257,3082,53258,1537,269,263 2,2566,257,5723,51424,2566,257,5824,43088,2566,257 ,6336,43223,2566,257,7616,43008,2058,1537,284,4932 0,16,2566,257,7104,43008,8202,1537,282,49320,64,25 66,257,6336,43009,2566,257,6080,43010,2566,257,582 4,43012,2566,257,5568,43016,2566,257,5312,43024,25 66,257,6336,43209,2566,257,6336,43200,2566,257,608 0,43210,2566,257,5824,43212,2566,257,5312,43216,25 66,257,6339,61310,2566,257,6339,61317,2566,257

Oleg
25-02-2008, 08:17
Раз раньше работало, а теперь с той же версией нет, то очевидно, что дело не в прошивке... Меня смущает именно то, что ответ не броадкастный.

AndrewN
25-02-2008, 14:07
Взял версию udhcpc из svn. Компильнул с дебагом.
Работает.

./udhcpc -i vlan1 -s /usr/local/root/showparams
udhcpc (v0.9.9-pre) started
adapter index 6
adapter hardware address 00:0c:6e:38:42:81
vforking and execle'ing /usr/local/root/showparams
deconfig
entering raw listen mode
Opening raw socket on ifindex 6
adding option 0x35
adding option 0x3d
adding option 0x3c
Sending discover...
Waiting on select...
oooooh!!! got some!
adding option 0x35
adding option 0x3d
adding option 0x3c
adding option 0x32
adding option 0x36
Sending select for 10.6.4.106...
Waiting on select...
oooooh!!! got some!
Lease of 10.6.4.106 obtained, lease time 54000
vforking and execle'ing /usr/local/root/showparams
bound
entering none listen mode


При этом tcpdump показывает следующее:

tcpdump: listening on vlan1, link-type EN10MB (Ethernet), capture size 1500 bytes
16:01:12.141515 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], length: 576) 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 00:0c:6e:38:42:81, length: 548, xid:0x8824b449, flags: [none] (0x0000)
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:DISCOVER
CID:[ether]00:0c:6e:38:42:81
VC:"udhcp 0.9.9-pre"
PR:SM+DG+NS+HN+DN+BR+YD+YS+NTP
16:01:12.145112 IP (tos 0x0, ttl 63, id 43342, offset 0, flags [DF], length: 334) 10.6.1.1.67 > 10.6.4.106.68: [udp sum ok] BOOTP/DHCP, Reply, length: 306, hops:2, xid:0x8824b449, flags: [none] (0x0000)
Your IP: 10.6.4.106
Gateway IP: 10.6.1.1
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:OFFER
SID:10.100.0.11
LT:54000
SM:255.255.240.0
DG:10.6.1.1
NS:10.100.0.11
DN:"psk-net.ru"
16:01:12.148293 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], length: 576) 0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 00:0c:6e:38:42:81, length: 548, xid:0x8824b449, flags: [none] (0x0000)
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:REQUEST
CID:[ether]00:0c:6e:38:42:81
VC:"udhcp 0.9.9-pre"
RQ:10.6.4.106
SID:10.100.0.11
PR:SM+DG+NS+HN+DN+BR+YD+YS+NTP
16:01:12.151933 IP (tos 0x0, ttl 63, id 43346, offset 0, flags [DF], length: 334) 10.6.1.1.67 > 10.6.4.106.68: [udp sum ok] BOOTP/DHCP, Reply, length: 306, hops:2, xid:0x8824b449, flags: [none] (0x0000)
Your IP: 10.6.4.106
Gateway IP: 10.6.1.1
Client Ethernet Address: 00:0c:6e:38:42:81
Vendor-rfc1048:
DHCP:ACK
SID:10.100.0.11
LT:54000
SM:255.255.240.0
DG:10.6.1.1
NS:10.100.0.11
DN:"psk-net.ru"

AndrewN
25-02-2008, 14:24
Олег,
У меня тут мысль возникла. Может udhcpc из прошивки ждет пакет с не тем mac адресом?

Oleg
25-02-2008, 14:36
Как это? :)

AndrewN
25-02-2008, 18:27
Раз раньше работало, а теперь с той же версией нет, то очевидно, что дело не в прошивке... Меня смущает именно то, что ответ не броадкастный.

Про не броадкастный ответ есть в описании протокола BOOTP следущее (см. п. 2a):

4. Chicken / Egg Issues

How can the server send an IP datagram to the client, if the client
doesnt know its own IP address (yet)? Whenever a bootreply is being
sent, the transmitting machine performs the following operations:

1. If the client knows its own IP address ('ciaddr' field is
nonzero), then the IP can be sent 'as normal', since the client
will respond to ARPs [5].

2. If the client does not yet know its IP address (ciaddr zero),
then the client cannot respond to ARPs sent by the transmitter of
the bootreply. There are two options:

a. If the transmitter has the necessary kernel or driver hooks


Croft & Gilmore [Page 4]



RFC 951 September 1985
Bootstrap Protocol


to 'manually' construct an ARP address cache entry, then it can
fill in an entry using the 'chaddr' and 'yiaddr' fields. Of
course, this entry should have a timeout on it, just like any
other entry made by the normal ARP code itself. The
transmitter of the bootreply can then simply send the bootreply
to the client's IP address. UNIX (4.2 BSD) has this
capability.

b. If the transmitter lacks these kernel hooks, it can simply
send the bootreply to the IP broadcast address on the
appropriate interface. This is only one additional broadcast
over the previous case.


В общем всё как-то странно...

Oleg
25-02-2008, 18:57
Попробуйте собрать бизибоксный udhcpc с отладкой и посмотреть в чём дело.

AndrewN
25-02-2008, 20:03
так вроде его и брал svn://busybox.net/trunk/udhcp
Или Вы не это имели ввиду?

ещё напрягает ругань на vlan1 прошивочного клиента:

udhcpc -i vlan1 -s /tmp/udhcpc
udhcpc (v0.9.9-pre) started
vlan1: No such process
Sending discover...
Sending discover...
Sending discover...

Oleg
25-02-2008, 20:13
У меня нет никакой ругани:
$ udhcpc -i vlan1 -s /bin/true
udhcpc (v0.9.9-pre) started
Sending discover...

Можно strace поставить и глянуть, на что именно он ругается.

В прошивке используется другой клиент, который интегрирован в бизибокс.

AndrewN
25-02-2008, 23:39
В прошивке используется другой клиент, который интегрирован в бизибокс.

собрал и бизибоксного. То же самое - работает...


./udhcpc -i vlan1 -s /usr/local/root/showparams
info, udhcpc (v0.9.9-pre) started
info, adapter index 6
info, adapter hardware address 00:0c:6e:38:42:81
info, vforking and execle'ing /usr/local/root/showparams
SP:deconfig
info, entering raw listen mode
info, Opening raw socket on ifindex 6
info, adding option 0x35
info, adding option 0x3d
info, adding option 0x3c
debug, Sending discover...
info, Waiting on select...
info, oooooh!!! got some!
info, adding option 0x35
info, adding option 0x3d
info, adding option 0x3c
info, adding option 0x32
info, adding option 0x36
debug, Sending select for 10.6.4.106...
info, Waiting on select...
info, oooooh!!! got some!
info, Lease of 10.6.4.106 obtained, lease time 54000
info, vforking and execle'ing /usr/local/root/showparams
SP:bound
info, entering none listen mode

AndrewN
26-02-2008, 00:06
strace

strace udhcpc -i vlan1 -s /tmp/udhcpc
execve("/sbin/udhcpc", ["udhcpc", "-i", "vlan1", "-s", "/tmp/udhcpc"], [/* 10 vars */]) = 0
svr4_syscall() = -1 ERRNO_4090 (Unknown error 4090)
mprotect(0x2aac0000, 25392, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
mprotect(0x400000, 1198572, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
readlink("/lib/ld-uClibc.so.0", 0x7fff78c8, 1024) = -1 EINVAL (Invalid argument)
open("/lib/libcrypt.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\000 0\6\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 348160, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ab07000
old_mmap(0x2ab07000, 13316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2ab07000
old_mmap(0x2ab4a000, 1124, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x3000) = 0x2ab4a000
old_mmap(0x2ab4b000, 67920, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ab4b000
close(3) = 0
open("/lib/libm.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0\3 00\22\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 344064, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ab5c000
old_mmap(0x2ab5c000, 79748, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2ab5c000
old_mmap(0x2abaf000, 2236, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x13000) = 0x2abaf000
close(3) = 0
open("/lib/libm.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0\3 20\251\0\0004\0\0\0"..., 4096) = 4096
old_mmap(NULL, 737280, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2abb0000
old_mmap(0x2abb0000, 452276, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2abb0000
old_mmap(0x2ac5e000, 11584, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x6e000) = 0x2ac5e000
old_mmap(0x2ac61000, 10280, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ac61000
close(3) = 0
mprotect(0x400000, 1198572, PROT_READ|PROT_EXEC) = 0
mprotect(0x2aac0000, 25392, PROT_READ|PROT_EXEC) = 0
ioctl(0, TIOCNXCL, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCNXCL, {B38400 opost isig icanon echo ...}) = 0
brk(0x10010004) = 0x10010004
brk(0x10011000) = 0x10011000
brk(0x10012000) = 0x10012000
getuid() = 0
getgid() = 0
setgid(0) = 0
setuid(0) = 0
open("/dev/null", O_RDWR|O_LARGEFILE) = 3
close(3) = 0
write(1, "udhcpc (v0.9.9-pre) started\n", 28udhcpc (v0.9.9-pre) started
) = 28
rt_sigaction(SIGPIPE, {SIG_DFL}, {SIG_DFL}, 16) = 0
socket(PF_FILE, SOCK_DGRAM, 0) = 3
connect(3, {sa_family=AF_FILE, path="/dev/log"}, 10) = 0
time([1203970337]) = 1203970337
open("/etc/TZ", O_RDONLY) = 4
read(4, "MSK-3MSD\n", 68) = 9
read(4, "", 59) = 0
close(4) = 0
getpid() = 355
write(3, "<134>Feb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0cpc[355]"..., 62) = 62
rt_sigaction(SIGPIPE, {0x7fff74da, [], SA_STACK|SA_RESTART|SA_INTERRUPT|SA_NOMASK|SA_SIGI NFO|SA_NOCLDWAIT|0x7fe74d2}, NULL, 16) = 0
socket(PF_INET, SOCK_RAW, IPPROTO_RAW) = 4
ioctl(4, 0x8933, {ifr_name="vlan1", ifr_index=6}) = 0
ioctl(4, 0x8927, {ifr_name="vlan1", ifr_hwaddr=00:0c:6e:38:42:81}) = 0
close(4) = 0
brk(0x10013000) = 0x10013000
socketpair(PF_FILE, SOCK_STREAM, 0, [4, 5]) = 0
rt_sigaction(SIGUSR1, {0x10000000, [], SA_NOCLDWAIT|0x467dc0}, {SIG_DFL}, 16) = 0
rt_sigaction(SIGUSR2, {0x10000000, [], SA_NOCLDWAIT|0x467dc0}, {SIG_DFL}, 16) = 0
rt_sigaction(SIGTERM, {0x10000000, [], SA_NOCLDWAIT|0x467dc0}, {SIG_DFL}, 16) = 0
brk(0x10014000) = 0x10014000
brk(0x10015000) = 0x10015000
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6
ioctl(6, TIOCNXCL, 0x7fff7818) = -1 ENOTTY (Inappropriate ioctl for device)
close(6) = 0
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6
ioctl(6, TIOCNXCL, 0x7fff7818) = -1 ENOTTY (Inappropriate ioctl for device)
close(6) = 0
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6
ioctl(6, TIOCNXCL, 0x7fff7818) = -1 ENOTTY (Inappropriate ioctl for device)
close(6) = 0
fork() = 356
wait4(356, vlan1: No such process
NULL, 0, NULL) = 356
--- SIGCHLD (Child exited) @ 0 (0) ---

AndrewN
26-02-2008, 20:02
Олег,

Подскажите, пожалуйста, как включить недостающие фичи в udhcp? Это наверное какие-нибудь патчи?

UDHCPC из прошивки PR:SM+DG+NS+HN+DN+BR+SR+YD+YS+NTP+T249
UDHCPC из бизибокса PR:SM+DG+NS+HN+DN+BR+YD+YS+NTP

Спасибо.

AndrewN
28-02-2008, 23:34
Нашел косяк.
Проблема в длине массива options в структуре dhcpMessage. Надо бы увеличить.
Провайдер размахался с маршрутами, аж не влазят! :)