lwip 2.0版本以上的ipv6移植成功后的ipv6设置问题

发布于 2019-08-05 14:48:57    浏览:1131
是这样的,最新接手的一个项目,是将之前用的ipv4的代码全部转移到ipv6上来,按照官方文档配置了文件,编译通过,移植成功
但是设置好ipv6地址之后,把这个ipv6地址设定为有效地址之后发现局域网内不能通信
希望大神指导一下,在这个问题上已经卡了半个月了,一点头绪都没有
之前我以为就是能创建ipv6的socket套接字就可以实现局域网通信
现在看来是一头雾水,完全搞不懂这个ipv6怎么回事
ipv4的话要设置本地的ip地址,子网掩码,路由的ip地址,ipv6的完全没有这个选项
求分享移植成功并且能够实现通信的ipv6的lwip代码,或者给一点指导
谢谢


查看更多

34 个回答
kuailedeluojie
kuailedeluojie 2019-08-05
This guy hasn't written anything yet
    本帖最后由 aozima 于 2019-8-5 14:59 编辑


finsh >list_if()
network interface: e0 (Default)
MTU: 1500
MAC: 00 60 37 12 34 56
FLAGS: UP LINK_UP

ipv6 link-local: FE80::260:37FF:FE12:3456 state:10 VALID
ipv6[1] address: :: state:00 INVALID
ipv6[2] address: :: state:00 INVALID

dns server #0: 240C::6644
dns server #1: ::
0, 0x00000000
finsh >


这是使用串口连接板子用list_if()指令打印的一些信息
kuailedeluojie
kuailedeluojie 2019-08-05
This guy hasn't written anything yet
测试后ipv4移植是完全没有问题的,就是用ipv6的时候不能正常通信
shadowliang
shadowliang 2019-08-05
This guy hasn't written anything yet
不知道楼主的问题解决了没,关于IPv6,最近刚好有接触到局域网接收IPv6组播包的需求,分享一下个人的实现方法仅供楼主参考一下。首先开启网络接收的调试打印,方便观察网络通信中接收到的信息,我使用的是无线的wifi,在drv_wlan.c中开启packet_dump功能,主要是通过
//#define MINI_DUMP
//#define ETH_RX_DUMP
//#define ETH_TX_DUMP,
这三个宏开关调试,具体可以阅读下相关bsp下的drv_wlan.c文件,
具体函数如下
static void packet_dump(const char *msg, const struct pbuf *p)
{
const struct pbuf *q;
rt_uint32_t i, j;
rt_uint8_t *ptr;

rt_kprintf("%s %d byte\n", msg, p->tot_len);

#ifdef MINI_DUMP
return;
#endif

i = 0;
for (q = p; q != RT_NULL; q = q->next)
{
ptr = q->payload;

for (j = 0; j < q->len; j++)
{
if ((i % 8) == 0)
{
rt_kprintf(" ");
}
if ((i % 16) == 0)
{
rt_kprintf("\r\n");
}
rt_kprintf("%02x ", *ptr);

i++;
ptr++;
}
}

rt_kprintf("\n\n");
}
#endif /* dump */



shadowliang
shadowliang 2019-08-05
This guy hasn't written anything yet
关于ipv6组播包是否被板子接收到,可以参考一下以下的方法,在网络的接收函数中,如果是使用wifi通信中的在drv_wlan.c文件中的ethernetif_input(int iface, struct pbuf *p)函数中的相关位置添加以下代码,打印网络接收数据的来源mac和目的的mac地址,如果是ipv6的组播包,第48bit是1就表示组播地址,mac的目的地址的第一个字节一般是0x33.
/* points to packet payload, which starts with an Ethernet header */
ethhdr = p->payload;

if (ethhdr->dest.addr[0] && 0x01)
{
rt_kprintf("\r\n [src_mac:%02x %02x %02x %02x %02x %02x ]", ethhdr->src.addr[0], ethhdr->src.addr[1], ethhdr->src.addr[2], ethhdr->src.addr[3], ethhdr->src.addr[4], ethhdr->src.addr[5]);
rt_kprintf("[dst_mac:%02x %02x %02x %02x %02x %02x ]\r\n", ethhdr->dest.addr[0], ethhdr->dest.addr[1], ethhdr->dest.addr[2], ethhdr->dest.addr[3], ethhdr->dest.addr[4], ethhdr->dest.addr[5]);

}
kuailedeluojie
kuailedeluojie 2019-08-05
This guy hasn't written anything yet
shadowliang 发表于 2019-8-5 15:30
关于ipv6组播包是否被板子接收到,可以参考一下以下的方法,在网络的接收函数中,如果是使用wifi通信中的在 ...


感谢关注和回复,ipv6的问题还没有得到解决,我的是用网线连接的也可以用WiFi通信的代码打印信息吗?
kuailedeluojie
kuailedeluojie 2019-08-05
This guy hasn't written anything yet
shadowliang 发表于 2019-8-5 15:20
不知道楼主的问题解决了没,关于IPv6,最近刚好有接触到局域网接收IPv6组播包的需求,分享一下个人的实现方 ...


我发现我的bsp目录下面并没有这个文件
aozima
aozima 2019-08-05
拒绝白嫖,拒绝键盘侠!
不管网线光纤还是wifi,数据包都是一样的。
请检查电脑发出的包,板子是否有收到。

组播需要设置过滤器,调试时可以允许所有包,STM32是把 MACFFR 的31位RA(recv all)设置为1,就可以放行所有包。
shadowliang
shadowliang 2019-08-05
This guy hasn't written anything yet
kuailedeluojie 发表于 2019-8-5 15:37
感谢关注和回复,ipv6的问题还没有得到解决,我的是用网线连接的也可以用WiFi通信的代码打印信息吗? ...


不知道楼主用的是什么板子呢?如果是stm32系列的板子,可以在bsp的下面drv_eth.c找到dump_hex的函数,通过开关//#define ETH_RX_DUMP来打印板子接收的网络数据,在该文件中的网络接收函数struct pbuf *rt_stm32_eth_rx(rt_device_t dev)里面添加判断是否接收到ipv6组播包的方法。
kuailedeluojie
kuailedeluojie 2019-08-05
This guy hasn't written anything yet
aozima 发表于 2019-8-5 15:43
不管网线光纤还是wifi,数据包都是一样的。
请检查电脑发出的包,板子是否有收到。



你好,请问设置组播过滤器的函数是哪个,我用的不是stm的板子,是lpc178,默认的网卡驱动程序我没有动
kuailedeluojie
kuailedeluojie 2019-08-05
This guy hasn't written anything yet
shadowliang 发表于 2019-8-5 15:48
不知道楼主用的是什么板子呢?如果是stm32系列的板子,可以在bsp的下面drv_eth.c找到dump_hex的函数,通 ...


我用的是lpc178x的板子
#if LWIP_IPV6_MLD
netif->flags |= NETIF_FLAG_MLD6;

/*
* For hardware/netifs that implement MAC filtering.
* All-nodes link-local is handled by default, so we must let the hardware know
* to allow multicast packets in.
* Should set mld_mac_filter previously. */
if (netif->mld_mac_filter != NULL)
{
ip6_addr_t ip6_allnodes_ll;
ip6_addr_set_allnodes_linklocal(&ip6_allnodes_ll);
netif->mld_mac_filter(netif, &ip6_allnodes_ll, NETIF_ADD_MAC_FILTER);
}


这段代码是不是设置过滤的呢

撰写答案

请登录后再发布答案,点击登录
关注者
0
被浏览
1.1k

发布
问题

分享
好友

手机
浏览

扫码手机浏览