MTK762x 在桥接模式下不能获取IPv6地址的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bingyu9875/article/details/89554709

MTK762x 在桥接模式下不能获取IPv6地址的问题

参考地址:https://dev.archive.openwrt.org/ticket/20453.html

1. 问题简介

Multicast IPv6 ICMP packets are dropped by built-in RT5350 switch, breaking neighbour discovery

2. 解决方案

The problem I have encountered is basically the exact same thing as described in this previous ticket: ​/ticket/15448.html except that it is happening in a different platform. In my case, I am using the RT5350F CPU with built in switch. The driver for the switch is the file called <openwrt-root>/target/linux/ramips/files/drivers/net/ethernet/ralink/esw_rt3052.c
I am attaching a one-line-modified version that corrects the problem by configuring one register in the CPU differently. Also, I am attaching a screen capture of the relevant datasheet section. Basically, I have set bits 18 to 24 to zeros to enable IPv6 multicast packets to make it to the CPU.
Here is the section I changed:
The following modification by Tom Rodinger
.reg_initval_fct2 = 0x00d6500c, old value

.reg_initval_fct2 = 0x000e500c, fixed value to allow IPv6 multicasts to get to the CPU

Finally, the attached Wireshark screenshot shows that after the fix, the correct neighbour advertisement response is invoked by a neighbour solicitation message.
I believe that this bug affects a number of variants from Ralink that all use this same switch driver. Hopefully you can integrate this fix into trunk.

3. 测试平台说明

软件:openwrt 1505 CC版本
硬件:MT7628NN

4. 补丁文件

--- a/drivers/net/ethernet/ralink/esw_rt3052.c
+++ b/drivers/net/ethernet/ralink/esw_rt3052.c
@@ -1353,7 +1353,9 @@ static const struct switch_dev_ops esw_o
 static struct rt305x_esw_platform_data rt3050_esw_data = {
        /* All ports are LAN ports. */
        .vlan_config            = RT305X_ESW_VLAN_CONFIG_NONE,
-       .reg_initval_fct2       = 0x00d6500c,
+// The following modification by Tom Rodinger
+//     .reg_initval_fct2       = 0x00d6500c,  // old value
+       .reg_initval_fct2       = 0x000e500c,  // fixed value to allow IPv6 multicasts to get to the CPU
        /*
         * ext phy base addr 31, enable port 5 polling, rx/tx clock skew 1,
         * turbo mii off, rgmi 3.3v off

展开阅读全文

获取IPV6地址,但不能访问IPV6网站,仅限WIN7系统

12-19

C:\Users\Eureka>ipconfig/allrnrnWindows IP 配置rnrn 主机名 . . . . . . . . . . . . . : Eureka-PCrn 主 DNS 后缀 . . . . . . . . . . . :rn 节点类型 . . . . . . . . . . . . : 混合rn IP 路由已启用 . . . . . . . . . . : 否rn WINS 代理已启用 . . . . . . . . . : 否rnrn以太网适配器 本地连接:rnrn 连接特定的 DNS 后缀 . . . . . . . :rn 描述. . . . . . . . . . . . . . . : Realtek RTL8168D/8111D 系列 PCI-E 千兆以rn太网 NIC (NDIS 6.20)rn 物理地址. . . . . . . . . . . . . : 00-25-64-F4-6D-7Arn DHCP 已启用 . . . . . . . . . . . : 是rn 自动配置已启用. . . . . . . . . . : 是rn IPv6 地址 . . . . . . . . . . . . : 2001:da8:203:200:496a:15a0:b987:403a(首选rn)rn 临时 IPv6 地址. . . . . . . . . . : 2001:da8:203:200:4c3b:bf38:b6db:77f2(首选rn)rn 本地链接 IPv6 地址. . . . . . . . : fe80::496a:15a0:b987:403a%11(首选)rn IPv4 地址 . . . . . . . . . . . . : 192.168.197.5(首选)rn 子网掩码 . . . . . . . . . . . . : 255.255.255.0rn 获得租约的时间 . . . . . . . . . : 2010年12月19日 10:54:50rn 租约过期的时间 . . . . . . . . . : 2010年12月20日 10:54:43rn 默认网关. . . . . . . . . . . . . : fe80::20f:e2ff:fe31:7fd0%11rn 192.168.197.1rn DHCP 服务器 . . . . . . . . . . . : 192.168.197.1rn DNS 服务器 . . . . . . . . . . . : 2001:da8:202:10::36rn 192.168.197.1rn TCPIP 上的 NetBIOS . . . . . . . : 已启用rnrn隧道适配器 isatap.EC0BC42C-8993-4E82-9B10-4A312AC93C91:rnrn 媒体状态 . . . . . . . . . . . . : 媒体已断开rn 连接特定的 DNS 后缀 . . . . . . . :rn 描述. . . . . . . . . . . . . . . : Microsoft ISATAP Adapterrn 物理地址. . . . . . . . . . . . . : 00-00-00-00-00-00-00-E0rn DHCP 已启用 . . . . . . . . . . . : 否rn 自动配置已启用. . . . . . . . . . : 是rnrn隧道适配器 Teredo Tunneling Pseudo-Interface:rnrn 连接特定的 DNS 后缀 . . . . . . . :rn 描述. . . . . . . . . . . . . . . : Teredo Tunneling Pseudo-Interfacern 物理地址. . . . . . . . . . . . . : 00-00-00-00-00-00-00-E0rn DHCP 已启用 . . . . . . . . . . . : 否rn 自动配置已启用. . . . . . . . . . : 是rn IPv6 地址 . . . . . . . . . . . . : 2001:0:4137:9e76:18ee:eb9:241f:63e7(首选)rnrn 本地链接 IPv6 地址. . . . . . . . : fe80::18ee:eb9:241f:63e7%13(首选)rn 默认网关. . . . . . . . . . . . . :rn TCPIP 上的 NetBIOS . . . . . . . : 已禁用rnrn以上是ipconfig/all的结果,同一个局域网里的XP机器就可以正常访问rnrn同时IPV4是正常的,arp -a所得的结果也是正常的,路由器的IP和MAC是对应的rnrn用WINDOWS自带的诊断工具结果是默认网关不可用rnrn前段时间是正常的,就最近开始不好用了。网上也有人问相关的问题,也是只存在于WIN7系统 论坛

在xp下怎么获取ipv6地址

02-11

我使用如下代码获取当前计算机的ip地址:rn addrinfo m_hins,*m_res = NULL;rn addrinfo *addrNext = NULL;rn memset(&m_hins,0,sizeof(m_hins));rn m_hins.ai_family = AF_UNSPEC;rn rn char host[128];rn memset(host,0,128);rn ::gethostname(host,127);rn int retval = ::getaddrinfo(host,NULL,&m_hins,&m_res);rn if(retval == 0)rn rn addrNext = m_res;rn while (addrNext != NULL) rnrn printf("\tFamily: "); rn switch (addrNext->ai_family) rn case AF_UNSPEC: rn printf("Unspecified\n"); rn break; rn case AF_INET:rn rn printf("AF_INET (IPv4) "); rn struct sockaddr_in *sockaddr_ipv4 = (struct sockaddr_in *) addrNext->ai_addr; rn printf("\tIPv4 address: %s\n",inet_ntoa(sockaddr_ipv4->sin_addr) ); rn rn rn break; rn case AF_INET6: rn rn printf("AF_INET6 (IPv6) "); rnrn LPSOCKADDR sockaddr_ip = (LPSOCKADDR) addrNext->ai_addr; rn DWORD ipbufferlength = 46; rn char ipstringbuffer[46]; rn int iRetval = WSAAddressToStringA(sockaddr_ip, (DWORD) addrNext->ai_addrlen, NULL,ipstringbuffer, &ipbufferlength ); rn if (iRetval) rn printf("WSAAddressToString failed with %u\n", WSAGetLastError() ); rn else rn printf("\tIPv6 address: %s\n", ipstringbuffer); rn rn break;rnrn case AF_NETBIOS: rn printf("AF_NETBIOS (NetBIOS)\n"); rn break; rn default: rn printf("Other %ld\n", addrNext->ai_family); rn break; rn rn rn addrNext = addrNext->ai_next;rn rn freeaddrinfo(m_res);rn rn在win7下面没有问题都可以获取到,但是在xp下面就不行了,ipv6地址只能获取到::1,ipv4地址可以正常获取到。我测试的xp是sp3的,已经安装了ipv6协议,系统以及分配了ipv6地址,并且在cmd下面ipconfig /all,可以看到本机的ipv4和ipv6地址。rn 不知道什么原因造成的,请各位大侠帮忙看看。 论坛

IPv6地址以及IPv6的DNS

11-17

• 随着信息技术的不断进步,互联网在我国得到了迅速的发展。据调查,我国上网人数突破5千万,达到世界第二。互联网上的计算机之间的通信采用IP技术,现在的IP版本是IPv4。但是,随着互联网络规模的迅速扩大,IPv4逐渐暴露出了一些缺陷。为了更好的适应互联网的发展,国际网络标准组织提出了新的IP版本IPv6,它弥补了IPv4的缺陷,是将取而代之的新技术。rnrn IPv6协议具有很多优点。首先,它提供了巨大的地址空间,这实际上是推广IPv6的最大动力。其次,IPv6的地址结构和地址分配采用严格的层次结构,以便于进行地址聚合,从而大大减小了路由器中路由表的规模。再次,IPv6协议支持网络节点的地址自动配置,可以实现即插即用功能。而且, IPv6协议对主机移动性有较好的支持,适合于越来越多的互联网移动应用。另外,IPv6协议在安全性、对多媒体流的支持性等方面都具有超过IPv4的优势。rnrn 互联网上的应用很多,但大都离不开域名系统(DNS)的支持,域名系统的主要作用是用来进行域名与IP地址的转换,即域名解析,比如浏览网站、 Email、FTP等都需要先进行域名解析。IPv6网络中的DNS非常重要,一些IPv6的新特性和DNS的支持密不可分。下面从IPv6 DNS的体系结构、IPv6的地址解析、IPv6地址自动配置和即插即用、IPv4到IPv6的过渡等几方面对IPv6 DNS进行介绍。rnrn (1)IPv6域名系统的体系结构rnrn IPv6网络中的DNS与IPv4的DNS在体系结构上是一致的,都采用树型结构的域名空间。IPv4协议与IPv6协议的不同并不意味着需要单独两套IPv4 DNS体系和IPv6 DNS体系,相反的是,DNS的体系和域名空间必须是一致的,即,IPv4和IPv6共同拥有统一的域名空间。在IPv4到IPv6的过渡阶段,域名可以同时对应于多个IPv4和IPv6的地址。以后随着IPv6网络的普及,IPv6地址将逐渐取代IPv4地址。rnrn (2)DNS对IPv6地址层次性的支持rnrn IPv6可聚合全局单播地址是在全局范围内使用的地址,必须进行层次划分及地址聚合。IPv6全局单播地址的分配方式如下:顶级地址聚合机构 TLA(即大的ISP或地址管理机构)获得大块地址,负责给次级地址聚合机构NLA(中小规模ISP)分配地址,NLA给站点级地址聚合机构SLA(子网)和网络用户分配地址。IPv6地址的层次性在DNS中通过地址链技术可以得到很好的支持。下面从DNS正向地址解析和反向地址解析两方面进行分析。rnrn a. 正向解析rnrn IPv4的地址正向解析的资源记录是“A”记录。IPv6地址的正向解析目前有两种资源记录,即,“AAAA”和“A6”记录。其中, “AAAA”较早提出<4>,它是对“A”记录的简单扩展,由于IP地址由32位扩展到128位,扩大了4倍,所以资源记录由“A”扩大成4 个“A”。“AAAA”用来表示域名和IPv6地址的对应关系,并不支持地址的层次性。rnrn “A6”在RFC2874<5>中提出,它是把一个IPv6地址与多个“A6”记录建立联系,每个“A6”记录都只包含了IPv6地址的一部分,结合后拼装成一个完整的IPv6地址。“A6”记录支持一些“AAAA”所不具备的新特性,如地址聚合,地址更改(Renumber)等。rnrn 首先,“A6”记录方式根据TLA、NLA和SLA的分配层次把128位的IPv6的地址分解成为若干级的地址前缀和地址后缀,构成了一个地址链。每个地址前缀和地址后缀都是地址链上的一环,一个完整的地址链就组成一个IPv6地址。这种思想符合IPv6地址的层次结构,从而支持地址聚合。rnrn 其次,用户在改变ISP时,要随ISP改变而改变其拥有的IPv6地址。如果手工修改用户子网中所有在DNS中注册的地址,是一件非常繁琐的事情。而在用“A6”记录表示的地址链中,只要改变地址前缀对应的ISP名字即可,可以大大减少DNS中资源记录的修改。并且在地址分配层次中越靠近底层,所需要改动的越少。rnrn b. 反向解析rnrn IPv6反向解析的记录和IPv4一样,是“PTR”,但地址表示形式有两种。一种是用 “.”分隔的半字节16进制数字格式(Nibble Format),低位地址在前,高位地址在后,域后缀是“IP6.INT.”。另一种是二进制串(Bit-string)格式,以“\<”开头, 16进制地址(无分隔符,高位在前,低位在后)居中,地址后加“>”,域后缀是“IP6.ARPA.”。半字节16进制数字格式与“AAAA”对应,是对IPv4的简单扩展。二进制串格式与“A6”记录对应,地址也象“A6”一样,可以分成多级地址链表示,每一级的授权用“DNAME”记录。和 “A6”一样,二进制串格式也支持地址层次特性。rnrn 总之,以地址链形式表示的IPv6地址体现了地址的层次性,支持地址聚合和地址更改。但是,由于一次完整的地址解析分成多个步骤进行,需要按照地址的分配层次关系到不同的DNS服务器进行查询。所有的查询都成功才能得到完整的解析结果。这势必会延长解析时间,出错的机会也增加。因此,需要进一步改进DNS地址链功能,提高域名解析的速度才能为用户提供理想的服务。rnrn (3)IPv6中的即插即用与DNSrnrn IPv6协议支持地址自动配置,这是一种即插即用的机制,在没有任何人工干预的情况下,IPv6网络接口可以获得链路局部地址、站点局部地址和全局地址等,并且可以防止地址重复。IPv6支持无状态地址自动配置和有状态地址自动配置两种方式。rnrn IPv6节点通过地址自动配置得到IPv6地址和网关地址。但是,地址自动配置中不包括DNS服务器的自动配置。如何自动发现提供解析服务的DNS服务器也是一个需要解决的问题。正在研究的DNS服务器的自动发现的解决方法可以分为无状态和有状态两类。rnrn 在无状态的方式下,需要为子网内部的DNS服务器配置站点范围内的任播地址。要进行自动配置的节点以该任播地址为目的地址发送服务器发现请求,询问DNS服务器地址、域名和搜索路径等DNS信息。这个请求到达距离最近的DNS服务器,服务器根据请求,回答DNS服务器单播地址、域名和搜索路径等 DNS信息。节点根据服务器的应答配置本机DNS信息,以后的DNS请求就直接用单播地址发送给DNS服务器。rnrn 另外,也可以不用站点范围内的任播地址,而采用站点范围内的多播地址或链路多播地址等。还可以一直用站点范围内的任播地址作为DNS服务器的地址,所有的DNS解析请求都发送给这个任播地址。距离最近的DNS服务器负责解析这个请求,得到解析结果后把结果返回请求节点,而不像上述做法是把DNS 服务器单播地址、域名和搜索路径等DNS信息告诉节点。从网络扩展性,安全性,实用性等多方面综合考虑,第一种采用站点范围内的任播地址作为DNS服务器地址的方式相对较好。rnrn 在有状态的DNS服务器发现方式下,是通过类似DHCP这样的服务器把DNS服务器地址、域名和搜索路径等DNS信息告诉节点。当然,这样做需要额外的服务器。rnrn (4)IPv6过渡阶段与DNSrnrn 在IPv4到IPv6的过渡过程中,作为Internet基础架构的DNS服务也要支持这种网络协议的升级和转换。IPv4和IPv6的DNS记录格式等方面有所不同,为了实现IPv4网络和IPv6网络之间的DNS查询和响应,可以采用应用层网关DNS-ALG结合NAT-PT的方法,在 IPv4和IPv6网络之间起到一个翻译的作用。例如,IPv4的地址域名映射使用“A”记录,而IPv6使用“AAAA”或“A6”记录。那么, IPv4的节点发送到IPv6网络的DNS查询请求是“A”记录,DNS-ALG就把“A”改写成“AAAA”,并发送给IPv6网络中的DNS服务器。当服务器的回答到达DNS-ALG时,DNS-ALG修改回答,把“AAAA”改为“A”,把IPv6地址改成DNS-ALG地址池中的IPv4转换地址,把这个IPv4转换地址和IPv6地址之间的映射关系通知NAT-PT,并把这个IPv4转换地址作为解析结果返回IPv4主机。IPv4主机就以这个IPv4转换地址作为目的地址与实际的IPv6主机通过NAT-PT通信。rn 论坛

vc获取本地ipv6地址的出错?

07-12

#include "IPHelper/Iphlpapi.h"rn#pragma comment(lib, "IPHelper/IPHLPAPI.LIB")rnvoid getLocalIPV6(char *IPAddr)rnrn PIP_ADAPTER_ADDRESSES pAddresses;rn ULONG outBufLen = 0;rn DWORD dwRetVal = 0;rn char buff[100];rn DWORD bufflen=100;rn int addrLen = sizeof(SOCKADDR_STORAGE);rn pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(sizeof(IP_ADAPTER_ADDRESSES));rn // 第一次使用 GetAdaptersAddresses 从 outBufLen 中获取需要的缓冲区大小rn if (GetAdaptersAddresses(AF_INET6, 0, NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW) rn rn free(pAddresses);rn pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(outBufLen);rn rnrn // 第二次调用GetAdaptersAddresses 获取实际想获取的信息.rn if ((dwRetVal = GetAdaptersAddresses(AF_INET6, 0 , NULL, pAddresses, &outBufLen)) == NO_ERROR) rn rn PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses;rn while (pCurrAddresses) rn rn if(pCurrAddresses->FirstUnicastAddress !=NULL)rn rn WSAAddressToString(pCurrAddresses->FirstUnicastAddress->Address.lpSockaddr,rn pCurrAddresses->FirstUnicastAddress->Address.iSockaddrLength,NULL,buff,&bufflen);rn if (strncmp(buff,"fe80",4)==0||strcmp(buff,"::1") ==0)rn rn rn elsern rn memcpy(IPAddr,buff,bufflen);rn return;rn rn rn pCurrAddresses = pCurrAddresses->Next;rn rn rnrnrnrn出错的原因是:rnerror LNK2001: unresolved external symbol _GetAdaptersAddresses@20rnrn网上说是IPHLPAPI.LIB没有加进来,但是我已经加了,还是报错,求高手解决一下。rnrn 论坛

没有更多推荐了,返回首页