Loading wifi/java/android/net/wifi/WifiMonitor.java +10 −2 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ import android.net.NetworkInfo; import android.net.wifi.p2p.WifiP2pConfig; import android.net.wifi.p2p.WifiP2pDevice; import android.net.wifi.p2p.WifiP2pGroup; import android.net.wifi.p2p.WifiP2pService; import android.net.wifi.p2p.WifiP2pService.P2pStatus; import android.net.wifi.p2p.WifiP2pProvDiscEvent; import android.net.wifi.p2p.nsd.WifiP2pServiceResponse; import android.net.wifi.StateChangeResult; Loading Loading @@ -186,7 +188,7 @@ public class WifiMonitor { /* P2P-GROUP-STARTED p2p-wlan0-0 [client|GO] ssid="DIRECT-W8" freq=2437 [psk=2182b2e50e53f260d04f3c7b25ef33c965a3291b9b36b455a82d77fd82ca15bc|passphrase="fKG4jMe3"] go_dev_addr=fa:7b:7a:42:02:13 */ go_dev_addr=fa:7b:7a:42:02:13 [PERSISTENT] */ private static final String P2P_GROUP_STARTED_STR = "P2P-GROUP-STARTED"; /* P2P-GROUP-REMOVED p2p-wlan0-0 [client|GO] reason=REQUESTED */ Loading Loading @@ -594,7 +596,13 @@ public class WifiMonitor { if (tokens.length != 2) return; String[] nameValue = tokens[1].split("="); if (nameValue.length != 2) return; mStateMachine.sendMessage(P2P_INVITATION_RESULT_EVENT, nameValue[1]); P2pStatus err = P2pStatus.UNKNOWN; try { err = P2pStatus.valueOf(Integer.parseInt(nameValue[1])); } catch (NumberFormatException e) { e.printStackTrace(); } mStateMachine.sendMessage(P2P_INVITATION_RESULT_EVENT, err); } else if (dataString.startsWith(P2P_PROV_DISC_PBC_REQ_STR)) { mStateMachine.sendMessage(P2P_PROV_DISC_PBC_REQ_EVENT, new WifiP2pProvDiscEvent(dataString)); Loading wifi/java/android/net/wifi/WifiNative.java +32 −5 Original line number Diff line number Diff line Loading @@ -547,10 +547,9 @@ public class WifiNative { break; } //TODO: Add persist behavior once the supplicant interaction is fixed for both // group and client scenarios /* Persist unless there is an explicit request to not do so*/ //if (config.persist != WifiP2pConfig.Persist.NO) args.add("persistent"); if (config.netId == WifiP2pGroup.PERSISTENT_NET_ID) { args.add("persistent"); } if (joinExistingGroup) { args.add("join"); Loading Loading @@ -592,10 +591,17 @@ public class WifiNative { return false; } public boolean p2pGroupAdd() { public boolean p2pGroupAdd(boolean persistent) { if (persistent) { return doBooleanCommand("P2P_GROUP_ADD persistent"); } return doBooleanCommand("P2P_GROUP_ADD"); } public boolean p2pGroupAdd(int netId) { return doBooleanCommand("P2P_GROUP_ADD persistent=" + netId); } public boolean p2pGroupRemove(String iface) { if (TextUtils.isEmpty(iface)) return false; return doBooleanCommand("P2P_GROUP_REMOVE " + iface); Loading Loading @@ -624,6 +630,9 @@ public class WifiNative { return doBooleanCommand("P2P_INVITE persistent=" + netId + " peer=" + deviceAddress); } public String p2pGetSsid(String deviceAddress) { return p2pGetParam(deviceAddress, "oper_ssid"); } public String p2pGetDeviceAddress() { String status = status(); Loading Loading @@ -665,6 +674,24 @@ public class WifiNative { return doStringCommand("P2P_PEER " + deviceAddress); } private String p2pGetParam(String deviceAddress, String key) { if (deviceAddress == null) return null; String peerInfo = p2pPeer(deviceAddress); if (peerInfo == null) return null; String[] tokens= peerInfo.split("\n"); key += "="; for (String token : tokens) { if (token.startsWith(key)) { String[] nameValue = token.split("="); if (nameValue.length != 2) break; return nameValue[1]; } } return null; } public boolean p2pServiceAdd(WifiP2pServiceInfo servInfo) { /* * P2P_SERVICE_ADD bonjour <query hexdump> <RDATA hexdump> Loading wifi/java/android/net/wifi/p2p/WifiP2pConfig.java +5 −15 Original line number Diff line number Diff line Loading @@ -46,18 +46,8 @@ public class WifiP2pConfig implements Parcelable { */ public int groupOwnerIntent = -1; /** * Indicates whether the configuration is saved * @hide */ public enum Persist { SYSTEM_DEFAULT, YES, NO } /** @hide */ public Persist persist = Persist.SYSTEM_DEFAULT; public int netId = WifiP2pGroup.PERSISTENT_NET_ID; public WifiP2pConfig() { //set defaults Loading Loading @@ -110,7 +100,7 @@ public class WifiP2pConfig implements Parcelable { sbuf.append("\n address: ").append(deviceAddress); sbuf.append("\n wps: ").append(wps); sbuf.append("\n groupOwnerIntent: ").append(groupOwnerIntent); sbuf.append("\n persist: ").append(persist.toString()); sbuf.append("\n persist: ").append(netId); return sbuf.toString(); } Loading @@ -125,7 +115,7 @@ public class WifiP2pConfig implements Parcelable { deviceAddress = source.deviceAddress; wps = new WpsInfo(source.wps); groupOwnerIntent = source.groupOwnerIntent; persist = source.persist; netId = source.netId; } } Loading @@ -134,7 +124,7 @@ public class WifiP2pConfig implements Parcelable { dest.writeString(deviceAddress); dest.writeParcelable(wps, flags); dest.writeInt(groupOwnerIntent); dest.writeString(persist.name()); dest.writeInt(netId); } /** Implement the Parcelable interface */ Loading @@ -145,7 +135,7 @@ public class WifiP2pConfig implements Parcelable { config.deviceAddress = in.readString(); config.wps = (WpsInfo) in.readParcelable(null); config.groupOwnerIntent = in.readInt(); config.persist = Persist.valueOf(in.readString()); config.netId = in.readInt(); return config; } Loading wifi/java/android/net/wifi/p2p/WifiP2pDevice.java +15 −0 Original line number Diff line number Diff line Loading @@ -231,11 +231,26 @@ public class WifiP2pDevice implements Parcelable { return (deviceCapability & DEVICE_CAPAB_SERVICE_DISCOVERY) != 0; } /** Returns true if the device is capable of invitation {@hide}*/ public boolean isInvitationCapable() { return (deviceCapability & DEVICE_CAPAB_INVITATION_PROCEDURE) != 0; } /** Returns true if the device reaches the limit. {@hide}*/ public boolean isDeviceLimit() { return (deviceCapability & DEVICE_CAPAB_DEVICE_LIMIT) != 0; } /** Returns true if the device is a group owner */ public boolean isGroupOwner() { return (groupCapability & GROUP_CAPAB_GROUP_OWNER) != 0; } /** Returns true if the group reaches the limit. {@hide}*/ public boolean isGroupLimit() { return (groupCapability & GROUP_CAPAB_GROUP_LIMIT) != 0; } @Override public boolean equals(Object obj) { if (this == obj) return true; Loading wifi/java/android/net/wifi/p2p/WifiP2pGroup.java +55 −3 Original line number Diff line number Diff line Loading @@ -33,6 +33,16 @@ import java.util.regex.Matcher; */ public class WifiP2pGroup implements Parcelable { /** The temporary network id. * {@hide} */ public static final int TEMPORARY_NET_ID = -1; /** The persistent network id. * If a matching persistent profile is found, use it. * Otherwise, create a new persistent profile. * {@hide} */ public static final int PERSISTENT_NET_ID = -2; /** The network name */ private String mNetworkName; Loading @@ -50,13 +60,17 @@ public class WifiP2pGroup implements Parcelable { private String mInterface; /** The network id in the wpa_supplicant */ private int mNetId; /** 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})" "go_dev_addr=((?:[0-9a-f]{2}:){5}[0-9a-f]{2})" + " ?(\\[PERSISTENT\\])?" ); public WifiP2pGroup() { Loading @@ -67,13 +81,15 @@ public class WifiP2pGroup implements Parcelable { * * P2P-GROUP-STARTED p2p-wlan0-0 [client|GO] ssid="DIRECT-W8" freq=2437 * [psk=2182b2e50e53f260d04f3c7b25ef33c965a3291b9b36b455a82d77fd82ca15bc| * passphrase="fKG4jMe3"] go_dev_addr=fa:7b:7a:42:02:13 * passphrase="fKG4jMe3"] go_dev_addr=fa:7b:7a:42:02:13 [PERSISTENT] * * P2P-GROUP-REMOVED p2p-wlan0-0 [client|GO] reason=REQUESTED * * P2P-INVITATION-RECEIVED sa=fa:7b:7a:42:02:13 go_dev_addr=f8:7b:7a:42:02:13 * bssid=fa:7b:7a:42:82:13 unknown-network * * P2P-INVITATION-RECEIVED sa=b8:f9:34:2a:c7:9d persistent=0 * * Note: The events formats can be looked up in the wpa_supplicant code * @hide */ Loading @@ -100,16 +116,38 @@ public class WifiP2pGroup implements Parcelable { //String psk = match.group(3); mPassphrase = match.group(4); mOwner = new WifiP2pDevice(match.group(5)); if (match.group(6) != null) { mNetId = PERSISTENT_NET_ID; } else { mNetId = TEMPORARY_NET_ID; } } else if (tokens[0].equals("P2P-INVITATION-RECEIVED")) { String sa = null; mNetId = PERSISTENT_NET_ID; for (String token : tokens) { String[] nameValue = token.split("="); if (nameValue.length != 2) continue; if (nameValue[0].equals("sa")) { sa = nameValue[1]; // set source address into the client list. WifiP2pDevice dev = new WifiP2pDevice(); dev.deviceAddress = nameValue[1]; mClients.add(dev); continue; } if (nameValue[0].equals("go_dev_addr")) { mOwner = new WifiP2pDevice(nameValue[1]); continue; } if (nameValue[0].equals("persistent")) { mOwner = new WifiP2pDevice(sa); mNetId = Integer.parseInt(nameValue[1]); continue; } } } else { throw new IllegalArgumentException("Malformed supplicant event"); Loading Loading @@ -212,6 +250,16 @@ public class WifiP2pGroup implements Parcelable { return mInterface; } /** @hide */ public int getNetworkId() { return mNetId; } /** @hide */ public void setNetworkId(int netId) { this.mNetId = netId; } public String toString() { StringBuffer sbuf = new StringBuffer(); sbuf.append("network: ").append(mNetworkName); Loading @@ -221,6 +269,7 @@ public class WifiP2pGroup implements Parcelable { sbuf.append("\n Client: ").append(client); } sbuf.append("\n interface: ").append(mInterface); sbuf.append("\n networkId: ").append(mNetId); return sbuf.toString(); } Loading @@ -238,6 +287,7 @@ public class WifiP2pGroup implements Parcelable { for (WifiP2pDevice d : source.getClientList()) mClients.add(d); mPassphrase = source.getPassphrase(); mInterface = source.getInterface(); mNetId = source.getNetworkId(); } } Loading @@ -252,6 +302,7 @@ public class WifiP2pGroup implements Parcelable { } dest.writeString(mPassphrase); dest.writeString(mInterface); dest.writeInt(mNetId); } /** Implement the Parcelable interface */ Loading @@ -268,6 +319,7 @@ public class WifiP2pGroup implements Parcelable { } group.setPassphrase(in.readString()); group.setInterface(in.readString()); group.setNetworkId(in.readInt()); return group; } Loading Loading
wifi/java/android/net/wifi/WifiMonitor.java +10 −2 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ import android.net.NetworkInfo; import android.net.wifi.p2p.WifiP2pConfig; import android.net.wifi.p2p.WifiP2pDevice; import android.net.wifi.p2p.WifiP2pGroup; import android.net.wifi.p2p.WifiP2pService; import android.net.wifi.p2p.WifiP2pService.P2pStatus; import android.net.wifi.p2p.WifiP2pProvDiscEvent; import android.net.wifi.p2p.nsd.WifiP2pServiceResponse; import android.net.wifi.StateChangeResult; Loading Loading @@ -186,7 +188,7 @@ public class WifiMonitor { /* P2P-GROUP-STARTED p2p-wlan0-0 [client|GO] ssid="DIRECT-W8" freq=2437 [psk=2182b2e50e53f260d04f3c7b25ef33c965a3291b9b36b455a82d77fd82ca15bc|passphrase="fKG4jMe3"] go_dev_addr=fa:7b:7a:42:02:13 */ go_dev_addr=fa:7b:7a:42:02:13 [PERSISTENT] */ private static final String P2P_GROUP_STARTED_STR = "P2P-GROUP-STARTED"; /* P2P-GROUP-REMOVED p2p-wlan0-0 [client|GO] reason=REQUESTED */ Loading Loading @@ -594,7 +596,13 @@ public class WifiMonitor { if (tokens.length != 2) return; String[] nameValue = tokens[1].split("="); if (nameValue.length != 2) return; mStateMachine.sendMessage(P2P_INVITATION_RESULT_EVENT, nameValue[1]); P2pStatus err = P2pStatus.UNKNOWN; try { err = P2pStatus.valueOf(Integer.parseInt(nameValue[1])); } catch (NumberFormatException e) { e.printStackTrace(); } mStateMachine.sendMessage(P2P_INVITATION_RESULT_EVENT, err); } else if (dataString.startsWith(P2P_PROV_DISC_PBC_REQ_STR)) { mStateMachine.sendMessage(P2P_PROV_DISC_PBC_REQ_EVENT, new WifiP2pProvDiscEvent(dataString)); Loading
wifi/java/android/net/wifi/WifiNative.java +32 −5 Original line number Diff line number Diff line Loading @@ -547,10 +547,9 @@ public class WifiNative { break; } //TODO: Add persist behavior once the supplicant interaction is fixed for both // group and client scenarios /* Persist unless there is an explicit request to not do so*/ //if (config.persist != WifiP2pConfig.Persist.NO) args.add("persistent"); if (config.netId == WifiP2pGroup.PERSISTENT_NET_ID) { args.add("persistent"); } if (joinExistingGroup) { args.add("join"); Loading Loading @@ -592,10 +591,17 @@ public class WifiNative { return false; } public boolean p2pGroupAdd() { public boolean p2pGroupAdd(boolean persistent) { if (persistent) { return doBooleanCommand("P2P_GROUP_ADD persistent"); } return doBooleanCommand("P2P_GROUP_ADD"); } public boolean p2pGroupAdd(int netId) { return doBooleanCommand("P2P_GROUP_ADD persistent=" + netId); } public boolean p2pGroupRemove(String iface) { if (TextUtils.isEmpty(iface)) return false; return doBooleanCommand("P2P_GROUP_REMOVE " + iface); Loading Loading @@ -624,6 +630,9 @@ public class WifiNative { return doBooleanCommand("P2P_INVITE persistent=" + netId + " peer=" + deviceAddress); } public String p2pGetSsid(String deviceAddress) { return p2pGetParam(deviceAddress, "oper_ssid"); } public String p2pGetDeviceAddress() { String status = status(); Loading Loading @@ -665,6 +674,24 @@ public class WifiNative { return doStringCommand("P2P_PEER " + deviceAddress); } private String p2pGetParam(String deviceAddress, String key) { if (deviceAddress == null) return null; String peerInfo = p2pPeer(deviceAddress); if (peerInfo == null) return null; String[] tokens= peerInfo.split("\n"); key += "="; for (String token : tokens) { if (token.startsWith(key)) { String[] nameValue = token.split("="); if (nameValue.length != 2) break; return nameValue[1]; } } return null; } public boolean p2pServiceAdd(WifiP2pServiceInfo servInfo) { /* * P2P_SERVICE_ADD bonjour <query hexdump> <RDATA hexdump> Loading
wifi/java/android/net/wifi/p2p/WifiP2pConfig.java +5 −15 Original line number Diff line number Diff line Loading @@ -46,18 +46,8 @@ public class WifiP2pConfig implements Parcelable { */ public int groupOwnerIntent = -1; /** * Indicates whether the configuration is saved * @hide */ public enum Persist { SYSTEM_DEFAULT, YES, NO } /** @hide */ public Persist persist = Persist.SYSTEM_DEFAULT; public int netId = WifiP2pGroup.PERSISTENT_NET_ID; public WifiP2pConfig() { //set defaults Loading Loading @@ -110,7 +100,7 @@ public class WifiP2pConfig implements Parcelable { sbuf.append("\n address: ").append(deviceAddress); sbuf.append("\n wps: ").append(wps); sbuf.append("\n groupOwnerIntent: ").append(groupOwnerIntent); sbuf.append("\n persist: ").append(persist.toString()); sbuf.append("\n persist: ").append(netId); return sbuf.toString(); } Loading @@ -125,7 +115,7 @@ public class WifiP2pConfig implements Parcelable { deviceAddress = source.deviceAddress; wps = new WpsInfo(source.wps); groupOwnerIntent = source.groupOwnerIntent; persist = source.persist; netId = source.netId; } } Loading @@ -134,7 +124,7 @@ public class WifiP2pConfig implements Parcelable { dest.writeString(deviceAddress); dest.writeParcelable(wps, flags); dest.writeInt(groupOwnerIntent); dest.writeString(persist.name()); dest.writeInt(netId); } /** Implement the Parcelable interface */ Loading @@ -145,7 +135,7 @@ public class WifiP2pConfig implements Parcelable { config.deviceAddress = in.readString(); config.wps = (WpsInfo) in.readParcelable(null); config.groupOwnerIntent = in.readInt(); config.persist = Persist.valueOf(in.readString()); config.netId = in.readInt(); return config; } Loading
wifi/java/android/net/wifi/p2p/WifiP2pDevice.java +15 −0 Original line number Diff line number Diff line Loading @@ -231,11 +231,26 @@ public class WifiP2pDevice implements Parcelable { return (deviceCapability & DEVICE_CAPAB_SERVICE_DISCOVERY) != 0; } /** Returns true if the device is capable of invitation {@hide}*/ public boolean isInvitationCapable() { return (deviceCapability & DEVICE_CAPAB_INVITATION_PROCEDURE) != 0; } /** Returns true if the device reaches the limit. {@hide}*/ public boolean isDeviceLimit() { return (deviceCapability & DEVICE_CAPAB_DEVICE_LIMIT) != 0; } /** Returns true if the device is a group owner */ public boolean isGroupOwner() { return (groupCapability & GROUP_CAPAB_GROUP_OWNER) != 0; } /** Returns true if the group reaches the limit. {@hide}*/ public boolean isGroupLimit() { return (groupCapability & GROUP_CAPAB_GROUP_LIMIT) != 0; } @Override public boolean equals(Object obj) { if (this == obj) return true; Loading
wifi/java/android/net/wifi/p2p/WifiP2pGroup.java +55 −3 Original line number Diff line number Diff line Loading @@ -33,6 +33,16 @@ import java.util.regex.Matcher; */ public class WifiP2pGroup implements Parcelable { /** The temporary network id. * {@hide} */ public static final int TEMPORARY_NET_ID = -1; /** The persistent network id. * If a matching persistent profile is found, use it. * Otherwise, create a new persistent profile. * {@hide} */ public static final int PERSISTENT_NET_ID = -2; /** The network name */ private String mNetworkName; Loading @@ -50,13 +60,17 @@ public class WifiP2pGroup implements Parcelable { private String mInterface; /** The network id in the wpa_supplicant */ private int mNetId; /** 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})" "go_dev_addr=((?:[0-9a-f]{2}:){5}[0-9a-f]{2})" + " ?(\\[PERSISTENT\\])?" ); public WifiP2pGroup() { Loading @@ -67,13 +81,15 @@ public class WifiP2pGroup implements Parcelable { * * P2P-GROUP-STARTED p2p-wlan0-0 [client|GO] ssid="DIRECT-W8" freq=2437 * [psk=2182b2e50e53f260d04f3c7b25ef33c965a3291b9b36b455a82d77fd82ca15bc| * passphrase="fKG4jMe3"] go_dev_addr=fa:7b:7a:42:02:13 * passphrase="fKG4jMe3"] go_dev_addr=fa:7b:7a:42:02:13 [PERSISTENT] * * P2P-GROUP-REMOVED p2p-wlan0-0 [client|GO] reason=REQUESTED * * P2P-INVITATION-RECEIVED sa=fa:7b:7a:42:02:13 go_dev_addr=f8:7b:7a:42:02:13 * bssid=fa:7b:7a:42:82:13 unknown-network * * P2P-INVITATION-RECEIVED sa=b8:f9:34:2a:c7:9d persistent=0 * * Note: The events formats can be looked up in the wpa_supplicant code * @hide */ Loading @@ -100,16 +116,38 @@ public class WifiP2pGroup implements Parcelable { //String psk = match.group(3); mPassphrase = match.group(4); mOwner = new WifiP2pDevice(match.group(5)); if (match.group(6) != null) { mNetId = PERSISTENT_NET_ID; } else { mNetId = TEMPORARY_NET_ID; } } else if (tokens[0].equals("P2P-INVITATION-RECEIVED")) { String sa = null; mNetId = PERSISTENT_NET_ID; for (String token : tokens) { String[] nameValue = token.split("="); if (nameValue.length != 2) continue; if (nameValue[0].equals("sa")) { sa = nameValue[1]; // set source address into the client list. WifiP2pDevice dev = new WifiP2pDevice(); dev.deviceAddress = nameValue[1]; mClients.add(dev); continue; } if (nameValue[0].equals("go_dev_addr")) { mOwner = new WifiP2pDevice(nameValue[1]); continue; } if (nameValue[0].equals("persistent")) { mOwner = new WifiP2pDevice(sa); mNetId = Integer.parseInt(nameValue[1]); continue; } } } else { throw new IllegalArgumentException("Malformed supplicant event"); Loading Loading @@ -212,6 +250,16 @@ public class WifiP2pGroup implements Parcelable { return mInterface; } /** @hide */ public int getNetworkId() { return mNetId; } /** @hide */ public void setNetworkId(int netId) { this.mNetId = netId; } public String toString() { StringBuffer sbuf = new StringBuffer(); sbuf.append("network: ").append(mNetworkName); Loading @@ -221,6 +269,7 @@ public class WifiP2pGroup implements Parcelable { sbuf.append("\n Client: ").append(client); } sbuf.append("\n interface: ").append(mInterface); sbuf.append("\n networkId: ").append(mNetId); return sbuf.toString(); } Loading @@ -238,6 +287,7 @@ public class WifiP2pGroup implements Parcelable { for (WifiP2pDevice d : source.getClientList()) mClients.add(d); mPassphrase = source.getPassphrase(); mInterface = source.getInterface(); mNetId = source.getNetworkId(); } } Loading @@ -252,6 +302,7 @@ public class WifiP2pGroup implements Parcelable { } dest.writeString(mPassphrase); dest.writeString(mInterface); dest.writeInt(mNetId); } /** Implement the Parcelable interface */ Loading @@ -268,6 +319,7 @@ public class WifiP2pGroup implements Parcelable { } group.setPassphrase(in.readString()); group.setInterface(in.readString()); group.setNetworkId(in.readInt()); return group; } Loading