嵌入式技术论坛
直播中

尚文清

7年用户 1595经验值
私信 关注
[问答]

请教下怎么配置来支持IPV6呢

现在板子使用ipv4没有问题,想增加ipv6的支持。

根据《RT-Thread编程指南》里面关于ipv6的部分配置过但是不能使用,2019-01-01版本。文档里面的lwIP还是在 1.5.0-Beta发布之前的??
与现有代码对应不上。

从menuconfig里面,选中Components->Network->light weight TCP/IP stack->IPV6 protocol后编译。
lwIP2.0.3版本可以编译通过,有ipv6的本地链接地址,但是与PC不能互通(PC直接可以互拼的环境下),也不能获取ipv6的地址;lwIP2.1.2版本不能编译通过,在rtconfig.h中增加

#define LWIP_IPV6_ADDRESS_LIFETIMES 180
这行后可以编译,但是板子运行不起来,在初始化以太网的时候HDCP部分报错(报错的地方与内存有关)。
把dhcp关掉后在

tid = rt_thread_create("phy",

此处还是会报内存错误。

请教下该怎么配置来支持IPV6呢??在此谢过!!

回帖(17)

王飞云

2022-9-21 11:23:03
报的什么错误?
举报

王飞云

2022-9-21 11:23:25
可以把调用栈打出来,看看死在哪里
举报

尚文清

2022-9-21 11:23:33
addr2line 对应显示如下:

PS E:rt-thread-4.0.5-d16-20220615bspstm32stm32f407-evc-d16cmake-build-debug> addr2line -e rtthread.elf -a -f 0804d36e 0804eeac 0807959e 0806bea2 0806dc68 08066c48 0806ad44 0806b132 0806ade8 0806dd90 0806ddda 080418be 0804e99e 0804e9a4 0804e9f6
0x0804d36e
rt_malloc
E:rt-thread-4.0.5-d16-20220615src/mem.c:349
0x0804eeac
rt_sem_take
E:rt-thread-4.0.5-d16-20220615src/ipc.c:489
0x0807959e
mem_malloc
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcarch/sys_arch.c:735
0x0806bea2
dhcp_start
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srccoreipv4/dhcp.c:757
0x0806dc68
eth_netif_device_init
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcnetif/ethernetif.c:485
0x08066c48
netif_add
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srccore/netif.c:378
0x0806ad44
netifapi_do_netif_add
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcapi/netifapi.c:67
0x0806b132
tcpip_api_call
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcapi/tcpip.c:478
0x0806ade8
netifapi_netif_add
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcapi/netifapi.c:253
0x0806dd90
eth_device_init_with_flag
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcnetif/ethernetif.c:567
0x0806ddda
eth_device_init
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcnetif/ethernetif.c:582
0x080418be
rt_hw_stm32_eth_init
E:rt-thread-4.0.5-d16-20220615bspstm32librariesHAL_Drivers/drv_eth.c:616
0x0804e99e
rt_components_init
E:rt-thread-4.0.5-d16-20220615src/components.c:119 (discriminator 3)
0x0804e9a4
rt_components_init
E:rt-thread-4.0.5-d16-20220615src/components.c:119 (discriminator 3)
0x0804e9f6
main_thread_entry
E:rt-thread-4.0.5-d16-20220615src/components.c:198
PS E:rt-thread-4.0.5-d16-20220615bspstm32stm32f407-evc-d16cmake-build-debug>
举报

王飞云

2022-9-21 11:23:42
软件调试,看看死机的位置,像是内存引起的。
举报

尚文清

2022-9-21 11:23:49
单不执行的时候到dhcp.c文件的757行
dhcp_ptr = (struct dhcp *)mem_malloc(sizeof(struct dhcp));
这出错的,再往下就到mem.c的406行 rt_sem_release(&heap_sem);处出错。
举报

王飞云

2022-9-21 11:23:55
这时线程调度起来了吗?
举报

尚文清

2022-9-21 11:24:03
要怎么确定线程调度是否起来呢?

我尝试在不同的地方申请内存,发现在ethernetif.c的351行 netdev_low_level_set_dhcp_status(netdev, RT_TRUE);之前执行内存申请是正常的,在这之后申请都会报错。
举报

王飞云

2022-9-21 11:24:11
主要是确认是否初始化的过早,正常申请内存不会出现死机。尝试把网卡驱动的初始化,放到后面试试
举报

尚文清

2022-9-21 11:24:21
drv_eth.c中初始化的宏从INIT_DEVICE_EXPORT改成INIT_COMPONENT_EXPORT延迟了还是报错。

印象中调度线程是在跑用户线程main后起来的吧??调度线程应该还没起来。
举报

尚文清

2022-9-21 11:24:28
请问我这样配置是正确的吗?如问题描述里面所说,我是在ipv4可正常使用的基础上,从menuconfig里面选中Components->Network->light weight TCP/IP stack->IPV6 protocol,然后在rtconfig.h中增加#define LWIP_IPV6_ADDRESS_LIFETIMES 180这行,改了这两个地方。现在出错不确定是我配置的问题还是其他什么地方的问题。

lwip2.0.3版本只改munuconfig里面,在rtconfig.h里面不加那行就可以编译运行,但是板子连接到两pc之间可以ipv6通讯的路由器上面,板子获取不到路由器分配的ipv6地址,用link-local地址也不能相互通讯。
举报

王飞云

2022-9-21 11:24:36
drv_eth.c 的初始化先放到 main 函数中试试,主要是为了【定位】问题。

如果是初始化次序引起的,比如在调度前申请内存,可能要调整内存的算法之类,如申请内存中有【互斥量】,但没调度前不允许【互斥量】

自动初始化时方便的,可以先注释掉,main中加个延时调用,
举报

尚文清

2022-9-21 11:24:53
谢谢关注此问题!!!

放到main里面初始化了,并且延迟了10秒,问题还是存在,一下是堆栈信息:

0x0804fc4e
rt_malloc
E:rt-thread-4.0.5-d16-20220615src/mem.c:349
0x0804de90
rt_sem_take
E:rt-thread-4.0.5-d16-20220615src/ipc.c:489
0x08079542
mem_malloc
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcarch/sys_arch.c:735
0x0806be46
dhcp_start
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srccoreipv4/dhcp.c:757
0x0806dc0c
eth_netif_device_init
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcnetif/ethernetif.c:488
0x08066c08
netif_add
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srccore/netif.c:378
0x0806ace8
netifapi_do_netif_add
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcapi/netifapi.c:67
0x0806b0d6
tcpip_api_call
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcapi/tcpip.c:478
0x0806ad8c
netifapi_netif_add
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcapi/netifapi.c:253
0x0806dd34
eth_device_init_with_flag
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcnetif/ethernetif.c:570
0x0806dd7e
eth_device_init
E:rt-thread-4.0.5-d16-20220615componentsnetlwip-2.1.2srcnetif/ethernetif.c:585
0x08040e12
rt_hw_stm32_eth_init
E:rt-thread-4.0.5-d16-20220615bspstm32librariesHAL_Drivers/drv_eth.c:616
0x08040f1c
rt_eth_init
E:rt-thread-4.0.5-d16-20220615bspstm32librariesHAL_Drivers/drv_eth.c:675
0x08040f20
rt_eth_init
E:rt-thread-4.0.5-d16-20220615bspstm32librariesHAL_Drivers/drv_eth.c:675
0x08028332
main
E:rt-thread-4.0.5-d16-20220615bspstm32stm32f407-evc-d16applications/main.c:200
0x0804f8a2
main_thread_entry
E:rt-thread-4.0.5-d16-20220615src/components.c:200
我又检查了我做的修改,在at_socket.c文件的1298行 sa4->type = IPADDR_TYPE_V4;
被我注释了,这行编译不通过,对应结构体里面也没有这个字段。不知道您那边是否也这样?
举报

王飞云

2022-9-21 11:25:03
lwip 改个版本试试,如2.0.3
举报

尚文清

2022-9-21 11:25:11
如问题描述里面所说,2.0.3版本可以编译运行,进系统后可以看到生成了link-local地址。但是在两pc可以相互通讯的环境下面,板子获取不到路由器分配的ipv6地址(可以获取ipv4地址),板子与pc也不能通过link-local互拼。
举报

尚文清

2022-9-21 11:25:16
通过路由器连接板子主要是想验证板子上ipv6的有效性,实际使用场景是两板子通过网下直连,可以通过link-local通讯即可。
举报

王飞云

2022-9-21 11:25:26
lwip ipv6 没用过,是不是初始化网卡驱动时要设置什么?或者DHCP 需要设置什么才能支持呢
举报

尚文清

2022-9-21 11:25:45
之前也没搞过这块,rt-thread上ipv6的配置说明文档也没有找着,痛苦呀。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分