diff options
author | Yoshihiko Ikenaga <yoshihiko.ikenaga@jp.sony.com> | 2012-03-23 13:48:11 +0900 |
---|---|---|
committer | Irfan Sheriff <isheriff@google.com> | 2012-03-27 16:45:02 -0700 |
commit | 61472a8314e6716f231ec1c0aba73e005935829b (patch) | |
tree | 5b9e502d74da35b3085345786c6b9d8e53f39f04 /wifi/java | |
parent | 8296628ed89d98a76a904cbca53ffeb62db8bbda (diff) | |
download | frameworks_base-61472a8314e6716f231ec1c0aba73e005935829b.zip frameworks_base-61472a8314e6716f231ec1c0aba73e005935829b.tar.gz frameworks_base-61472a8314e6716f231ec1c0aba73e005935829b.tar.bz2 |
p2p fixes
Fix space handling in device name and ssid (This builds from contribution of
Yoshihiko Ikenaga <yoshihiko.ikenaga@jp.sony.com>)
Also clean up STA event handling and remove the unused interface address
Change-Id: Ic16a4aadf905c1da5c060faa8a3caa83adc0549f
Diffstat (limited to 'wifi/java')
-rw-r--r-- | wifi/java/android/net/wifi/WifiMonitor.java | 14 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/WifiNative.java | 27 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/p2p/WifiP2pDevice.java | 140 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java | 13 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/p2p/WifiP2pGroup.java | 37 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/p2p/WifiP2pService.java | 35 |
6 files changed, 112 insertions, 154 deletions
diff --git a/wifi/java/android/net/wifi/WifiMonitor.java b/wifi/java/android/net/wifi/WifiMonitor.java index c406fa0..f07e0de 100644 --- a/wifi/java/android/net/wifi/WifiMonitor.java +++ b/wifi/java/android/net/wifi/WifiMonitor.java @@ -560,18 +560,12 @@ public class WifiMonitor { */ private void handleHostApEvents(String dataString) { String[] tokens = dataString.split(" "); - /* AP-STA-CONNECTED 42:fc:89:a8:96:09 dev_addr=02:90:4c:a0:92:54 */ + /* AP-STA-CONNECTED 42:fc:89:a8:96:09 p2p_dev_addr=02:90:4c:a0:92:54 */ if (tokens[0].equals(AP_STA_CONNECTED_STR)) { - String[] nameValue = tokens[2].split("="); - if (nameValue.length != 2) return; - WifiP2pDevice device = new WifiP2pDevice(); - device.interfaceAddress = tokens[1]; - device.deviceAddress = nameValue[1]; - mStateMachine.sendMessage(AP_STA_CONNECTED_EVENT, device); - /* AP-STA-DISCONNECTED 42:fc:89:a8:96:09 */ + mStateMachine.sendMessage(AP_STA_CONNECTED_EVENT, new WifiP2pDevice(dataString)); + /* AP-STA-DISCONNECTED 42:fc:89:a8:96:09 p2p_dev_addr=02:90:4c:a0:92:54 */ } else if (tokens[0].equals(AP_STA_DISCONNECTED_STR)) { - //TODO: fix this once wpa_supplicant reports this consistently - mStateMachine.sendMessage(AP_STA_DISCONNECTED_EVENT, tokens[1]); + mStateMachine.sendMessage(AP_STA_DISCONNECTED_EVENT, new WifiP2pDevice(dataString)); } } diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java index ecd4073..3f9ffcf 100644 --- a/wifi/java/android/net/wifi/WifiNative.java +++ b/wifi/java/android/net/wifi/WifiNative.java @@ -577,26 +577,6 @@ public class WifiNative { } - public String p2pGetInterfaceAddress(String deviceAddress) { - if (TextUtils.isEmpty(deviceAddress)) return null; - - // "p2p_peer deviceAddress" returns a multi-line result containing - // intended_addr=fa:7b:7a:42:82:13 - String peerInfo = p2pPeer(deviceAddress); - if (TextUtils.isEmpty(peerInfo)) return null; - String[] tokens= peerInfo.split("\n"); - - for (String token : tokens) { - //TODO: update from interface_addr when wpa_supplicant implementation is fixed - if (token.startsWith("intended_addr=")) { - String[] nameValue = token.split("="); - if (nameValue.length != 2) break; - return nameValue[1]; - } - } - return null; - } - public String p2pGetDeviceAddress() { String status = status(); if (status == null) return ""; @@ -612,6 +592,13 @@ public class WifiNative { return ""; } + public boolean isGroupOwner(String deviceAddress) { + /* BSS returns details only for a GO */ + String bssInfo = doStringCommand("BSS p2p_dev_addr=" + deviceAddress); + if (TextUtils.isEmpty(bssInfo)) return false; + return true; + } + public String p2pPeer(String deviceAddress) { return doStringCommand("P2P_PEER " + deviceAddress); } diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java b/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java index b0cde64..afdc9be 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java @@ -21,6 +21,7 @@ import android.os.Parcel; import android.util.Log; import java.util.regex.Pattern; +import java.util.regex.Matcher; /** * A class representing a Wi-Fi p2p device @@ -42,17 +43,6 @@ public class WifiP2pDevice implements Parcelable { public String deviceAddress = ""; /** - * interfaceAddress - * - * This address is used during group owner negotiation as the Intended - * P2P Interface Address and the group interface will be created with - * address as the local address in case of successfully completed - * negotiation. - * @hide - */ - public String interfaceAddress; - - /** * Primary device type identifies the type of device. For example, an application * could filter the devices discovered to only display printers if the purpose is to * enable a printing action from the user. See the Wi-Fi Direct technical specification @@ -117,6 +107,43 @@ public class WifiP2pDevice implements Parcelable { /** Device connection status */ public int status = UNAVAILABLE; + /** Detailed device string pattern + * Example: + * P2P-DEVICE-FOUND fa:7b:7a:42:02:13 p2p_dev_addr=fa:7b:7a:42:02:13 + * pri_dev_type=1-0050F204-1 name='p2p-TEST1' config_methods=0x188 dev_capab=0x27 + * group_capab=0x0 + * + */ + private static final Pattern detailedDevicePattern = Pattern.compile( + "((?:[0-9a-f]{2}:){5}[0-9a-f]{2}) " + + "(\\d+ )?" + + "p2p_dev_addr=((?:[0-9a-f]{2}:){5}[0-9a-f]{2}) " + + "pri_dev_type=(\\d+-[0-9a-fA-F]+-\\d+) " + + "name='(.*)' " + + "config_methods=(0x[0-9a-fA-F]+) " + + "dev_capab=(0x[0-9a-fA-F]+) " + + "group_capab=(0x[0-9a-fA-F]+)" + ); + + /** 2 token device address pattern + * Example: + * P2P-DEVICE-LOST p2p_dev_addr=fa:7b:7a:42:02:13 + * AP-STA-DISCONNECTED 42:fc:89:a8:96:09 + */ + private static final Pattern twoTokenPattern = Pattern.compile( + "(p2p_dev_addr=)?((?:[0-9a-f]{2}:){5}[0-9a-f]{2})" + ); + + /** 3 token device address pattern + * Example: + * AP-STA-CONNECTED 42:fc:89:a8:96:09 p2p_dev_addr=fa:7b:7a:42:02:13 + * AP-STA-DISCONNECTED 42:fc:89:a8:96:09 p2p_dev_addr=fa:7b:7a:42:02:13 + */ + private static final Pattern threeTokenPattern = Pattern.compile( + "(?:[0-9a-f]{2}:){5}[0-9a-f]{2} p2p_dev_addr=((?:[0-9a-f]{2}:){5}[0-9a-f]{2})" + ); + + public WifiP2pDevice() { } @@ -128,6 +155,10 @@ public class WifiP2pDevice implements Parcelable { * * P2P-DEVICE-LOST p2p_dev_addr=fa:7b:7a:42:02:13 * + * AP-STA-CONNECTED 42:fc:89:a8:96:09 [p2p_dev_addr=02:90:4c:a0:92:54] + * + * AP-STA-DISCONNECTED 42:fc:89:a8:96:09 [p2p_dev_addr=02:90:4c:a0:92:54] + * * fa:7b:7a:42:02:13 * * Note: The events formats can be looked up in the wpa_supplicant code @@ -135,56 +166,44 @@ public class WifiP2pDevice implements Parcelable { */ public WifiP2pDevice(String string) throws IllegalArgumentException { String[] tokens = string.split("[ \n]"); + Matcher match; if (tokens.length < 1) { throw new IllegalArgumentException("Malformed supplicant event"); } - /* Just a device address */ - if (tokens.length == 1) { - deviceAddress = string; - return; - } - - for (String token : tokens) { - String[] nameValue = token.split("="); - if (nameValue.length != 2) { - //mac address without key is device address - if (token.matches("(([0-9a-f]{2}:){5}[0-9a-f]{2})")) { - deviceAddress = token; + switch (tokens.length) { + case 1: + /* Just a device address */ + deviceAddress = string; + return; + case 2: + match = twoTokenPattern.matcher(string); + if (!match.find()) { + throw new IllegalArgumentException("Malformed supplicant event"); + } + deviceAddress = match.group(2); + return; + case 3: + match = threeTokenPattern.matcher(string); + if (!match.find()) { + throw new IllegalArgumentException("Malformed supplicant event"); + } + deviceAddress = match.group(1); + return; + default: + match = detailedDevicePattern.matcher(string); + if (!match.find()) { + throw new IllegalArgumentException("Malformed supplicant event"); } - continue; - } - - if (nameValue[0].equals("p2p_dev_addr")) { - deviceAddress = nameValue[1]; - continue; - } - - if (nameValue[0].equals("pri_dev_type")) { - primaryDeviceType = nameValue[1]; - continue; - } - - if (nameValue[0].equals("name") || nameValue[0].equals("device_name")) { - deviceName = trimQuotes(nameValue[1]); - continue; - } - - if (nameValue[0].equals("config_methods")) { - wpsConfigMethodsSupported = parseHex(nameValue[1]); - continue; - } - - if (nameValue[0].equals("dev_capab")) { - deviceCapability = parseHex(nameValue[1]); - continue; - } - if (nameValue[0].equals("group_capab")) { - groupCapability = parseHex(nameValue[1]); - continue; - } + deviceAddress = match.group(3); + primaryDeviceType = match.group(4); + deviceName = match.group(5); + wpsConfigMethodsSupported = parseHex(match.group(6)); + deviceCapability = parseHex(match.group(7)); + groupCapability = parseHex(match.group(8)); + break; } if (tokens[0].startsWith("P2P-DEVICE-FOUND")) { @@ -233,7 +252,6 @@ public class WifiP2pDevice implements Parcelable { StringBuffer sbuf = new StringBuffer(); sbuf.append("Device: ").append(deviceName); sbuf.append("\n deviceAddress: ").append(deviceAddress); - sbuf.append("\n interfaceAddress: ").append(interfaceAddress); sbuf.append("\n primary type: ").append(primaryDeviceType); sbuf.append("\n secondary type: ").append(secondaryDeviceType); sbuf.append("\n wps: ").append(wpsConfigMethodsSupported); @@ -253,7 +271,6 @@ public class WifiP2pDevice implements Parcelable { if (source != null) { deviceName = source.deviceName; deviceAddress = source.deviceAddress; - interfaceAddress = source.interfaceAddress; primaryDeviceType = source.primaryDeviceType; secondaryDeviceType = source.secondaryDeviceType; wpsConfigMethodsSupported = source.wpsConfigMethodsSupported; @@ -267,7 +284,6 @@ public class WifiP2pDevice implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeString(deviceName); dest.writeString(deviceAddress); - dest.writeString(interfaceAddress); dest.writeString(primaryDeviceType); dest.writeString(secondaryDeviceType); dest.writeInt(wpsConfigMethodsSupported); @@ -283,7 +299,6 @@ public class WifiP2pDevice implements Parcelable { WifiP2pDevice device = new WifiP2pDevice(); device.deviceName = in.readString(); device.deviceAddress = in.readString(); - device.interfaceAddress = in.readString(); device.primaryDeviceType = in.readString(); device.secondaryDeviceType = in.readString(); device.wpsConfigMethodsSupported = in.readInt(); @@ -298,15 +313,6 @@ public class WifiP2pDevice implements Parcelable { } }; - private String trimQuotes(String str) { - str = str.trim(); - if (str.startsWith("'") && str.endsWith("'")) { - if (str.length() <= 2) return ""; - else return str.substring(1, str.length()-1); - } - return str; - } - //supported formats: 0x1abc, 0X1abc, 1abc private int parseHex(String hexString) { int num = 0; diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java index cbb4e81..9ce2545 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java @@ -80,19 +80,6 @@ public class WifiP2pDeviceList implements Parcelable { } /** @hide */ - public void updateInterfaceAddress(WifiP2pDevice device) { - for (WifiP2pDevice d : mDevices) { - //Found, update interface address - if (d.equals(device)) { - d.interfaceAddress = device.interfaceAddress; - return; - } - } - //Not found, add a new one - mDevices.add(device); - } - - /** @hide */ public boolean remove(WifiP2pDevice device) { if (device == null) return false; return mDevices.remove(device); diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java b/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java index e141aba..c30cc73 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java @@ -23,6 +23,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Collection; import java.util.Collections; +import java.util.regex.Pattern; +import java.util.regex.Matcher; /** * A class representing a Wi-Fi P2p group @@ -48,6 +50,15 @@ public class WifiP2pGroup implements Parcelable { private String mInterface; + /** P2P group started string pattern */ + private static final Pattern groupStartedPattern = Pattern.compile( + "ssid=\"(.+)\" " + + "freq=(\\d+) " + + "(?:psk=)?([0-9a-fA-F]{64})?" + + "(?:passphrase=)?(?:\"(.{8,63})\")? " + + "go_dev_addr=((?:[0-9a-f]{2}:){5}[0-9a-f]{2})" + ); + public WifiP2pGroup() { } @@ -78,24 +89,18 @@ public class WifiP2pGroup implements Parcelable { mInterface = tokens[1]; mIsGroupOwner = tokens[2].equals("GO"); - for (String token : tokens) { - String[] nameValue = token.split("="); - if (nameValue.length != 2) continue; - - if (nameValue[0].equals("ssid")) { - mNetworkName = nameValue[1]; - continue; - } + Matcher match = groupStartedPattern.matcher(supplicantEvent); + if (!match.find()) { + return; + } - if (nameValue[0].equals("passphrase")) { - mPassphrase = nameValue[1]; - continue; - } + mNetworkName = match.group(1); + //freq and psk are unused right now + //int freq = Integer.parseInt(match.group(2)); + //String psk = match.group(3); + mPassphrase = match.group(4); + mOwner = new WifiP2pDevice(match.group(5)); - if (nameValue[0].equals("go_dev_addr")) { - mOwner = new WifiP2pDevice(nameValue[1]); - } - } } else if (tokens[0].equals("P2P-INVITATION-RECEIVED")) { for (String token : tokens) { String[] nameValue = token.split("="); diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java index 399dc9d..02ca926 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java @@ -541,8 +541,6 @@ public class WifiP2pService extends IWifiP2pManager.Stub { case WifiP2pManager.CONNECT: if (DBG) logd(getName() + " sending connect"); mSavedPeerConfig = (WifiP2pConfig) message.obj; - String updatedPeerDetails = mWifiNative.p2pPeer(mSavedPeerConfig.deviceAddress); - mPeers.update(new WifiP2pDevice(updatedPeerDetails)); mPersistGroup = false; int netId = configuredNetworkId(mSavedPeerConfig.deviceAddress); if (netId >= 0) { @@ -553,7 +551,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { mWifiNative.p2pStopFind(); //If peer is a GO, we do not need to send provisional discovery, //the supplicant takes care of it. - if (isGroupOwner(mSavedPeerConfig.deviceAddress)) { + if (mWifiNative.isGroupOwner(mSavedPeerConfig.deviceAddress)) { p2pConnectWithPinDisplay(mSavedPeerConfig, JOIN_GROUP); transitionTo(mGroupNegotiationState); } else { @@ -683,7 +681,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { switch (message.what) { case PEER_CONNECTION_USER_ACCEPT: //TODO: handle persistence - if (isGroupOwner(mSavedPeerConfig.deviceAddress)) { + if (mWifiNative.isGroupOwner(mSavedPeerConfig.deviceAddress)) { p2pConnectWithPinDisplay(mSavedPeerConfig, JOIN_GROUP); } else { p2pConnectWithPinDisplay(mSavedPeerConfig, FORM_GROUP); @@ -842,7 +840,6 @@ public class WifiP2pService extends IWifiP2pManager.Stub { String deviceAddress = device.deviceAddress; if (deviceAddress != null) { mGroup.addClient(deviceAddress); - mPeers.updateInterfaceAddress(device); updateDeviceStatus(deviceAddress, WifiP2pDevice.CONNECTED); if (DBG) logd(getName() + " ap sta connected"); sendP2pPeersChangedBroadcast(); @@ -851,10 +848,8 @@ public class WifiP2pService extends IWifiP2pManager.Stub { } break; case WifiMonitor.AP_STA_DISCONNECTED_EVENT: - //TODO: the disconnection event is still inconsistent and reports - //interface address. Fix this after wpa_supplicant is fixed. - String interfaceAddress = (String) message.obj; - deviceAddress = getDeviceAddress(interfaceAddress); + device = (WifiP2pDevice) message.obj; + deviceAddress = device.deviceAddress; if (deviceAddress != null) { updateDeviceStatus(deviceAddress, WifiP2pDevice.AVAILABLE); if (mGroup.removeClient(deviceAddress)) { @@ -872,7 +867,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { sendP2pPeersChangedBroadcast(); if (DBG) loge(getName() + " ap sta disconnected"); } else { - loge("Disconnect on unknown interface address : " + interfaceAddress); + loge("Disconnect on unknown device: " + device); } break; case DhcpStateMachine.CMD_POST_DHCP_ACTION: @@ -883,6 +878,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { setWifiP2pInfoOnGroupFormation(dhcpInfo.serverAddress); sendP2pConnectionChangedBroadcast(); } else { + loge("DHCP failed"); mWifiNative.p2pGroupRemove(mGroup.getInterface()); } break; @@ -916,6 +912,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { } mGroup = null; + mWifiNative.p2pFlush(); if (changed) sendP2pPeersChangedBroadcast(); transitionTo(mInactiveState); break; @@ -1183,15 +1180,6 @@ public class WifiP2pService extends IWifiP2pManager.Stub { } } - private boolean isGroupOwner(String deviceAddress) { - for (WifiP2pDevice d : mPeers.getDeviceList()) { - if (d.deviceAddress.equals(deviceAddress)) { - return d.isGroupOwner(); - } - } - return false; - } - //TODO: implement when wpa_supplicant is fixed private int configuredNetworkId(String deviceAddress) { return -1; @@ -1219,15 +1207,6 @@ public class WifiP2pService extends IWifiP2pManager.Stub { return deviceAddress; } - private String getDeviceAddress(String interfaceAddress) { - for (WifiP2pDevice d : mPeers.getDeviceList()) { - if (interfaceAddress.equals(d.interfaceAddress)) { - return d.deviceAddress; - } - } - return null; - } - private WifiP2pDevice getDeviceFromPeerList(String deviceAddress) { for (WifiP2pDevice d : mPeers.getDeviceList()) { if (d.deviceAddress.equals(deviceAddress)) { |