Skip to content
This repository was archived by the owner on Dec 20, 2023. It is now read-only.

Commit 2ee8db6

Browse files
author
Jay Logue
committed
Binding enhancements for connection-oriented WDM
-- Various changes to Binding class in preparation for full support of WDM over connection- oriented transports. -- Revised the binding reset logic to preserve the configuration state of the binding while in the Failed state. This allows code in the application’s BindingFailed handler to see the original binding configuration values, such as the peer’s node id. -- Modified Binding::IsAuthenticMessageFromPeer() to assert that an incoming message must be received over the same transport as the binding. In the case of a connection, the message must have been received over the specific connection associated with the binding. -- Simplified the interface to the Binding::Configuration::ConfigureFromMessage() method and updated the logic to properly support messages received over a Weave connection. -- Added API for querying transport type.
1 parent ec11225 commit 2ee8db6

File tree

2 files changed

+102
-37
lines changed

2 files changed

+102
-37
lines changed

src/lib/core/WeaveBinding.cpp

Lines changed: 71 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@ void Binding::DoReset(State newState)
361361
if (GetFlag(kFlag_KeyReserved))
362362
{
363363
sm->ReleaseKey(mPeerNodeId, mKeyId);
364+
ClearFlag(kFlag_KeyReserved);
364365
}
365366

366367
#if WEAVE_CONFIG_ENABLE_DNS_RESOLVER
@@ -379,16 +380,26 @@ void Binding::DoReset(State newState)
379380
{
380381
mCon->OnConnectionComplete = NULL;
381382
mCon->Release();
383+
ClearFlag(kFlag_ConnectionReferenced);
382384
}
385+
mCon = NULL;
383386

384387
// If a session establishment was in progress, cancel it.
385388
if (origState == kState_PreparingSecurity_EstablishSession)
386389
{
387390
sm->CancelSessionEstablishment(this);
388391
}
389392

390-
// Reset the configuration state of the binding.
391-
ResetConfig();
393+
// Reset the configuration state of the binding, except when entering the Failed state.
394+
//
395+
// We leave the configuration state of the binding intact in the Failed state so that
396+
// applications can inspected it during failure handling. If the application decides
397+
// to re-prepare the bind, the configuration state will be reset when binding enters
398+
// the Configuring state.
399+
if (newState != kState_Failed)
400+
{
401+
ResetConfig();
402+
}
392403

393404
// Advance to the new state.
394405
mState = newState;
@@ -1195,8 +1206,15 @@ WEAVE_ERROR Binding::AdjustResponseTimeout(nl::Weave::ExchangeContext *apExchang
11951206
/**
11961207
* Determine if a particular incoming message is from the configured peer and is suitably authenticated.
11971208
*
1198-
* This method confirms that the message in question originated from the peer node of the binding and
1199-
* that the encryption key and type used to encrypt the message matches those configured in the binding.
1209+
* This method confirms the following details about the given message:
1210+
*
1211+
* - The message originated from the peer node of the binding
1212+
*
1213+
* - The message was received over the same transport type as the binding. If the message was
1214+
* received over a connection, the method also confirms that the message was received over the
1215+
* exact connection associated with the binding.
1216+
*
1217+
* - The encryption key and type used to encrypt the message matches those configured in the binding.
12001218
* For bindings configured without the use of security, the method confirms that the incoming message is
12011219
* NOT encrypted.
12021220
*
@@ -1205,7 +1223,7 @@ WEAVE_ERROR Binding::AdjustResponseTimeout(nl::Weave::ExchangeContext *apExchang
12051223
* the method allows the local node to confirm that the incoming unsolicited message was sent by the
12061224
* associated peer. (Of course, for Bindings configured without the use of message encryption, this
12071225
* assertion provides no value from a security perspective. It merely confirms that the sender node
1208-
* id in the received message matches the peer's node id.)
1226+
* id and transport types match.)
12091227
*
12101228
* Note that if the binding is not in the Ready state, this method will always return false.
12111229
*
@@ -1221,6 +1239,17 @@ bool Binding::IsAuthenticMessageFromPeer(const nl::Weave::WeaveMessageHeader *ms
12211239
if (msgInfo->SourceNodeId != mPeerNodeId)
12221240
return false;
12231241

1242+
if (msgInfo->InCon != NULL)
1243+
{
1244+
if ((mTransportOption != kTransport_TCP && mTransportOption != kTransport_ExistingConnection) || msgInfo->InCon != mCon)
1245+
return false;
1246+
}
1247+
else
1248+
{
1249+
if (mTransportOption != kTransport_UDP && mTransportOption != kTransport_UDP_WRM)
1250+
return false;
1251+
}
1252+
12241253
if (msgInfo->EncryptionType != mEncType)
12251254
return false;
12261255

@@ -1429,6 +1458,11 @@ Binding::Configuration::Configuration(Binding& aBinding)
14291458
{
14301459
if (mBinding.CanBePrepared())
14311460
{
1461+
if (mBinding.mState != kState_NotConfigured)
1462+
{
1463+
mBinding.ResetConfig();
1464+
}
1465+
14321466
mBinding.mState = kState_Configuring;
14331467
mError = WEAVE_NO_ERROR;
14341468

@@ -1652,9 +1686,13 @@ Binding::Configuration& Binding::Configuration::Transport_DefaultWRMPConfig(cons
16521686
/**
16531687
* Use an existing Weave connection to communicate with the peer.
16541688
*
1689+
* NOTE: The reference count on the connection object is incremented when binding
1690+
* preparation succeeds. Thus the application is responsible for ensuring the
1691+
* connection object remain alive until that time.
1692+
*
16551693
* @param[in] con A pointer to the existing Weave connection.
16561694
*
1657-
* @return A reference to the binding object.
1695+
* @return A reference to the binding object.
16581696
*/
16591697
Binding::Configuration& Binding::Configuration::Transport_ExistingConnection(WeaveConnection *con)
16601698
{
@@ -1895,51 +1933,51 @@ Binding::Configuration& Binding::Configuration::Security_AuthenticationMode(Weav
18951933
/**
18961934
* Configure the binding to allow communication with the sender of a received message.
18971935
*
1898-
* @param[in] apMsgHeader Message information structure associated with the received message.
1899-
* @param[in] apConnection The connection over which the message was received; or NULL if the message
1900-
* was not received via a connection.
1901-
* @param[in] apPktInfo Packet information for the received message.
1936+
* @param[in] aMsgInfo Message information structure associated with the received message.
1937+
* @param[in] aPacketInfo Packet information for the received message.
19021938
*
19031939
*/
19041940
Binding::Configuration& Binding::Configuration::ConfigureFromMessage(
1905-
const nl::Weave::WeaveMessageHeader *apMsgHeader,
1906-
const nl::Inet::IPPacketInfo *apPktInfo,
1907-
WeaveConnection *apConnection)
1941+
const nl::Weave::WeaveMessageInfo *aMsgInfo,
1942+
const nl::Inet::IPPacketInfo *aPacketInfo)
19081943
{
1909-
mBinding.mPeerNodeId = apMsgHeader->SourceNodeId;
1944+
mBinding.mPeerNodeId = aMsgInfo->SourceNodeId;
19101945

1911-
// Configure the outgoing interface only if the received message is from a
1912-
// link-local address because we need to specify the interface when we are
1913-
// sending to a link local address. Otherwise, defer to the routing logic
1914-
// to choose the outgoing interface.
1915-
TargetAddress_IP(apPktInfo->SrcAddress, apPktInfo->SrcPort,
1916-
apPktInfo->SrcAddress.IsIPv6LinkLocal() ? apPktInfo->Interface : INET_NULL_INTERFACEID);
1917-
1918-
if (apConnection != NULL)
1946+
if (aMsgInfo->InCon != NULL)
19191947
{
1920-
Transport_ExistingConnection(apConnection);
1948+
Transport_ExistingConnection(aMsgInfo->InCon);
19211949
}
1922-
else if (apMsgHeader->Flags & kWeaveMessageFlag_PeerRequestedAck)
1950+
else
19231951
{
1952+
if (aMsgInfo->Flags & kWeaveMessageFlag_PeerRequestedAck)
1953+
{
19241954
#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
1925-
Transport_UDP_WRM();
1955+
Transport_UDP_WRM();
19261956
#else
1927-
mError = WEAVE_ERROR_NOT_IMPLEMENTED;
1957+
mError = WEAVE_ERROR_NOT_IMPLEMENTED;
19281958
#endif // #if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
1929-
}
1930-
else
1931-
{
1932-
Transport_UDP();
1959+
}
1960+
else
1961+
{
1962+
Transport_UDP();
1963+
}
1964+
1965+
// Configure the outgoing interface only if the received message is from a
1966+
// link-local address because we need to specify the interface when we are
1967+
// sending to a link local address. Otherwise, defer to the routing logic
1968+
// to choose the outgoing interface.
1969+
TargetAddress_IP(aPacketInfo->SrcAddress, aPacketInfo->SrcPort,
1970+
aPacketInfo->SrcAddress.IsIPv6LinkLocal() ? aPacketInfo->Interface : INET_NULL_INTERFACEID);
19331971
}
19341972

1935-
if (apMsgHeader->KeyId == WeaveKeyId::kNone)
1973+
if (aMsgInfo->KeyId == WeaveKeyId::kNone)
19361974
{
19371975
Security_None();
19381976
}
19391977
else
19401978
{
1941-
Security_Key(apMsgHeader->KeyId);
1942-
Security_EncryptionType(apMsgHeader->EncryptionType);
1979+
Security_Key(aMsgInfo->KeyId);
1980+
Security_EncryptionType(aMsgInfo->EncryptionType);
19431981
}
19441982

19451983
return *this;

src/lib/core/WeaveBinding.h

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,10 @@ class Binding
199199
void SetEventCallback(EventCallback aEventCallback);
200200
WeaveConnection *GetConnection() const;
201201
WeaveExchangeManager *GetExchangeManager() const;
202+
bool IsConnectionTransport() const;
203+
bool IsUDPTransport() const;
204+
bool IsWRMTransport() const;
205+
bool IsUnreliableUDPTransport() const;
202206

203207
enum
204208
{
@@ -308,6 +312,7 @@ class Binding
308312

309313
bool GetFlag(uint8_t flag) const;
310314
void SetFlag(uint8_t flag);
315+
void ClearFlag(uint8_t flag);
311316

312317
WEAVE_ERROR DoPrepare(WEAVE_ERROR configErr);
313318
void DoReset(State newState);
@@ -384,10 +389,7 @@ class Binding::Configuration
384389
Configuration& Security_EncryptionType(uint8_t aEncType);
385390
Configuration& Security_AuthenticationMode(WeaveAuthMode aAuthMode);
386391

387-
Configuration& ConfigureFromMessage(
388-
const WeaveMessageInfo *apMsgHeader,
389-
const nl::Inet::IPPacketInfo *apPktInfo,
390-
WeaveConnection *apConnection = NULL);
392+
Configuration& ConfigureFromMessage(const WeaveMessageInfo *aMsgInfo, const Inet::IPPacketInfo *aPacketInfo);
391393

392394
WEAVE_ERROR PrepareBinding(void);
393395

@@ -572,11 +574,36 @@ inline void Binding::SetFlag(uint8_t flag)
572574
mFlags |= flag;
573575
}
574576

577+
inline void Binding::ClearFlag(uint8_t flag)
578+
{
579+
mFlags &= ~flag;
580+
}
581+
575582
inline WeaveExchangeManager *Binding::GetExchangeManager() const
576583
{
577584
return mExchangeManager;
578585
}
579586

587+
inline bool Binding::IsConnectionTransport() const
588+
{
589+
return mTransportOption == kTransport_TCP || mTransportOption == kTransport_ExistingConnection;
590+
}
591+
592+
inline bool Binding::IsUDPTransport() const
593+
{
594+
return mTransportOption == kTransport_UDP || mTransportOption == kTransport_UDP_WRM;
595+
}
596+
597+
inline bool Binding::IsWRMTransport() const
598+
{
599+
return mTransportOption == kTransport_UDP_WRM;
600+
}
601+
602+
inline bool Binding::IsUnreliableUDPTransport() const
603+
{
604+
return mTransportOption == kTransport_UDP;
605+
}
606+
580607
inline Binding::Configuration Binding::BeginConfiguration()
581608
{
582609
return Configuration(*this);

0 commit comments

Comments
 (0)