[T-Mobile LG G3] motoridersd:
T-Mobile has gone full IPV6 on the G3 (or maybe it was LG, or both). You will notice that you are not able to get an IPV4 only APN to work on T-Mobile's network, with epc, fast or pcweb APNs. The phone always connects to IPV6, and then uses NAT64 to provide IPV4 service to IPV4 only applications on the phone, and 464XLAT to communicate to IPV4 networks on the internet.

EDIT: I have confirmed that using epc.tmobile.com and forcing to IPV4 will work. This explains why using this combination makes data roaming work abroad. It seems like it's the fast.t-mobile.com APN that is forced to IPV6 only on the G3.

Here's a log of the data connection being set up on a T-Mobile G3 when using fast.t-mobile.com

D/libc ( 314): _dns_getaddrinfo: query_ipv4=1, query_ipv6=1
I/clatd (19471): Detected NAT64 prefix 2607:7700:0:a::/96
W/clatd (19471): ifmtu=1440
W/clatd (19471): ipv4mtu now set to = 1412
I/Vold ( 308): [LGE][VOLD][NetlinkHandler.cpp][onEvent()] subsys:net, action:1
I/Vold ( 308): [LGE][VOLD][NetlinkHandler.cpp][onEvent()] subsys:queues, action:1
I/Vold ( 308): [LGE][VOLD][NetlinkHandler.cpp][onEvent()] subsys:queues, action:1
I/Vold ( 308): [LGE][VOLD][NetlinkHandler.cpp][onEvent()] subsys:net, action:1
I/Vold ( 308): [LGE][VOLD][NetlinkHandler.cpp][onEvent()] subsys:queues, action:1
D/DHCP ( 314): ifc_init_returning 0
D/DHCP ( 314): ifc_close
I/Vold ( 308): [LGE][VOLD][NetlinkHandler.cpp][onEvent()] subsys:queues, action:1
I/Nat464Xlat( 1073): interface clat4 added, mIsRunning = false -> true
I/Nat464Xlat( 1073): Adding stacked link. tracker LP: {InterfaceName: rmnet0 LinkAddresses: [2607:fb90:2119:99f2:3c3d:1928:98a6:3341/64,] Routes: [::/0 -> fe80::4168:e92e:6776:e831,] DnsAddresses: [fd00:976a::9,] Domains: null MTU: 1440 Stacked: [ [{InterfaceName: clat4 LinkAddresses: [192.0.0.4/32,] Routes: [0.0.0.0/0 -> 192.0.0.4,] DnsAddresses: [] Domains: null MTU: 0} ],] }
D/ConnectivityServiceHSM( 1073): Actual State: DefaultConnectivityState, Current State: DefaultConnectivityState.processMessage what=458753
D/ConnectivityServiceHSM( 1073): send additional Connectivity Action
I/Nat464Xlat( 1073): sending message to ConnectivityService: { when=-9h45m41s893ms what=458753 obj=NetworkInfo: type: mobile[LTE], state: CONNECTED/CONNECTED, reason: connected, extra: fast.t-mobile.com, roaming: false, failover: true, isAvailable: true, smCause: 0, isConnectedToProvisioningNetwork: false target=com.android.internal.util.StateMachine$SmHandler }
D/QcConnectivityService( 1073): makeGeneralIntent(): SM Cause is added to CONNECTIVITY_ACTION intent for [mobile], SM cause : 0
D/LocSvc_java( 1073): LocatioService.java action : android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE
D/ConnectivityServiceHSM( 1073): Actual State: DefaultConnectivityState, Current State: DefaultConnectivityState.processMessage what=5003
D/DHCP ( 314): ifc_init_returning 0
I/TelephonyProvider( 1434): getPreferredApnId: subscription=0
D/QcConnectivityService( 1073): makeGeneralIntent(): SM Cause is added to CONNECTIVITY_ACTION intent for [mobile], SM cause : 0
D/QcConnectivityService( 1073): handleConnectivityChange:0 is conntected
D/QcConnectivityService( 1073): [DATA]ePDG Dual Connectivity feature : false
D/BubblePopupHelper( 1217): isShowingBubblePopup : false
I/iptables( 314): iptables: Index of insertion too big.
I/iptables( 314): iptables terminated by exit(1)
E/BandwidthController( 314): runIptablesCmd(): res=1 status=256 failed /system/bin/iptables -I bw_INPUT 2 -i rmnet0 --jump bw_costly_rmnet0
I/iptables( 314): iptables: Index of insertion too big.
I/iptables( 314): iptables terminated by exit(1)
E/BandwidthController( 314): runIptablesCmd(): res=1 status=256 failed /system/bin/iptables -I bw_OUTPUT 2 -o rmnet0 --jump bw_costly_rmnet0
I/LGEPowerSaver( 341): GBM state is 1
I/ViewRootImpl( 1217): ViewRoot's Touch Event : ACTION_DOWN
E/BandwidthController( 314): Failed set quota rule
E/BandwidthController( 314): No such iface rmnet0 to delete
F/NetworkPolicy( 1073): problem setting interface quota
F/NetworkPolicy( 1073): java.lang.IllegalStateException: command '1039 bandwidth setiquota rmnet0 9223372036854775807' failed with '400 1039 Bandwidth command failed'
F/NetworkPolicy( 1073):	at com.android.server.NetworkManagementService.setInterfaceQuota(NetworkManagementService.java:1978)
F/NetworkPolicy( 1073):	at com.android.server.net.NetworkPolicyManagerService.setInterfaceQuota(NetworkPolicyManagerService.java:2318)
F/NetworkPolicy( 1073):	at com.android.server.net.NetworkPolicyManagerService.updateNetworkRulesLocked(NetworkPolicyManagerService.java:1359)
F/NetworkPolicy( 1073):	at com.android.server.net.NetworkPolicyManagerService.access$1300(NetworkPolicyManagerService.java:192)
F/NetworkPolicy( 1073):	at com.android.server.net.NetworkPolicyManagerService$16.onReceive(NetworkPolicyManagerService.java:1155)
F/NetworkPolicy( 1073):	at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:782)
F/NetworkPolicy( 1073):	at android.os.Handler.handleCallback(Handler.java:733)
F/NetworkPolicy( 1073):	at android.os.Handler.dispatchMessage(Handler.java:95)
F/NetworkPolicy( 1073):	at android.os.Looper.loop(Looper.java:136)
F/NetworkPolicy( 1073):	at android.os.HandlerThread.run(HandlerThread.java:61)
F/NetworkPolicy( 1073): Caused by: com.android.server.NativeDaemonConnector$NativeDaemonFailureException: command '1039 bandwidth setiquota rmnet0 9223372036854775807' failed with '400 1039 Bandwidth command failed'
F/NetworkPolicy( 1073):	at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:413)
F/NetworkPolicy( 1073):	at com.android.server.NativeDaemonConnector.executeForList(NativeDaemonConnector.java:340)
F/NetworkPolicy( 1073):	at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:305)
F/NetworkPolicy( 1073):	at com.android.server.NetworkManagementService.setInterfaceQuota(NetworkManagementService.java:1975)
F/NetworkPolicy( 1073):	... 9 more
D/QcConnectivityService( 1073): handleConnectivityChange: address are the same reset per doReset linkProperty[0]: resetMask=0
D/QcConnectivityService( 1073): RoutesChanged, Remove old dns /fd00:976a::9
E/NetworkManagementService( 1073): [LGE_DATA]isHostRoute = true isDefaultRoute = false
V/ ( 314): [LGE_DATA]route append fe80::4168:e92e:6776:e831 via :: dev rmnet0 table 254 metric 512
V/ ( 314): RouteController
D/QcConnectivityService( 1073): RoutesChanged, Add new dns /fd00:976a::9
V/ ( 314): RouteController
V/ ( 314): RouteController
W/NetworkManagementService( 1073): route cmd failed:
W/NetworkManagementService( 1073): com.android.server.NativeDaemonConnector$NativeDaemonFailureException: command '1042 route add append v6 rmnet0 512 fe80::4168:e92e:6776:e831 ::' failed with '400 1042 route append fe80::4168:e92e:6776:e831 via :: dev rmnet0 table 254 metric 512: RTNETLINK answers: Invalid argument
W/NetworkManagementService( 1073): '
W/NetworkManagementService( 1073):	at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:413)
W/NetworkManagementService( 1073):	at com.android.server.NativeDaemonConnector.executeForList(NativeDaemonConnector.java:340)
W/NetworkManagementService( 1073):	at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:305)
W/NetworkManagementService( 1073):	at com.android.server.NativeDaemonConnector.execute(NativeDaemonConnector.java:290)
W/NetworkManagementService( 1073):	at com.android.server.NetworkManagementService.appendRouteWithMetric(NetworkManagementService.java:2757)
W/NetworkManagementService( 1073):	at com.android.server.QcConnectivityService.modifyRoute(QcConnectivityService.java:2995)
W/NetworkManagementService( 1073):	at com.android.server.QcConnectivityService.modifyRoute(QcConnectivityService.java:2975)
W/NetworkManagementService( 1073):	at com.android.server.QcConnectivityService.modifyRouteToAddress(QcConnectivityService.java:2933)
W/NetworkManagementService( 1073):	at com.android.server.QcConnectivityService.addRouteToAddress(QcConnectivityService.java:2903)
W/NetworkManagementService( 1073):	at com.android.server.QcConnectivityService.updateRoutes(QcConnectivityService.java:4813)
W/NetworkManagementService( 1073):	at com.android.server.QcConnectivityService.handleConnectivityChange(QcConnectivityService.java:4637)
W/NetworkManagementService( 1073):	at com.android.server.QcConnectivityService.access$6100(QcConnectivityService.java:244)
W/NetworkManagementService( 1073):	at com.android.server.QcConnectivityService$ConnectivityServiceHSM$DefaultConnectivityState.processMessage(QcConnectivityService.java:6047)
W/NetworkManagementService( 1073):	at com.android.internal.util.StateMachine$SmHandler.processMsg(StateMachine.java:966)
W/NetworkManagementService( 1073):	at com.android.internal.util.StateMachine$SmHandler.handleMessage(StateMachine.java:789)
W/NetworkManagementService( 1073):	at android.os.Handler.dispatchMessage(Handler.java:102)
W/NetworkManagementService( 1073):	at android.os.Looper.loop(Looper.java:136)
W/NetworkManagementService( 1073):	at android.os.HandlerThread.run(HandlerThread.java:61)
E/NetworkManagementService( 1073): [LGE_DATA]isHostRoute = true isDefaultRoute = false
V/ ( 314): [LGE_DATA]route append fd00:976a::9 via fe80::4168:e92e:6776:e831 dev rmnet0 table 254 metric 512
V/ ( 314): RouteController
D/QcConnectivityService( 1073): Adding v6 fe80::4168:e92e:6776:e831/128 -> :: for interface rmnet0 with metric 512
V/ ( 314): RouteController
V/ ( 314): RouteController
V/ ( 314): [LGE_DATA]res empty
V/ ( 314): RouteController
I/ViewRootImpl( 1217): ViewRoot's Touch Event : ACTION_UP
D/DHCP ( 314): ifc_init_returning 0
D/DHCP ( 314): ifc_close
D/DHCP ( 314): ifc_add_route(clat4, 192.0.0.4, 32, 0.0.0.0) = 0
D/DHCP ( 314): ifc_init_returning 0
D/DHCP ( 314): ifc_close
D/DHCP ( 314): ifc_add_route(clat4, 0.0.0.0, 0, 192.0.0.4) = 0
D/ConnectivityServiceHSM( 1073): Actual State: DefaultConnectivityState, Current State: DefaultConnectivityState.processMessage what=112
D/ConnectivityServiceHSM( 1073): Actual State: DefaultConnectivityState, Current State: DefaultConnectivityState.processMessage what=112
D/ConnectivityServiceHSM( 1073): Actual State: DefaultConnectivityState, Current State: DefaultConnectivityState.processMessage what=112
D/ConnectivityServiceHSM( 1073): Actual State: DefaultConnectivityState, Current State: DefaultConnectivityState.processMessage what=112
D/QcConnectivityService( 1073): Adding v6 fd00:976a::9/128 -> fe80::4168:e92e:6776:e831 for interface rmnet0 with metric 512
D/QcConnectivityService( 1073): Route attribute is null, Adding 192.0.0.4/32 -> 0.0.0.0 for interface clat4
D/QcConnectivityService( 1073): Route attribute is null, Adding 0.0.0.0/0 -> 192.0.0.4 for interface clat4
D/Nat464Xlat( 1073): requiresClat: netType=0, hasIPv4Address=false
E/Nat464Xlat( 1073): startClat: already started
D/QcConnectivityService( 1073): CLAT started, enable dns query A and AAAA types for netType=0
D/MobileDataStateTracker( 1073): default: setPolicyDataEnable(enabled=true)
D/MobileDataStateTracker( 1073): default: setPolicyDataEnable(enabled=true)