diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt
index 3d9bd067d..ddc341c44 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidClient.kt
@@ -35,11 +35,11 @@ internal open class QQAndroidClient(
     var ssoSequenceId: Int = 0
     var openAppId: Long = 715019303L
 
-    var ipv6NetType: Int = TODO()
-
     val apkVersionName: ByteArray = "8.2.0".toByteArray()
 
-    val appClientVersion: Int = TODO()
+    val appClientVersion: Int = 0
+
+    var networkType: NetworkType = NetworkType.WIFI
 
     val apkSignatureMd5: ByteArray = TODO()
 
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/Tlv.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/Tlv.kt
index 8f61cf347..b495a6ef7 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/Tlv.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/Tlv.kt
@@ -4,6 +4,7 @@ import kotlinx.io.core.BytePacketBuilder
 import kotlinx.io.core.ByteReadPacket
 import kotlinx.io.core.toByteArray
 import kotlinx.io.core.writeFully
+import net.mamoe.mirai.qqandroid.utils.NetworkType
 import net.mamoe.mirai.utils.currentTime
 import net.mamoe.mirai.utils.io.*
 import net.mamoe.mirai.utils.md5
@@ -29,15 +30,14 @@ inline class LoginType(
 }
 
 @Suppress("MemberVisibilityCanBePrivate")
-fun BytePacketBuilder.t1(uin: Long, ip: ByteArray) {
-    require(ip.size == 4)
+fun BytePacketBuilder.t1(uin: Long, ip: String) {
     writeShort(0x1)
     writeShortLVPacket {
         writeShort(1) // _ip_ver
         writeInt(Random.nextInt())
         writeInt(uin.toInt())
         writeTime()
-        writeFully(ip)
+        writeIP(ip)
         writeShort(0)
     } shouldEqualsTo 20
 }
@@ -83,9 +83,9 @@ fun BytePacketBuilder.t18(
 fun BytePacketBuilder.t106(
     appId: Long,
     subAppId: Long,
-    appClientVersion: Int,
+    appClientVersion: Int = 0,
     uin: Long,
-    ipAddress: ByteArray,
+    ipAddress: String,
     n5_always_1: Int = 1,
     passwordMd5: ByteArray,
     salt: Long,
@@ -112,7 +112,7 @@ fun BytePacketBuilder.t106(
             }
 
             writeTime()
-            writeFully(ipAddress)
+            writeIP(ipAddress)
             writeByte(n5_always_1.toByte())
             writeFully(passwordMd5)
             writeFully(tgtgtKey)
@@ -130,7 +130,7 @@ fun BytePacketBuilder.t106(
             }
             writeInt(subAppId.toInt())
             writeInt(loginType.value)
-            writeShortLVByteArray(uinAccount)
+            writeShortLVByteArray(uinAccount) // TODO check if should be empty byte[]
         }
     } shouldEqualsTo 98
 }
@@ -234,7 +234,7 @@ fun BytePacketBuilder.t144(
     // t124
     osType: ByteArray = "android".toByteArray(),
     osVersion: ByteArray,
-    ipv6NetType: Int,
+    networkType: NetworkType,
     simInfo: ByteArray,
     unknown: ByteArray,
     apn: ByteArray = "wifi".toByteArray(),
@@ -256,7 +256,7 @@ fun BytePacketBuilder.t144(
         encryptAndWrite(tgtgtKey) {
             t109(androidId)
             t52d(androidDevInfo)
-            t124(osType, osVersion, ipv6NetType, simInfo, unknown, apn)
+            t124(osType, osVersion, networkType, simInfo, unknown, apn)
             t128(isGuidFromFileNull, isGuidAvailable, isGuidChanged, guidFlag, buildModel, guid, buildBrand)
             t16e(buildModel)
         }
@@ -284,7 +284,7 @@ fun BytePacketBuilder.t52d(
 fun BytePacketBuilder.t124(
     osType: ByteArray = "android".toByteArray(),
     osVersion: ByteArray, // Build.VERSION.RELEASE.toByteArray()
-    ipv6NetType: Int,  //oicq.wlogin_sdk.tools.util#get_network_type
+    networkType: NetworkType,  //oicq.wlogin_sdk.tools.util#get_network_type
     simInfo: ByteArray, // oicq.wlogin_sdk.tools.util#get_sim_operator_name
     unknown: ByteArray,
     apn: ByteArray = "wifi".toByteArray() // oicq.wlogin_sdk.tools.util#get_apn_string
@@ -293,7 +293,7 @@ fun BytePacketBuilder.t124(
     writeShortLVPacket {
         writeShortLVByteArrayLimitedLength(osType, 16)
         writeShortLVByteArrayLimitedLength(osVersion, 16)
-        writeShort(ipv6NetType.toShort())
+        writeShort(networkType.value.toShort())
         writeShortLVByteArrayLimitedLength(simInfo, 16)
         writeShortLVByteArrayLimitedLength(unknown, 32)
         writeShortLVByteArrayLimitedLength(apn, 16)
@@ -414,14 +414,14 @@ fun BytePacketBuilder.t154(
 
 fun BytePacketBuilder.t141(
     simInfo: ByteArray,
-    ipv6NetType: Int,
+    networkType: NetworkType,
     apn: ByteArray
 ) {
     writeShort(0x141)
     writeShortLVPacket {
         writeShort(1) // version
         writeShortLVByteArray(simInfo)
-        writeShort(ipv6NetType.toShort())
+        writeShort(networkType.value.toShort())
         writeShortLVByteArray(apn)
     }
 }
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt
index 37a1dd7d9..220fe6768 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt
@@ -74,7 +74,7 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, Log
                 androidDevInfo = client.device.generateDeviceInfoData(),
                 osType = client.device.osType,
                 osVersion = client.device.version.release,
-                ipv6NetType = client.ipv6NetType,
+                networkType = client.networkType,
                 simInfo = client.device.simInfo,
                 unknown = byteArrayOf(), apn = client.device.apn,
                 isGuidFromFileNull = false,
@@ -97,7 +97,7 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, Log
             // ignored t16a because array5 is null
 
             t154(client.ssoSequenceId)
-            t141(client.device.simInfo, client.ipv6NetType, client.device.apn)
+            t141(client.device.simInfo, client.networkType, client.device.apn)
             t8(2052)
 
             // ignored t511 because domain is null
diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/utils/DeviceInfo.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/utils/DeviceInfo.kt
index bd6d8af2f..d5d2e83be 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/utils/DeviceInfo.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/utils/DeviceInfo.kt
@@ -34,7 +34,7 @@ abstract class DeviceInfo(
 
     abstract val imsiMd5: ByteArray
 
-    abstract val ipAddress: ByteArray
+    abstract val ipAddress: String
 
     abstract val androidId: ByteArray