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