Android 12(S) IPV4优先IPV6(优先使用IPv4地址)的实现

这篇具有很好参考价值的文章主要介绍了Android 12(S) IPV4优先IPV6(优先使用IPv4地址)的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

根据RFC 6724中 规定 android 会优先选择IPv6 地址而不是 IPv4 地址,当整个网络中,同时支持IPv4和IPv6 地址时,设备中的应用请求服务器DNS时,会优先返回IPv6地址。

假如IPv6服务器支持内容不够完善,则应用显示内容会与IPv4服务器不一致,甚至有问题。

因此有需求是定制设备平台,使得 IPV4优先IPV6,主要修改2个地方:

1. 当设备或平台连接网络时,原来是先请求ipv6地址,再请求ipv4地址,这样会使用应用会先拿到ipv6地址,所以需要调整顺序,让ipv4先请求dhcp地址,再请求ipv6。


2. DNS域名解析时,调整解析DNS的优先顺序,即先解析IPv4地址,再解析IPv6地址,注:android 12在DnsResolver代码中。


接下来对这2个修改点进行逐一修改并说明。

1. 当设备或平台连接网络时,原来是先请求ipv6地址,再请求ipv4地址,这样会使用应用会先拿到ipv6地址,所以需要调整顺序,让ipv4先请求dhcp地址,再请求ipv6。

文件:packages/modules/NetworkStack/src/android/net/ip/IpClient.java

修改差异如下:

--- a/modules/NetworkStack/src/android/net/ip/IpClient.java
+++ b/modules/NetworkStack/src/android/net/ip/IpClient.java
@@ -161,6 +161,8 @@
     private final NetworkInformationShim mShim = NetworkInformationShimImpl.newInstance();
     private final IpProvisioningMetrics mIpProvisioningMetrics = new IpProvisioningMetrics();
     private final NetworkQuirkMetrics mNetworkQuirkMetrics;
+    //CN project let get ipv4 first and then ipv6, tiangui.tang @2023.9.7
//用于区别自定义code与AOSP
+    private final boolean bStartIPv6AfterIPv4 = true;
 
     /**
      * Dump all state machine and connectivity packet logs to the specified writer.
@@ -1734,7 +1736,21 @@
         recordMetric(failureType);
         mCallback.onProvisioningFailure(mLinkProperties);
     }
+    private void enqueueJumpToStoppingState(final DisconnectCode code) {
+        deferMessage(obtainMessage(CMD_JUMP_RUNNING_TO_STOPPING, code.getNumber()));
+    }
+    private void startIPv6AfterIPv4() {
+        if (bStartIPv6AfterIPv4 == false) {
+            return;
+        }
+        Log.d(mTag, "startIPv6AfterIPv4");
 
+        if (mConfiguration.mEnableIPv6 && !startIPv6()) {
+            doImmediateProvisioningFailure(IpManagerEvent.ERROR_STARTING_IPV6);
+            enqueueJumpToStoppingState(DisconnectCode.DC_ERROR_STARTING_IPV6);
+            return;
+        }
+    }
     private boolean startIPv4() {
         // If we have a StaticIpConfiguration attempt to apply it and
         // handle the result accordingly.
@@ -1744,6 +1760,7 @@
             } else {
                 return false;
             }
+            startIPv6AfterIPv4();
         } else {
             if (mDhcpClient != null) {
                 Log.wtf(mTag, "DhcpClient should never be non-null in startIPv4()");
@@ -2229,7 +2246,7 @@
             mPacketTracker = createPacketTracker();
             if (mPacketTracker != null) mPacketTracker.start(mConfiguration.mDisplayName);
 
-            if (mConfiguration.mEnableIPv6 && !startIPv6()) {
+            if ((bStartIPv6AfterIPv4 == false) && mConfiguration.mEnableIPv6 && !startIPv6()) {
                 doImmediateProvisioningFailure(IpManagerEvent.ERROR_STARTING_IPV6);
                 enqueueJumpToStoppingState(DisconnectCode.DC_ERROR_STARTING_IPV6);
                 return;
@@ -2414,6 +2431,7 @@
                 }
 
                 case EVENT_DHCPACTION_TIMEOUT:
+                    startIPv6AfterIPv4();
                     stopDhcpAction();
                     break;
 
@@ -2431,6 +2449,7 @@
 
                 case DhcpClient.CMD_CONFIGURE_LINKADDRESS: {
                     final LinkAddress ipAddress = (LinkAddress) msg.obj;
+                    startIPv6AfterIPv4();
                     if (mInterfaceCtrl.setIPv4Address(ipAddress)) {
                         mDhcpClient.sendMessage(DhcpClient.EVENT_LINKADDRESS_CONFIGURED);
                     } else {


2. DNS域名解析时,调整解析DNS的优先顺序,即先解析IPv4地址,再解析IPv6地址,注:android 12在DnsResolver代码中。文章来源地址https://www.toymoban.com/news/detail-776746.html

diff --git a/modules/DnsResolver/getaddrinfo.cpp b/modules/DnsResolver/getaddrinfo.cpp

--- a/modules/DnsResolver/getaddrinfo.cpp
+++ b/modules/DnsResolver/getaddrinfo.cpp
@@ -1147,7 +1147,8 @@
             return 1;
         } else {
             /* All other IPv6 addresses, including global unicast addresses. */
//DNS解析出来的地址进行排序,IPv4(return 35) 比IPv6(改为return 34)更高优先级
-            return 40;
+            LOG(DEBUG) << __func__ << " ttgctt force 34 for ipv6";
+            return 34;
         }
     } else {
         return 1;
@@ -1406,16 +1407,17 @@
                 query_ipv6 = have_ipv6(netcontext->app_mark, netcontext->uid);
                 query_ipv4 = have_ipv4(netcontext->app_mark, netcontext->uid);
             }
//调整顺序,先请求IPv4对应的DNS,再请求IPv6
-            if (query_ipv6) {
-                q.qtype = T_AAAA;
-                if (query_ipv4) {
+            //query_ipv6 = 0;
+            if (query_ipv4) {
+                q.qtype = T_A;
+                if (query_ipv6) {
                     q.next = &q2;
                     q2.name = name;
                     q2.qclass = C_IN;
-                    q2.qtype = T_A;
+                    q2.qtype = T_AAAA;
                 }
-            } else if (query_ipv4) {
-                q.qtype = T_A;
+            } else if (query_ipv6) {
+                q.qtype = T_AAAA;
             } else { 
                 return EAI_NODATA;
             }
@@ -1452,7 +1454,7 @@
         cur->ai_next = ai;
         while (cur && cur->ai_next) cur = cur->ai_next;
     }
     if (q.next) {
         ai = getanswer(q2.answer, q2.n, q2.name, q2.qtype, pai, &he);
         if (ai) cur->ai_next = ai;
     }

到了这里,关于Android 12(S) IPV4优先IPV6(优先使用IPv4地址)的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用docker阿里云域名动态解析IPV6和IPV4地址

    现在通信运营商一般不会再单独分配动态公网ipv4地址,ipv6地址的启用给我们带来了希望,现在给大家介绍用docker方式动态解析IPV6地址。 准备工作: 1、树莓派、台式机或者软路由都可以; 2、光猫开启ipv6功能,在这里不再赘述; 3、在电脑安装docker; 4、在阿里云网站上购买

    2024年02月02日
    浏览(51)
  • centos nginx配置ipv4和ipv6的地址都可以访问同一个网站

    在 Nginx 中配置使 IPv4 和 IPv6 地址都可以访问同一个网站相对简单。只需要确保 Nginx 配置文件正确地配置了监听 IPv4 和 IPv6 地址的监听器即可。 打开你的 Nginx 配置文件,通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/ 目录下。 编辑配置文件,添加以下内容来配置监听 IPv4 和 IP

    2024年02月12日
    浏览(54)
  • 软考系分之计算机网络IP地址的表示(IPv4及IPv6)

      本篇介绍计算机网络中的IP地址,在网络工程师的考试中,IP地址是必考内容,但是在系统分析师的考察中,IP地址的考查重点,应该就是IPv4和IPv6的相关概念和IPv4中简单的子网划分计算了。 2.1 IPv4分类表示   IP地址中,机器存放IPv4是32位二进制代码,每隔8位插一个空格

    2024年01月18日
    浏览(51)
  • IPv6 over IPv4

    IPv6 over IPv4隧道可实现IPv6网络孤岛之间通过IPv4网络互连。由于IPv4地址的枯竭和IPv6的先进性,IPv4过渡为IPv6势在必行。因为IPv6与IPv4的不兼容性,所以需要对原有的IPv4设备进行替换。但是如果贸然将IPv4设备大量替换所需成本会非常巨大,且现网运行的业务也会中断,显然并不

    2024年02月15日
    浏览(48)
  • IPv4,IPv6,TCP,路由

    ip : 网际协议,IP协议能让世界上任意两台计算机之间进行通信。 IP协议的三大功能: 寻址和路由 传递服务:不可靠(尽最大努力交付传输数据包),可靠性由上层协议提供;无连接 数据包分片重组 OSI七层架构(理论) 和 TCP/IP的4层架构(实现) IP的主要作用是在复杂的网络

    2024年02月11日
    浏览(53)
  • IP 报文格式详解(IPv4、IPv6)

    中文名 英文名 长度 bit(位) 解释 版本 Version 4 IP 协议版本号,固定为 4 首部长度 Internet Header Length, IHL 4 以 4 字节 为单位,最小值 5(20Byte) ,最大值 15(60Byte) 服务类型 Type of Service, TOS 8 几乎不用 总长度 Total Length 16 整个数据报的长度, 2 16 − 1 = 65535 2^{16} -1 = 65535

    2024年02月10日
    浏览(42)
  • 前端校验:IPV4、IPV6格式正则校验。

    1、标准 IPV4 校验,示例:110.220.39.103 2、标准 IPV6 校验,示例:2001:0db8:85a3:0000:0000:8a2e:0370:7334 3、标准 IPV4/掩码 校验,示例:192.0.2.235/22 4、标准 IPV6/掩码 校验,示例:2001:db8::/32 5、标准 IPV4- IPV4 校验,示例:10.220.39.1-10.220.39.103 6、标准 IPV6- IPV6 校验,示例:2001:db8::1-2001:db

    2024年04月12日
    浏览(43)
  • 科普知识:IPv4 vs IPv6

    这几天关于IPv4地址耗尽的报道几乎天天有啊……这东西倒底和我们的生活有什么关系呢? IPv4是指IP(Internet Protocol)协议第4版,IPv6就是第6版了(至于第5版是什么,有兴趣的同学可以自己查查)。IP协议是网络通信中的一个基础协议。每一个连上网(无论是局域网还是英特网)

    2024年02月08日
    浏览(63)
  • IPv6 over IPv4隧道配置举例

    组网需求 如图1所示,两台IPv6主机分别通过SwitchA和SwitchC与IPv4骨干网络连接,客户希望两台IPv6主机能通过IPv4骨干网互通。 图1 配置IPv6 over IPv4手动隧道组网图 配置思路 配置IPv6 over IPv4手动隧道的思路如下: 配置IPv4网络。配置接口的IPv4地址和静态路由,使SwitchA、SwitchB和Sw

    2024年02月14日
    浏览(44)
  • IPV6(IPV6,RIPng的配置以及手工配置IPV4隧道)

    目录 实验一:IPv6的基本配置 实验二:RIPng基本配置 RIPng RIPng的工作机制 实验三:手工配置IPV4隧道 实验一:IPv6的基本配置 案例如下:  各部分配置如下  配置路由器RTA  配置路由器RTB 此时PC-10-1能ping通RTA,不能ping通PC-20-1  此时PC-20-1能ping通RTB,不能ping通PC-10-1 RTA能与RTB进

    2024年02月07日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包