1ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpackage com.android.hotspot2.pps; 2ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 3ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.hotspot2.Utils; 4ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.hotspot2.omadm.MOManager; 5ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.hotspot2.omadm.OMAException; 6ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.hotspot2.omadm.OMANode; 7ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 8ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.ArrayList; 9ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.HashMap; 10ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.List; 11ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.Map; 12ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 13ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_Country; 14ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_DLBandwidth; 15ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_FQDN_Match; 16ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_IPProtocol; 17ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_MaximumBSSLoadValue; 18ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_MinBackhaulThreshold; 19ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_NetworkType; 20ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_PolicyUpdate; 21ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_PortNumber; 22ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_PreferredRoamingPartnerList; 23ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_Priority; 24ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_RequiredProtoPortTuple; 25ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_SPExclusionList; 26ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_SSID; 27ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport static com.android.hotspot2.omadm.MOManager.TAG_ULBandwidth; 28ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 29ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpublic class Policy { 30ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final List<PreferredRoamingPartner> mPreferredRoamingPartners; 31ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final List<MinBackhaul> mMinBackhaulThresholds; 32ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final UpdateInfo mPolicyUpdate; 33ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final List<String> mSPExclusionList; 34ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final Map<Integer, List<Integer>> mRequiredProtos; 35ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final int mMaxBSSLoad; 36ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 37ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public Policy(OMANode node) throws OMAException { 38ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 39ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist OMANode rpNode = node.getChild(TAG_PreferredRoamingPartnerList); 40ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (rpNode == null) { 41ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mPreferredRoamingPartners = null; 42ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 43ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mPreferredRoamingPartners = new ArrayList<>(rpNode.getChildren().size()); 44ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist for (OMANode instance : rpNode.getChildren()) { 45ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (instance.isLeaf()) { 46ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist throw new OMAException("Not expecting leaf node in " + 47ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist TAG_PreferredRoamingPartnerList); 48ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 49ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mPreferredRoamingPartners.add(new PreferredRoamingPartner(instance)); 50ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 51ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 52ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 53ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist OMANode bhtNode = node.getChild(TAG_MinBackhaulThreshold); 54ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (bhtNode == null) { 55ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mMinBackhaulThresholds = null; 56ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 57ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mMinBackhaulThresholds = new ArrayList<>(bhtNode.getChildren().size()); 58ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist for (OMANode instance : bhtNode.getChildren()) { 59ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (instance.isLeaf()) { 60ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist throw new OMAException("Not expecting leaf node in " + 61ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist TAG_MinBackhaulThreshold); 62ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 63ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mMinBackhaulThresholds.add(new MinBackhaul(instance)); 64ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 65ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 66ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 67ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mPolicyUpdate = new UpdateInfo(node.getChild(TAG_PolicyUpdate)); 68ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 69ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist OMANode sxNode = node.getChild(TAG_SPExclusionList); 70ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (sxNode == null) { 71ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mSPExclusionList = null; 72ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 73ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mSPExclusionList = new ArrayList<>(sxNode.getChildren().size()); 74ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist for (OMANode instance : sxNode.getChildren()) { 75ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (instance.isLeaf()) { 76ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist throw new OMAException("Not expecting leaf node in " + TAG_SPExclusionList); 77ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 78ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mSPExclusionList.add(MOManager.getString(instance, TAG_SSID)); 79ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 80ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 81ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 82ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist OMANode rptNode = node.getChild(TAG_RequiredProtoPortTuple); 83ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (rptNode == null) { 84ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mRequiredProtos = null; 85ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 86ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mRequiredProtos = new HashMap<>(rptNode.getChildren().size()); 87ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist for (OMANode instance : rptNode.getChildren()) { 88ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (instance.isLeaf()) { 89ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist throw new OMAException("Not expecting leaf node in " + 90ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist TAG_RequiredProtoPortTuple); 91ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 92ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist int protocol = (int) MOManager.getLong(instance, TAG_IPProtocol, null); 93ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist String[] portSegments = MOManager.getString(instance, TAG_PortNumber).split(","); 94ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist List<Integer> ports = new ArrayList<>(portSegments.length); 95ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist for (String portSegment : portSegments) { 96ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist try { 97ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ports.add(Integer.parseInt(portSegment)); 98ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } catch (NumberFormatException nfe) { 99ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist throw new OMAException("Port is not a number: " + portSegment); 100ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 101ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 102ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mRequiredProtos.put(protocol, ports); 103ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 104ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 105ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 106ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mMaxBSSLoad = (int) MOManager.getLong(node, TAG_MaximumBSSLoadValue, Long.MAX_VALUE); 107ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 108ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 109ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public List<PreferredRoamingPartner> getPreferredRoamingPartners() { 110ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return mPreferredRoamingPartners; 111ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 112ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 113ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public List<MinBackhaul> getMinBackhaulThresholds() { 114ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return mMinBackhaulThresholds; 115ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 116ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 117ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public UpdateInfo getPolicyUpdate() { 118ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return mPolicyUpdate; 119ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 120ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 121ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public List<String> getSPExclusionList() { 122ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return mSPExclusionList; 123ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 124ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 125ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public Map<Integer, List<Integer>> getRequiredProtos() { 126ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return mRequiredProtos; 127ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 128ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 129ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public int getMaxBSSLoad() { 130ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return mMaxBSSLoad; 131ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 132ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 133ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private static class PreferredRoamingPartner { 134ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final List<String> mDomain; 135ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final Boolean mIncludeSubDomains; 136ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final int mPriority; 137ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final String mCountry; 138ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 139ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private PreferredRoamingPartner(OMANode node) 140ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist throws OMAException { 141ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 142ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist String[] segments = MOManager.getString(node, TAG_FQDN_Match).split(","); 143ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (segments.length != 2) { 144ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist throw new OMAException("Bad FQDN match string: " + TAG_FQDN_Match); 145ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 146ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mDomain = Utils.splitDomain(segments[0]); 147ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mIncludeSubDomains = MOManager.getSelection(TAG_FQDN_Match, segments[1]); 148ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mPriority = (int) MOManager.getLong(node, TAG_Priority, null); 149ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mCountry = MOManager.getString(node, TAG_Country); 150ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 151ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 152ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 153ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public String toString() { 154ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return "PreferredRoamingPartner{" + 155ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist "domain=" + mDomain + 156ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ", includeSubDomains=" + mIncludeSubDomains + 157ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ", priority=" + mPriority + 158ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ", country='" + mCountry + '\'' + 159ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist '}'; 160ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 161ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 162ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 163ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private static class MinBackhaul { 164ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final Boolean mHome; 165ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final long mDL; 166ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final long mUL; 167ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 168ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private MinBackhaul(OMANode node) throws OMAException { 169ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mHome = MOManager.getSelection(node, TAG_NetworkType); 170ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mDL = MOManager.getLong(node, TAG_DLBandwidth, Long.MAX_VALUE); 171ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mUL = MOManager.getLong(node, TAG_ULBandwidth, Long.MAX_VALUE); 172ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 173ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 174ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 175ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public String toString() { 176ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return "MinBackhaul{" + 177ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist "home=" + mHome + 178ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ", DL=" + mDL + 179ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ", UL=" + mUL + 180ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist '}'; 181ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 182ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 183ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 184ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 185ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public String toString() { 186ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return "Policy{" + 187ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist "preferredRoamingPartners=" + mPreferredRoamingPartners + 188ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ", minBackhaulThresholds=" + mMinBackhaulThresholds + 189ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ", policyUpdate=" + mPolicyUpdate + 190ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ", SPExclusionList=" + mSPExclusionList + 191ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ", requiredProtos=" + mRequiredProtos + 192ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ", maxBSSLoad=" + mMaxBSSLoad + 193ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist '}'; 194ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 195ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist} 196