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