mesh: fix after sync part 2
diff --git a/apps/bttester/syscfg.yml b/apps/bttester/syscfg.yml
index 066eaea..e2439d2 100644
--- a/apps/bttester/syscfg.yml
+++ b/apps/bttester/syscfg.yml
@@ -80,7 +80,7 @@
     SHELL_TASK: 0
     SHELL_NEWTMGR: 0
     LOG_LEVEL: 12
-    MSYS_1_BLOCK_COUNT: 48
+    MSYS_1_BLOCK_COUNT: 80
 
     BLE_MONITOR_RTT: 1
     CONSOLE_RTT: 0
diff --git a/nimble/host/mesh/include/mesh/glue.h b/nimble/host/mesh/include/mesh/glue.h
index 84f2fbb..abe3dd5 100644
--- a/nimble/host/mesh/include/mesh/glue.h
+++ b/nimble/host/mesh/include/mesh/glue.h
@@ -420,8 +420,8 @@
 #define CONFIG_BT_MAX_CONN                       MYNEWT_VAL(BLE_MAX_CONNECTIONS)
 #define CONFIG_BT_MESH_SEQ_STORE_RATE            MYNEWT_VAL(BLE_MESH_SEQ_STORE_RATE)
 #define CONFIG_BT_MESH_RPL_STORE_TIMEOUT         MYNEWT_VAL(BLE_MESH_RPL_STORE_TIMEOUT)
-#define CONFIG_BT_MESH_APP_KEY_COUNT             MYNEWT_VAL(BLE_MESH_CDB_APP_KEY_COUNT)
-#define CONFIG_BT_MESH_SUBNET_COUNT              MYNEWT_VAL(BLE_MESH_CDB_SUBNET_COUNT)
+#define CONFIG_BT_MESH_APP_KEY_COUNT             MYNEWT_VAL(BLE_MESH_APP_KEY_COUNT)
+#define CONFIG_BT_MESH_SUBNET_COUNT              MYNEWT_VAL(BLE_MESH_SUBNET_COUNT)
 #define CONFIG_BT_MESH_STORE_TIMEOUT             MYNEWT_VAL(BLE_MESH_STORE_TIMEOUT)
 #define CONFIG_BT_MESH_IVU_DIVIDER               MYNEWT_VAL(BLE_MESH_IVU_DIVIDER)
 #define CONFIG_BT_DEVICE_NAME                    MYNEWT_VAL(BLE_MESH_DEVICE_NAME)
diff --git a/nimble/host/mesh/src/app_keys.c b/nimble/host/mesh/src/app_keys.c
index f986174..a6c32bf 100644
--- a/nimble/host/mesh/src/app_keys.c
+++ b/nimble/host/mesh/src/app_keys.c
@@ -36,7 +36,10 @@
 	int i;
 
 	for (i = 0; i < (sizeof(bt_mesh_app_key_cb_list)/sizeof(void *)); i++) {
-		bt_mesh_app_key_cb_list[i] (app->app_idx, app->net_idx, evt);
+		if (bt_mesh_app_key_cb_list[i]) {
+			BT_DBG("app_key_evt %d", i);
+			bt_mesh_app_key_cb_list[i] (app->app_idx, app->net_idx, evt);
+		}
 	}
 }
 
@@ -101,9 +104,42 @@
 	app_key_evt(app, BT_MESH_KEY_REVOKED);
 }
 
+
+static void subnet_evt(struct bt_mesh_subnet *sub, enum bt_mesh_key_evt evt)
+{
+	if (evt == BT_MESH_KEY_UPDATED || evt == BT_MESH_KEY_ADDED) {
+		return;
+	}
+
+	for (int i = 0; i < ARRAY_SIZE(apps); i++) {
+		struct bt_mesh_app_key *app = &apps[i];
+
+		if (app->app_idx == BT_MESH_KEY_UNUSED) {
+			continue;
+		}
+
+		if (app->net_idx != sub->net_idx) {
+			continue;
+		}
+
+		if (evt == BT_MESH_KEY_DELETED) {
+			app_key_del(app);
+		} else if (evt == BT_MESH_KEY_REVOKED) {
+			app_key_revoke(app);
+		} else if (evt == BT_MESH_KEY_SWAPPED && app->updated) {
+			app_key_evt(app, BT_MESH_KEY_SWAPPED);
+		}
+	}
+}
+
+
 uint8_t bt_mesh_app_key_add(uint16_t app_idx, uint16_t net_idx,
 			const uint8_t key[16])
 {
+	if (!bt_mesh_subnet_cb_list[0]) {
+		bt_mesh_subnet_cb_list[0] = subnet_evt;
+	}
+
 	struct bt_mesh_app_key *app;
 
 	BT_DBG("net_idx 0x%04x app_idx %04x val %s", net_idx, app_idx,
@@ -249,37 +285,9 @@
 	return STATUS_SUCCESS;
 }
 
-static void subnet_evt(struct bt_mesh_subnet *sub, enum bt_mesh_key_evt evt)
-{
-	if (evt == BT_MESH_KEY_UPDATED || evt == BT_MESH_KEY_ADDED) {
-		return;
-	}
-
-	for (int i = 0; i < ARRAY_SIZE(apps); i++) {
-		struct bt_mesh_app_key *app = &apps[i];
-
-		if (app->app_idx == BT_MESH_KEY_UNUSED) {
-			continue;
-		}
-
-		if (app->net_idx != sub->net_idx) {
-			continue;
-		}
-
-		if (evt == BT_MESH_KEY_DELETED) {
-			app_key_del(app);
-		} else if (evt == BT_MESH_KEY_REVOKED) {
-			app_key_revoke(app);
-		} else if (evt == BT_MESH_KEY_SWAPPED && app->updated) {
-			app_key_evt(app, BT_MESH_KEY_SWAPPED);
-		}
-	}
-}
-
 int bt_mesh_app_key_set(uint16_t app_idx, uint16_t net_idx,
 		    const uint8_t old_key[16], const uint8_t new_key[16])
 {
-	bt_mesh_subnet_cb_list[0] = subnet_evt;
 	struct bt_mesh_app_key *app;
 
 	app = app_key_alloc(app_idx);
diff --git a/nimble/host/mesh/src/beacon.c b/nimble/host/mesh/src/beacon.c
index bea1c89..a79e520 100644
--- a/nimble/host/mesh/src/beacon.c
+++ b/nimble/host/mesh/src/beacon.c
@@ -419,14 +419,16 @@
 
 static void subnet_evt(struct bt_mesh_subnet *sub, enum bt_mesh_key_evt evt)
 {
-	if (evt == BT_MESH_KEY_ADDED || evt == BT_MESH_KEY_SWAPPED) {
+	if (evt != BT_MESH_KEY_DELETED) {
 		bt_mesh_beacon_update(sub);
 	}
 }
 
 void bt_mesh_beacon_init(void)
 {
-	bt_mesh_subnet_cb_list[1] = subnet_evt;
+		if (!bt_mesh_subnet_cb_list[1]) {
+		bt_mesh_subnet_cb_list[1] = subnet_evt;
+	}
 
 	k_delayed_work_init(&beacon_timer, beacon_send);
 }
diff --git a/nimble/host/mesh/src/cfg_cli.c b/nimble/host/mesh/src/cfg_cli.c
index b6db5ea..5e8f53c 100644
--- a/nimble/host/mesh/src/cfg_cli.c
+++ b/nimble/host/mesh/src/cfg_cli.c
@@ -1111,7 +1111,7 @@
 
 	err = cli_prepare(&param, OP_NET_KEY_STATUS);
 	if (err) {
-		return err;
+		goto done;
 	}
 
 	bt_mesh_model_msg_init(msg, OP_NET_KEY_DEL);
@@ -1121,16 +1121,18 @@
 	if (err) {
 		BT_ERR("model_send() failed (err %d)", err);
 		cli_reset();
-		return err;
+		goto done;
 	}
 
 	if (!status) {
 		cli_reset();
-		return 0;
+		goto done;
 	}
 
+	err = cli_wait();
+done:
 	os_mbuf_free_chain(msg);
-	return cli_wait();
+	return err;
 }
 
 int bt_mesh_cfg_app_key_add(uint16_t net_idx, uint16_t addr, uint16_t key_net_idx,
@@ -1196,7 +1198,7 @@
 
 	err = cli_prepare(status, OP_NODE_RESET_STATUS);
 	if (err) {
-		return err;
+		goto done;
 	}
 
 	bt_mesh_model_msg_init(msg, OP_NODE_RESET);
@@ -1205,15 +1207,22 @@
 	if (err) {
 		BT_ERR("model_send() failed (err %d)", err);
 		cli_reset();
-		return err;
+		goto done;
 	}
 
 	if (!status) {
 		cli_reset();
-		return 0;
+		goto done;
 	}
 
-	return cli_wait();
+	err = cli_wait();
+done:
+	os_mbuf_free_chain(msg);
+	if (err) {
+		return err;
+	} else {
+		return 0;
+	}
 }
 
 int bt_mesh_cfg_app_key_get(uint16_t net_idx, uint16_t addr, uint16_t key_net_idx,
@@ -1236,6 +1245,7 @@
 
 	err = cli_prepare(&param, OP_APP_KEY_LIST);
 	if (err) {
+		os_mbuf_free_chain(msg);
 		return err;
 	}
 
@@ -1245,6 +1255,7 @@
 	err = bt_mesh_model_send(cli->model, &ctx, msg, NULL, NULL);
 	if (err) {
 		BT_ERR("model_send() failed (err %d)", err);
+		os_mbuf_free_chain(msg);
 		cli_reset();
 		return err;
 	}
@@ -1272,6 +1283,7 @@
 
 	err = cli_prepare(&param, OP_APP_KEY_STATUS);
 	if (err) {
+		os_mbuf_free_chain(msg);
 		return err;
 	}
 
@@ -1281,12 +1293,14 @@
 	err = bt_mesh_model_send(cli->model, &ctx, msg, NULL, NULL);
 	if (err) {
 		BT_ERR("model_send() failed (err %d)", err);
+		os_mbuf_free_chain(msg);
 		cli_reset();
 		return err;
 	}
 
 	if (!status) {
 		cli_reset();
+		os_mbuf_free_chain(msg);
 		return 0;
 	}
 
@@ -1388,7 +1402,7 @@
 
 	err = cli_prepare(&param, OP_MOD_APP_STATUS);
 	if (err) {
-		return err;
+		goto done;
 	}
 
 	bt_mesh_model_msg_init(msg, OP_MOD_APP_UNBIND);
@@ -1405,16 +1419,22 @@
 	if (err) {
 		BT_ERR("model_send() failed (err %d)", err);
 		cli_reset();
-		return err;
+		goto done;
 	}
 
 	if (!status) {
 		cli_reset();
-		return 0;
+		err = 0;
+		goto done;
 	}
 
+done:
 	os_mbuf_free_chain(msg);
-	return cli_wait();
+	if (err) {
+		return err;
+	} else {
+		return cli_wait();
+	}
 }
 
 int bt_mesh_cfg_mod_app_unbind(uint16_t net_idx, uint16_t addr,
@@ -1461,7 +1481,7 @@
 
 	err = cli_prepare(&param, expect_op);
 	if (err) {
-		return err;
+		goto done;
 	}
 
 	BT_DBG("net_idx 0x%04x addr 0x%04x elem_addr 0x%04x",
@@ -1481,11 +1501,13 @@
 	if (err) {
 		BT_ERR("model_send() failed (err %d)", err);
 		cli_reset();
-		return err;
+		goto done;
 	}
 
+	err = cli_wait();
+done:
 	os_mbuf_free_chain(msg);
-	return cli_wait();
+	return err;
 }
 
 int bt_mesh_cfg_mod_app_get(uint16_t net_idx, uint16_t addr, uint16_t elem_addr,
diff --git a/nimble/host/mesh/src/cfg_srv.c b/nimble/host/mesh/src/cfg_srv.c
index 0c2f5d2..f82abd6 100644
--- a/nimble/host/mesh/src/cfg_srv.c
+++ b/nimble/host/mesh/src/cfg_srv.c
@@ -237,7 +237,7 @@
 		period_ms = bt_mesh_model_pub_period_get(model);
 		BT_DBG("period %u ms", (unsigned) period_ms);
 
-		if (period_ms) {
+		if (period_ms > 0) {
 			k_delayed_work_submit(&model->pub->timer, period_ms);
 		} else {
 			k_delayed_work_cancel(&model->pub->timer);
@@ -1731,7 +1731,7 @@
 				uint8_t status,
 				uint16_t net_idx, uint8_t node_id)
 {
-	struct os_mbuf *msg = NET_BUF_SIMPLE(4);
+	struct os_mbuf *msg = BT_MESH_MODEL_BUF(OP_NODE_IDENTITY_STATUS, 4);
 
 	bt_mesh_model_msg_init(msg, OP_NODE_IDENTITY_STATUS);
 	net_buf_simple_add_u8(msg, status);
diff --git a/nimble/host/mesh/src/friend.c b/nimble/host/mesh/src/friend.c
index 4cef2c5..41a1702 100644
--- a/nimble/host/mesh/src/friend.c
+++ b/nimble/host/mesh/src/friend.c
@@ -1267,9 +1267,9 @@
 				BT_ERR("Failed updating friend cred for 0x%04x",
 				       frnd->lpn);
 				friend_clear(frnd);
-				break;
 			}
-
+			break;
+		case BT_MESH_KEY_SWAPPED:
 			enqueue_update(frnd, 0);
 			break;
 		case BT_MESH_KEY_REVOKED:
@@ -1287,7 +1287,9 @@
 
 int bt_mesh_friend_init(void)
 {
-	bt_mesh_subnet_cb_list[3] = subnet_evt;
+	if (!bt_mesh_subnet_cb_list[3]) {
+		bt_mesh_subnet_cb_list[3] = subnet_evt;
+	}
 	int rc;
 	int i;
 
diff --git a/nimble/host/mesh/src/lpn.c b/nimble/host/mesh/src/lpn.c
index 947d20f..7919e95 100644
--- a/nimble/host/mesh/src/lpn.c
+++ b/nimble/host/mesh/src/lpn.c
@@ -1051,7 +1051,9 @@
 {
 	struct bt_mesh_lpn *lpn = &bt_mesh.lpn;
 
-	bt_mesh_subnet_cb_list[2] = subnet_evt;
+	if (!bt_mesh_subnet_cb_list[2]) {
+		bt_mesh_subnet_cb_list[2] = subnet_evt;
+	}
 
 	BT_DBG("");
 
diff --git a/nimble/host/mesh/src/net.c b/nimble/host/mesh/src/net.c
index 5cba092..e802f53 100644
--- a/nimble/host/mesh/src/net.c
+++ b/nimble/host/mesh/src/net.c
@@ -68,12 +68,11 @@
 	.local_queue = STAILQ_HEAD_INITIALIZER(bt_mesh.local_queue),
 };
 
-static struct os_mempool loopback_buf_mempool;
 static struct os_mbuf_pool loopback_os_mbuf_pool;
-
-static os_membuf_t loopback_buf_mem[OS_MEMPOOL_SIZE(
-		MYNEWT_VAL(BLE_MESH_LOOPBACK_BUFS),
-		LOOPBACK_MAX_PDU_LEN + BT_MESH_MBUF_HEADER_SIZE)];
+static struct os_mempool loopback_buf_mempool;
+os_membuf_t loopback_mbuf_membuf[
+		OS_MEMPOOL_SIZE(LOOPBACK_MAX_PDU_LEN + BT_MESH_MBUF_HEADER_SIZE,
+        MYNEWT_VAL(BLE_MESH_LOOPBACK_BUFS))];
 
 static uint32_t dup_cache[MYNEWT_VAL(BLE_MESH_MSG_CACHE_SIZE)];
 static int   dup_cache_next;
@@ -429,7 +428,7 @@
 {
 	struct os_mbuf *buf;
 
-	buf = os_mbuf_get(&loopback_os_mbuf_pool, 0);
+	buf = os_mbuf_get_pkthdr(&loopback_os_mbuf_pool, 0);
 	if (!buf) {
 		BT_WARN("Unable to allocate loopback");
 		return -ENOMEM;
@@ -851,6 +850,11 @@
 
 	rc = os_mempool_init(&loopback_buf_mempool, MYNEWT_VAL(BLE_MESH_LOOPBACK_BUFS),
 			     LOOPBACK_MAX_PDU_LEN + BT_MESH_MBUF_HEADER_SIZE,
-			     loopback_buf_mem, "loopback_buf_pool");
+			     &loopback_mbuf_membuf[0], "loopback_buf_pool");
+	assert(rc == 0);
+
+	rc = os_mbuf_pool_init(&loopback_os_mbuf_pool, &loopback_buf_mempool,
+						   LOOPBACK_MAX_PDU_LEN + BT_MESH_MBUF_HEADER_SIZE,
+						   MYNEWT_VAL(BLE_MESH_LOOPBACK_BUFS));
 	assert(rc == 0);
 }
diff --git a/nimble/host/mesh/src/proxy.c b/nimble/host/mesh/src/proxy.c
index 7110e7b..1a4dda3 100644
--- a/nimble/host/mesh/src/proxy.c
+++ b/nimble/host/mesh/src/proxy.c
@@ -1527,7 +1527,9 @@
 	int i;
 
 #if (MYNEWT_VAL(BLE_MESH_GATT_PROXY))
-	bt_mesh_subnet_cb_list[4] = subnet_evt;
+		if (!bt_mesh_subnet_cb_list[4]) {
+		bt_mesh_subnet_cb_list[4] = subnet_evt;
+	}
 #endif
 
 	for (i = 0; i < MYNEWT_VAL(BLE_MAX_CONNECTIONS); ++i) {