blob: fcaf146c97ee18e0a27650d82f4a502d04190baa [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2017, Regents of the University of California,
*
* This file is part of NFD Control Center. See AUTHORS.md for complete list of NFD
* authors and contributors.
*
* NFD Control Center is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* NFD Control Center is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with NFD
* Control Center, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
#include "osx-adhoc.hpp"
#include <ndn-cxx/name.hpp>
#include <ndn-cxx/mgmt/nfd/control-parameters.hpp>
#ifdef OSX_BUILD
#import <CoreWLAN/CoreWLAN.h>
#import <CoreWLAN/CoreWLANConstants.h>
#import <CoreWLAN/CWInterface.h>
#import <CoreWLAN/CWWiFiClient.h>
#import <CoreWLAN/CoreWLANTypes.h>
namespace ndn {
namespace ncc {
const std::string adhocUri = "udp4://224.0.23.170:56363";
const std::set<Name> adhocPrefixes = {"/", "/adhoc"};
const NSUInteger g_channel = 11;
const uint16_t ROUTE_ORIGIN_NCC = 67;
Adhoc::Adhoc(Face& face, KeyChain& keychain)
: m_face(face)
, m_keyChain(keychain)
, m_controller(new nfd::Controller(m_face, m_keyChain))
, m_faceMonitor(new nfd::FaceMonitor(m_face))
{
m_faceMonitor->onNotification.connect(bind(&Adhoc::onNotification, this, _1));
}
Adhoc::~Adhoc()
{
delete m_faceMonitor;
delete m_controller;
}
bool
Adhoc::createAdhoc()
{
m_faceMonitor->start();
NSString* networkName =
[[NSString alloc] initWithCString:"NDNdirect" encoding:NSASCIIStringEncoding];
NSString* passphrase =
[[NSString alloc] initWithCString:"NDNhello" encoding:NSASCIIStringEncoding];
NSArray* airportInterfaces = [CWWiFiClient interfaceNames];
NSString* interfaceName = [airportInterfaces objectAtIndex:0];
CWWiFiClient* wifiInterfaces = [[CWWiFiClient alloc] init];
CWInterface* airport = [wifiInterfaces interfaceWithName:interfaceName];
NSError* error = nil;
NSData* data = [networkName dataUsingEncoding:NSUTF8StringEncoding];
BOOL created = [airport startIBSSModeWithSSID:data
security:kCWIBSSModeSecurityNone
channel:g_channel
password:passphrase
error:&error];
if (!created) {
return false;
}
else {
unregisterRoutes(ndn::nfd::ROUTE_ORIGIN_AUTOCONF);
return true;
}
}
void
Adhoc::destroyAdhoc()
{
unregisterRoutes(ROUTE_ORIGIN_NCC);
m_faceMonitor->stop();
NSArray* airportInterfaces = [CWWiFiClient interfaceNames];
NSString* interfaceName = [airportInterfaces objectAtIndex:0];
CWWiFiClient* wifiInterfaces = [[CWWiFiClient alloc] init];
CWInterface* airport = [wifiInterfaces interfaceWithName:interfaceName];
[airport disassociate];
NSError* err = nil;
[airport setPower:NO error:&err];
[NSThread sleepForTimeInterval: 3.0];
[airport setPower:YES error:&err];
}
void
Adhoc::onNotification(const ndn::nfd::FaceEventNotification& notification)
{
if (notification.getKind() == ndn::nfd::FACE_EVENT_CREATED &&
notification.getRemoteUri() == adhocUri &&
notification.getLinkType() == ndn::nfd::LINK_TYPE_MULTI_ACCESS) {
for (const auto& prefix : adhocPrefixes) {
ndn::nfd::ControlParameters params;
params
.setName(prefix)
.setFaceId(notification.getFaceId())
.setOrigin(ROUTE_ORIGIN_NCC);
m_controller->start<ndn::nfd::RibRegisterCommand>(params, nullptr, nullptr);
}
}
}
void
Adhoc::unregisterRoutes(uint16_t origin)
{
m_controller->fetch<ndn::nfd::RibDataset>([this, origin] (const std::vector<nfd::RibEntry>& ribs) {
for (const auto& rib : ribs) {
for (const auto& route : rib.getRoutes()) {
if (route.getOrigin() == origin) {
ndn::nfd::ControlParameters params;
params.setFaceId(route.getFaceId());
m_controller->start<ndn::nfd::FaceDestroyCommand>(params, nullptr, nullptr);
}
}
}
}, nullptr);
}
} // namespace ncc
} // namespace ndn
#endif // OSX_BUILD