1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2021, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker * All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker *
5*cfb92d14SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker *
16*cfb92d14SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker */
28*cfb92d14SAndroid Build Coastguard Worker
29*cfb92d14SAndroid Build Coastguard Worker #include <openthread/config.h>
30*cfb92d14SAndroid Build Coastguard Worker
31*cfb92d14SAndroid Build Coastguard Worker #include "test_platform.h"
32*cfb92d14SAndroid Build Coastguard Worker #include "test_util.hpp"
33*cfb92d14SAndroid Build Coastguard Worker
34*cfb92d14SAndroid Build Coastguard Worker #include "common/arg_macros.hpp"
35*cfb92d14SAndroid Build Coastguard Worker #include "common/array.hpp"
36*cfb92d14SAndroid Build Coastguard Worker #include "common/as_core_type.hpp"
37*cfb92d14SAndroid Build Coastguard Worker #include "common/time.hpp"
38*cfb92d14SAndroid Build Coastguard Worker #include "instance/instance.hpp"
39*cfb92d14SAndroid Build Coastguard Worker #include "net/dns_dso.hpp"
40*cfb92d14SAndroid Build Coastguard Worker
41*cfb92d14SAndroid Build Coastguard Worker namespace ot {
42*cfb92d14SAndroid Build Coastguard Worker
43*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DNS_DSO_ENABLE
44*cfb92d14SAndroid Build Coastguard Worker
45*cfb92d14SAndroid Build Coastguard Worker extern "C" {
46*cfb92d14SAndroid Build Coastguard Worker
47*cfb92d14SAndroid Build Coastguard Worker static uint32_t sNow = 0;
48*cfb92d14SAndroid Build Coastguard Worker static uint32_t sAlarmTime;
49*cfb92d14SAndroid Build Coastguard Worker static bool sAlarmOn = false;
50*cfb92d14SAndroid Build Coastguard Worker static otInstance *sInstance;
51*cfb92d14SAndroid Build Coastguard Worker
52*cfb92d14SAndroid Build Coastguard Worker // Logs a message and adds current time (sNow) as "<hours>:<min>:<secs>.<msec>"
53*cfb92d14SAndroid Build Coastguard Worker #define Log(...) \
54*cfb92d14SAndroid Build Coastguard Worker printf("%02u:%02u:%02u.%03u " OT_FIRST_ARG(__VA_ARGS__) "\n", (sNow / 36000000), (sNow / 60000) % 60, \
55*cfb92d14SAndroid Build Coastguard Worker (sNow / 1000) % 60, sNow % 1000 OT_REST_ARGS(__VA_ARGS__))
56*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMilliStop(otInstance *)57*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStop(otInstance *) { sAlarmOn = false; }
58*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMilliStartAt(otInstance *,uint32_t aT0,uint32_t aDt)59*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStartAt(otInstance *, uint32_t aT0, uint32_t aDt)
60*cfb92d14SAndroid Build Coastguard Worker {
61*cfb92d14SAndroid Build Coastguard Worker sAlarmOn = true;
62*cfb92d14SAndroid Build Coastguard Worker sAlarmTime = aT0 + aDt;
63*cfb92d14SAndroid Build Coastguard Worker
64*cfb92d14SAndroid Build Coastguard Worker Log(" otPlatAlarmMilliStartAt(time:%u.%03u, dt:%u.%03u)", sAlarmTime / 1000, sAlarmTime % 1000,
65*cfb92d14SAndroid Build Coastguard Worker (sAlarmTime - sNow) / 1000, (sAlarmTime - sNow) % 1000);
66*cfb92d14SAndroid Build Coastguard Worker }
67*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMilliGetNow(void)68*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatAlarmMilliGetNow(void) { return sNow; }
69*cfb92d14SAndroid Build Coastguard Worker
70*cfb92d14SAndroid Build Coastguard Worker } // extern "C"
71*cfb92d14SAndroid Build Coastguard Worker
AdvanceTime(uint32_t aDuration)72*cfb92d14SAndroid Build Coastguard Worker void AdvanceTime(uint32_t aDuration)
73*cfb92d14SAndroid Build Coastguard Worker {
74*cfb92d14SAndroid Build Coastguard Worker uint32_t time = sNow + aDuration;
75*cfb92d14SAndroid Build Coastguard Worker
76*cfb92d14SAndroid Build Coastguard Worker Log(" AdvanceTime for %u.%03u", aDuration / 1000, aDuration % 1000);
77*cfb92d14SAndroid Build Coastguard Worker
78*cfb92d14SAndroid Build Coastguard Worker while (TimeMilli(sAlarmTime) <= TimeMilli(time))
79*cfb92d14SAndroid Build Coastguard Worker {
80*cfb92d14SAndroid Build Coastguard Worker sNow = sAlarmTime;
81*cfb92d14SAndroid Build Coastguard Worker otPlatAlarmMilliFired(sInstance);
82*cfb92d14SAndroid Build Coastguard Worker }
83*cfb92d14SAndroid Build Coastguard Worker
84*cfb92d14SAndroid Build Coastguard Worker sNow = time;
85*cfb92d14SAndroid Build Coastguard Worker }
86*cfb92d14SAndroid Build Coastguard Worker
87*cfb92d14SAndroid Build Coastguard Worker namespace Dns {
88*cfb92d14SAndroid Build Coastguard Worker
89*cfb92d14SAndroid Build Coastguard Worker OT_TOOL_PACKED_BEGIN
90*cfb92d14SAndroid Build Coastguard Worker class TestTlv : public Dso::Tlv
91*cfb92d14SAndroid Build Coastguard Worker {
92*cfb92d14SAndroid Build Coastguard Worker public:
93*cfb92d14SAndroid Build Coastguard Worker static constexpr Type kType = 0xf800;
94*cfb92d14SAndroid Build Coastguard Worker
Init(uint8_t aValue)95*cfb92d14SAndroid Build Coastguard Worker void Init(uint8_t aValue)
96*cfb92d14SAndroid Build Coastguard Worker {
97*cfb92d14SAndroid Build Coastguard Worker Tlv::Init(kType, sizeof(*this) - sizeof(Tlv));
98*cfb92d14SAndroid Build Coastguard Worker mValue = aValue;
99*cfb92d14SAndroid Build Coastguard Worker }
100*cfb92d14SAndroid Build Coastguard Worker
IsValid(void) const101*cfb92d14SAndroid Build Coastguard Worker bool IsValid(void) const { return GetSize() >= sizeof(*this); }
GetValue(void) const102*cfb92d14SAndroid Build Coastguard Worker uint8_t GetValue(void) const { return mValue; }
103*cfb92d14SAndroid Build Coastguard Worker
104*cfb92d14SAndroid Build Coastguard Worker private:
105*cfb92d14SAndroid Build Coastguard Worker uint8_t mValue;
106*cfb92d14SAndroid Build Coastguard Worker
107*cfb92d14SAndroid Build Coastguard Worker } OT_TOOL_PACKED_END;
108*cfb92d14SAndroid Build Coastguard Worker
109*cfb92d14SAndroid Build Coastguard Worker extern "C" void otPlatDsoSend(otPlatDsoConnection *aConnection, otMessage *aMessage);
110*cfb92d14SAndroid Build Coastguard Worker
111*cfb92d14SAndroid Build Coastguard Worker class Connection : public Dso::Connection
112*cfb92d14SAndroid Build Coastguard Worker {
113*cfb92d14SAndroid Build Coastguard Worker friend void otPlatDsoSend(otPlatDsoConnection *aConnection, otMessage *aMessage);
114*cfb92d14SAndroid Build Coastguard Worker
115*cfb92d14SAndroid Build Coastguard Worker public:
Connection(Instance & aInstance,const char * aName,const Ip6::SockAddr & aLocalSockAddr,const Ip6::SockAddr & aPeerSockAddr)116*cfb92d14SAndroid Build Coastguard Worker explicit Connection(Instance &aInstance,
117*cfb92d14SAndroid Build Coastguard Worker const char *aName,
118*cfb92d14SAndroid Build Coastguard Worker const Ip6::SockAddr &aLocalSockAddr,
119*cfb92d14SAndroid Build Coastguard Worker const Ip6::SockAddr &aPeerSockAddr)
120*cfb92d14SAndroid Build Coastguard Worker : Dso::Connection(aInstance, aPeerSockAddr, sCallbacks)
121*cfb92d14SAndroid Build Coastguard Worker , mName(aName)
122*cfb92d14SAndroid Build Coastguard Worker , mLocalSockAddr(aLocalSockAddr)
123*cfb92d14SAndroid Build Coastguard Worker {
124*cfb92d14SAndroid Build Coastguard Worker ClearTestFlags();
125*cfb92d14SAndroid Build Coastguard Worker }
126*cfb92d14SAndroid Build Coastguard Worker
GetName(void) const127*cfb92d14SAndroid Build Coastguard Worker const char *GetName(void) const { return mName; }
GetLocalSockAddr(void) const128*cfb92d14SAndroid Build Coastguard Worker const Ip6::SockAddr &GetLocalSockAddr(void) const { return mLocalSockAddr; }
129*cfb92d14SAndroid Build Coastguard Worker
ClearTestFlags(void)130*cfb92d14SAndroid Build Coastguard Worker void ClearTestFlags(void)
131*cfb92d14SAndroid Build Coastguard Worker {
132*cfb92d14SAndroid Build Coastguard Worker mDidGetConnectedSignal = false;
133*cfb92d14SAndroid Build Coastguard Worker mDidGetSessionEstablishedSignal = false;
134*cfb92d14SAndroid Build Coastguard Worker mDidGetDisconnectSignal = false;
135*cfb92d14SAndroid Build Coastguard Worker mDidSendMessage = false;
136*cfb92d14SAndroid Build Coastguard Worker mDidReceiveMessage = false;
137*cfb92d14SAndroid Build Coastguard Worker mDidProcessRequest = false;
138*cfb92d14SAndroid Build Coastguard Worker mDidProcessUnidirectional = false;
139*cfb92d14SAndroid Build Coastguard Worker mDidProcessResponse = false;
140*cfb92d14SAndroid Build Coastguard Worker }
141*cfb92d14SAndroid Build Coastguard Worker
DidGetConnectedSignal(void) const142*cfb92d14SAndroid Build Coastguard Worker bool DidGetConnectedSignal(void) const { return mDidGetConnectedSignal; }
DidGetSessionEstablishedSignal(void) const143*cfb92d14SAndroid Build Coastguard Worker bool DidGetSessionEstablishedSignal(void) const { return mDidGetSessionEstablishedSignal; }
DidGetDisconnectSignal(void) const144*cfb92d14SAndroid Build Coastguard Worker bool DidGetDisconnectSignal(void) const { return mDidGetDisconnectSignal; }
DidSendMessage(void) const145*cfb92d14SAndroid Build Coastguard Worker bool DidSendMessage(void) const { return mDidSendMessage; }
DidReceiveMessage(void) const146*cfb92d14SAndroid Build Coastguard Worker bool DidReceiveMessage(void) const { return mDidReceiveMessage; }
DidProcessRequest(void) const147*cfb92d14SAndroid Build Coastguard Worker bool DidProcessRequest(void) const { return mDidProcessRequest; }
DidProcessUnidirectional(void) const148*cfb92d14SAndroid Build Coastguard Worker bool DidProcessUnidirectional(void) const { return mDidProcessUnidirectional; }
DidProcessResponse(void) const149*cfb92d14SAndroid Build Coastguard Worker bool DidProcessResponse(void) const { return mDidProcessResponse; }
150*cfb92d14SAndroid Build Coastguard Worker
GetLastRxTestTlvValue(void) const151*cfb92d14SAndroid Build Coastguard Worker uint8_t GetLastRxTestTlvValue(void) const { return mLastRxTestTlvValue; }
GetLastRxResponseCode(void) const152*cfb92d14SAndroid Build Coastguard Worker Dns::Header::Response GetLastRxResponseCode(void) const { return mLastRxResponseCode; }
153*cfb92d14SAndroid Build Coastguard Worker
SendTestRequestMessage(uint8_t aValue=0,uint32_t aResponseTimeout=Dso::kResponseTimeout)154*cfb92d14SAndroid Build Coastguard Worker void SendTestRequestMessage(uint8_t aValue = 0, uint32_t aResponseTimeout = Dso::kResponseTimeout)
155*cfb92d14SAndroid Build Coastguard Worker {
156*cfb92d14SAndroid Build Coastguard Worker MessageId messageId;
157*cfb92d14SAndroid Build Coastguard Worker
158*cfb92d14SAndroid Build Coastguard Worker mLastTxTestTlvValue = aValue;
159*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(SendRequestMessage(PrepareTestMessage(aValue), messageId, aResponseTimeout));
160*cfb92d14SAndroid Build Coastguard Worker }
161*cfb92d14SAndroid Build Coastguard Worker
SendTestUnidirectionalMessage(uint8_t aValue=0)162*cfb92d14SAndroid Build Coastguard Worker void SendTestUnidirectionalMessage(uint8_t aValue = 0)
163*cfb92d14SAndroid Build Coastguard Worker {
164*cfb92d14SAndroid Build Coastguard Worker mLastTxTestTlvValue = aValue;
165*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(SendUnidirectionalMessage(PrepareTestMessage(aValue)));
166*cfb92d14SAndroid Build Coastguard Worker }
167*cfb92d14SAndroid Build Coastguard Worker
168*cfb92d14SAndroid Build Coastguard Worker private:
PrepareTestMessage(uint8_t aValue)169*cfb92d14SAndroid Build Coastguard Worker Message &PrepareTestMessage(uint8_t aValue)
170*cfb92d14SAndroid Build Coastguard Worker {
171*cfb92d14SAndroid Build Coastguard Worker TestTlv testTlv;
172*cfb92d14SAndroid Build Coastguard Worker Message *message = NewMessage();
173*cfb92d14SAndroid Build Coastguard Worker
174*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(message != nullptr);
175*cfb92d14SAndroid Build Coastguard Worker testTlv.Init(aValue);
176*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(message->Append(testTlv));
177*cfb92d14SAndroid Build Coastguard Worker
178*cfb92d14SAndroid Build Coastguard Worker return *message;
179*cfb92d14SAndroid Build Coastguard Worker }
180*cfb92d14SAndroid Build Coastguard Worker
ParseTestMessage(const Message & aMessage)181*cfb92d14SAndroid Build Coastguard Worker void ParseTestMessage(const Message &aMessage)
182*cfb92d14SAndroid Build Coastguard Worker {
183*cfb92d14SAndroid Build Coastguard Worker TestTlv testTlv;
184*cfb92d14SAndroid Build Coastguard Worker Dso::Tlv tlv;
185*cfb92d14SAndroid Build Coastguard Worker uint16_t offset = aMessage.GetOffset();
186*cfb92d14SAndroid Build Coastguard Worker
187*cfb92d14SAndroid Build Coastguard Worker // Test message MUST only contain Test TLV and Encryption
188*cfb92d14SAndroid Build Coastguard Worker // Padding TLV.
189*cfb92d14SAndroid Build Coastguard Worker
190*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(aMessage.Read(offset, testTlv));
191*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(testTlv.GetType() == TestTlv::kType);
192*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(testTlv.IsValid());
193*cfb92d14SAndroid Build Coastguard Worker offset += testTlv.GetSize();
194*cfb92d14SAndroid Build Coastguard Worker mLastRxTestTlvValue = testTlv.GetValue();
195*cfb92d14SAndroid Build Coastguard Worker
196*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(aMessage.Read(offset, tlv));
197*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(tlv.GetType() == Dso::Tlv::kEncryptionPaddingType);
198*cfb92d14SAndroid Build Coastguard Worker offset += tlv.GetSize();
199*cfb92d14SAndroid Build Coastguard Worker
200*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(offset == aMessage.GetLength());
201*cfb92d14SAndroid Build Coastguard Worker }
202*cfb92d14SAndroid Build Coastguard Worker
SendTestResponseMessage(MessageId aResponseId,uint8_t aValue)203*cfb92d14SAndroid Build Coastguard Worker void SendTestResponseMessage(MessageId aResponseId, uint8_t aValue)
204*cfb92d14SAndroid Build Coastguard Worker {
205*cfb92d14SAndroid Build Coastguard Worker mLastTxTestTlvValue = aValue;
206*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(SendResponseMessage(PrepareTestMessage(aValue), aResponseId));
207*cfb92d14SAndroid Build Coastguard Worker }
208*cfb92d14SAndroid Build Coastguard Worker
209*cfb92d14SAndroid Build Coastguard Worker //---------------------------------------------------------------------
210*cfb92d14SAndroid Build Coastguard Worker // Callback methods
211*cfb92d14SAndroid Build Coastguard Worker
HandleConnected(void)212*cfb92d14SAndroid Build Coastguard Worker void HandleConnected(void) { mDidGetConnectedSignal = true; }
HandleSessionEstablished(void)213*cfb92d14SAndroid Build Coastguard Worker void HandleSessionEstablished(void) { mDidGetSessionEstablishedSignal = true; }
HandleDisconnected(void)214*cfb92d14SAndroid Build Coastguard Worker void HandleDisconnected(void) { mDidGetDisconnectSignal = true; }
215*cfb92d14SAndroid Build Coastguard Worker
ProcessRequestMessage(MessageId aMessageId,const Message & aMessage,Dso::Tlv::Type aPrimaryTlvType)216*cfb92d14SAndroid Build Coastguard Worker Error ProcessRequestMessage(MessageId aMessageId, const Message &aMessage, Dso::Tlv::Type aPrimaryTlvType)
217*cfb92d14SAndroid Build Coastguard Worker {
218*cfb92d14SAndroid Build Coastguard Worker Error error = kErrorNone;
219*cfb92d14SAndroid Build Coastguard Worker
220*cfb92d14SAndroid Build Coastguard Worker Log(" ProcessRequestMessage(primaryTlv:0x%04x) on %s", aPrimaryTlvType, mName);
221*cfb92d14SAndroid Build Coastguard Worker mDidProcessRequest = true;
222*cfb92d14SAndroid Build Coastguard Worker
223*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(aPrimaryTlvType == TestTlv::kType, error = kErrorNotFound);
224*cfb92d14SAndroid Build Coastguard Worker ParseTestMessage(aMessage);
225*cfb92d14SAndroid Build Coastguard Worker SendTestResponseMessage(aMessageId, mLastRxTestTlvValue);
226*cfb92d14SAndroid Build Coastguard Worker
227*cfb92d14SAndroid Build Coastguard Worker exit:
228*cfb92d14SAndroid Build Coastguard Worker return error;
229*cfb92d14SAndroid Build Coastguard Worker }
230*cfb92d14SAndroid Build Coastguard Worker
ProcessUnidirectionalMessage(const Message & aMessage,Dso::Tlv::Type aPrimaryTlvType)231*cfb92d14SAndroid Build Coastguard Worker Error ProcessUnidirectionalMessage(const Message &aMessage, Dso::Tlv::Type aPrimaryTlvType)
232*cfb92d14SAndroid Build Coastguard Worker {
233*cfb92d14SAndroid Build Coastguard Worker Log(" ProcessUnidirectionalMessage(primaryTlv:0x%04x) on %s", aPrimaryTlvType, mName);
234*cfb92d14SAndroid Build Coastguard Worker mDidProcessUnidirectional = true;
235*cfb92d14SAndroid Build Coastguard Worker
236*cfb92d14SAndroid Build Coastguard Worker if (aPrimaryTlvType == TestTlv::kType)
237*cfb92d14SAndroid Build Coastguard Worker {
238*cfb92d14SAndroid Build Coastguard Worker ParseTestMessage(aMessage);
239*cfb92d14SAndroid Build Coastguard Worker }
240*cfb92d14SAndroid Build Coastguard Worker
241*cfb92d14SAndroid Build Coastguard Worker return kErrorNone;
242*cfb92d14SAndroid Build Coastguard Worker }
243*cfb92d14SAndroid Build Coastguard Worker
ProcessResponseMessage(const Dns::Header & aHeader,const Message & aMessage,Dso::Tlv::Type aResponseTlvType,Dso::Tlv::Type aRequestTlvType)244*cfb92d14SAndroid Build Coastguard Worker Error ProcessResponseMessage(const Dns::Header &aHeader,
245*cfb92d14SAndroid Build Coastguard Worker const Message &aMessage,
246*cfb92d14SAndroid Build Coastguard Worker Dso::Tlv::Type aResponseTlvType,
247*cfb92d14SAndroid Build Coastguard Worker Dso::Tlv::Type aRequestTlvType)
248*cfb92d14SAndroid Build Coastguard Worker {
249*cfb92d14SAndroid Build Coastguard Worker Error error = kErrorNone;
250*cfb92d14SAndroid Build Coastguard Worker
251*cfb92d14SAndroid Build Coastguard Worker mDidProcessResponse = true;
252*cfb92d14SAndroid Build Coastguard Worker mLastRxResponseCode = aHeader.GetResponseCode();
253*cfb92d14SAndroid Build Coastguard Worker Log(" ProcessResponseMessage(responseTlv:0x%04x) on %s (response-Code:%u) ", aResponseTlvType, mName,
254*cfb92d14SAndroid Build Coastguard Worker mLastRxResponseCode);
255*cfb92d14SAndroid Build Coastguard Worker
256*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(mLastRxResponseCode == Dns::Header::kResponseSuccess);
257*cfb92d14SAndroid Build Coastguard Worker
258*cfb92d14SAndroid Build Coastguard Worker // During test we only expect a Test TLV response with
259*cfb92d14SAndroid Build Coastguard Worker // a matching TLV value to what was sent last.
260*cfb92d14SAndroid Build Coastguard Worker
261*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aResponseTlvType == TestTlv::kType);
262*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aRequestTlvType == TestTlv::kType);
263*cfb92d14SAndroid Build Coastguard Worker ParseTestMessage(aMessage);
264*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(mLastRxTestTlvValue == mLastTxTestTlvValue);
265*cfb92d14SAndroid Build Coastguard Worker
266*cfb92d14SAndroid Build Coastguard Worker exit:
267*cfb92d14SAndroid Build Coastguard Worker return error;
268*cfb92d14SAndroid Build Coastguard Worker }
269*cfb92d14SAndroid Build Coastguard Worker
HandleConnected(Dso::Connection & aConnection)270*cfb92d14SAndroid Build Coastguard Worker static void HandleConnected(Dso::Connection &aConnection)
271*cfb92d14SAndroid Build Coastguard Worker {
272*cfb92d14SAndroid Build Coastguard Worker static_cast<Connection &>(aConnection).HandleConnected();
273*cfb92d14SAndroid Build Coastguard Worker }
274*cfb92d14SAndroid Build Coastguard Worker
HandleSessionEstablished(Dso::Connection & aConnection)275*cfb92d14SAndroid Build Coastguard Worker static void HandleSessionEstablished(Dso::Connection &aConnection)
276*cfb92d14SAndroid Build Coastguard Worker {
277*cfb92d14SAndroid Build Coastguard Worker static_cast<Connection &>(aConnection).HandleSessionEstablished();
278*cfb92d14SAndroid Build Coastguard Worker }
279*cfb92d14SAndroid Build Coastguard Worker
HandleDisconnected(Dso::Connection & aConnection)280*cfb92d14SAndroid Build Coastguard Worker static void HandleDisconnected(Dso::Connection &aConnection)
281*cfb92d14SAndroid Build Coastguard Worker {
282*cfb92d14SAndroid Build Coastguard Worker static_cast<Connection &>(aConnection).HandleDisconnected();
283*cfb92d14SAndroid Build Coastguard Worker }
284*cfb92d14SAndroid Build Coastguard Worker
ProcessRequestMessage(Dso::Connection & aConnection,MessageId aMessageId,const Message & aMessage,Dso::Tlv::Type aPrimaryTlvType)285*cfb92d14SAndroid Build Coastguard Worker static Error ProcessRequestMessage(Dso::Connection &aConnection,
286*cfb92d14SAndroid Build Coastguard Worker MessageId aMessageId,
287*cfb92d14SAndroid Build Coastguard Worker const Message &aMessage,
288*cfb92d14SAndroid Build Coastguard Worker Dso::Tlv::Type aPrimaryTlvType)
289*cfb92d14SAndroid Build Coastguard Worker {
290*cfb92d14SAndroid Build Coastguard Worker return static_cast<Connection &>(aConnection).ProcessRequestMessage(aMessageId, aMessage, aPrimaryTlvType);
291*cfb92d14SAndroid Build Coastguard Worker }
292*cfb92d14SAndroid Build Coastguard Worker
ProcessUnidirectionalMessage(Dso::Connection & aConnection,const Message & aMessage,Dso::Tlv::Type aPrimaryTlvType)293*cfb92d14SAndroid Build Coastguard Worker static Error ProcessUnidirectionalMessage(Dso::Connection &aConnection,
294*cfb92d14SAndroid Build Coastguard Worker const Message &aMessage,
295*cfb92d14SAndroid Build Coastguard Worker Dso::Tlv::Type aPrimaryTlvType)
296*cfb92d14SAndroid Build Coastguard Worker {
297*cfb92d14SAndroid Build Coastguard Worker return static_cast<Connection &>(aConnection).ProcessUnidirectionalMessage(aMessage, aPrimaryTlvType);
298*cfb92d14SAndroid Build Coastguard Worker }
299*cfb92d14SAndroid Build Coastguard Worker
ProcessResponseMessage(Dso::Connection & aConnection,const Dns::Header & aHeader,const Message & aMessage,Dso::Tlv::Type aResponseTlvType,Dso::Tlv::Type aRequestTlvType)300*cfb92d14SAndroid Build Coastguard Worker static Error ProcessResponseMessage(Dso::Connection &aConnection,
301*cfb92d14SAndroid Build Coastguard Worker const Dns::Header &aHeader,
302*cfb92d14SAndroid Build Coastguard Worker const Message &aMessage,
303*cfb92d14SAndroid Build Coastguard Worker Dso::Tlv::Type aResponseTlvType,
304*cfb92d14SAndroid Build Coastguard Worker Dso::Tlv::Type aRequestTlvType)
305*cfb92d14SAndroid Build Coastguard Worker {
306*cfb92d14SAndroid Build Coastguard Worker return static_cast<Connection &>(aConnection)
307*cfb92d14SAndroid Build Coastguard Worker .ProcessResponseMessage(aHeader, aMessage, aResponseTlvType, aRequestTlvType);
308*cfb92d14SAndroid Build Coastguard Worker }
309*cfb92d14SAndroid Build Coastguard Worker
310*cfb92d14SAndroid Build Coastguard Worker const char *mName;
311*cfb92d14SAndroid Build Coastguard Worker Ip6::SockAddr mLocalSockAddr;
312*cfb92d14SAndroid Build Coastguard Worker bool mDidGetConnectedSignal;
313*cfb92d14SAndroid Build Coastguard Worker bool mDidGetSessionEstablishedSignal;
314*cfb92d14SAndroid Build Coastguard Worker bool mDidGetDisconnectSignal;
315*cfb92d14SAndroid Build Coastguard Worker bool mDidSendMessage;
316*cfb92d14SAndroid Build Coastguard Worker bool mDidReceiveMessage;
317*cfb92d14SAndroid Build Coastguard Worker bool mDidProcessRequest;
318*cfb92d14SAndroid Build Coastguard Worker bool mDidProcessUnidirectional;
319*cfb92d14SAndroid Build Coastguard Worker bool mDidProcessResponse;
320*cfb92d14SAndroid Build Coastguard Worker uint8_t mLastTxTestTlvValue;
321*cfb92d14SAndroid Build Coastguard Worker uint8_t mLastRxTestTlvValue;
322*cfb92d14SAndroid Build Coastguard Worker Dns::Header::Response mLastRxResponseCode;
323*cfb92d14SAndroid Build Coastguard Worker
324*cfb92d14SAndroid Build Coastguard Worker static Callbacks sCallbacks;
325*cfb92d14SAndroid Build Coastguard Worker };
326*cfb92d14SAndroid Build Coastguard Worker
327*cfb92d14SAndroid Build Coastguard Worker Dso::Connection::Callbacks Connection::sCallbacks(Connection::HandleConnected,
328*cfb92d14SAndroid Build Coastguard Worker Connection::HandleSessionEstablished,
329*cfb92d14SAndroid Build Coastguard Worker Connection::HandleDisconnected,
330*cfb92d14SAndroid Build Coastguard Worker Connection::ProcessRequestMessage,
331*cfb92d14SAndroid Build Coastguard Worker Connection::ProcessUnidirectionalMessage,
332*cfb92d14SAndroid Build Coastguard Worker Connection::ProcessResponseMessage);
333*cfb92d14SAndroid Build Coastguard Worker
334*cfb92d14SAndroid Build Coastguard Worker static constexpr uint16_t kMaxConnections = 5;
335*cfb92d14SAndroid Build Coastguard Worker
336*cfb92d14SAndroid Build Coastguard Worker static Array<Connection *, kMaxConnections> sConnections;
337*cfb92d14SAndroid Build Coastguard Worker
FindPeerConnection(const Connection & aConnetion)338*cfb92d14SAndroid Build Coastguard Worker static Connection *FindPeerConnection(const Connection &aConnetion)
339*cfb92d14SAndroid Build Coastguard Worker {
340*cfb92d14SAndroid Build Coastguard Worker Connection *peerConn = nullptr;
341*cfb92d14SAndroid Build Coastguard Worker
342*cfb92d14SAndroid Build Coastguard Worker for (Connection *conn : sConnections)
343*cfb92d14SAndroid Build Coastguard Worker {
344*cfb92d14SAndroid Build Coastguard Worker if (conn->GetLocalSockAddr() == aConnetion.GetPeerSockAddr())
345*cfb92d14SAndroid Build Coastguard Worker {
346*cfb92d14SAndroid Build Coastguard Worker peerConn = conn;
347*cfb92d14SAndroid Build Coastguard Worker break;
348*cfb92d14SAndroid Build Coastguard Worker }
349*cfb92d14SAndroid Build Coastguard Worker }
350*cfb92d14SAndroid Build Coastguard Worker
351*cfb92d14SAndroid Build Coastguard Worker return peerConn;
352*cfb92d14SAndroid Build Coastguard Worker }
353*cfb92d14SAndroid Build Coastguard Worker
354*cfb92d14SAndroid Build Coastguard Worker extern "C" {
355*cfb92d14SAndroid Build Coastguard Worker
356*cfb92d14SAndroid Build Coastguard Worker static bool sDsoListening = false;
357*cfb92d14SAndroid Build Coastguard Worker
358*cfb92d14SAndroid Build Coastguard Worker // This test flag indicates whether the `otPlatDso` API should
359*cfb92d14SAndroid Build Coastguard Worker // forward a sent message to the peer connection. It can be set to
360*cfb92d14SAndroid Build Coastguard Worker // `false` to drop the messages to test timeout behaviors on the
361*cfb92d14SAndroid Build Coastguard Worker // peer.
362*cfb92d14SAndroid Build Coastguard Worker static bool sTestDsoForwardMessageToPeer = true;
363*cfb92d14SAndroid Build Coastguard Worker
364*cfb92d14SAndroid Build Coastguard Worker // This test flag indicate whether when disconnecting a connection
365*cfb92d14SAndroid Build Coastguard Worker // (using `otPlatDsoDisconnect()` to signal the peer connection about
366*cfb92d14SAndroid Build Coastguard Worker // the disconnect. Default behavior is set to `true`. It can be set
367*cfb92d14SAndroid Build Coastguard Worker // to `false` to test certain timeout behavior on peer side.
368*cfb92d14SAndroid Build Coastguard Worker static bool sTestDsoSignalDisconnectToPeer = true;
369*cfb92d14SAndroid Build Coastguard Worker
otPlatDsoEnableListening(otInstance *,bool aEnable)370*cfb92d14SAndroid Build Coastguard Worker void otPlatDsoEnableListening(otInstance *, bool aEnable)
371*cfb92d14SAndroid Build Coastguard Worker {
372*cfb92d14SAndroid Build Coastguard Worker Log(" otPlatDsoEnableListening(%s)", aEnable ? "true" : "false");
373*cfb92d14SAndroid Build Coastguard Worker sDsoListening = aEnable;
374*cfb92d14SAndroid Build Coastguard Worker }
375*cfb92d14SAndroid Build Coastguard Worker
otPlatDsoConnect(otPlatDsoConnection * aConnection,const otSockAddr * aPeerSockAddr)376*cfb92d14SAndroid Build Coastguard Worker void otPlatDsoConnect(otPlatDsoConnection *aConnection, const otSockAddr *aPeerSockAddr)
377*cfb92d14SAndroid Build Coastguard Worker {
378*cfb92d14SAndroid Build Coastguard Worker Connection &conn = *static_cast<Connection *>(aConnection);
379*cfb92d14SAndroid Build Coastguard Worker Connection *peerConn = nullptr;
380*cfb92d14SAndroid Build Coastguard Worker const Ip6::SockAddr &peerSockAddr = AsCoreType(aPeerSockAddr);
381*cfb92d14SAndroid Build Coastguard Worker
382*cfb92d14SAndroid Build Coastguard Worker Log(" otPlatDsoConnect(%s, aPeer:0x%04x)", conn.GetName(), peerSockAddr.GetPort());
383*cfb92d14SAndroid Build Coastguard Worker
384*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(conn.GetPeerSockAddr() == peerSockAddr);
385*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(conn.GetState() == Connection::kStateConnecting);
386*cfb92d14SAndroid Build Coastguard Worker
387*cfb92d14SAndroid Build Coastguard Worker if (!sDsoListening)
388*cfb92d14SAndroid Build Coastguard Worker {
389*cfb92d14SAndroid Build Coastguard Worker Log(" Server is not listening");
390*cfb92d14SAndroid Build Coastguard Worker ExitNow();
391*cfb92d14SAndroid Build Coastguard Worker }
392*cfb92d14SAndroid Build Coastguard Worker
393*cfb92d14SAndroid Build Coastguard Worker peerConn = static_cast<Connection *>(otPlatDsoAccept(otPlatDsoGetInstance(aConnection), aPeerSockAddr));
394*cfb92d14SAndroid Build Coastguard Worker
395*cfb92d14SAndroid Build Coastguard Worker if (peerConn == nullptr)
396*cfb92d14SAndroid Build Coastguard Worker {
397*cfb92d14SAndroid Build Coastguard Worker Log(" Request rejected");
398*cfb92d14SAndroid Build Coastguard Worker ExitNow();
399*cfb92d14SAndroid Build Coastguard Worker }
400*cfb92d14SAndroid Build Coastguard Worker
401*cfb92d14SAndroid Build Coastguard Worker Log(" Request accepted");
402*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(peerConn->GetState() == Connection::kStateConnecting);
403*cfb92d14SAndroid Build Coastguard Worker
404*cfb92d14SAndroid Build Coastguard Worker Log(" Signalling `Connected` on peer connection (%s)", peerConn->GetName());
405*cfb92d14SAndroid Build Coastguard Worker otPlatDsoHandleConnected(peerConn);
406*cfb92d14SAndroid Build Coastguard Worker
407*cfb92d14SAndroid Build Coastguard Worker Log(" Signalling `Connected` on connection (%s)", conn.GetName());
408*cfb92d14SAndroid Build Coastguard Worker otPlatDsoHandleConnected(aConnection);
409*cfb92d14SAndroid Build Coastguard Worker
410*cfb92d14SAndroid Build Coastguard Worker exit:
411*cfb92d14SAndroid Build Coastguard Worker return;
412*cfb92d14SAndroid Build Coastguard Worker }
413*cfb92d14SAndroid Build Coastguard Worker
otPlatDsoSend(otPlatDsoConnection * aConnection,otMessage * aMessage)414*cfb92d14SAndroid Build Coastguard Worker void otPlatDsoSend(otPlatDsoConnection *aConnection, otMessage *aMessage)
415*cfb92d14SAndroid Build Coastguard Worker {
416*cfb92d14SAndroid Build Coastguard Worker Connection &conn = *static_cast<Connection *>(aConnection);
417*cfb92d14SAndroid Build Coastguard Worker Connection *peerConn = nullptr;
418*cfb92d14SAndroid Build Coastguard Worker
419*cfb92d14SAndroid Build Coastguard Worker Log(" otPlatDsoSend(%s), message-len:%u", conn.GetName(), AsCoreType(aMessage).GetLength());
420*cfb92d14SAndroid Build Coastguard Worker
421*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(conn.GetState() != Connection::kStateDisconnected);
422*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(conn.GetState() != Connection::kStateConnecting);
423*cfb92d14SAndroid Build Coastguard Worker conn.mDidSendMessage = true;
424*cfb92d14SAndroid Build Coastguard Worker
425*cfb92d14SAndroid Build Coastguard Worker if (sTestDsoForwardMessageToPeer)
426*cfb92d14SAndroid Build Coastguard Worker {
427*cfb92d14SAndroid Build Coastguard Worker peerConn = FindPeerConnection(conn);
428*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(peerConn != nullptr);
429*cfb92d14SAndroid Build Coastguard Worker
430*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(peerConn->GetState() != Connection::kStateDisconnected);
431*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(peerConn->GetState() != Connection::kStateConnecting);
432*cfb92d14SAndroid Build Coastguard Worker
433*cfb92d14SAndroid Build Coastguard Worker Log(" Sending the message to peer connection (%s)", peerConn->GetName());
434*cfb92d14SAndroid Build Coastguard Worker
435*cfb92d14SAndroid Build Coastguard Worker peerConn->mDidReceiveMessage = true;
436*cfb92d14SAndroid Build Coastguard Worker otPlatDsoHandleReceive(peerConn, aMessage);
437*cfb92d14SAndroid Build Coastguard Worker }
438*cfb92d14SAndroid Build Coastguard Worker else
439*cfb92d14SAndroid Build Coastguard Worker {
440*cfb92d14SAndroid Build Coastguard Worker Log(" Dropping the message");
441*cfb92d14SAndroid Build Coastguard Worker }
442*cfb92d14SAndroid Build Coastguard Worker }
443*cfb92d14SAndroid Build Coastguard Worker
otPlatDsoDisconnect(otPlatDsoConnection * aConnection,otPlatDsoDisconnectMode aMode)444*cfb92d14SAndroid Build Coastguard Worker void otPlatDsoDisconnect(otPlatDsoConnection *aConnection, otPlatDsoDisconnectMode aMode)
445*cfb92d14SAndroid Build Coastguard Worker {
446*cfb92d14SAndroid Build Coastguard Worker Connection &conn = *static_cast<Connection *>(aConnection);
447*cfb92d14SAndroid Build Coastguard Worker Connection *peerConn = nullptr;
448*cfb92d14SAndroid Build Coastguard Worker
449*cfb92d14SAndroid Build Coastguard Worker Log(" otPlatDsoDisconnect(%s, mode:%s)", conn.GetName(),
450*cfb92d14SAndroid Build Coastguard Worker (aMode == OT_PLAT_DSO_DISCONNECT_MODE_GRACEFULLY_CLOSE) ? "close" : "abort");
451*cfb92d14SAndroid Build Coastguard Worker
452*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(conn.GetState() == Connection::kStateDisconnected);
453*cfb92d14SAndroid Build Coastguard Worker
454*cfb92d14SAndroid Build Coastguard Worker if (sTestDsoSignalDisconnectToPeer)
455*cfb92d14SAndroid Build Coastguard Worker {
456*cfb92d14SAndroid Build Coastguard Worker peerConn = FindPeerConnection(conn);
457*cfb92d14SAndroid Build Coastguard Worker
458*cfb92d14SAndroid Build Coastguard Worker if (peerConn == nullptr)
459*cfb92d14SAndroid Build Coastguard Worker {
460*cfb92d14SAndroid Build Coastguard Worker Log(" No peer connection found");
461*cfb92d14SAndroid Build Coastguard Worker }
462*cfb92d14SAndroid Build Coastguard Worker else if (peerConn->GetState() == Connection::kStateDisconnected)
463*cfb92d14SAndroid Build Coastguard Worker {
464*cfb92d14SAndroid Build Coastguard Worker Log(" Peer connection (%s) already disconnected", peerConn->GetName());
465*cfb92d14SAndroid Build Coastguard Worker }
466*cfb92d14SAndroid Build Coastguard Worker else
467*cfb92d14SAndroid Build Coastguard Worker {
468*cfb92d14SAndroid Build Coastguard Worker Log(" Signaling `Disconnected` on peer connection (%s)", peerConn->GetName());
469*cfb92d14SAndroid Build Coastguard Worker otPlatDsoHandleDisconnected(peerConn, aMode);
470*cfb92d14SAndroid Build Coastguard Worker }
471*cfb92d14SAndroid Build Coastguard Worker }
472*cfb92d14SAndroid Build Coastguard Worker }
473*cfb92d14SAndroid Build Coastguard Worker
474*cfb92d14SAndroid Build Coastguard Worker } // extern "C"
475*cfb92d14SAndroid Build Coastguard Worker
AcceptConnection(Instance & aInstance,const Ip6::SockAddr & aPeerSockAddr)476*cfb92d14SAndroid Build Coastguard Worker Dso::Connection *AcceptConnection(Instance &aInstance, const Ip6::SockAddr &aPeerSockAddr)
477*cfb92d14SAndroid Build Coastguard Worker {
478*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
479*cfb92d14SAndroid Build Coastguard Worker
480*cfb92d14SAndroid Build Coastguard Worker Connection *rval = nullptr;
481*cfb92d14SAndroid Build Coastguard Worker
482*cfb92d14SAndroid Build Coastguard Worker Log(" AcceptConnection(peer:0x%04x)", aPeerSockAddr.GetPort());
483*cfb92d14SAndroid Build Coastguard Worker
484*cfb92d14SAndroid Build Coastguard Worker for (Connection *conn : sConnections)
485*cfb92d14SAndroid Build Coastguard Worker {
486*cfb92d14SAndroid Build Coastguard Worker if (conn->GetLocalSockAddr() == aPeerSockAddr)
487*cfb92d14SAndroid Build Coastguard Worker {
488*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(conn->GetState() == Connection::kStateDisconnected);
489*cfb92d14SAndroid Build Coastguard Worker rval = conn;
490*cfb92d14SAndroid Build Coastguard Worker break;
491*cfb92d14SAndroid Build Coastguard Worker }
492*cfb92d14SAndroid Build Coastguard Worker }
493*cfb92d14SAndroid Build Coastguard Worker
494*cfb92d14SAndroid Build Coastguard Worker if (rval != nullptr)
495*cfb92d14SAndroid Build Coastguard Worker {
496*cfb92d14SAndroid Build Coastguard Worker Log(" Accepting and returning connection %s", rval->GetName());
497*cfb92d14SAndroid Build Coastguard Worker }
498*cfb92d14SAndroid Build Coastguard Worker else
499*cfb92d14SAndroid Build Coastguard Worker {
500*cfb92d14SAndroid Build Coastguard Worker Log(" Rejecting");
501*cfb92d14SAndroid Build Coastguard Worker }
502*cfb92d14SAndroid Build Coastguard Worker
503*cfb92d14SAndroid Build Coastguard Worker return rval;
504*cfb92d14SAndroid Build Coastguard Worker }
505*cfb92d14SAndroid Build Coastguard Worker
506*cfb92d14SAndroid Build Coastguard Worker static constexpr uint8_t kKeepAliveTestIterations = 3;
507*cfb92d14SAndroid Build Coastguard Worker
VerifyKeepAliveExchange(Connection & aClientConn,Connection & aServerConn,uint32_t aKeepAliveInterval,uint8_t aNumIterations=kKeepAliveTestIterations)508*cfb92d14SAndroid Build Coastguard Worker static void VerifyKeepAliveExchange(Connection &aClientConn,
509*cfb92d14SAndroid Build Coastguard Worker Connection &aServerConn,
510*cfb92d14SAndroid Build Coastguard Worker uint32_t aKeepAliveInterval,
511*cfb92d14SAndroid Build Coastguard Worker uint8_t aNumIterations = kKeepAliveTestIterations)
512*cfb92d14SAndroid Build Coastguard Worker {
513*cfb92d14SAndroid Build Coastguard Worker for (uint8_t n = 0; n < aNumIterations; n++)
514*cfb92d14SAndroid Build Coastguard Worker {
515*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
516*cfb92d14SAndroid Build Coastguard Worker Log("Test Keep Alive message exchange, iter %d", n + 1);
517*cfb92d14SAndroid Build Coastguard Worker
518*cfb92d14SAndroid Build Coastguard Worker aClientConn.ClearTestFlags();
519*cfb92d14SAndroid Build Coastguard Worker aServerConn.ClearTestFlags();
520*cfb92d14SAndroid Build Coastguard Worker
521*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(aKeepAliveInterval - 1);
522*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!aClientConn.DidSendMessage());
523*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!aServerConn.DidReceiveMessage());
524*cfb92d14SAndroid Build Coastguard Worker Log("No message before keep alive timeout");
525*cfb92d14SAndroid Build Coastguard Worker
526*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(1);
527*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aClientConn.DidSendMessage());
528*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(aServerConn.DidReceiveMessage());
529*cfb92d14SAndroid Build Coastguard Worker Log("KeepAlive message exchanged after keep alive time elapses");
530*cfb92d14SAndroid Build Coastguard Worker }
531*cfb92d14SAndroid Build Coastguard Worker }
532*cfb92d14SAndroid Build Coastguard Worker
TestDso(void)533*cfb92d14SAndroid Build Coastguard Worker void TestDso(void)
534*cfb92d14SAndroid Build Coastguard Worker {
535*cfb92d14SAndroid Build Coastguard Worker static constexpr uint16_t kPortA = 0xaaaa;
536*cfb92d14SAndroid Build Coastguard Worker static constexpr uint16_t kPortB = 0xbbbb;
537*cfb92d14SAndroid Build Coastguard Worker
538*cfb92d14SAndroid Build Coastguard Worker static constexpr Dso::Tlv::Type kUnknownTlvType = 0xf801;
539*cfb92d14SAndroid Build Coastguard Worker
540*cfb92d14SAndroid Build Coastguard Worker static constexpr uint32_t kRetryDelayInterval = TimeMilli::SecToMsec(3600);
541*cfb92d14SAndroid Build Coastguard Worker static constexpr uint32_t kLongResponseTimeout = Dso::kResponseTimeout + TimeMilli::SecToMsec(17);
542*cfb92d14SAndroid Build Coastguard Worker
543*cfb92d14SAndroid Build Coastguard Worker Instance &instance = *static_cast<Instance *>(testInitInstance());
544*cfb92d14SAndroid Build Coastguard Worker Ip6::SockAddr serverSockAddr(kPortA);
545*cfb92d14SAndroid Build Coastguard Worker Ip6::SockAddr clientSockAddr(kPortB);
546*cfb92d14SAndroid Build Coastguard Worker Connection serverConn(instance, "serverConn", serverSockAddr, clientSockAddr);
547*cfb92d14SAndroid Build Coastguard Worker Connection clientConn(instance, "clinetConn", clientSockAddr, serverSockAddr);
548*cfb92d14SAndroid Build Coastguard Worker Message *message;
549*cfb92d14SAndroid Build Coastguard Worker Dso::Tlv tlv;
550*cfb92d14SAndroid Build Coastguard Worker Connection::MessageId messageId;
551*cfb92d14SAndroid Build Coastguard Worker
552*cfb92d14SAndroid Build Coastguard Worker sNow = 0;
553*cfb92d14SAndroid Build Coastguard Worker sInstance = &instance;
554*cfb92d14SAndroid Build Coastguard Worker
555*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(sConnections.PushBack(&serverConn));
556*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(sConnections.PushBack(&clientConn));
557*cfb92d14SAndroid Build Coastguard Worker
558*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetPeerSockAddr() == clientSockAddr);
559*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetPeerSockAddr() == serverSockAddr);
560*cfb92d14SAndroid Build Coastguard Worker
561*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
562*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
563*cfb92d14SAndroid Build Coastguard Worker
564*cfb92d14SAndroid Build Coastguard Worker instance.Get<Dso>().StartListening(AcceptConnection);
565*cfb92d14SAndroid Build Coastguard Worker
566*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindClientConnection(clientSockAddr) == nullptr);
567*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindServerConnection(clientSockAddr) == nullptr);
568*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindClientConnection(serverSockAddr) == nullptr);
569*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindServerConnection(serverSockAddr) == nullptr);
570*cfb92d14SAndroid Build Coastguard Worker
571*cfb92d14SAndroid Build Coastguard Worker Log("-------------------------------------------------------------------------------------------");
572*cfb92d14SAndroid Build Coastguard Worker Log("Connect from client to server");
573*cfb92d14SAndroid Build Coastguard Worker
574*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
575*cfb92d14SAndroid Build Coastguard Worker
576*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateConnectedButSessionless);
577*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateConnectedButSessionless);
578*cfb92d14SAndroid Build Coastguard Worker
579*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.IsClient());
580*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.IsServer());
581*cfb92d14SAndroid Build Coastguard Worker
582*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!serverConn.IsClient());
583*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.IsServer());
584*cfb92d14SAndroid Build Coastguard Worker
585*cfb92d14SAndroid Build Coastguard Worker // Note that we find connection with a peer address
586*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindClientConnection(serverSockAddr) == &clientConn);
587*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindServerConnection(serverSockAddr) == nullptr);
588*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindClientConnection(clientSockAddr) == nullptr);
589*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindServerConnection(clientSockAddr) == &serverConn);
590*cfb92d14SAndroid Build Coastguard Worker
591*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidGetConnectedSignal());
592*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidGetSessionEstablishedSignal());
593*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidGetDisconnectSignal());
594*cfb92d14SAndroid Build Coastguard Worker
595*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidGetConnectedSignal());
596*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!serverConn.DidGetSessionEstablishedSignal());
597*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!serverConn.DidGetDisconnectSignal());
598*cfb92d14SAndroid Build Coastguard Worker
599*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
600*cfb92d14SAndroid Build Coastguard Worker Log("Send keep alive message to establish connection");
601*cfb92d14SAndroid Build Coastguard Worker
602*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
603*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
604*cfb92d14SAndroid Build Coastguard Worker
605*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
606*cfb92d14SAndroid Build Coastguard Worker
607*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
608*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
609*cfb92d14SAndroid Build Coastguard Worker
610*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidGetConnectedSignal());
611*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidGetSessionEstablishedSignal());
612*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidGetDisconnectSignal());
613*cfb92d14SAndroid Build Coastguard Worker
614*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!serverConn.DidGetConnectedSignal());
615*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidGetSessionEstablishedSignal());
616*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!serverConn.DidGetDisconnectSignal());
617*cfb92d14SAndroid Build Coastguard Worker
618*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetKeepAliveInterval() == Dso::kDefaultTimeout);
619*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetInactivityTimeout() == Dso::kDefaultTimeout);
620*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetKeepAliveInterval() == Dso::kDefaultTimeout);
621*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetInactivityTimeout() == Dso::kDefaultTimeout);
622*cfb92d14SAndroid Build Coastguard Worker
623*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
624*cfb92d14SAndroid Build Coastguard Worker Log("Close connection");
625*cfb92d14SAndroid Build Coastguard Worker
626*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
627*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
628*cfb92d14SAndroid Build Coastguard Worker
629*cfb92d14SAndroid Build Coastguard Worker clientConn.Disconnect(Connection::kGracefullyClose, Connection::kReasonInactivityTimeout);
630*cfb92d14SAndroid Build Coastguard Worker
631*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
632*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
633*cfb92d14SAndroid Build Coastguard Worker
634*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
635*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
636*cfb92d14SAndroid Build Coastguard Worker
637*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidGetConnectedSignal());
638*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidGetSessionEstablishedSignal());
639*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidGetDisconnectSignal());
640*cfb92d14SAndroid Build Coastguard Worker
641*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!serverConn.DidGetConnectedSignal());
642*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!serverConn.DidGetSessionEstablishedSignal());
643*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidGetDisconnectSignal());
644*cfb92d14SAndroid Build Coastguard Worker
645*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindClientConnection(clientSockAddr) == nullptr);
646*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindServerConnection(clientSockAddr) == nullptr);
647*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindClientConnection(serverSockAddr) == nullptr);
648*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindServerConnection(serverSockAddr) == nullptr);
649*cfb92d14SAndroid Build Coastguard Worker
650*cfb92d14SAndroid Build Coastguard Worker Log("-------------------------------------------------------------------------------------------");
651*cfb92d14SAndroid Build Coastguard Worker Log("Connection timeout when server is not listening");
652*cfb92d14SAndroid Build Coastguard Worker
653*cfb92d14SAndroid Build Coastguard Worker instance.Get<Dso>().StopListening();
654*cfb92d14SAndroid Build Coastguard Worker
655*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
656*cfb92d14SAndroid Build Coastguard Worker
657*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
658*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateConnecting);
659*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindClientConnection(serverSockAddr) == &clientConn);
660*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindServerConnection(serverSockAddr) == nullptr);
661*cfb92d14SAndroid Build Coastguard Worker
662*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kConnectingTimeout);
663*cfb92d14SAndroid Build Coastguard Worker
664*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
665*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonFailedToConnect);
666*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindClientConnection(serverSockAddr) == nullptr);
667*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(instance.Get<Dso>().FindServerConnection(serverSockAddr) == nullptr);
668*cfb92d14SAndroid Build Coastguard Worker
669*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidGetConnectedSignal());
670*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidGetSessionEstablishedSignal());
671*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidGetDisconnectSignal());
672*cfb92d14SAndroid Build Coastguard Worker
673*cfb92d14SAndroid Build Coastguard Worker Log("-------------------------------------------------------------------------------------------");
674*cfb92d14SAndroid Build Coastguard Worker Log("Keep Alive Timeout behavior");
675*cfb92d14SAndroid Build Coastguard Worker
676*cfb92d14SAndroid Build Coastguard Worker // Keep Alive timeout smaller than min value should be rejected.
677*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kMinKeepAliveInterval - 1) == kErrorInvalidArgs);
678*cfb92d14SAndroid Build Coastguard Worker
679*cfb92d14SAndroid Build Coastguard Worker instance.Get<Dso>().StartListening(AcceptConnection);
680*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kMinKeepAliveInterval));
681*cfb92d14SAndroid Build Coastguard Worker
682*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetKeepAliveInterval() == Dso::kMinKeepAliveInterval);
683*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetInactivityTimeout() == Dso::kInfiniteTimeout);
684*cfb92d14SAndroid Build Coastguard Worker
685*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
686*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
687*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
688*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
689*cfb92d14SAndroid Build Coastguard Worker
690*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetKeepAliveInterval() == Dso::kMinKeepAliveInterval);
691*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetInactivityTimeout() == Dso::kInfiniteTimeout);
692*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetKeepAliveInterval() == Dso::kMinKeepAliveInterval);
693*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetInactivityTimeout() == Dso::kInfiniteTimeout);
694*cfb92d14SAndroid Build Coastguard Worker
695*cfb92d14SAndroid Build Coastguard Worker VerifyKeepAliveExchange(clientConn, serverConn, Dso::kMinKeepAliveInterval);
696*cfb92d14SAndroid Build Coastguard Worker
697*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
698*cfb92d14SAndroid Build Coastguard Worker Log("Change Keep Alive interval on server");
699*cfb92d14SAndroid Build Coastguard Worker
700*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
701*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
702*cfb92d14SAndroid Build Coastguard Worker
703*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kDefaultTimeout));
704*cfb92d14SAndroid Build Coastguard Worker
705*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidSendMessage());
706*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidReceiveMessage());
707*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidSendMessage());
708*cfb92d14SAndroid Build Coastguard Worker
709*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetKeepAliveInterval() == Dso::kDefaultTimeout);
710*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetInactivityTimeout() == Dso::kInfiniteTimeout);
711*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetKeepAliveInterval() == Dso::kDefaultTimeout);
712*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetInactivityTimeout() == Dso::kInfiniteTimeout);
713*cfb92d14SAndroid Build Coastguard Worker
714*cfb92d14SAndroid Build Coastguard Worker VerifyKeepAliveExchange(clientConn, serverConn, Dso::kDefaultTimeout);
715*cfb92d14SAndroid Build Coastguard Worker
716*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
717*cfb92d14SAndroid Build Coastguard Worker Log("Keep Alive timer clear on message send or receive");
718*cfb92d14SAndroid Build Coastguard Worker
719*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
720*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
721*cfb92d14SAndroid Build Coastguard Worker
722*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kDefaultTimeout / 2);
723*cfb92d14SAndroid Build Coastguard Worker
724*cfb92d14SAndroid Build Coastguard Worker clientConn.SendTestUnidirectionalMessage();
725*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidSendMessage());
726*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidReceiveMessage());
727*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!serverConn.DidSendMessage());
728*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
729*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
730*cfb92d14SAndroid Build Coastguard Worker Log("Sent unidirectional message (client->server) at half the keep alive interval");
731*cfb92d14SAndroid Build Coastguard Worker VerifyKeepAliveExchange(clientConn, serverConn, Dso::kDefaultTimeout, 1);
732*cfb92d14SAndroid Build Coastguard Worker
733*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
734*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
735*cfb92d14SAndroid Build Coastguard Worker
736*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kDefaultTimeout / 2);
737*cfb92d14SAndroid Build Coastguard Worker
738*cfb92d14SAndroid Build Coastguard Worker serverConn.SendTestUnidirectionalMessage();
739*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidSendMessage());
740*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidReceiveMessage());
741*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidSendMessage());
742*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
743*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
744*cfb92d14SAndroid Build Coastguard Worker Log("Sent unidirectional message (server->client) at half the keep alive interval");
745*cfb92d14SAndroid Build Coastguard Worker VerifyKeepAliveExchange(clientConn, serverConn, Dso::kDefaultTimeout, 1);
746*cfb92d14SAndroid Build Coastguard Worker
747*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
748*cfb92d14SAndroid Build Coastguard Worker Log("Keep Alive timeout on server");
749*cfb92d14SAndroid Build Coastguard Worker
750*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
751*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
752*cfb92d14SAndroid Build Coastguard Worker
753*cfb92d14SAndroid Build Coastguard Worker Log("Drop all sent message (drop Keep Alive msg from client->server)");
754*cfb92d14SAndroid Build Coastguard Worker sTestDsoForwardMessageToPeer = false;
755*cfb92d14SAndroid Build Coastguard Worker
756*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kDefaultTimeout);
757*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidSendMessage());
758*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!serverConn.DidReceiveMessage());
759*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
760*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
761*cfb92d14SAndroid Build Coastguard Worker
762*cfb92d14SAndroid Build Coastguard Worker Log("Sever waits for twice the interval before Keep Alive timeout");
763*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kDefaultTimeout);
764*cfb92d14SAndroid Build Coastguard Worker
765*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
766*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonKeepAliveTimeout);
767*cfb92d14SAndroid Build Coastguard Worker
768*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
769*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonPeerAborted);
770*cfb92d14SAndroid Build Coastguard Worker Log("Server aborted connection on Keep Alive timeout");
771*cfb92d14SAndroid Build Coastguard Worker sTestDsoForwardMessageToPeer = true;
772*cfb92d14SAndroid Build Coastguard Worker
773*cfb92d14SAndroid Build Coastguard Worker Log("-------------------------------------------------------------------------------------------");
774*cfb92d14SAndroid Build Coastguard Worker Log("Inactivity Timeout behavior");
775*cfb92d14SAndroid Build Coastguard Worker
776*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kDefaultTimeout, Dso::kMinKeepAliveInterval));
777*cfb92d14SAndroid Build Coastguard Worker
778*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetKeepAliveInterval() == Dso::kMinKeepAliveInterval);
779*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetInactivityTimeout() == Dso::kDefaultTimeout);
780*cfb92d14SAndroid Build Coastguard Worker
781*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
782*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
783*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
784*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
785*cfb92d14SAndroid Build Coastguard Worker
786*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetKeepAliveInterval() == Dso::kMinKeepAliveInterval);
787*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetInactivityTimeout() == Dso::kDefaultTimeout);
788*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetKeepAliveInterval() == Dso::kMinKeepAliveInterval);
789*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetInactivityTimeout() == Dso::kDefaultTimeout);
790*cfb92d14SAndroid Build Coastguard Worker
791*cfb92d14SAndroid Build Coastguard Worker Log("Sending a unidirectional message should clear inactivity timer");
792*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kDefaultTimeout / 2);
793*cfb92d14SAndroid Build Coastguard Worker clientConn.SendTestUnidirectionalMessage();
794*cfb92d14SAndroid Build Coastguard Worker
795*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kDefaultTimeout - 1);
796*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
797*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
798*cfb92d14SAndroid Build Coastguard Worker Log("Client keeps the connection up to the inactivity timeout");
799*cfb92d14SAndroid Build Coastguard Worker
800*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(1);
801*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
802*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
803*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
804*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
805*cfb92d14SAndroid Build Coastguard Worker Log("Client closes the connection gracefully on inactivity timeout");
806*cfb92d14SAndroid Build Coastguard Worker
807*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
808*cfb92d14SAndroid Build Coastguard Worker Log("Increasing inactivity timeout in middle");
809*cfb92d14SAndroid Build Coastguard Worker
810*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
811*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
812*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
813*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
814*cfb92d14SAndroid Build Coastguard Worker
815*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(TimeMilli::SecToMsec(10));
816*cfb92d14SAndroid Build Coastguard Worker Log("After 10 sec elapses, change the inactivity timeout from 15 to 20 sec");
817*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(TimeMilli::SecToMsec(20), Dso::kMinKeepAliveInterval));
818*cfb92d14SAndroid Build Coastguard Worker
819*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(TimeMilli::SecToMsec(10) - 1);
820*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
821*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
822*cfb92d14SAndroid Build Coastguard Worker Log("Client keeps the connection up to new 20 sec inactivity timeout");
823*cfb92d14SAndroid Build Coastguard Worker
824*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(1);
825*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
826*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
827*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
828*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
829*cfb92d14SAndroid Build Coastguard Worker Log("Client closes the connection gracefully on inactivity timeout of 20 sec");
830*cfb92d14SAndroid Build Coastguard Worker
831*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
832*cfb92d14SAndroid Build Coastguard Worker Log("Decreasing inactivity timeout in middle");
833*cfb92d14SAndroid Build Coastguard Worker
834*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
835*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
836*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
837*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
838*cfb92d14SAndroid Build Coastguard Worker
839*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(TimeMilli::SecToMsec(10));
840*cfb92d14SAndroid Build Coastguard Worker Log("After 10 sec elapses, change the inactivity timeout from 15 to 10 sec");
841*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(TimeMilli::SecToMsec(10), Dso::kMinKeepAliveInterval));
842*cfb92d14SAndroid Build Coastguard Worker
843*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(0);
844*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
845*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
846*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
847*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
848*cfb92d14SAndroid Build Coastguard Worker Log("Client closes the connection gracefully on new shorter inactivity timeout of 10 sec");
849*cfb92d14SAndroid Build Coastguard Worker
850*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
851*cfb92d14SAndroid Build Coastguard Worker Log("Changing inactivity timeout from infinite to finite");
852*cfb92d14SAndroid Build Coastguard Worker
853*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kDefaultTimeout, Dso::kInfiniteTimeout));
854*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
855*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
856*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
857*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
858*cfb92d14SAndroid Build Coastguard Worker
859*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(TimeMilli::SecToMsec(6));
860*cfb92d14SAndroid Build Coastguard Worker Log("After 6 sec, change the inactivity to infinite");
861*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kInfiniteTimeout));
862*cfb92d14SAndroid Build Coastguard Worker
863*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(TimeMilli::SecToMsec(4));
864*cfb92d14SAndroid Build Coastguard Worker Log("After 4 sec, change the inactivity timeout from infinite to 20 sec");
865*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(TimeMilli::SecToMsec(20), Dso::kInfiniteTimeout));
866*cfb92d14SAndroid Build Coastguard Worker
867*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(TimeMilli::SecToMsec(10) - 1);
868*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
869*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
870*cfb92d14SAndroid Build Coastguard Worker
871*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(1);
872*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
873*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
874*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
875*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
876*cfb92d14SAndroid Build Coastguard Worker Log("Client closes the connection gracefully after 20 sec since last activity");
877*cfb92d14SAndroid Build Coastguard Worker
878*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
879*cfb92d14SAndroid Build Coastguard Worker Log("Tracking activity while inactivity timeout is infinite");
880*cfb92d14SAndroid Build Coastguard Worker
881*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kInfiniteTimeout));
882*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
883*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
884*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
885*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
886*cfb92d14SAndroid Build Coastguard Worker
887*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(TimeMilli::SecToMsec(7));
888*cfb92d14SAndroid Build Coastguard Worker Log("After 7 sec, send a test message, this clears inactivity timer");
889*cfb92d14SAndroid Build Coastguard Worker serverConn.SendTestUnidirectionalMessage();
890*cfb92d14SAndroid Build Coastguard Worker
891*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(TimeMilli::SecToMsec(10));
892*cfb92d14SAndroid Build Coastguard Worker Log("After 10 sec, change the inactivity timeout from infinite to 15 sec");
893*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(TimeMilli::SecToMsec(15), Dso::kInfiniteTimeout));
894*cfb92d14SAndroid Build Coastguard Worker
895*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(TimeMilli::SecToMsec(5) - 1);
896*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
897*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
898*cfb92d14SAndroid Build Coastguard Worker
899*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(1);
900*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
901*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
902*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
903*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
904*cfb92d14SAndroid Build Coastguard Worker Log("Client closes the connection gracefully after 15 sec since last activity");
905*cfb92d14SAndroid Build Coastguard Worker
906*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
907*cfb92d14SAndroid Build Coastguard Worker Log("Inactivity timeout on server");
908*cfb92d14SAndroid Build Coastguard Worker
909*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
910*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
911*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
912*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
913*cfb92d14SAndroid Build Coastguard Worker
914*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kDefaultTimeout, Dso::kInfiniteTimeout));
915*cfb92d14SAndroid Build Coastguard Worker
916*cfb92d14SAndroid Build Coastguard Worker Log("Wait for inactivity timeout and ensure client disconnect");
917*cfb92d14SAndroid Build Coastguard Worker Log("Configure test for client not to signal its disconnect to server");
918*cfb92d14SAndroid Build Coastguard Worker sTestDsoSignalDisconnectToPeer = false;
919*cfb92d14SAndroid Build Coastguard Worker
920*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kDefaultTimeout);
921*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
922*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
923*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
924*cfb92d14SAndroid Build Coastguard Worker sTestDsoSignalDisconnectToPeer = true;
925*cfb92d14SAndroid Build Coastguard Worker
926*cfb92d14SAndroid Build Coastguard Worker Log("Server should disconnect after twice the inactivity timeout");
927*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kDefaultTimeout - 1);
928*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
929*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(1);
930*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
931*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
932*cfb92d14SAndroid Build Coastguard Worker
933*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
934*cfb92d14SAndroid Build Coastguard Worker Log("Server reducing inactivity timeout to expired (on server)");
935*cfb92d14SAndroid Build Coastguard Worker
936*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
937*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
938*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
939*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
940*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kDefaultTimeout, Dso::kInfiniteTimeout));
941*cfb92d14SAndroid Build Coastguard Worker
942*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(TimeMilli::SecToMsec(10));
943*cfb92d14SAndroid Build Coastguard Worker Log("After 11 sec elapses, change the inactivity timeout from 15 to 2 sec");
944*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(TimeMilli::SecToMsec(2), Dso::kMinKeepAliveInterval));
945*cfb92d14SAndroid Build Coastguard Worker
946*cfb92d14SAndroid Build Coastguard Worker sTestDsoSignalDisconnectToPeer = false;
947*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(0);
948*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
949*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
950*cfb92d14SAndroid Build Coastguard Worker sTestDsoSignalDisconnectToPeer = true;
951*cfb92d14SAndroid Build Coastguard Worker Log("Client closes the connection gracefully on expired timeout");
952*cfb92d14SAndroid Build Coastguard Worker Log("Configure test for client not to signal its disconnect to server");
953*cfb92d14SAndroid Build Coastguard Worker
954*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kMinServerInactivityWaitTime - 1);
955*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
956*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(1);
957*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
958*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
959*cfb92d14SAndroid Build Coastguard Worker Log("Server wait for kMinServerInactivityWaitTime (5 sec) before closing on expired timeout");
960*cfb92d14SAndroid Build Coastguard Worker
961*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
962*cfb92d14SAndroid Build Coastguard Worker Log("Long-lived operation");
963*cfb92d14SAndroid Build Coastguard Worker
964*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
965*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
966*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
967*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
968*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kDefaultTimeout, Dso::kInfiniteTimeout));
969*cfb92d14SAndroid Build Coastguard Worker
970*cfb92d14SAndroid Build Coastguard Worker clientConn.SetLongLivedOperation(true);
971*cfb92d14SAndroid Build Coastguard Worker serverConn.SetLongLivedOperation(true);
972*cfb92d14SAndroid Build Coastguard Worker
973*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(2 * Dso::kDefaultTimeout);
974*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
975*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
976*cfb92d14SAndroid Build Coastguard Worker
977*cfb92d14SAndroid Build Coastguard Worker clientConn.SetLongLivedOperation(false);
978*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(0);
979*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
980*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
981*cfb92d14SAndroid Build Coastguard Worker
982*cfb92d14SAndroid Build Coastguard Worker Log("-------------------------------------------------------------------------------------------");
983*cfb92d14SAndroid Build Coastguard Worker Log("Request, response, and unidirectional message exchange");
984*cfb92d14SAndroid Build Coastguard Worker
985*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kDefaultTimeout, Dso::kDefaultTimeout));
986*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
987*cfb92d14SAndroid Build Coastguard Worker
988*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateConnectedButSessionless);
989*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateConnectedButSessionless);
990*cfb92d14SAndroid Build Coastguard Worker
991*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
992*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
993*cfb92d14SAndroid Build Coastguard Worker
994*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
995*cfb92d14SAndroid Build Coastguard Worker Log("Establish connection using test message request/response");
996*cfb92d14SAndroid Build Coastguard Worker clientConn.SendTestRequestMessage();
997*cfb92d14SAndroid Build Coastguard Worker
998*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
999*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1000*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidProcessRequest());
1001*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidProcessResponse());
1002*cfb92d14SAndroid Build Coastguard Worker
1003*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1004*cfb92d14SAndroid Build Coastguard Worker Log("Send unidirectional test message");
1005*cfb92d14SAndroid Build Coastguard Worker
1006*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
1007*cfb92d14SAndroid Build Coastguard Worker clientConn.SendTestUnidirectionalMessage(0x10);
1008*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidProcessUnidirectional());
1009*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetLastRxTestTlvValue() == 0x10);
1010*cfb92d14SAndroid Build Coastguard Worker
1011*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
1012*cfb92d14SAndroid Build Coastguard Worker serverConn.SendTestUnidirectionalMessage(0x20);
1013*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidProcessUnidirectional());
1014*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetLastRxTestTlvValue() == 0x20);
1015*cfb92d14SAndroid Build Coastguard Worker
1016*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1017*cfb92d14SAndroid Build Coastguard Worker Log("Exchange request and response");
1018*cfb92d14SAndroid Build Coastguard Worker
1019*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
1020*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
1021*cfb92d14SAndroid Build Coastguard Worker serverConn.SendTestRequestMessage(0x30);
1022*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidProcessRequest());
1023*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidProcessResponse());
1024*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!serverConn.DidProcessRequest());
1025*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidProcessResponse());
1026*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetLastRxTestTlvValue() == 0x30);
1027*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetLastRxTestTlvValue() == 0x30);
1028*cfb92d14SAndroid Build Coastguard Worker
1029*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
1030*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
1031*cfb92d14SAndroid Build Coastguard Worker clientConn.SendTestRequestMessage(0x40);
1032*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidProcessRequest());
1033*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidProcessResponse());
1034*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidProcessRequest());
1035*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!serverConn.DidProcessResponse());
1036*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetLastRxTestTlvValue() == 0x40);
1037*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetLastRxTestTlvValue() == 0x40);
1038*cfb92d14SAndroid Build Coastguard Worker
1039*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1040*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1041*cfb92d14SAndroid Build Coastguard Worker
1042*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1043*cfb92d14SAndroid Build Coastguard Worker Log("Send unknown TLV request");
1044*cfb92d14SAndroid Build Coastguard Worker
1045*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
1046*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
1047*cfb92d14SAndroid Build Coastguard Worker
1048*cfb92d14SAndroid Build Coastguard Worker message = clientConn.NewMessage();
1049*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(message != nullptr);
1050*cfb92d14SAndroid Build Coastguard Worker tlv.Init(kUnknownTlvType, 0);
1051*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(message->Append(tlv));
1052*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendRequestMessage(*message, messageId));
1053*cfb92d14SAndroid Build Coastguard Worker
1054*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!clientConn.DidProcessRequest());
1055*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidProcessResponse());
1056*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidProcessRequest());
1057*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!serverConn.DidProcessResponse());
1058*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetLastRxResponseCode() == Dns::Header::kDsoTypeNotImplemented);
1059*cfb92d14SAndroid Build Coastguard Worker Log("Received a response with DSO Type Unknown error code");
1060*cfb92d14SAndroid Build Coastguard Worker
1061*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1062*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1063*cfb92d14SAndroid Build Coastguard Worker
1064*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1065*cfb92d14SAndroid Build Coastguard Worker Log("Send unknown TLV unidirectional");
1066*cfb92d14SAndroid Build Coastguard Worker
1067*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
1068*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
1069*cfb92d14SAndroid Build Coastguard Worker
1070*cfb92d14SAndroid Build Coastguard Worker message = clientConn.NewMessage();
1071*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(message != nullptr);
1072*cfb92d14SAndroid Build Coastguard Worker tlv.Init(kUnknownTlvType, 0);
1073*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(message->Append(tlv));
1074*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendUnidirectionalMessage(*message));
1075*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidProcessUnidirectional());
1076*cfb92d14SAndroid Build Coastguard Worker Log("Unknown TLV unidirectional is correctly ignored");
1077*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1078*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1079*cfb92d14SAndroid Build Coastguard Worker
1080*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1081*cfb92d14SAndroid Build Coastguard Worker Log("Send malformed/invalid request");
1082*cfb92d14SAndroid Build Coastguard Worker
1083*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
1084*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
1085*cfb92d14SAndroid Build Coastguard Worker
1086*cfb92d14SAndroid Build Coastguard Worker message = clientConn.NewMessage();
1087*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(message != nullptr);
1088*cfb92d14SAndroid Build Coastguard Worker tlv.Init(Dso::Tlv::kEncryptionPaddingType, 0);
1089*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(message->Append(tlv));
1090*cfb92d14SAndroid Build Coastguard Worker
1091*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SendRequestMessage(*message, messageId));
1092*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
1093*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
1094*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonPeerMisbehavior);
1095*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerAborted);
1096*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidGetDisconnectSignal());
1097*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidGetDisconnectSignal());
1098*cfb92d14SAndroid Build Coastguard Worker Log("Client aborted on invalid request message");
1099*cfb92d14SAndroid Build Coastguard Worker
1100*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1101*cfb92d14SAndroid Build Coastguard Worker Log("Response timeout during session establishment");
1102*cfb92d14SAndroid Build Coastguard Worker
1103*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
1104*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
1105*cfb92d14SAndroid Build Coastguard Worker
1106*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kResponseTimeout, Dso::kInfiniteTimeout));
1107*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
1108*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateConnectedButSessionless);
1109*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateConnectedButSessionless);
1110*cfb92d14SAndroid Build Coastguard Worker
1111*cfb92d14SAndroid Build Coastguard Worker sTestDsoForwardMessageToPeer = false;
1112*cfb92d14SAndroid Build Coastguard Worker clientConn.SendTestRequestMessage();
1113*cfb92d14SAndroid Build Coastguard Worker sTestDsoForwardMessageToPeer = true;
1114*cfb92d14SAndroid Build Coastguard Worker
1115*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateEstablishingSession);
1116*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateConnectedButSessionless);
1117*cfb92d14SAndroid Build Coastguard Worker
1118*cfb92d14SAndroid Build Coastguard Worker sTestDsoSignalDisconnectToPeer = false;
1119*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kResponseTimeout);
1120*cfb92d14SAndroid Build Coastguard Worker sTestDsoSignalDisconnectToPeer = true;
1121*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
1122*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonResponseTimeout);
1123*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidGetDisconnectSignal());
1124*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateConnectedButSessionless);
1125*cfb92d14SAndroid Build Coastguard Worker Log("Client disconnected after response timeout");
1126*cfb92d14SAndroid Build Coastguard Worker
1127*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kResponseTimeout);
1128*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
1129*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonInactivityTimeout);
1130*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidGetDisconnectSignal());
1131*cfb92d14SAndroid Build Coastguard Worker Log("Server disconnected after twice the inactivity timeout");
1132*cfb92d14SAndroid Build Coastguard Worker
1133*cfb92d14SAndroid Build Coastguard Worker Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
1134*cfb92d14SAndroid Build Coastguard Worker Log("Response timeout after session establishment");
1135*cfb92d14SAndroid Build Coastguard Worker
1136*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
1137*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
1138*cfb92d14SAndroid Build Coastguard Worker
1139*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kInfiniteTimeout));
1140*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
1141*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
1142*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1143*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1144*cfb92d14SAndroid Build Coastguard Worker
1145*cfb92d14SAndroid Build Coastguard Worker sTestDsoForwardMessageToPeer = false;
1146*cfb92d14SAndroid Build Coastguard Worker serverConn.SendTestRequestMessage();
1147*cfb92d14SAndroid Build Coastguard Worker sTestDsoForwardMessageToPeer = true;
1148*cfb92d14SAndroid Build Coastguard Worker
1149*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1150*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1151*cfb92d14SAndroid Build Coastguard Worker
1152*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(Dso::kResponseTimeout - 1);
1153*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1154*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1155*cfb92d14SAndroid Build Coastguard Worker
1156*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(1);
1157*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
1158*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
1159*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonResponseTimeout);
1160*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonPeerAborted);
1161*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidGetDisconnectSignal());
1162*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidGetDisconnectSignal());
1163*cfb92d14SAndroid Build Coastguard Worker
1164*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
1165*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
1166*cfb92d14SAndroid Build Coastguard Worker
1167*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kInfiniteTimeout));
1168*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
1169*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
1170*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1171*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1172*cfb92d14SAndroid Build Coastguard Worker
1173*cfb92d14SAndroid Build Coastguard Worker sTestDsoForwardMessageToPeer = false;
1174*cfb92d14SAndroid Build Coastguard Worker serverConn.SendTestRequestMessage(0, kLongResponseTimeout);
1175*cfb92d14SAndroid Build Coastguard Worker sTestDsoForwardMessageToPeer = true;
1176*cfb92d14SAndroid Build Coastguard Worker
1177*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1178*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1179*cfb92d14SAndroid Build Coastguard Worker
1180*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(kLongResponseTimeout - 1);
1181*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1182*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1183*cfb92d14SAndroid Build Coastguard Worker
1184*cfb92d14SAndroid Build Coastguard Worker AdvanceTime(1);
1185*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
1186*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
1187*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonResponseTimeout);
1188*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonPeerAborted);
1189*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidGetDisconnectSignal());
1190*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidGetDisconnectSignal());
1191*cfb92d14SAndroid Build Coastguard Worker
1192*cfb92d14SAndroid Build Coastguard Worker Log("-------------------------------------------------------------------------------------------");
1193*cfb92d14SAndroid Build Coastguard Worker Log("Retry Delay message");
1194*cfb92d14SAndroid Build Coastguard Worker
1195*cfb92d14SAndroid Build Coastguard Worker clientConn.ClearTestFlags();
1196*cfb92d14SAndroid Build Coastguard Worker serverConn.ClearTestFlags();
1197*cfb92d14SAndroid Build Coastguard Worker
1198*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SetTimeouts(Dso::kInfiniteTimeout, Dso::kInfiniteTimeout));
1199*cfb92d14SAndroid Build Coastguard Worker clientConn.Connect();
1200*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(clientConn.SendKeepAliveMessage());
1201*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateSessionEstablished);
1202*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateSessionEstablished);
1203*cfb92d14SAndroid Build Coastguard Worker
1204*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(serverConn.SendRetryDelayMessage(kRetryDelayInterval, Dns::Header::kResponseServerFailure));
1205*cfb92d14SAndroid Build Coastguard Worker
1206*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetState() == Connection::kStateDisconnected);
1207*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetState() == Connection::kStateDisconnected);
1208*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.DidGetDisconnectSignal());
1209*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.DidGetDisconnectSignal());
1210*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetDisconnectReason() == Connection::kReasonServerRetryDelayRequest);
1211*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(serverConn.GetDisconnectReason() == Connection::kReasonPeerClosed);
1212*cfb92d14SAndroid Build Coastguard Worker
1213*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetRetryDelay() == kRetryDelayInterval);
1214*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(clientConn.GetRetryDelayErrorCode() == Dns::Header::kResponseServerFailure);
1215*cfb92d14SAndroid Build Coastguard Worker
1216*cfb92d14SAndroid Build Coastguard Worker Log("End of test");
1217*cfb92d14SAndroid Build Coastguard Worker
1218*cfb92d14SAndroid Build Coastguard Worker testFreeInstance(&instance);
1219*cfb92d14SAndroid Build Coastguard Worker }
1220*cfb92d14SAndroid Build Coastguard Worker
1221*cfb92d14SAndroid Build Coastguard Worker } // namespace Dns
1222*cfb92d14SAndroid Build Coastguard Worker
1223*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_DNS_DSO_ENABLE
1224*cfb92d14SAndroid Build Coastguard Worker
1225*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
1226*cfb92d14SAndroid Build Coastguard Worker
main(void)1227*cfb92d14SAndroid Build Coastguard Worker int main(void)
1228*cfb92d14SAndroid Build Coastguard Worker {
1229*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DNS_DSO_ENABLE
1230*cfb92d14SAndroid Build Coastguard Worker ot::Dns::TestDso();
1231*cfb92d14SAndroid Build Coastguard Worker printf("All tests passed\n");
1232*cfb92d14SAndroid Build Coastguard Worker #else
1233*cfb92d14SAndroid Build Coastguard Worker printf("DSO feature is not enabled\n");
1234*cfb92d14SAndroid Build Coastguard Worker #endif
1235*cfb92d14SAndroid Build Coastguard Worker
1236*cfb92d14SAndroid Build Coastguard Worker return 0;
1237*cfb92d14SAndroid Build Coastguard Worker }
1238