Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
IPv6
请教关于RT-thread下LWIP对IPV6的支持
发布于 2013-03-20 00:28:56 浏览:5081
订阅该版
请教关于RT-thread下LWIP对IPV6的支持 看到RT-thread发展这么快,好羡慕~向大家学习先~~ --- 最近在git上看到RT-thread在IPV6上的文件又有更新了,补充了几个有关IPV6的文件 很想知道 - 1、在现有情况下:使用原有的LWIP 1.4或者使用git上的最新版本的代码 能否通过以太网(ENC28J60)进行简单的通信?(无需DHCP等等其他功能,只需要使用Socket的程度) - 2、在使用现有程序的时候,在保证IPV4可以通信的情况下,PC 通过网口 Ping 板子(IPV6,板子的IPV6的地址是自己生成的吧),我的是`IPv6 address: FE80::204:A3FF:FE11:2233`,观察ethernet_input()函数,发现没有IPV6的分组进入,这个情况有点奇怪的说,不知道哪里出了问题,抓的包PC的网口是有数据的 --- 感谢大家的贡献哈~~感谢xuliman大神~~ --- 2013.4.2 跟进问题 关于socket 在文件socket.c当中 出现以下宏定义 ```c #define IP4ADDR_PORT_TO_SOCKADDR(sin, ipXaddr, port) do { (sin)->sin_len = sizeof(struct sockaddr_in); (sin)->sin_family = AF_INET; (sin)->sin_port = htons((port)); inet_addr_from_ipaddr(&(sin)->sin_addr, ipX_2_ip(ipXaddr)); memset((sin)->sin_zero, 0, SIN_ZERO_LEN); }while(0) #define SOCKADDR4_TO_IP4ADDR_PORT(sin, ipXaddr, port) do { inet_addr_to_ipaddr(ipX_2_ip(ipXaddr), &((sin)->sin_addr)); (port) = ntohs((sin)->sin_port); }while(0) #if LWIP_IPV6 #define IS_SOCK_ADDR_LEN_VALID(namelen) (((namelen) == sizeof(struct sockaddr_in)) || ((namelen) == sizeof(struct sockaddr_in6))) #define IS_SOCK_ADDR_TYPE_VALID(name) (((name)->sa_family == AF_INET) || ((name)->sa_family == AF_INET6)) #define SOCK_ADDR_TYPE_MATCH(name, sock) ((((name)->sa_family == AF_INET) && !(NETCONNTYPE_ISIPV6((sock)->conn->type))) || (((name)->sa_family == AF_INET6) && (NETCONNTYPE_ISIPV6((sock)->conn->type)))) #define IP6ADDR_PORT_TO_SOCKADDR(sin6, ipXaddr, port) do { (sin6)->sin6_len = sizeof(struct sockaddr_in6); (sin6)->sin6_family = AF_INET6; (sin6)->sin6_port = htons((port)); (sin6)->sin6_flowinfo = 0; inet6_addr_from_ip6addr(&(sin6)->sin6_addr, ipX_2_ip6(ipXaddr)); }while(0) #define IPXADDR_PORT_TO_SOCKADDR(isipv6, sockaddr, ipXaddr, port) do { if (isipv6) { IP6ADDR_PORT_TO_SOCKADDR((struct sockaddr_in6*)(void*)(sockaddr), ipXaddr, port); } else { IP4ADDR_PORT_TO_SOCKADDR((struct sockaddr_in*)(void*)(sockaddr), ipXaddr, port); } } while(0) #define SOCKADDR6_TO_IP6ADDR_PORT(sin6, ipXaddr, port) do { inet6_addr_to_ip6addr(ipX_2_ip6(ipXaddr), &((sin6)->sin6_addr)); (port) = ntohs((sin6)->sin6_port); }while(0) #define SOCKADDR_TO_IPXADDR_PORT(isipv6, sockaddr, ipXaddr, port) do { if (isipv6) { SOCKADDR6_TO_IP6ADDR_PORT((struct sockaddr_in6*)(void*)(sockaddr), ipXaddr, port); } else { SOCKADDR4_TO_IP4ADDR_PORT((struct sockaddr_in*)(void*)(sockaddr), ipXaddr, port); } } while(0) #define DOMAIN_TO_NETCONN_TYPE(domain, type) (((domain) == AF_INET) ? (type) : (enum netconn_type)((type) | NETCONN_TYPE_IPV6)) #else /* LWIP_IPV6 */ #define IS_SOCK_ADDR_LEN_VALID(namelen) ((namelen) == sizeof(struct sockaddr_in)) #define IS_SOCK_ADDR_TYPE_VALID(name) ((name)->sa_family == AF_INET) #define SOCK_ADDR_TYPE_MATCH(name, sock) 1 #define IPXADDR_PORT_TO_SOCKADDR(isipv6, sockaddr, ipXaddr, port) IP4ADDR_PORT_TO_SOCKADDR((struct sockaddr_in*)(void*)(sockaddr), ipXaddr, port) #define SOCKADDR_TO_IPXADDR_PORT(isipv6, sockaddr, ipXaddr, port) SOCKADDR4_TO_IP4ADDR_PORT((struct sockaddr_in*)(void*)(sockaddr), ipXaddr, port) #define DOMAIN_TO_NETCONN_TYPE(domain, netconn_type) (netconn_type) #endif /* LWIP_IPV6 */ #define IS_SOCK_ADDR_TYPE_VALID_OR_UNSPEC(name) (((name)->sa_family == AF_UNSPEC) || IS_SOCK_ADDR_TYPE_VALID(name)) #define SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock) (((name)->sa_family == AF_UNSPEC) || SOCK_ADDR_TYPE_MATCH(name, sock)) #define IS_SOCK_ADDR_ALIGNED(name) ((((mem_ptr_t)(name)) % 4) == 0) ``` 在.c文件中这样定义是否不妥?因为其他文件无法调用这些定义,还是说这些宏定义是socket.c私有的?但是在本文件中未见调用,所以它们应该被移动到socket.h中?
查看更多
12
个回答
默认排序
按发布时间排序
bernard
2013-03-20
这家伙很懒,什么也没写!
你是否取了github上的lwip-head代码?想用IPv6,就需要使用这个分支。
dhbighead
2013-03-20
这家伙很懒,什么也没写!
>你是否取了github上的lwip-head代码?想用IPv6,就需要使用这个分支。 --- 是取了的 github上最新的代码 添加进去以后 可以收到IPV4的分组 但是收不到 IPV6的分组
aozima
2013-03-20
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
先检查驱动是否有收到V6的数据报,再跟进,也许? 使能开关没有开?
dhbighead
2013-03-20
这家伙很懒,什么也没写!
>先检查驱动是否有收到V6的数据报,再跟进,也许? 使能开关没有开? --- 刚才自上而下查看了一下 使能开关是打开的 追踪到问题 enc28j60_rx() 收到的报文中就没有IPV6的分组 是PC发出报文的问题?或者是enc28j60不能支持IPV6(MAC层的应该不会吧)? =============== 刚才又抓包看了下 貌似是MAC的问题 PC对地址 FE80::204:A3FF:FE11:2233 ping的时候 目的MAC地址填的是 33:33:ff:11:22:33 ,但是实际上MAC地址是00 04 a3 11 22 33 ,应该是ENC28J60直接判断MAC不符合 就丢弃分组了
aozima
2013-03-20
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
检查是否属于多播IP地址?还没仔细看书,不知道IPV6是否也是类似的做法。 板子这边的V6地址指定一个跟PC类似的(比如仅最后1组变化),另外,V6应该也有ARP过程的吧。
dhbighead
2013-03-20
这家伙很懒,什么也没写!
>检查是否属于多播IP地址?还没仔细看书,不知道IPV6是否也是类似的做法。 >板子这边的V6地址指定一个跟PC类似的(比如仅最后1组变化),另外,V6应该也有ARP过程的吧。 --- V6是没有ARP过程的 V6通过邻居发现机制替代ARP 其实问题就是出现在ENC28J60的缺陷了 它一般只能用于IPV4 他会接受自身的MAC相符的或者广播的帧 但是对于IPV6的邻居发现帧就只能过滤掉了 要是通过ENC28J60实现邻居发现 估计有点复杂 不过对我个人的应用来说问题不会太大 因为我们要在PPP上跑IPV6 可能还有自己添加PPP里的相关V6的几个子层
dhbighead
2013-03-20
这家伙很懒,什么也没写!
>检查是否属于多播IP地址?还没仔细看书,不知道IPV6是否也是类似的做法。 >板子这边的V6地址指定一个跟PC类似的(比如仅最后1组变化),另外,V6应该也有ARP过程的吧。 --- 请问下 能否关闭邻居发现机制?直接ping? 同时找到一个网站 [https://sites.google.com/site/ghoelzl/ipv6ethershield](https://sites.google.com/site/ghoelzl/ipv6ethershield) 也是基于enc28j60的IPV6 很好奇 正在看他是怎么实现的 看起来是enc28j60设置的问题了 ========================================= 搞定~~~~ 建议在enc28j60.c里加入 ``` #if LWIP_IPV6 spi_write(ERXFCON, ERXFCON_UCEN|ERXFCON_BCEN|ERXFCON_MCEN); #else spi_write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_BCEN); #endif ```
aozima
2013-03-20
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
启用了MCEN,但为什么禁用了CRCEN呢?
dhbighead
2013-03-20
这家伙很懒,什么也没写!
。。。下午有点急,忘了开CRCEN了
dhbighead
2013-04-02
这家伙很懒,什么也没写!
其实我想了想 应该是私有的 我应该写成这样吧 ``` remoteAddr.sin6_len = sizeof(struct sockaddr_in6); remoteAddr.sin6_family = AF_INET6; remoteAddr.sin6_port = htons((GATEWAY_PORT)); remoteAddr.sin6_flowinfo = 0; (remoteAddr).sin6_addr.un.u32_addr[0] = GATEWAY_ADDR1; (remoteAddr).sin6_addr.un.u32_addr[1] = GATEWAY_ADDR2; (remoteAddr).sin6_addr.un.u32_addr[2] = GATEWAY_ADDR3; (remoteAddr).sin6_addr.un.u32_addr[3] = GATEWAY_ADDR4; ```
撰写答案
登录
注册新账号
关注者
0
被浏览
5.1k
关于作者
dhbighead
这家伙很懒,什么也没写!
提问
2
回答
14
被采纳
0
关注TA
发私信
相关问题
1
怎么实现在RT-Thread上通过IPv6远程通信
2
请教:RT-Thread 1.01 支持IPV6吗?(基于lm3s8962)
3
nRF51822上的IPv6
4
这是IPv6 BUG吗?
5
求助,有人用LWIP2.0以上版本实现IPV6通讯吗?
6
求助 lwip2.0.2的IPV6的移植完代码和稳定或相关资料
7
谁有文档中心lwIP-IPv6 支持的测试代码,求分享。拜谢各位。
8
lwip 2.0版本以上的ipv6移植成功后的ipv6设置问题
9
lpc178x emac网卡设置成能接收ipv6组播报的配置
10
lwip ipv6能接收组播包,不能ping通
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部