2023-09-08 Android 12(S) IPV4優(yōu)先IPV6(優(yōu)先使用IPv4地址)的實(shí)現(xiàn)

根據(jù)RFC 6724中 規(guī)定 android 會優(yōu)先選擇IPv6 地址而不是 IPv4 地址闷盔,當(dāng)整個網(wǎng)絡(luò)中,同時支持IPv4和IPv6 地址時磕潮,設(shè)備中的應(yīng)用請求服務(wù)器DNS時吵取,會優(yōu)先返回IPv6地址嵌屎。

假如IPv6服務(wù)器支持內(nèi)容不夠完善赠制,則應(yīng)用顯示內(nèi)容會與IPv4服務(wù)器不一致浮定,甚至有問題征讲。

因此有需求是定制設(shè)備平臺扇苞,使得 IPV4優(yōu)先IPV6欺殿,主要修改2個地方:

1. 當(dāng)設(shè)備或平臺連接網(wǎng)絡(luò)時寄纵,原來是先請求ipv6地址,再請求ipv4地址祈餐,這樣會使用應(yīng)用會先拿到ipv6地址屏箍,所以需要調(diào)整順序仓坞,讓ipv4先請求dhcp地址货裹,再請求ipv6氨距。


2. DNS域名解析時,調(diào)整解析DNS的優(yōu)先順序蜒谤,即先解析IPv4地址山宾,再解析IPv6地址,注:android 12在DnsResolver代碼中鳍徽。


接下來對這2個修改點(diǎn)進(jìn)行逐一修改并說明资锰。

1. 當(dāng)設(shè)備或平臺連接網(wǎng)絡(luò)時,原來是先請求ipv6地址阶祭,再請求ipv4地址绷杜,這樣會使用應(yīng)用會先拿到ipv6地址,所以需要調(diào)整順序濒募,讓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
//用于區(qū)別自定義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域名解析時瑰剃,調(diào)整解析DNS的優(yōu)先順序齿诉,即先解析IPv4地址,再解析IPv6地址晌姚,注:android 12在DnsResolver代碼中粤剧。

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解析出來的地址進(jìn)行排序,IPv4(return 35) 比IPv6(改為return 34)更高優(yōu)先級
-            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);
             }
//調(diào)整順序挥唠,先請求IPv4對應(yīng)的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;
     }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宝磨,隨后出現(xiàn)的幾起案子弧关,更是在濱河造成了極大的恐慌,老刑警劉巖懊烤,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梯醒,死亡現(xiàn)場離奇詭異宽堆,居然都是意外死亡腌紧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門畜隶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壁肋,“玉大人号胚,你說我怎么就攤上這事〗牛” “怎么了猫胁?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長跛锌。 經(jīng)常有香客問我弃秆,道長,這世上最難降的妖魔是什么髓帽? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任菠赚,我火速辦了婚禮,結(jié)果婚禮上郑藏,老公的妹妹穿的比我還像新娘衡查。我一直安慰自己,他們只是感情好必盖,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布拌牲。 她就那樣靜靜地躺著,像睡著了一般歌粥。 火紅的嫁衣襯著肌膚如雪塌忽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天阁吝,我揣著相機(jī)與錄音砚婆,去河邊找鬼。 笑死突勇,一個胖子當(dāng)著我的面吹牛装盯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甲馋,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼埂奈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了定躏?” 一聲冷哼從身側(cè)響起账磺,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痊远,沒想到半個月后垮抗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碧聪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年冒版,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逞姿。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡辞嗡,死狀恐怖捆等,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情续室,我是刑警寧澤栋烤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站挺狰,受9級特大地震影響明郭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丰泊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一达址、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趁耗,春花似錦沉唠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至罢屈,卻和暖如春嘀韧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缠捌。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工锄贷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人曼月。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓谊却,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哑芹。 傳聞我的和親對象是個殘疾皇子炎辨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容