C++程序  |  101行  |  3.22 KB

//
// Copyright (C) 2015 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#ifndef SHILL_WIFI_TDLS_MANAGER_H_
#define SHILL_WIFI_TDLS_MANAGER_H_

#include <map>
#include <string>

#include <base/cancelable_callback.h>

namespace shill {

class Error;
class EventDispatcher;
class SupplicantInterfaceProxyInterface;

// Manage TDLS peers for the specified interface |interface_name|.
class TDLSManager {
 public:
  TDLSManager(EventDispatcher* dispatcher,
              SupplicantInterfaceProxyInterface* supplicant_interface_proxy,
              const std::string& interface_name);
  virtual ~TDLSManager();

  // Perform TDLS |operation| on |peer|.
  virtual std::string PerformOperation(const std::string& peer_mac_address,
                                       const std::string& operation,
                                       Error* error);

  // Called when a discover response for |peer_mac_address| is received.
  virtual void OnDiscoverResponseReceived(const std::string& peer_mac_address);

  const std::string& interface_name() const { return interface_name_; }

 private:
  friend class TDLSManagerTest;

  enum class PeerDiscoveryState {
    kNone,
    kRequestSent,
    kResponseReceived
  };

  static const int kPeerDiscoveryCleanupTimeoutSeconds;

  // Discover TDLS service on a remote |peer_mac_address|.  Returns true if
  // operation is initiated successfully.
  bool DiscoverPeer(const std::string& peer_mac_address);

  // Setup a TDLS pairing with |peer_mac_address|.  Returns true if operation is
  // initiated successfully.
  bool SetupPeer(const std::string& peer_mac_address);

  // Tear down the TDLS pairing with |peer|.  Returns true if operation is
  // initiated successfully.
  bool TearDownPeer(const std::string& peer_mac_address);

  // Return a string indicating the TDLS status with |peer_mac_address|.
  std::string PeerStatus(const std::string& peer_mac_address);

  // Start the timer to delete any peer entries stored in our peer discovery
  // map.
  void StartPeerDiscoveryCleanupTimer();

  // Timeout handler to delete any peer entries from our peer discovery map.
  void PeerDiscoveryCleanup();

  // Returns the TDLS discover status for this peer
  PeerDiscoveryState CheckDiscoveryState(const std::string& peer_mac_address);

  // Executes when the TDLS peer discovery cleanup timer expires.
  base::CancelableClosure peer_discovery_cleanup_callback_;

  // Maps peer to its discovery state.
  std::map<std::string, PeerDiscoveryState> peer_discovery_state_;

  EventDispatcher* dispatcher_;
  SupplicantInterfaceProxyInterface* supplicant_interface_proxy_;
  std::string interface_name_;

  DISALLOW_COPY_AND_ASSIGN(TDLSManager);
};

}  // namespace shill

#endif  // SHILL_WIFI_TDLS_MANAGER_H_