12e814680f4dd27a5f825afab189843582235cedcJan Nordqvist/*
22e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * Copyright (C) 2016 The Android Open Source Project
32e814680f4dd27a5f825afab189843582235cedcJan Nordqvist *
42e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * Licensed under the Apache License, Version 2.0 (the "License");
52e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * you may not use this file except in compliance with the License.
62e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * You may obtain a copy of the License at
72e814680f4dd27a5f825afab189843582235cedcJan Nordqvist *
82e814680f4dd27a5f825afab189843582235cedcJan Nordqvist *      http://www.apache.org/licenses/LICENSE-2.0
92e814680f4dd27a5f825afab189843582235cedcJan Nordqvist *
102e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * Unless required by applicable law or agreed to in writing, software
112e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * distributed under the License is distributed on an "AS IS" BASIS,
122e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * See the License for the specific language governing permissions and
142e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * limitations under the License.
152e814680f4dd27a5f825afab189843582235cedcJan Nordqvist */
162e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
172e814680f4dd27a5f825afab189843582235cedcJan Nordqvistpackage com.android.server.wifi;
182e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
192e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport java.io.IOException;
202e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
212e814680f4dd27a5f825afab189843582235cedcJan Nordqvist/**
222e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * This class carries the payload of a Hotspot 2.0 Wireless Network Management (WNM) frame,
232e814680f4dd27a5f825afab189843582235cedcJan Nordqvist * described in the Hotspot 2.0 spec, section 3.2.
242e814680f4dd27a5f825afab189843582235cedcJan Nordqvist */
252e814680f4dd27a5f825afab189843582235cedcJan Nordqvistpublic class WnmData {
262e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    private static final int ESS = 1;   // HS2.0 spec section 3.2.1.2, table 4
272e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
282e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    private final long mBssid;
292e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    private final String mUrl;
302e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    private final boolean mDeauthEvent;
312e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    private final int mMethod;
322e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    private final boolean mEss;
332e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    private final int mDelay;
342e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
352e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    public static WnmData buildWnmData(String event) throws IOException {
362e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        // %012x HS20-SUBSCRIPTION-REMEDIATION "%u %s", osu_method, url
372e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        // %012x HS20-DEAUTH-IMMINENT-NOTICE "%u %u %s", code, reauth_delay, url
382e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
392e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        String[] segments = event.split(" ");
402e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        if (segments.length < 2) {
412e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            throw new IOException("Short event");
422e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        }
432e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
442e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        switch (segments[1]) {
452e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            case WifiMonitor.HS20_SUB_REM_STR: {
462e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                if (segments.length != 4) {
472e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                    throw new IOException("Expected 4 segments");
482e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                }
492e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                return new WnmData(Long.parseLong(segments[0], 16),
502e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        segments[3],
512e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        Integer.parseInt(segments[2]));
522e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            }
532e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            case WifiMonitor.HS20_DEAUTH_STR: {
542e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                if (segments.length != 5) {
552e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                    throw new IOException("Expected 5 segments");
562e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                }
572e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                int codeID = Integer.parseInt(segments[2]);
582e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                if (codeID < 0 || codeID > ESS) {
592e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                    throw new IOException("Unknown code");
602e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                }
612e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                return new WnmData(Long.parseLong(segments[0], 16),
622e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        segments[4],
632e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        codeID == ESS,
642e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        Integer.parseInt(segments[3]));
652e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            }
662e814680f4dd27a5f825afab189843582235cedcJan Nordqvist            default:
672e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                throw new IOException("Unknown event type");
682e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        }
692e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    }
702e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
712e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    private WnmData(long bssid, String url, int method) {
722e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mBssid = bssid;
732e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mUrl = url;
742e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mMethod = method;
752e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mEss = false;
762e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mDelay = -1;
772e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mDeauthEvent = false;
782e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    }
792e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
802e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    private WnmData(long bssid, String url, boolean ess, int delay) {
812e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mBssid = bssid;
822e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mUrl = url;
832e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mEss = ess;
842e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mDelay = delay;
852e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mMethod = -1;
862e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        mDeauthEvent = true;
872e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    }
882e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
892e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    public long getBssid() {
902e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        return mBssid;
912e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    }
922e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
932e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    public String getUrl() {
942e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        return mUrl;
952e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    }
962e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
972e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    public boolean isDeauthEvent() {
982e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        return mDeauthEvent;
992e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    }
1002e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
1012e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    public int getMethod() {
1022e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        return mMethod;
1032e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    }
1042e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
1052e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    public boolean isEss() {
1062e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        return mEss;
1072e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    }
1082e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
1092e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    public int getDelay() {
1102e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        return mDelay;
1112e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    }
1122e814680f4dd27a5f825afab189843582235cedcJan Nordqvist}
113