11d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistpackage com.android.server.wifi.hotspot2.pps;
21d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
31d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport com.android.server.wifi.hotspot2.Utils;
41d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport com.android.server.wifi.hotspot2.omadm.OMAException;
51d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport com.android.server.wifi.hotspot2.omadm.OMANode;
62e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager;
71d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
81d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport java.util.ArrayList;
91d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport java.util.HashMap;
101d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport java.util.List;
111d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistimport java.util.Map;
121d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
132e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_Country;
142e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_DLBandwidth;
152e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_FQDN_Match;
162e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_IPProtocol;
172e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_MaximumBSSLoadValue;
182e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_MinBackhaulThreshold;
192e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_NetworkType;
202e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_PolicyUpdate;
212e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_PortNumber;
222e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_PreferredRoamingPartnerList;
232e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_Priority;
242e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_RequiredProtoPortTuple;
252e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_SPExclusionList;
262e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_SSID;
272e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport static com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager.TAG_ULBandwidth;
281d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
291d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvistpublic class Policy {
301d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    private final List<PreferredRoamingPartner> mPreferredRoamingPartners;
311d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    private final List<MinBackhaul> mMinBackhaulThresholds;
321d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    private final UpdateInfo mPolicyUpdate;
331d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    private final List<String> mSPExclusionList;
341d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    private final Map<Integer, List<Integer>> mRequiredProtos;
351d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    private final int mMaxBSSLoad;
361d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
371d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    public Policy(OMANode node) throws OMAException {
381d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
391d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        OMANode rpNode = node.getChild(TAG_PreferredRoamingPartnerList);
401d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        if (rpNode == null) {
411d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            mPreferredRoamingPartners = null;
421d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        }
431d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        else {
441d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            mPreferredRoamingPartners = new ArrayList<>(rpNode.getChildren().size());
451d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            for (OMANode instance : rpNode.getChildren()) {
461d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                if (instance.isLeaf()) {
471d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    throw new OMAException("Not expecting leaf node in " +
481d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                            TAG_PreferredRoamingPartnerList);
491d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                }
501d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                mPreferredRoamingPartners.add(new PreferredRoamingPartner(instance));
511d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            }
521d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        }
531d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
541d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        OMANode bhtNode = node.getChild(TAG_MinBackhaulThreshold);
551d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        if (bhtNode == null) {
561d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            mMinBackhaulThresholds = null;
571d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        }
581d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        else {
591d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            mMinBackhaulThresholds = new ArrayList<>(bhtNode.getChildren().size());
601d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            for (OMANode instance : bhtNode.getChildren()) {
611d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                if (instance.isLeaf()) {
621d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    throw new OMAException("Not expecting leaf node in " +
631d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                            TAG_MinBackhaulThreshold);
641d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                }
651d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                mMinBackhaulThresholds.add(new MinBackhaul(instance));
661d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            }
671d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        }
681d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
691d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        mPolicyUpdate = new UpdateInfo(node.getChild(TAG_PolicyUpdate));
701d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
711d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        OMANode sxNode = node.getChild(TAG_SPExclusionList);
721d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        if (sxNode == null) {
731d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            mSPExclusionList = null;
741d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        }
751d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        else {
761d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            mSPExclusionList = new ArrayList<>(sxNode.getChildren().size());
771d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            for (OMANode instance : sxNode.getChildren()) {
781d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                if (instance.isLeaf()) {
791d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    throw new OMAException("Not expecting leaf node in " + TAG_SPExclusionList);
801d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                }
812e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                mSPExclusionList
822e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        .add(PasspointManagementObjectManager.getString(instance, TAG_SSID));
831d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            }
841d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        }
851d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
861d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        OMANode rptNode = node.getChild(TAG_RequiredProtoPortTuple);
871d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        if (rptNode == null) {
881d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            mRequiredProtos = null;
891d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        }
901d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        else {
911d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            mRequiredProtos = new HashMap<>(rptNode.getChildren().size());
921d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            for (OMANode instance : rptNode.getChildren()) {
931d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                if (instance.isLeaf()) {
941d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    throw new OMAException("Not expecting leaf node in " +
951d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                            TAG_RequiredProtoPortTuple);
961d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                }
972e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                int protocol =
982e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        (int) PasspointManagementObjectManager
992e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                                .getLong(instance, TAG_IPProtocol, null);
1002e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                String[] portSegments =
1012e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        PasspointManagementObjectManager
1022e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                                .getString(instance, TAG_PortNumber).split(",");
1031d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                List<Integer> ports = new ArrayList<>(portSegments.length);
1041d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                for (String portSegment : portSegments) {
1051d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    try {
1061d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                        ports.add(Integer.parseInt(portSegment));
1071d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    }
1081d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    catch (NumberFormatException nfe) {
1091d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                        throw new OMAException("Port is not a number: " + portSegment);
1101d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    }
1111d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                }
1121d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                mRequiredProtos.put(protocol, ports);
1131d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            }
1141d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        }
1151d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1162e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mMaxBSSLoad = (int) PasspointManagementObjectManager.getLong(node,
1172e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                TAG_MaximumBSSLoadValue, Long.MAX_VALUE);
1181d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    }
1191d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1201d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    public List<PreferredRoamingPartner> getPreferredRoamingPartners() {
1211d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        return mPreferredRoamingPartners;
1221d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    }
1231d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1241d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    public List<MinBackhaul> getMinBackhaulThresholds() {
1251d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        return mMinBackhaulThresholds;
1261d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    }
1271d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1281d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    public UpdateInfo getPolicyUpdate() {
1291d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        return mPolicyUpdate;
1301d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    }
1311d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1321d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    public List<String> getSPExclusionList() {
1331d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        return mSPExclusionList;
1341d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    }
1351d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1361d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    public Map<Integer, List<Integer>> getRequiredProtos() {
1371d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        return mRequiredProtos;
1381d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    }
1391d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1401d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    public int getMaxBSSLoad() {
1411d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        return mMaxBSSLoad;
1421d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    }
1431d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1441d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    private static class PreferredRoamingPartner {
1451d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        private final List<String> mDomain;
1461d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        private final Boolean mIncludeSubDomains;
1471d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        private final int mPriority;
1481d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        private final String mCountry;
1491d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1501d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        private PreferredRoamingPartner(OMANode node)
1511d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                throws OMAException {
1521d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1532e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            String[] segments =
1542e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                    PasspointManagementObjectManager.getString(node, TAG_FQDN_Match).split(",");
1551d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            if (segments.length != 2) {
1561d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                throw new OMAException("Bad FQDN match string: " + TAG_FQDN_Match);
1571d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            }
1581d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            mDomain = Utils.splitDomain(segments[0]);
1592e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            mIncludeSubDomains =
1602e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                    PasspointManagementObjectManager.getSelection(TAG_FQDN_Match, segments[1]);
1612e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            mPriority = (int) PasspointManagementObjectManager.getLong(node, TAG_Priority, null);
1622e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            mCountry = PasspointManagementObjectManager.getString(node, TAG_Country);
1631d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        }
1641d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1651d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        @Override
1661d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        public String toString() {
1671d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            return "PreferredRoamingPartner{" +
1681d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    "domain=" + mDomain +
1691d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    ", includeSubDomains=" + mIncludeSubDomains +
1701d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    ", priority=" + mPriority +
1711d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    ", country='" + mCountry + '\'' +
1721d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    '}';
1731d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        }
1741d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    }
1751d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1761d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    private static class MinBackhaul {
1771d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        private final Boolean mHome;
1781d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        private final long mDL;
1791d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        private final long mUL;
1801d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1811d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        private MinBackhaul(OMANode node) throws OMAException {
1822e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            mHome = PasspointManagementObjectManager.getSelection(node, TAG_NetworkType);
1832e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            mDL = PasspointManagementObjectManager.getLong(node, TAG_DLBandwidth, Long.MAX_VALUE);
1842e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            mUL = PasspointManagementObjectManager.getLong(node, TAG_ULBandwidth, Long.MAX_VALUE);
1851d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        }
1861d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1871d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        @Override
1881d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        public String toString() {
1891d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist            return "MinBackhaul{" +
1901d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    "home=" + mHome +
1911d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    ", DL=" + mDL +
1921d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    ", UL=" + mUL +
1931d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                    '}';
1941d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        }
1951d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    }
1961d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist
1971d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    @Override
1981d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    public String toString() {
1991d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist        return "Policy{" +
2001d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                "preferredRoamingPartners=" + mPreferredRoamingPartners +
2011d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                ", minBackhaulThresholds=" + mMinBackhaulThresholds +
2021d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                ", policyUpdate=" + mPolicyUpdate +
2031d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                ", SPExclusionList=" + mSPExclusionList +
2041d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                ", requiredProtos=" + mRequiredProtos +
2051d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                ", maxBSSLoad=" + mMaxBSSLoad +
2061d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist                '}';
2071d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    }
2081d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist}
209