resolved conflicts for merge of 08c39c6a
to honeycomb-LTE
Change-Id: I79f8ac1dc8ff9f5d0559d37043b850cd26246b92
This commit is contained in:
333
core/java/android/net/EthernetDataTracker.java
Normal file
333
core/java/android/net/EthernetDataTracker.java
Normal file
@ -0,0 +1,333 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 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 android.net;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.DhcpInfoInternal;
|
||||||
|
import android.net.LinkAddress;
|
||||||
|
import android.net.LinkCapabilities;
|
||||||
|
import android.net.LinkProperties;
|
||||||
|
import android.net.NetworkInfo;
|
||||||
|
import android.net.NetworkInfo.DetailedState;
|
||||||
|
import android.net.NetworkStateTracker;
|
||||||
|
import android.net.NetworkUtils;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.os.INetworkManagementService;
|
||||||
|
import android.os.Message;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
import android.os.ServiceManager;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class tracks the data connection associated with Ethernet
|
||||||
|
* This is a singleton class and an instance will be created by
|
||||||
|
* ConnectivityService.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public class EthernetDataTracker implements NetworkStateTracker {
|
||||||
|
private static final String NETWORKTYPE = "ETHERNET";
|
||||||
|
private static final String TAG = "Ethernet";
|
||||||
|
|
||||||
|
private AtomicBoolean mTeardownRequested = new AtomicBoolean(false);
|
||||||
|
private AtomicBoolean mPrivateDnsRouteSet = new AtomicBoolean(false);
|
||||||
|
private AtomicInteger mDefaultGatewayAddr = new AtomicInteger(0);
|
||||||
|
private AtomicBoolean mDefaultRouteSet = new AtomicBoolean(false);
|
||||||
|
|
||||||
|
private LinkProperties mLinkProperties;
|
||||||
|
private LinkCapabilities mLinkCapabilities;
|
||||||
|
private NetworkInfo mNetworkInfo;
|
||||||
|
private InterfaceObserver mInterfaceObserver;
|
||||||
|
|
||||||
|
/* For sending events to connectivity service handler */
|
||||||
|
private Handler mCsHandler;
|
||||||
|
private Context mContext;
|
||||||
|
|
||||||
|
private static EthernetDataTracker sInstance;
|
||||||
|
private static String mIface = "";
|
||||||
|
|
||||||
|
private static class InterfaceObserver extends INetworkManagementEventObserver.Stub {
|
||||||
|
private EthernetDataTracker mTracker;
|
||||||
|
|
||||||
|
InterfaceObserver(EthernetDataTracker tracker) {
|
||||||
|
super();
|
||||||
|
mTracker = tracker;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void interfaceLinkStatusChanged(String iface, boolean up) {
|
||||||
|
Log.d(TAG, "Interface " + iface + " link " + (up ? "up" : "down"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void interfaceAdded(String iface) {
|
||||||
|
mTracker.interfaceAdded(iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void interfaceRemoved(String iface) {
|
||||||
|
mTracker.interfaceRemoved(iface);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private EthernetDataTracker() {
|
||||||
|
mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_ETHERNET, 0, NETWORKTYPE, "");
|
||||||
|
mLinkProperties = new LinkProperties();
|
||||||
|
mLinkCapabilities = new LinkCapabilities();
|
||||||
|
|
||||||
|
mNetworkInfo.setIsAvailable(false);
|
||||||
|
setTeardownRequested(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void interfaceAdded(String iface) {
|
||||||
|
if (!iface.matches("eth\\d"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Log.d(TAG, "Adding " + iface);
|
||||||
|
|
||||||
|
synchronized(mIface) {
|
||||||
|
if(!mIface.isEmpty())
|
||||||
|
return;
|
||||||
|
mIface = iface;
|
||||||
|
}
|
||||||
|
|
||||||
|
mNetworkInfo.setIsAvailable(true);
|
||||||
|
Message msg = mCsHandler.obtainMessage(EVENT_CONFIGURATION_CHANGED, mNetworkInfo);
|
||||||
|
msg.sendToTarget();
|
||||||
|
|
||||||
|
runDhcp();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void interfaceRemoved(String iface) {
|
||||||
|
if (!iface.equals(mIface))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Log.d(TAG, "Removing " + iface);
|
||||||
|
|
||||||
|
NetworkUtils.stopDhcp(mIface);
|
||||||
|
|
||||||
|
mLinkProperties.clear();
|
||||||
|
mNetworkInfo.setIsAvailable(false);
|
||||||
|
mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null);
|
||||||
|
|
||||||
|
Message msg = mCsHandler.obtainMessage(EVENT_CONFIGURATION_CHANGED, mNetworkInfo);
|
||||||
|
msg.sendToTarget();
|
||||||
|
|
||||||
|
msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo);
|
||||||
|
msg.sendToTarget();
|
||||||
|
|
||||||
|
mIface = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void runDhcp() {
|
||||||
|
Thread dhcpThread = new Thread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
DhcpInfoInternal dhcpInfoInternal = new DhcpInfoInternal();
|
||||||
|
if (!NetworkUtils.runDhcp(mIface, dhcpInfoInternal)) {
|
||||||
|
Log.e(TAG, "DHCP request error:" + NetworkUtils.getDhcpError());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mLinkProperties = dhcpInfoInternal.makeLinkProperties();
|
||||||
|
mLinkProperties.setInterfaceName(mIface);
|
||||||
|
|
||||||
|
mNetworkInfo.setDetailedState(DetailedState.CONNECTED, null, null);
|
||||||
|
Message msg = mCsHandler.obtainMessage(EVENT_STATE_CHANGED, mNetworkInfo);
|
||||||
|
msg.sendToTarget();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dhcpThread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static synchronized EthernetDataTracker getInstance() {
|
||||||
|
if (sInstance == null) sInstance = new EthernetDataTracker();
|
||||||
|
return sInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object Clone() throws CloneNotSupportedException {
|
||||||
|
throw new CloneNotSupportedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTeardownRequested(boolean isRequested) {
|
||||||
|
mTeardownRequested.set(isRequested);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTeardownRequested() {
|
||||||
|
return mTeardownRequested.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begin monitoring connectivity
|
||||||
|
*/
|
||||||
|
public void startMonitoring(Context context, Handler target) {
|
||||||
|
mContext = context;
|
||||||
|
mCsHandler = target;
|
||||||
|
|
||||||
|
// register for notifications from NetworkManagement Service
|
||||||
|
IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
|
||||||
|
INetworkManagementService service = INetworkManagementService.Stub.asInterface(b);
|
||||||
|
mInterfaceObserver = new InterfaceObserver(this);
|
||||||
|
try {
|
||||||
|
service.registerObserver(mInterfaceObserver);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
Log.e(TAG, "Could not register InterfaceObserver " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable connectivity to a network
|
||||||
|
* TODO: do away with return value after making MobileDataStateTracker async
|
||||||
|
*/
|
||||||
|
public boolean teardown() {
|
||||||
|
mTeardownRequested.set(true);
|
||||||
|
NetworkUtils.stopDhcp(mIface);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Re-enable connectivity to a network after a {@link #teardown()}.
|
||||||
|
*/
|
||||||
|
public boolean reconnect() {
|
||||||
|
mTeardownRequested.set(false);
|
||||||
|
runDhcp();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turn the wireless radio off for a network.
|
||||||
|
* @param turnOn {@code true} to turn the radio on, {@code false}
|
||||||
|
*/
|
||||||
|
public boolean setRadio(boolean turnOn) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true - If are we currently tethered with another device.
|
||||||
|
*/
|
||||||
|
public synchronized boolean isAvailable() {
|
||||||
|
return mNetworkInfo.isAvailable();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells the underlying networking system that the caller wants to
|
||||||
|
* begin using the named feature. The interpretation of {@code feature}
|
||||||
|
* is completely up to each networking implementation.
|
||||||
|
* @param feature the name of the feature to be used
|
||||||
|
* @param callingPid the process ID of the process that is issuing this request
|
||||||
|
* @param callingUid the user ID of the process that is issuing this request
|
||||||
|
* @return an integer value representing the outcome of the request.
|
||||||
|
* The interpretation of this value is specific to each networking
|
||||||
|
* implementation+feature combination, except that the value {@code -1}
|
||||||
|
* always indicates failure.
|
||||||
|
* TODO: needs to go away
|
||||||
|
*/
|
||||||
|
public int startUsingNetworkFeature(String feature, int callingPid, int callingUid) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells the underlying networking system that the caller is finished
|
||||||
|
* using the named feature. The interpretation of {@code feature}
|
||||||
|
* is completely up to each networking implementation.
|
||||||
|
* @param feature the name of the feature that is no longer needed.
|
||||||
|
* @param callingPid the process ID of the process that is issuing this request
|
||||||
|
* @param callingUid the user ID of the process that is issuing this request
|
||||||
|
* @return an integer value representing the outcome of the request.
|
||||||
|
* The interpretation of this value is specific to each networking
|
||||||
|
* implementation+feature combination, except that the value {@code -1}
|
||||||
|
* always indicates failure.
|
||||||
|
* TODO: needs to go away
|
||||||
|
*/
|
||||||
|
public int stopUsingNetworkFeature(String feature, int callingPid, int callingUid) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param enabled
|
||||||
|
*/
|
||||||
|
public void setDataEnable(boolean enabled) {
|
||||||
|
Log.d(TAG, "setDataEnabled: IGNORING enabled=" + enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if private DNS route is set for the network
|
||||||
|
*/
|
||||||
|
public boolean isPrivateDnsRouteSet() {
|
||||||
|
return mPrivateDnsRouteSet.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a flag indicating private DNS route is set
|
||||||
|
*/
|
||||||
|
public void privateDnsRouteSet(boolean enabled) {
|
||||||
|
mPrivateDnsRouteSet.set(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch NetworkInfo for the network
|
||||||
|
*/
|
||||||
|
public synchronized NetworkInfo getNetworkInfo() {
|
||||||
|
return mNetworkInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch LinkProperties for the network
|
||||||
|
*/
|
||||||
|
public synchronized LinkProperties getLinkProperties() {
|
||||||
|
return new LinkProperties(mLinkProperties);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A capability is an Integer/String pair, the capabilities
|
||||||
|
* are defined in the class LinkSocket#Key.
|
||||||
|
*
|
||||||
|
* @return a copy of this connections capabilities, may be empty but never null.
|
||||||
|
*/
|
||||||
|
public LinkCapabilities getLinkCapabilities() {
|
||||||
|
return new LinkCapabilities(mLinkCapabilities);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch default gateway address for the network
|
||||||
|
*/
|
||||||
|
public int getDefaultGatewayAddr() {
|
||||||
|
return mDefaultGatewayAddr.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if default route is set
|
||||||
|
*/
|
||||||
|
public boolean isDefaultRouteSet() {
|
||||||
|
return mDefaultRouteSet.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a flag indicating default route is set for the network
|
||||||
|
*/
|
||||||
|
public void defaultRouteSet(boolean enabled) {
|
||||||
|
mDefaultRouteSet.set(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the system properties name associated with the tcp buffer sizes
|
||||||
|
* for this network.
|
||||||
|
*/
|
||||||
|
public String getTcpBufferSizesPropName() {
|
||||||
|
return "net.tcp.buffersize.wifi";
|
||||||
|
}
|
||||||
|
}
|
@ -24,6 +24,7 @@ import android.content.pm.PackageManager;
|
|||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.DummyDataStateTracker;
|
import android.net.DummyDataStateTracker;
|
||||||
|
import android.net.EthernetDataTracker;
|
||||||
import android.net.IConnectivityManager;
|
import android.net.IConnectivityManager;
|
||||||
import android.net.LinkProperties;
|
import android.net.LinkProperties;
|
||||||
import android.net.MobileDataStateTracker;
|
import android.net.MobileDataStateTracker;
|
||||||
@ -408,6 +409,10 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
mNetTrackers[netType] = BluetoothTetheringDataTracker.getInstance();
|
mNetTrackers[netType] = BluetoothTetheringDataTracker.getInstance();
|
||||||
mNetTrackers[netType].startMonitoring(context, mHandler);
|
mNetTrackers[netType].startMonitoring(context, mHandler);
|
||||||
break;
|
break;
|
||||||
|
case ConnectivityManager.TYPE_ETHERNET:
|
||||||
|
mNetTrackers[netType] = EthernetDataTracker.getInstance();
|
||||||
|
mNetTrackers[netType].startMonitoring(context, mHandler);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
loge("Trying to create a DataStateTracker for an unknown radio type " +
|
loge("Trying to create a DataStateTracker for an unknown radio type " +
|
||||||
mNetConfigs[netType].radio);
|
mNetConfigs[netType].radio);
|
||||||
|
Reference in New Issue
Block a user