13using namespace dawn::wakaama_internal;
18 , securityObj(nullptr)
21 , instancePools(nullptr)
35 securityObj =
new (std::nothrow) lwm2m_object_t();
36 serverObj =
new (std::nothrow) lwm2m_object_t();
37 deviceObj =
new (std::nothrow) lwm2m_object_t();
38 if (securityObj ==
nullptr || serverObj ==
nullptr || deviceObj ==
nullptr)
43 ret = buildSecurityAndServerObjects();
49 ret = buildDeviceObject();
55 lwm2mObjects.push_back(securityObj);
56 lwm2mObjects.push_back(serverObj);
57 lwm2mObjects.push_back(deviceObj);
67 lwm2mObjects.push_back(obj->object());
73int ClientRuntime::buildSecurityAndServerObjects()
76 const size_t serverCapacity = owner.serverPoolCapacity();
84 pools->securityCapacity = serverCapacity;
85 pools->serverCapacity = serverCapacity;
88 if (pools->security ==
nullptr || pools->server ==
nullptr)
90 delete[] pools->security;
91 delete[] pools->server;
96 instancePools = pools;
97 for (
const CProtoWakaama::ServerConfig &server : owner.servers)
101 std::string uri = owner.serverUri(server);
103 secInst = allocateSecurityInstance(pools);
104 if (!server.bootstrap)
106 srvInst = allocateServerInstance(pools);
109 if (secInst ==
nullptr || (!server.bootstrap && srvInst ==
nullptr))
114 secInst->id = server.securityInstanceId;
115 secInst->shortServerId = server.shortServerId;
116 secInst->holdoff = server.holdoff;
117 secInst->bootstrapTimeout = server.bootstrapTimeout;
118 secInst->securityMode = server.securityMode;
119 secInst->bootstrap = server.bootstrap;
120 if (!assignSecurityString(
121 *secInst,
reinterpret_cast<const uint8_t *
>(uri.c_str()), uri.size()) ||
122 !assignSecurityBuffer(
reinterpret_cast<const uint8_t *
>(server.pskIdentity.data()),
123 server.pskIdentity.size(),
124 secInst->publicIdentityBuffer,
125 sizeof(secInst->publicIdentityBuffer),
126 &secInst->publicIdentity,
127 &secInst->publicIdentityLen) ||
128 !assignSecurityBuffer(server.pskKey.data(),
129 server.pskKey.size(),
130 secInst->secretKeyBuffer,
131 sizeof(secInst->secretKeyBuffer),
133 &secInst->secretKeyLen))
138 securityObj->instanceList = LWM2M_LIST_ADD(securityObj->instanceList, secInst);
140 if (!server.bootstrap)
142 srvInst->id = server.serverInstanceId;
143 srvInst->shortServerId = server.shortServerId;
144 srvInst->lifetime = server.lifetime;
146 srvInst->binding, (server.binding & BINDING_Q) ?
"UQ" :
"U", sizeof(srvInst->binding));
147 srvInst->storing =
false;
149 serverObj->instanceList = LWM2M_LIST_ADD(serverObj->instanceList, srvInst);
153 securityObj->objID = LWM2M_SECURITY_OBJECT_ID;
154 securityObj->userData = pools;
155 securityObj->readFunc = securityRead;
156 securityObj->discoverFunc = securityDiscover;
157#ifdef CONFIG_WAKAAMA_BOOTSTRAP
158 securityObj->writeFunc = securityWrite;
159 securityObj->createFunc = securityCreate;
160 securityObj->deleteFunc = securityDelete;
163 serverObj->objID = LWM2M_SERVER_OBJECT_ID;
164 serverObj->userData = pools;
165 serverObj->readFunc = serverRead;
166 serverObj->discoverFunc = serverDiscover;
167 serverObj->executeFunc = serverExecute;
168 serverObj->writeFunc = serverWrite;
169#ifdef CONFIG_WAKAAMA_BOOTSTRAP
170 serverObj->createFunc = serverCreate;
171 serverObj->deleteFunc = serverDelete;
177int ClientRuntime::buildDeviceObject()
180 if (devInst ==
nullptr)
186 deviceObj->objID = CProtoWakaama::WAKAAMA_OBJECT_DEVICE;
187 deviceObj->instanceList = LWM2M_LIST_ADD(deviceObj->instanceList, devInst);
188 deviceObj->userData = &owner;
189 deviceObj->readFunc = deviceRead;
190 deviceObj->discoverFunc = deviceDiscover;
194 deviceResolveBatteryBindings(&owner);
208 lwm2mObjects.clear();
210 if (securityObj !=
nullptr)
212 securityObj->instanceList =
nullptr;
214 securityObj =
nullptr;
217 if (serverObj !=
nullptr)
219 serverObj->instanceList =
nullptr;
224 if (deviceObj !=
nullptr)
226 while (deviceObj->instanceList !=
nullptr)
230 deviceObj->instanceList = deviceObj->instanceList->next;
238 if (instancePools !=
nullptr)
240 delete[] instancePools->security;
241 delete[] instancePools->server;
242 delete instancePools;
243 instancePools =
nullptr;
249 ctx = lwm2m_init(userdata);
251 return ctx ==
nullptr ? -ENOMEM : OK;
261 return lwm2m_configure(ctx,
265 static_cast<uint16_t
>(lwm2mObjects.size()),
266 lwm2mObjects.data());
271 return ctx ==
nullptr ? -ENODEV : lwm2m_step(ctx, timeout);
276 if (ctx !=
nullptr && ctx->state == STATE_BOOTSTRAP_REQUIRED &&
277 ctx->bootstrapServerList ==
nullptr && ctx->serverList !=
nullptr)
279 ctx->state = STATE_REGISTER_REQUIRED;
288 return ctx !=
nullptr && ctx->state == STATE_READY;
293 if (ctx !=
nullptr && session !=
nullptr)
295 lwm2m_handle_packet(ctx, buffer, length, session);
301 if (securityObj ==
nullptr)
307 lwm2m_list_find(securityObj->instanceList, securityInstanceId));
310void ClientRuntime::closeContext()
Wakaama LwM2M client protocol implementation.
int configure(const char *endpoint)
Configure the Wakaama client endpoint and registered objects.
bool recoverFromBootstrapWedge()
Nudge a registration-failed client (parked in STATE_BOOTSTRAP_REQUIRED with no bootstrap server) back...
~ClientRuntime()
Close the Wakaama context and release owned object allocations.
int build(const std::vector< ObjectBinding * > &objects)
Build built-in and descriptor-backed LwM2M objects.
void destroy(const std::vector< ObjectBinding * > &objects)
Release built-in and descriptor-backed LwM2M objects.
security_instance_s * findSecurityInstance(uint16_t securityInstanceId) const
Find a Security object instance by instance ID.
bool ready() const
Return true when the Wakaama client has completed registration.
ClientRuntime(CProtoWakaama &owner)
Construct runtime state for a Wakaama protocol owner.
int step(time_t *timeout)
Run one Wakaama state-machine step.
int openContext(void *userdata)
Open the Wakaama client context with transport callback userdata.
void handlePacket(uint8_t *buffer, size_t length, void *session)
Deliver one received packet into the Wakaama client context.
Runtime binding between one LwM2M object and Dawn IO resources.
Out-of-tree user-extension hooks for Dawn.
Fixed pools backing bootstrap-mutable Security and Server objects.
Runtime representation of the single LwM2M Device instance.
Runtime representation of one LwM2M Security object instance.
Runtime representation of one LwM2M Server object instance.