OC_ADAPTER_REMOTE_ACCESS = (1 << 3)
#endif
+#ifdef TCP_ADAPTER
+ /** CoAP over TCP.*/
+ OC_ADAPTER_TCP = (1 << 4)
+#endif
+
} OCTransportAdapter;
/**
CT_ADAPTER_REMOTE_ACCESS = (1 << 19),
#endif
+#ifdef TCP_ADAPTER
+ /** CoAP over TCP.*/
+ CT_ADAPTER_TCP = (1 << 20),
+#endif
+
/** Insecure transport is the default (subject to change).*/
/** secure the transport path.*/
OCDeviceEntityHandler defaultDeviceHandler;
void* defaultDeviceHandlerCallbackParameter = NULL;
+#ifdef TCP_ADAPTER
+static const char COAP_TCP[] = "coap+tcp:";
+#endif
+
//-----------------------------------------------------------------------------
// Macros
//-----------------------------------------------------------------------------
caglobals.clientFlags = (CATransportFlags_t)(caglobals.clientFlags|CA_IPV4|CA_IPV6);
}
+#ifdef TCP_ADAPTER
+ if (!(caglobals.serverFlags & CA_IPFAMILY_MASK))
+ {
+ caglobals.serverFlags = (CATransportFlags_t)(caglobals.serverFlags|CA_IPV4);
+ }
+ if (!(caglobals.clientFlags & CA_IPFAMILY_MASK))
+ {
+ caglobals.clientFlags = (CATransportFlags_t)(caglobals.clientFlags|CA_IPV4);
+ }
+#endif
+
defaultDeviceHandler = NULL;
defaultDeviceHandlerCallbackParameter = NULL;
OCSeedRandom();
/**
* A request uri consists of the following components in order:
* example
- * optional prefix "coap://"
+ * optionally one of
+ * CoAP over UDP prefix "coap://"
+ * CoAP over TCP prefix "coap+tcp://"
* optionally one of
* IPv6 address "[1234::5678]"
* IPv4 address "192.168.1.1"
return OC_STACK_INVALID_URI;
}
+#ifdef TCP_ADAPTER
+ // process url scheme
+ size_t prefixLen = slash2 - fullUri;
+ bool istcp = false;
+ if (prefixLen)
+ {
+ if ((prefixLen == sizeof(COAP_TCP) - 1) && (!strncmp(fullUri, COAP_TCP, prefixLen)))
+ {
+ istcp = true;
+ }
+ }
+#endif
+
+ // TODO: this logic should come in with unit tests exercising the various strings
// processs url prefix, if any
size_t urlLen = slash - start;
// port
{ // ipv4 address
colon = strchr(start, ':');
end = (colon && colon < slash) ? colon : slash;
- adapter = (OCTransportAdapter)(adapter | OC_ADAPTER_IP);
- flags = (OCTransportFlags)(flags | OC_IP_USE_V4);
+#ifdef TCP_ADAPTER
+ if (istcp)
+ { // coap over tcp
+ adapter = (OCTransportAdapter)(adapter | OC_ADAPTER_TCP);
+ }
+ else
+#endif
+ {
+ adapter = (OCTransportAdapter)(adapter | OC_ADAPTER_IP);
+ flags = (OCTransportFlags)(flags | OC_IP_USE_V4);
+ }
}
else
{ // MAC address
static const char COAP[] = "coap://";
static const char COAPS[] = "coaps://";
+
+#ifdef TCP_ADAPTER
+static const char COAP_TCP[] = "coap+tcp://";
+#endif
+
using OC::nil_guard;
using OC::result_guard;
using OC::checked_guard;
prefix_len = sizeof(COAPS) - 1;
m_devAddr.flags = static_cast<OCTransportFlags>(m_devAddr.flags & OC_SECURE);
}
+#ifdef TCP_ADAPTER
+ else if (host.compare(0, sizeof(COAP_TCP) - 1, COAP_TCP) == 0)
+ {
+ prefix_len = sizeof(COAP_TCP) - 1;
+ m_devAddr.adapter = static_cast<OCTransportAdapter>(m_devAddr.adapter & OC_ADAPTER_TCP);
+ }
+#endif
else
{
throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(),
m_interfaces.empty(), m_clientWrapper.expired(), false, false);
}
- // removed coap:// or coaps://
+ // removed coap:// or coaps:// or coap+tcp://
std::string host_token = host.substr(prefix_len);
if(host_token[0] == '[')
{
ss << COAPS;
}
+#ifdef TCP_ADAPTER
+ else if (m_devAddr.adapter & OC_ADAPTER_TCP)
+ {
+ ss << COAP_TCP;
+ }
+#endif
else
{
ss << COAP;