diff --git a/mesh/cfgmod-server.c b/mesh/cfgmod-server.c
index 9dc82ee..df26145 100644
--- a/mesh/cfgmod-server.c
+++ b/mesh/cfgmod-server.c
#include "mesh/appkey.h"
#include "mesh/model.h"
#include "mesh/storage.h"
+#include "mesh/mesh-db.h"
#include "mesh/cfgmod.h"
if (IS_UNASSIGNED(ota) && !b_virt)
ttl = period = idx = 0;
- if (status >= 0 && !unreliable)
+ if (!unreliable)
send_pub_status(node, src, dst, status, ele_addr, ota,
mod_id, idx, cred_flag, ttl, period,
retransmit);
return true;
}
+static bool save_config_sub(struct mesh_node *node, uint16_t ele_addr,
+ uint32_t mod_id, bool vendor,
+ const uint8_t *addr, bool virt,
+ uint16_t grp, uint32_t opcode)
+{
+ struct mesh_db_sub db_sub = {
+ .virt = virt,
+ .src.addr = grp
+ };
+
+ if (virt)
+ memcpy(db_sub.src.virt_addr, addr, 16);
+
+ if (opcode == OP_CONFIG_MODEL_SUB_VIRT_OVERWRITE ||
+ opcode == OP_CONFIG_MODEL_SUB_OVERWRITE)
+ mesh_db_model_sub_del_all(node_jconfig_get(node),
+ ele_addr, vendor ? mod_id : mod_id & 0x0000ffff,
+ vendor);
+
+ if (opcode != OP_CONFIG_MODEL_SUB_VIRT_DELETE &&
+ opcode != OP_CONFIG_MODEL_SUB_DELETE)
+ return mesh_db_model_sub_add(node_jconfig_get(node),
+ ele_addr,
+ vendor ? mod_id : mod_id & 0x0000ffff,
+ vendor, &db_sub);
+ else
+ return mesh_db_model_sub_del(node_jconfig_get(node),
+ ele_addr,
+ vendor ? mod_id : mod_id & 0x0000ffff,
+ vendor, &db_sub);
+}
+
static void config_sub_set(struct mesh_node *node, uint16_t src, uint16_t dst,
const uint8_t *pkt, uint16_t size,
bool virt, uint32_t opcode)
uint32_t mod_id, func;
const uint8_t *addr = NULL;
int status = 0;
+ bool vendor = false;
switch (size) {
default:
} else {
mod_id = l_get_le16(pkt + 2) << 16;
mod_id |= l_get_le16(pkt + 4);
+ vendor = true;
}
break;
case 8:
return;
mod_id = l_get_le16(pkt + 4) << 16;
mod_id |= l_get_le16(pkt + 6);
+ vendor = true;
break;
case 20:
if (!virt)
case OP_CONFIG_MODEL_SUB_DELETE_ALL:
status = mesh_model_sub_del_all(node, ele_addr, mod_id);
+
+ if (status == MESH_STATUS_SUCCESS)
+ mesh_db_model_sub_del_all(node_jconfig_get(node),
+ ele_addr, vendor ? mod_id : mod_id & 0x0000ffff,
+ vendor);
break;
case OP_CONFIG_MODEL_SUB_VIRT_OVERWRITE:
case OP_CONFIG_MODEL_SUB_OVERWRITE:
status = mesh_model_sub_ovr(node, ele_addr, mod_id,
addr, virt, &grp);
+
+ if (status == MESH_STATUS_SUCCESS)
+ save_config_sub(node, ele_addr, mod_id, vendor, addr,
+ virt, grp, opcode);
break;
case OP_CONFIG_MODEL_SUB_VIRT_ADD:
grp = UNASSIGNED_ADDRESS;
case OP_CONFIG_MODEL_SUB_ADD:
status = mesh_model_sub_add(node, ele_addr, mod_id,
addr, virt, &grp);
+
+ if (status == MESH_STATUS_SUCCESS &&
+ !save_config_sub(node, ele_addr, mod_id, vendor,
+ addr, virt, grp, opcode))
+ status = MESH_STATUS_STORAGE_FAIL;
+
break;
case OP_CONFIG_MODEL_SUB_VIRT_DELETE:
grp = UNASSIGNED_ADDRESS;
case OP_CONFIG_MODEL_SUB_DELETE:
status = mesh_model_sub_del(node, ele_addr, mod_id,
addr, virt, &grp);
+
+ if (status == MESH_STATUS_SUCCESS)
+ save_config_sub(node, ele_addr, mod_id, vendor, addr,
+ virt, grp, opcode);
+
break;
}
- if (!unreliable && status >= 0)
+ if (!unreliable)
send_sub_status(node, src, dst, status, ele_addr, grp, mod_id);
}