搜索
bottom↓
回复: 2

DHCP的问题?

[复制链接]

出0入0汤圆

发表于 2012-4-8 00:08:02 | 显示全部楼层 |阅读模式
本帖最后由 keendawn 于 2012-4-8 13:04 编辑

我参考stm32radio V4版自己做了一块板子,CPU和dm9000是一样的,
现在DHCP一直不成功,我把DHCP_DEBUG打开,重新编译,启动的打印信息如下:
SystemInit......
CPU SN: 35FFD6053346343026871743

mem test pass!!

\ | /
- RT - Thread Operating System
/ | \ 0.4.0 build Apr 6 2012
2006 - 2011 Copyright by rt-thread team
sdcard init failed
SPI File System initialized!
SD File System init failed!
Unable to open GBK to Unicode look up table.
Unable to open Unicode to GBK look up table.
load_default!
Invalid LCD ID:00000000
Please check you hardware and configure.
data bus test error: 0022 0022

rem_codes /resource/remote.txt open fail! fd:-1
The remote disbale.
please run rem_study()
rtc is not configured
please configure with set_date and set_time
Thu Jan 1 00:00:00 1970

dm9000 id: 0x90000a46
finsh>>operating at 100M full duplex mode
lwip_sanity_check: WARNING: TCP_SND_BUF must be at least as much as (2 * TCP_MSS) for things to work smoothly
dhcp_start(netif=6800480c) e00
dhcp_start(): starting new DHCP client
dhcp_start(): allocated dhcpdhcp_start(): starting DHCP configuration
dhcp_discover()
transaction id xid(abcd0001)
dhcp_discover: making request
dhcp_discover: realloc()ing
dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)
dhcp_discover: deleting()ing
dhcp_discover: SELECTING
dhcp_discover(): set request timeout 2000 msecs
dhcp_discover()
transaction id xid(abcd0002)
dhcp_discover: making request
dhcp_discover: realloc()ing
dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)
dhcp_discover: deleting()ing
dhcp_discover: SELECTING
dhcp_discover(): set request timeout 2000 msecs
TCP/IP initialized!
stat -> stopped
dhcp_recv(pbuf = 6800000c) from DHCP server 192.168.1.1 port 67
pbuf->len = 548
pbuf->tot_len = 548
transaction id mismatch reply_msg->xid(abcd0001)!=dhcp->xid(abcd0002)
dhcp_free_reply(): free'd
dhcp_recv(pbuf = 68000028) from DHCP server 192.168.1.1 port 67
pbuf->len = 548
pbuf->tot_len = 548
dhcp_free_reply(): free'd
dhcp_unfold_reply(): copied 240 bytes into dhcp->msg_in[]
dhcp_unfold_reply(): copied 308 bytes to dhcp->options_in[]
searching DHCP_OPTION_MESSAGE_TYPE
option found at offset 0 in options
option byte value=2
DHCP_OFFER received in DHCP_SELECTING state
skipping option 53 in options
option found at offset 3 in options
dhcp_handle_offer(netif=6800480c) e00
option long value=3232235777
dhcp_handle_offer(): server 0x0101a8c0
dhcp_handle_offer(): offer for 0x6801a8c0
dhcp_select(netif=6800480c) e00
transaction id xid(abcd0003)
dhcp_select: REQUESTING
dhcp_select(): set request timeout 2000 msecs
dhcp_free_reply(): free'd
dhcp_recv(pbuf = 68000028) from DHCP server 192.168.1.1 port 67
pbuf->len = 548
pbuf->tot_len = 548
dhcp_free_reply(): free'd
dhcp_unfold_reply(): copied 240 bytes into dhcp->msg_in[]
dhcp_unfold_reply(): copied 308 bytes to dhcp->options_in[]
searching DHCP_OPTION_MESSAGE_TYPE
option found at offset 0 in options
option byte value=5
DHCP_ACK received
skipping option 53 in options
skipping option 54 in options
skipping option 1 in options
option found at offset 15 in options
option long value=7200
skipping option 53 in options
skipping option 54 in options
skipping option 1 in options
skipping option 51 in options
overloaded message detected
skipping option 3 in options
skipping option 28 in options
skipping option 6 in options
overloaded sname and file field
skipping option 53 in options
skipping option 54 in options
skipping option 1 in options
skipping option 51 in options
overloaded message detected
skipping option 3 in options
skipping option 28 in options
skipping option 6 in options
overloaded sname and file field
skipping option 53 in options
skipping option 54 in options
option found at offset 9 in options
option long value=4294967040
skipping option 53 in options
skipping option 54 in options
skipping option 1 in options
skipping option 51 in options
overloaded message detected
option found at offset 24 in options
option long value=3232235777
skipping option 53 in options
skipping option 54 in options
skipping option 1 in options
skipping option 51 in options
overloaded message detected
skipping option 3 in options
option found at offset 30 in options
option long value=4294967295
skipping option 53 in options
skipping option 54 in options
skipping option 1 in options
skipping option 51 in options
overloaded message detected
skipping option 3 in options
skipping option 28 in options
option found at offset 36 in options
option byte value=8
option long value=1032520261
option long value=3657877643
dhcp_check(netif=6800480c) e0
dhcp_check(): set request timeout 500 msecs
dhcp_free_reply(): free'd

finsh>>dhcp_coarse_tmr()

finsh>>dhcp_coarse_tmr()

finsh>>list_if()
Default network interface: e0
MTU: 1500
MAC: 00 60 6e 30 26 87
FLAGS: DOWN LINK_UP DHCP ETHARP
ip address: 0.0.0.0
gw address: 0.0.0.0
net mask : 0.0.0.0
dns server: 61.139.2.69
24, 0x00000018


请忽略其他部分的初始化失败信息,我的板子上没有这些功能,还没裁剪,
我目前只关心网络功能,
抓包信息如下:


设为固定IP都是OK的,可以ping通.

由于最终产品还是要用DHCP来分配IP地址,所以DHCP的问题一定要解决才行!

应该是板子发出的DHCP discover帧(不知为何还发出了两遍),不知为何路由器一直没有回复OFFER帧?
这个路由器对PC的DHCP都是正常的,而且我在两个路由器上都试过,现象都一样.
我就怀疑板子发出的DHCP discover帧是不是有什么错误,对报内容过了一遍,也没发现什么问题?

请对这块比较熟悉的不吝赐教!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-4-8 11:31:09 | 显示全部楼层
lwip dhcp server过程
UDP应用编程,发现无法接受到UDP广播报,在网上找了一下,有人说是没有打开接收广播包的状态和。查了一

下资料,加上了这句“”
        pcb_dhcps = udp_new();

        IP4_ADDR(&broadcast_dhcps,255,255,255,255);
        IP4_ADDR(&server_address,192,168,1,1);
        IP4_ADDR(&client_address,192,168,1,2);
      
         pcb_dhcps->so_options |= SOF_BROADCAST;

        udp_bind(pcb_dhcps, IP_ADDR_ANY, DHCPS_SERVER_PORT );

        udp_recv(pcb_dhcps, handle_dhcp, NULL);
调试,依然没有广播包到达。无奈我打开IP,UDP的调试信息输出,发现有如下IP.C文件输出:
ip_input: iphdr->dest 0xffffffff netif->ip_addr 0x 101a8c0 (0x  ffffff, 0x   1a8c0, 0xff000000)
ip_input: packet accepted on interface st
ip_input: packet source is not valid.
原来是IP.C文件把这个广播包给丢弃了,修改IP.C文件,使在IP层不丢弃广播包。

再次调试,果然能进入UDP回调函数了。由于我在网上下载的这个DHCP SERVER代码实现比较简单,或者是比较

与之相对应的LWIP版本比较老,有一个重要的结构体定义与我的LWIP不太一样,

struct dhcp_msg *m这个DHCP结构体,少了m-》cookie这一项,但这个比较关键,里面放着uint8_t

magic_cookie[4] = {99, 130, 83, 99};这4个字节,看到这4个字节,才认为这是个DHCP包。而我下载 的这个

版本反这cookie放在了m->option中了,所以在赋值的时候必须往后空用4个字节的空间。还有就是一些编译的

错误了,网上下载 的资料,这少个符号,那多个字母了,很正常的,一般编译器都能把它们找出来,一一更正

就是了。还有就是这个DHCP SERVER自己占用192.168.1.1这个地址,无论谁请求地址,它都给人家一个

192.168.1.2这个地址,搞的第一台电脑连它的时候,就用出现“地址冲突”。于是我把它改成client_addr递

增。增到192.168.1.254,重新给192.168.1.2,也是比较简单。毕竟它不是路由器



DHCP分为4个阶段,discover  offer,request  ack,
discover发现阶段,客户机向网路上发广播包,问有没没人提供IP地址。
offer提供IP: 服务器向客户端提供的IP地址等信息都 在这个包中。
也许有人认为DHCP在这就可以结束了,但是如果网路 上有多个DHCP服务器,我还是不知道我的电脑到底用的哪

个DHCP服务。所以就有了以下两个包:
request 请求:你想用哪个chdp服务器,向它发送请求,如果对方同意,则它发现下面的包以响应
ACK:同意,欢迎你的加入 。
在这期间,有一个事务ID,x-id,这个ID是由客户端随机生成的,32bit。这个ID贯穿整个4个阶段,我的DHCP

SERVER居然用了一个固定的ID,搞的人家向他发送discover包,它老是回复人家 一个不同ID的offer包,难怪

人家不理他,把这个随机事务ID取出来 ,4 个DHCP阶段,都要用同一个事务ID.

出0入0汤圆

 楼主| 发表于 2012-4-8 13:03:18 | 显示全部楼层
总之,还是感谢楼上的回复。
楼上的回复我在网上也看到过,这是做一个DHCP server的,我的是一个client,发出的discover,DHCP server不理我。
我正在看我的discover帧有没有错,好像也没什么错。
只有一点觉得奇怪,我的discover帧包长度是350bytes,已经大于最小直接要求了,为何其IP包尾部还有20多字节的0x00 pad?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 11:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表