Files
frameworks_base/telephony/java/com/android/internal/telephony/DataCallState.java
Wink Saville 32d106e154 Filter out addresses that are 0.
If the address is "any" address, i.e. an address which is all zeros
for both IPv4 and IPv6 ignore it.

Bug: 5073048
Change-Id: I8b9f64103aaffd001114a672375ff5f99616c327
2011-07-25 15:26:56 -07:00

238 lines
8.7 KiB
Java

/*
* Copyright (C) 2009 Qualcomm Innovation Center, Inc. All Rights Reserved.
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkUtils;
import android.net.RouteInfo;
import android.os.SystemProperties;
import android.util.Log;
import com.android.internal.telephony.DataConnection.FailCause;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* This is RIL_Data_Call_Response_v5 from ril.h
* TODO: Rename to DataCallResponse.
*/
public class DataCallState {
private final boolean DBG = true;
private final String LOG_TAG = "GSM";
public int version = 0;
public int status = 0;
public int cid = 0;
public int active = 0;
public String type = "";
public String ifname = "";
public String [] addresses = new String[0];
public String [] dnses = new String[0];
public String[] gateways = new String[0];
public int suggestedRetryTime = -1;
/**
* Class returned by onSetupConnectionCompleted.
*/
public enum SetupResult {
SUCCESS,
ERR_BadCommand,
ERR_UnacceptableParameter,
ERR_GetLastErrorFromRil,
ERR_Stale,
ERR_RilError;
public FailCause mFailCause;
SetupResult() {
mFailCause = FailCause.fromInt(0);
}
@Override
public String toString() {
return name() + " SetupResult.mFailCause=" + mFailCause;
}
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("DataCallState: {")
.append("version=").append(version)
.append(" status=").append(status)
.append(" retry=").append(suggestedRetryTime)
.append(" cid=").append(cid)
.append(" active=").append(active)
.append(" type=").append(type)
.append("' ifname='").append(ifname);
sb.append("' addresses=[");
for (String addr : addresses) {
sb.append(addr);
sb.append(",");
}
if (addresses.length > 0) sb.deleteCharAt(sb.length()-1);
sb.append("] dnses=[");
for (String addr : dnses) {
sb.append(addr);
sb.append(",");
}
if (dnses.length > 0) sb.deleteCharAt(sb.length()-1);
sb.append("] gateways=[");
for (String addr : gateways) {
sb.append(addr);
sb.append(",");
}
if (gateways.length > 0) sb.deleteCharAt(sb.length()-1);
sb.append("]}");
return sb.toString();
}
public SetupResult setLinkProperties(LinkProperties linkProperties,
boolean okToUseSystemPropertyDns) {
SetupResult result;
// Start with clean network properties and if we have
// a failure we'll clear again at the bottom of this code.
if (linkProperties == null)
linkProperties = new LinkProperties();
else
linkProperties.clear();
if (status == FailCause.NONE.getErrorCode()) {
String propertyPrefix = "net." + ifname + ".";
try {
// set interface name
linkProperties.setInterfaceName(ifname);
// set link addresses
if (addresses != null && addresses.length > 0) {
for (String addr : addresses) {
LinkAddress la;
int addrPrefixLen;
String [] ap = addr.split("/");
if (ap.length == 2) {
addr = ap[0];
addrPrefixLen = Integer.parseInt(ap[1]);
} else {
addrPrefixLen = 0;
}
InetAddress ia;
try {
ia = NetworkUtils.numericToInetAddress(addr);
} catch (IllegalArgumentException e) {
throw new UnknownHostException("Non-numeric ip addr=" + addr);
}
if (! ia.isAnyLocalAddress()) {
if (addrPrefixLen == 0) {
// Assume point to point
addrPrefixLen = (ia instanceof Inet4Address) ? 32 : 128;
}
if (DBG) Log.d(LOG_TAG, "addr/pl=" + addr + "/" + addrPrefixLen);
la = new LinkAddress(ia, addrPrefixLen);
linkProperties.addLinkAddress(la);
}
}
} else {
throw new UnknownHostException("no address for ifname=" + ifname);
}
// set dns servers
if (dnses != null && dnses.length > 0) {
for (String addr : dnses) {
InetAddress ia;
try {
ia = NetworkUtils.numericToInetAddress(addr);
} catch (IllegalArgumentException e) {
throw new UnknownHostException("Non-numeric dns addr=" + addr);
}
if (! ia.isAnyLocalAddress()) {
linkProperties.addDns(ia);
}
}
} else if (okToUseSystemPropertyDns){
String dnsServers[] = new String[2];
dnsServers[0] = SystemProperties.get(propertyPrefix + "dns1");
dnsServers[1] = SystemProperties.get(propertyPrefix + "dns2");
for (String dnsAddr : dnsServers) {
InetAddress ia;
try {
ia = NetworkUtils.numericToInetAddress(dnsAddr);
} catch (IllegalArgumentException e) {
throw new UnknownHostException("Non-numeric dns addr=" + dnsAddr);
}
if (! ia.isAnyLocalAddress()) {
linkProperties.addDns(ia);
}
}
} else {
throw new UnknownHostException("Empty dns response and no system default dns");
}
// set gateways
if ((gateways == null) || (gateways.length == 0)) {
String sysGateways = SystemProperties.get(propertyPrefix + "gw");
if (sysGateways != null) {
gateways = sysGateways.split(" ");
} else {
gateways = new String[0];
}
}
for (String addr : gateways) {
InetAddress ia;
try {
ia = NetworkUtils.numericToInetAddress(addr);
} catch (IllegalArgumentException e) {
throw new UnknownHostException("Non-numeric gateway addr=" + addr);
}
if (! ia.isAnyLocalAddress()) {
linkProperties.addRoute(new RouteInfo(ia));
}
}
result = SetupResult.SUCCESS;
} catch (UnknownHostException e) {
Log.d(LOG_TAG, "setLinkProperties: UnknownHostException " + e);
e.printStackTrace();
result = SetupResult.ERR_UnacceptableParameter;
}
} else {
if (version < 4) {
result = SetupResult.ERR_GetLastErrorFromRil;
} else {
result = SetupResult.ERR_RilError;
}
}
// An error occurred so clear properties
if (result != SetupResult.SUCCESS) {
if(DBG) {
Log.d(LOG_TAG, "setLinkProperties: error clearing LinkProperties " +
"status=" + status + " result=" + result);
}
linkProperties.clear();
}
return result;
}
}