Home | History | Annotate | Download | only in wifi
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.server.wifi;
     18 
     19 import java.io.IOException;
     20 
     21 /**
     22  * This class carries the payload of a Hotspot 2.0 Wireless Network Management (WNM) frame,
     23  * described in the Hotspot 2.0 spec, section 3.2.
     24  */
     25 public class WnmData {
     26     private static final int ESS = 1;   // HS2.0 spec section 3.2.1.2, table 4
     27 
     28     private final long mBssid;
     29     private final String mUrl;
     30     private final boolean mDeauthEvent;
     31     private final int mMethod;
     32     private final boolean mEss;
     33     private final int mDelay;
     34 
     35     public static WnmData buildWnmData(String event) throws IOException {
     36         // %012x HS20-SUBSCRIPTION-REMEDIATION "%u %s", osu_method, url
     37         // %012x HS20-DEAUTH-IMMINENT-NOTICE "%u %u %s", code, reauth_delay, url
     38 
     39         String[] segments = event.split(" ");
     40         if (segments.length < 2) {
     41             throw new IOException("Short event");
     42         }
     43 
     44         switch (segments[1]) {
     45             case WifiMonitor.HS20_SUB_REM_STR: {
     46                 if (segments.length != 4) {
     47                     throw new IOException("Expected 4 segments");
     48                 }
     49                 return new WnmData(Long.parseLong(segments[0], 16),
     50                         segments[3],
     51                         Integer.parseInt(segments[2]));
     52             }
     53             case WifiMonitor.HS20_DEAUTH_STR: {
     54                 if (segments.length != 5) {
     55                     throw new IOException("Expected 5 segments");
     56                 }
     57                 int codeID = Integer.parseInt(segments[2]);
     58                 if (codeID < 0 || codeID > ESS) {
     59                     throw new IOException("Unknown code");
     60                 }
     61                 return new WnmData(Long.parseLong(segments[0], 16),
     62                         segments[4],
     63                         codeID == ESS,
     64                         Integer.parseInt(segments[3]));
     65             }
     66             default:
     67                 throw new IOException("Unknown event type");
     68         }
     69     }
     70 
     71     private WnmData(long bssid, String url, int method) {
     72         mBssid = bssid;
     73         mUrl = url;
     74         mMethod = method;
     75         mEss = false;
     76         mDelay = -1;
     77         mDeauthEvent = false;
     78     }
     79 
     80     private WnmData(long bssid, String url, boolean ess, int delay) {
     81         mBssid = bssid;
     82         mUrl = url;
     83         mEss = ess;
     84         mDelay = delay;
     85         mMethod = -1;
     86         mDeauthEvent = true;
     87     }
     88 
     89     public long getBssid() {
     90         return mBssid;
     91     }
     92 
     93     public String getUrl() {
     94         return mUrl;
     95     }
     96 
     97     public boolean isDeauthEvent() {
     98         return mDeauthEvent;
     99     }
    100 
    101     public int getMethod() {
    102         return mMethod;
    103     }
    104 
    105     public boolean isEss() {
    106         return mEss;
    107     }
    108 
    109     public int getDelay() {
    110         return mDelay;
    111     }
    112 }
    113