Skip to content

Commit

Permalink
dnssd plat api (all done for registering)
Browse files Browse the repository at this point in the history
  • Loading branch information
abtink committed Sep 20, 2023
1 parent 0f76a8c commit c377a12
Show file tree
Hide file tree
Showing 8 changed files with 438 additions and 2 deletions.
6 changes: 6 additions & 0 deletions etc/cmake/options.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,12 @@ if (OTBR_DNSSD_DISCOVERY_PROXY)
target_compile_definitions(otbr-config INTERFACE OTBR_ENABLE_DNSSD_DISCOVERY_PROXY=1)
endif()

# When enabled the Advertising Proxy and Discovery proxy will be supported by OpenThread core
option(OTBR_DNSSD_PLAT "Enable DNS-SD plat APIs for Advertising proxy and Discovery proxy in core" OFF)
if (OTBR_DNSSD_PLAT)
target_compile_definitions(otbr-config INTERFACE OTBR_ENABLE_DNSSD_PLAT=1)
endif()

option(OTBR_UNSECURE_JOIN "Enable unsecure joining" OFF)
if(OTBR_UNSECURE_JOIN)
target_compile_definitions(otbr-config INTERFACE OTBR_ENABLE_UNSECURE_JOIN=1)
Expand Down
2 changes: 2 additions & 0 deletions script/_otbr
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ otbr_install()
"-DOTBR_DBUS=ON"
"-DOTBR_DNSSD_DISCOVERY_PROXY=ON"
"-DOTBR_SRP_ADVERTISING_PROXY=ON"
# TODO: Change this later
"-DOTBR_DNSSD_PLAT=ON"
"-DOTBR_INFRA_IF_NAME=${INFRA_IF_NAME}"
"-DOTBR_MDNS=${OTBR_MDNS:=mDNSResponder}"
# Force re-evaluation of version strings
Expand Down
8 changes: 8 additions & 0 deletions src/border_agent/border_agent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,9 @@ struct StateBitmap
BorderAgent::BorderAgent(otbr::Ncp::ControllerOpenThread &aNcp)
: mNcp(aNcp)
, mPublisher(Mdns::Publisher::Create([this](Mdns::Publisher::State aNewState) { HandleMdnsState(aNewState); }))
#if OTBR_ENABLE_DNSSD_PLAT
, mDnssdPlatform(aNcp, *mPublisher)
#endif
#if OTBR_ENABLE_SRP_ADVERTISING_PROXY
, mAdvertisingProxy(aNcp, *mPublisher)
#endif
Expand Down Expand Up @@ -184,6 +187,7 @@ void BorderAgent::Start(void)
otbrError error = OTBR_ERROR_NONE;

SuccessOrExit(error = mPublisher->Start());

#if OTBR_ENABLE_SRP_ADVERTISING_PROXY
mAdvertisingProxy.Start();
#endif
Expand Down Expand Up @@ -222,6 +226,10 @@ BorderAgent::~BorderAgent(void)

void BorderAgent::HandleMdnsState(Mdns::Publisher::State aState)
{
#if OTBR_ENABLE_DNSSD_PLAT
mDnssdPlatform.HandleMdnsPublisherStateChange(aState);
#endif

switch (aState)
{
case Mdns::Publisher::State::kReady:
Expand Down
5 changes: 5 additions & 0 deletions src/border_agent/border_agent.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include "backbone_router/backbone_agent.hpp"
#include "common/code_utils.hpp"
#include "common/mainloop.hpp"
#include "mdns/dnssd_plat.hpp"
#include "mdns/mdns.hpp"
#include "ncp/ncp_openthread.hpp"
#include "sdp_proxy/advertising_proxy.hpp"
Expand Down Expand Up @@ -137,6 +138,10 @@ class BorderAgent : private NonCopyable
std::map<std::string, std::vector<uint8_t>> mMeshCopTxtUpdate;
#endif

#if OTBR_ENABLE_DNSSD_PLAT
DnssdPlatform mDnssdPlatform;
#endif
// TODO: change these
#if OTBR_ENABLE_SRP_ADVERTISING_PROXY
AdvertisingProxy mAdvertisingProxy;
#endif
Expand Down
2 changes: 2 additions & 0 deletions src/mdns/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ if(OTBR_MDNS STREQUAL "avahi")
add_library(otbr-mdns
mdns.cpp
mdns_avahi.cpp
dnssd_plat.cpp
)
target_compile_definitions(otbr-mdns PUBLIC
OTBR_ENABLE_MDNS_AVAHI=1
Expand All @@ -48,6 +49,7 @@ if(OTBR_MDNS STREQUAL "mDNSResponder")
add_library(otbr-mdns
mdns.cpp
mdns_mdnssd.cpp
dnssd_plat.cpp
)
target_compile_definitions(otbr-mdns PUBLIC
OTBR_ENABLE_MDNS_MDNSSD=1
Expand Down
308 changes: 308 additions & 0 deletions src/mdns/dnssd_plat.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,308 @@
/*
* Copyright (c) 2023, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

/**
* @file
* This file includes definitions for implementing OpenThread DNS-SD platform APIs.
*/

#define OTBR_LOG_TAG "DnssdPlat"

#include "mdns/dnssd_plat.hpp"

#include <openthread/platform/toolchain.h>

#include "common/code_utils.hpp"
#include "utils/dns_utils.hpp"

#if OTBR_ENABLE_DNSSD_PLAT

static otbr::DnssdPlatform *sDnssdPlatform = nullptr;

//----------------------------------------------------------------------------------------------------------------------
// otPlatDnssd APIs

extern "C" otPlatDnssdState otPlatDnssdGetState(otInstance *aInstance)
{
OT_UNUSED_VARIABLE(aInstance);

return sDnssdPlatform->GetState();
}

extern "C" void otPlatDnssdRegisterService(otInstance *aInstance,
const otPlatDnssdService *aService,
otPlatDnssdRequestId aRequestId,
otPlatDnssdRegisterCallback aCallback)
{
OT_UNUSED_VARIABLE(aInstance);
sDnssdPlatform->RegisterService(*aService, aRequestId, aCallback);
}

extern "C" void otPlatDnssdUnregisterService(otInstance *aInstance,
const otPlatDnssdService *aService,
otPlatDnssdRequestId aRequestId,
otPlatDnssdRegisterCallback aCallback)
{
OT_UNUSED_VARIABLE(aInstance);
sDnssdPlatform->UnregisterService(*aService, aRequestId, aCallback);
}

extern "C" void otPlatDnssdRegisterHost(otInstance *aInstance,
const otPlatDnssdHost *aHost,
otPlatDnssdRequestId aRequestId,
otPlatDnssdRegisterCallback aCallback)
{
OT_UNUSED_VARIABLE(aInstance);
sDnssdPlatform->RegisterHost(*aHost, aRequestId, aCallback);
}

extern "C" void otPlatDnssdUnregisterHost(otInstance *aInstance,
const otPlatDnssdHost *aHost,
otPlatDnssdRequestId aRequestId,
otPlatDnssdRegisterCallback aCallback)
{
OT_UNUSED_VARIABLE(aInstance);
sDnssdPlatform->UnregisterHost(*aHost, aRequestId, aCallback);
}

extern "C" void otPlatDnssdRegisterKey(otInstance *aInstance,
const otPlatDnssdKey *aKey,
otPlatDnssdRequestId aRequestId,
otPlatDnssdRegisterCallback aCallback)
{
OT_UNUSED_VARIABLE(aInstance);
sDnssdPlatform->RegisterKey(*aKey, aRequestId, aCallback);
}

extern "C" void otPlatDnssdUnregisterKey(otInstance *aInstance,
const otPlatDnssdKey *aKey,
otPlatDnssdRequestId aRequestId,
otPlatDnssdRegisterCallback aCallback)
{
OT_UNUSED_VARIABLE(aInstance);
sDnssdPlatform->UnregisterKey(*aKey, aRequestId, aCallback);
}

extern "C" void otPlatDnssdStartServiceBrowser(otInstance *aInstance, const char *aServiceType, uint32_t aInfraIfIndex)
{
OT_UNUSED_VARIABLE(aInstance);
OT_UNUSED_VARIABLE(aServiceType);
OT_UNUSED_VARIABLE(aInfraIfIndex);
}

extern "C" void otPlatDnssdStopServiceBrowser(otInstance *aInstance, const char *aServiceType, uint32_t aInfraIfIndex)
{
OT_UNUSED_VARIABLE(aInstance);
OT_UNUSED_VARIABLE(aServiceType);
OT_UNUSED_VARIABLE(aInfraIfIndex);
}

extern "C" void otPlatDnssdStartServiceResolver(otInstance *aInstance,
const otPlatDnssdServiceInstance *aServiceInstance)
{
OT_UNUSED_VARIABLE(aInstance);
OT_UNUSED_VARIABLE(aServiceInstance);
}

extern "C" void otPlatDnssdStopServiceResolver(otInstance *aInstance,
const otPlatDnssdServiceInstance *aServiceInstance)
{
OT_UNUSED_VARIABLE(aInstance);
OT_UNUSED_VARIABLE(aServiceInstance);
}

extern "C" void otPlatDnssdStartIp6AddressResolver(otInstance *aInstance, const char *aHostName, uint32_t aInfraIfIndex)
{
OT_UNUSED_VARIABLE(aInstance);
OT_UNUSED_VARIABLE(aHostName);
OT_UNUSED_VARIABLE(aInfraIfIndex);
}

extern "C" void otPlatDnssdStopIp6AddressResolver(otInstance *aInstance, const char *aHostName, uint32_t aInfraIfIndex)
{
OT_UNUSED_VARIABLE(aInstance);
OT_UNUSED_VARIABLE(aHostName);
OT_UNUSED_VARIABLE(aInfraIfIndex);
}

extern "C" void otPlatDnssdStartIp4AddressResolver(otInstance *aInstance, const char *aHostName, uint32_t aInfraIfIndex)
{
OT_UNUSED_VARIABLE(aInstance);
OT_UNUSED_VARIABLE(aHostName);
OT_UNUSED_VARIABLE(aInfraIfIndex);
}

extern "C" void otPlatDnssdStopIp4AddressResolver(otInstance *aInstance, const char *aHostName, uint32_t aInfraIfIndex)
{
OT_UNUSED_VARIABLE(aInstance);
OT_UNUSED_VARIABLE(aHostName);
OT_UNUSED_VARIABLE(aInfraIfIndex);
}

//----------------------------------------------------------------------------------------------------------------------

namespace otbr {

DnssdPlatform::DnssdPlatform(Ncp::ControllerOpenThread &aNcp, Mdns::Publisher &aPublisher)
: mNcp(aNcp)
, mPublisher(aPublisher)
, mState(OT_PLAT_DNSSD_STOPPED)
{
sDnssdPlatform = this;
}

otError DnssdPlatform::ResultToError(otbrError aOtbrError)
{
otError error = OT_ERROR_FAILED;

switch (aOtbrError)
{
case OTBR_ERROR_NONE:
error = OT_ERROR_NONE;
break;
case OTBR_ERROR_DUPLICATED:
error = OT_ERROR_DUPLICATED;
break;
case OTBR_ERROR_INVALID_ARGS:
error = OT_ERROR_INVALID_ARGS;
break;
case OTBR_ERROR_ABORTED:
error = OT_ERROR_ABORT;
break;
case OTBR_ERROR_INVALID_STATE:
error = OT_ERROR_INVALID_STATE;
break;
case OTBR_ERROR_NOT_IMPLEMENTED:
error = OT_ERROR_NOT_IMPLEMENTED;
break;
case OTBR_ERROR_NOT_FOUND:
error = OT_ERROR_NOT_FOUND;
break;
case OTBR_ERROR_PARSE:
error = OT_ERROR_PARSE;
break;
default:
break;
}

return error;
}

void DnssdPlatform::HandleMdnsPublisherStateChange(Mdns::Publisher::State aState)
{
switch (aState)
{
case Mdns::Publisher::State::kIdle:
mState = OT_PLAT_DNSSD_STOPPED;
break;

case Mdns::Publisher::State::kReady:
mState = OT_PLAT_DNSSD_READY;
break;
}

otPlatDnssdStateHandleStateChange(mNcp.GetInstance());
}

Mdns::Publisher::ResultCallback DnssdPlatform::MakePublisherCallback(RequestId aRequestId, RegisterCallback aCallback)
{
otInstance *instance = mNcp.GetInstance();

return [instance, aRequestId, aCallback](otbrError aError) {
if (aCallback != nullptr)
{
aCallback(instance, aRequestId, DnssdPlatform::ResultToError(aError));
}
};
}

void DnssdPlatform::RegisterService(const Service &aService, RequestId aRequestId, RegisterCallback aCallback)
{
Mdns::Publisher::SubTypeList subTypeList;
Mdns::Publisher::TxtData txtData(aService.mTxtData, aService.mTxtData + aService.mTxtDataLength);

for (uint16_t index = 0; index < aService.mSubTypeLabelsLength; index++)
{
subTypeList.push_back(aService.mSubTypeLabels[index]);
}

mPublisher.PublishService(aService.mHostName, aService.mServiceInstance, aService.mServiceType, subTypeList,
aService.mPort, txtData, MakePublisherCallback(aRequestId, aCallback));
}

void DnssdPlatform::UnregisterService(const Service &aService, RequestId aRequestId, RegisterCallback aCallback)
{
mPublisher.UnpublishService(aService.mServiceInstance, aService.mServiceType,
MakePublisherCallback(aRequestId, aCallback));
}

void DnssdPlatform::RegisterHost(const Host &aHost, RequestId aRequestId, RegisterCallback aCallback)
{
Mdns::Publisher::AddressList addressList;

for (uint16_t index = 0; index < aHost.mNumAddresses; index++)
{
addressList.push_back(Ip6Address(aHost.mAddresses[index].mFields.m8));
}

mPublisher.PublishHost(aHost.mHostName, addressList, MakePublisherCallback(aRequestId, aCallback));
}

void DnssdPlatform::UnregisterHost(const Host &aHost, RequestId aRequestId, RegisterCallback aCallback)
{
mPublisher.UnpublishHost(aHost.mHostName, MakePublisherCallback(aRequestId, aCallback));
}

std::string DnssdPlatform::KeyNameFor(const Key &aKey)
{
std::string name(aKey.mName);

if (aKey.mServiceType != nullptr)
{
name += ".";
name += aKey.mServiceType;
}

return name;
}

void DnssdPlatform::RegisterKey(const Key &aKey, RequestId aRequestId, RegisterCallback aCallback)
{
Mdns::Publisher::KeyData keyData(aKey.mKeyData, aKey.mKeyData + aKey.mKeyDataLength);

mPublisher.PublishKey(KeyNameFor(aKey), keyData, MakePublisherCallback(aRequestId, aCallback));
}

void DnssdPlatform::UnregisterKey(const Key &aKey, RequestId aRequestId, RegisterCallback aCallback)
{
mPublisher.UnpublishKey(KeyNameFor(aKey), MakePublisherCallback(aRequestId, aCallback));
}

} // namespace otbr

#endif // OTBR_ENABLE_DNSSD_PLAT
Loading

0 comments on commit c377a12

Please sign in to comment.