1 /*  Bluetooth Mesh */
2 
3 /*
4  * Copyright (c) 2017 Intel Corporation
5  * Additional Copyright (c) 2018 Espressif Systems (Shanghai) PTE LTD
6  *
7  * SPDX-License-Identifier: Apache-2.0
8  */
9 #include <stdint.h>
10 #include <stdbool.h>
11 #include <errno.h>
12 
13 #include "mesh.h"
14 #include "adv.h"
15 #include "transport.h"
16 #include "access.h"
17 #include "foundation.h"
18 #include "mesh_main.h"
19 #include "mesh_common.h"
20 #include "fast_prov.h"
21 #include "provisioner_main.h"
22 
23 #define BLE_MESH_SDU_MAX_LEN    384
24 
25 static const struct bt_mesh_comp *dev_comp;
26 static uint16_t dev_primary_addr;
27 
bt_mesh_model_foreach(void (* func)(struct bt_mesh_model * mod,struct bt_mesh_elem * elem,bool vnd,bool primary,void * user_data),void * user_data)28 void bt_mesh_model_foreach(void (*func)(struct bt_mesh_model *mod,
29                                         struct bt_mesh_elem *elem,
30                                         bool vnd, bool primary,
31                                         void *user_data),
32                            void *user_data)
33 {
34     int i, j;
35 
36     if (dev_comp == NULL) {
37         BT_ERR("Invalid device composition");
38         return;
39     }
40 
41     for (i = 0; i < dev_comp->elem_count; i++) {
42         struct bt_mesh_elem *elem = &dev_comp->elem[i];
43 
44         for (j = 0; j < elem->model_count; j++) {
45             struct bt_mesh_model *model = &elem->models[j];
46 
47             func(model, elem, false, i == 0, user_data);
48         }
49 
50         for (j = 0; j < elem->vnd_model_count; j++) {
51             struct bt_mesh_model *model = &elem->vnd_models[j];
52 
53             func(model, elem, true, i == 0, user_data);
54         }
55     }
56 }
57 
bt_mesh_model_pub_period_get(struct bt_mesh_model * mod)58 int32_t bt_mesh_model_pub_period_get(struct bt_mesh_model *mod)
59 {
60     int period = 0;
61 
62     if (!mod->pub) {
63         BT_ERR("Model has no publication support");
64         return 0;
65     }
66 
67     switch (mod->pub->period >> 6) {
68     case 0x00:
69         /* 1 step is 100 ms */
70         period = K_MSEC((mod->pub->period & BIT_MASK(6)) * 100U);
71         break;
72     case 0x01:
73         /* 1 step is 1 second */
74         period = K_SECONDS(mod->pub->period & BIT_MASK(6));
75         break;
76     case 0x02:
77         /* 1 step is 10 seconds */
78         period = K_SECONDS((mod->pub->period & BIT_MASK(6)) * 10U);
79         break;
80     case 0x03:
81         /* 1 step is 10 minutes */
82         period = K_MINUTES((mod->pub->period & BIT_MASK(6)) * 10U);
83         break;
84     default:
85         BT_ERR("Unknown model publication period");
86         return 0;
87     }
88 
89     if (mod->pub->fast_period) {
90         return period >> mod->pub->period_div;
91     } else {
92         return period;
93     }
94 }
95 
next_period(struct bt_mesh_model * mod)96 static int32_t next_period(struct bt_mesh_model *mod)
97 {
98     struct bt_mesh_model_pub *pub = mod->pub;
99     uint32_t elapsed = 0U, period = 0U;
100 
101     if (!pub) {
102         BT_ERR("Model has no publication support");
103         return -ENOTSUP;
104     }
105 
106     period = bt_mesh_model_pub_period_get(mod);
107     if (!period) {
108         return 0;
109     }
110 
111     elapsed = k_uptime_get_32() - pub->period_start;
112 
113     BT_INFO("Publishing took %ums", elapsed);
114 
115     if (elapsed >= period) {
116         BT_WARN("Publication sending took longer than the period");
117         /* Return smallest positive number since 0 means disabled */
118         return K_MSEC(1);
119     }
120 
121     return period - elapsed;
122 }
123 
publish_sent(int err,void * user_data)124 static void publish_sent(int err, void *user_data)
125 {
126     struct bt_mesh_model *mod = user_data;
127     int32_t delay = 0;
128 
129     BT_DBG("err %d", err);
130 
131     if (!mod->pub) {
132         BT_ERR("Model has no publication support");
133         return;
134     }
135 
136     if (mod->pub->count) {
137         delay = BLE_MESH_PUB_TRANSMIT_INT(mod->pub->retransmit);
138     } else {
139         delay = next_period(mod);
140     }
141 
142     if (delay) {
143         BT_INFO("Publishing next time in %dms", delay);
144         k_delayed_work_submit(&mod->pub->timer, delay);
145     }
146 }
147 
publish_start(uint16_t duration,int err,void * user_data)148 static void publish_start(uint16_t duration, int err, void *user_data)
149 {
150     struct bt_mesh_model *mod = user_data;
151     struct bt_mesh_model_pub *pub = mod->pub;
152 
153     if (err) {
154         BT_ERR("Failed to publish: err %d", err);
155         return;
156     }
157 
158     /* Initialize the timestamp for the beginning of a new period */
159     if (pub->count == BLE_MESH_PUB_TRANSMIT_COUNT(pub->retransmit)) {
160         pub->period_start = k_uptime_get_32();
161     }
162 }
163 
164 static const struct bt_mesh_send_cb pub_sent_cb = {
165     .start = publish_start,
166     .end = publish_sent,
167 };
168 
publish_retransmit(struct bt_mesh_model * mod)169 static int publish_retransmit(struct bt_mesh_model *mod)
170 {
171     struct bt_mesh_model_pub *pub = mod->pub;
172     if (!pub) {
173         BT_ERR("Model has no publication support");
174         return -ENOTSUP;
175     }
176 
177     struct bt_mesh_app_key *key = NULL;
178     struct net_buf_simple *sdu = NULL;
179     struct bt_mesh_msg_ctx ctx = {
180         .addr = pub->addr,
181         .send_ttl = pub->ttl,
182         .model = mod,
183         .srv_send = (pub->dev_role == NODE ? true : false),
184     };
185     struct bt_mesh_net_tx tx = {
186         .ctx = &ctx,
187         .src = bt_mesh_model_elem(mod)->addr,
188         .xmit = bt_mesh_net_transmit_get(),
189         .friend_cred = pub->cred,
190     };
191     int err = 0;
192 
193     key = bt_mesh_tx_appkey_get(pub->dev_role, pub->key);
194     if (!key) {
195         BT_ERR("AppKey 0x%03x not exists", pub->key);
196         return -EADDRNOTAVAIL;
197     }
198 
199     tx.sub = bt_mesh_tx_netkey_get(pub->dev_role, key->net_idx);
200     if (!tx.sub) {
201         BT_ERR("Subnet 0x%04x not exists", key->net_idx);
202         return -EADDRNOTAVAIL;
203     }
204 
205     ctx.net_idx = key->net_idx;
206     ctx.app_idx = key->app_idx;
207 
208     sdu = bt_mesh_alloc_buf(pub->msg->len + BLE_MESH_MIC_SHORT);
209     if (!sdu) {
210         BT_ERR("%s, Out of memory", __func__);
211         return -ENOMEM;
212     }
213 
214     net_buf_simple_add_mem(sdu, pub->msg->data, pub->msg->len);
215 
216     pub->count--;
217 
218     err = bt_mesh_trans_send(&tx, sdu, &pub_sent_cb, mod);
219 
220     bt_mesh_free_buf(sdu);
221     return err;
222 }
223 
publish_retransmit_end(int err,struct bt_mesh_model_pub * pub)224 static void publish_retransmit_end(int err, struct bt_mesh_model_pub *pub)
225 {
226     /* Cancel all retransmits for this publish attempt */
227     pub->count = 0U;
228     /* Make sure the publish timer gets reset */
229     publish_sent(err, pub->mod);
230 }
231 
mod_publish(struct k_work * work)232 static void mod_publish(struct k_work *work)
233 {
234     struct bt_mesh_model_pub *pub = CONTAINER_OF(work,
235                                     struct bt_mesh_model_pub,
236                                     timer.work);
237     int32_t period_ms = 0;
238     int err = 0;
239 
240     BT_DBG("%s", __func__);
241 
242     period_ms = bt_mesh_model_pub_period_get(pub->mod);
243     BT_INFO("Publish period %u ms", period_ms);
244 
245     if (pub->count) {
246         err = publish_retransmit(pub->mod);
247         if (err) {
248             BT_ERR("Failed to retransmit (err %d)", err);
249 
250             pub->count = 0U;
251 
252             /* Continue with normal publication */
253             if (period_ms) {
254                 k_delayed_work_submit(&pub->timer, period_ms);
255             }
256         }
257 
258         return;
259     }
260 
261     if (!period_ms) {
262         return;
263     }
264 
265     /* Callback the model publish update event to the application layer.
266      * In the event, users can update the context of the publish message
267      * which will be published in the next period.
268      */
269     if (pub->update && pub->update(pub->mod)) {
270         /* Cancel this publish attempt. */
271         BT_ERR("Update failed, skipping publish (err %d)", err);
272         pub->period_start = k_uptime_get_32();
273         publish_retransmit_end(err, pub);
274         return;
275     }
276 
277     err = bt_mesh_model_publish(pub->mod);
278     if (err) {
279         BT_ERR("Publishing failed (err %d)", err);
280     }
281 }
282 
bt_mesh_model_elem(struct bt_mesh_model * mod)283 struct bt_mesh_elem *bt_mesh_model_elem(struct bt_mesh_model *mod)
284 {
285     return &dev_comp->elem[mod->elem_idx];
286 }
287 
bt_mesh_model_get(bool vnd,uint8_t elem_idx,uint8_t mod_idx)288 struct bt_mesh_model *bt_mesh_model_get(bool vnd, uint8_t elem_idx, uint8_t mod_idx)
289 {
290     struct bt_mesh_elem *elem = NULL;
291 
292     if (!dev_comp) {
293         BT_ERR("dev_comp not initialized");
294         return NULL;
295     }
296 
297     if (elem_idx >= dev_comp->elem_count) {
298         BT_ERR("Invalid element index %u", elem_idx);
299         return NULL;
300     }
301 
302     elem = &dev_comp->elem[elem_idx];
303 
304     if (vnd) {
305         if (mod_idx >= elem->vnd_model_count) {
306             BT_ERR("Invalid vendor model index %u", mod_idx);
307             return NULL;
308         }
309 
310         return &elem->vnd_models[mod_idx];
311     } else {
312         if (mod_idx >= elem->model_count) {
313             BT_ERR("Invalid SIG model index %u", mod_idx);
314             return NULL;
315         }
316 
317         return &elem->models[mod_idx];
318     }
319 }
320 
mod_init(struct bt_mesh_model * mod,struct bt_mesh_elem * elem,bool vnd,bool primary,void * user_data)321 static void mod_init(struct bt_mesh_model *mod, struct bt_mesh_elem *elem,
322                      bool vnd, bool primary, void *user_data)
323 {
324     int *err = user_data;
325     int i;
326 
327     if (!user_data) {
328         BT_ERR("Invalid model init user data");
329         return;
330     }
331 
332     if (*err) {
333         BT_ERR("Model init failed (err %d)", *err);
334         return;
335     }
336 
337     mod->elem = elem;
338 
339     if (mod->pub) {
340         mod->pub->mod = mod;
341         k_delayed_work_init(&mod->pub->timer, mod_publish);
342     }
343 
344     for (i = 0; i < ARRAY_SIZE(mod->keys); i++) {
345         mod->keys[i] = BLE_MESH_KEY_UNUSED;
346     }
347 
348     mod->flags = 0;
349     mod->elem_idx = elem - dev_comp->elem;
350     if (vnd) {
351         mod->model_idx = mod - elem->vnd_models;
352     } else {
353         mod->model_idx = mod - elem->models;
354     }
355 
356     if (vnd) {
357         return;
358     }
359 
360     if (mod->cb && mod->cb->init) {
361         *err = mod->cb->init(mod);
362     }
363 }
364 
bt_mesh_comp_register(const struct bt_mesh_comp * comp)365 int bt_mesh_comp_register(const struct bt_mesh_comp *comp)
366 {
367     int err = 0;
368 
369     /* There must be at least one element */
370     if (!comp->elem_count) {
371         return -EINVAL;
372     }
373 
374     dev_comp = comp;
375 
376     bt_mesh_model_foreach(mod_init, &err);
377 
378     return err;
379 }
380 
381 #if CONFIG_BLE_MESH_DEINIT
mod_deinit(struct bt_mesh_model * mod,struct bt_mesh_elem * elem,bool vnd,bool primary,void * user_data)382 static void mod_deinit(struct bt_mesh_model *mod, struct bt_mesh_elem *elem,
383                        bool vnd, bool primary, void *user_data)
384 {
385     int *err = user_data;
386     int i;
387 
388     if (!user_data) {
389         BT_ERR("Invalid model deinit user data");
390         return;
391     }
392 
393     if (*err) {
394         BT_ERR("Model deinit failed (err %d)", *err);
395         return;
396     }
397 
398     mod->elem = NULL;
399 
400     if (mod->pub) {
401         mod->pub->mod = NULL;
402         k_delayed_work_free(&mod->pub->timer);
403     }
404 
405     for (i = 0; i < ARRAY_SIZE(mod->keys); i++) {
406         mod->keys[i] = BLE_MESH_KEY_UNUSED;
407     }
408 
409     mod->flags = 0U;
410     mod->elem_idx = 0U;
411     mod->model_idx = 0U;
412 
413     if (vnd) {
414         return;
415     }
416 
417     if (mod->cb && mod->cb->deinit) {
418         *err = mod->cb->deinit(mod);
419     }
420 }
421 
bt_mesh_comp_deregister(void)422 int bt_mesh_comp_deregister(void)
423 {
424     int err = 0;
425 
426     if (dev_comp == NULL) {
427         return -EINVAL;
428     }
429 
430     bt_mesh_model_foreach(mod_deinit, &err);
431 
432     dev_comp = NULL;
433 
434     return err;
435 }
436 #endif /* CONFIG_BLE_MESH_DEINIT */
437 
bt_mesh_comp_provision(uint16_t addr)438 void bt_mesh_comp_provision(uint16_t addr)
439 {
440     int i;
441 
442     dev_primary_addr = addr;
443 
444     BT_INFO("Primary address 0x%04x, element count %u", addr, dev_comp->elem_count);
445 
446     for (i = 0; i < dev_comp->elem_count; i++) {
447         struct bt_mesh_elem *elem = &dev_comp->elem[i];
448 
449         elem->addr = addr++;
450 
451         BT_DBG("addr 0x%04x mod_count %u vnd_mod_count %u",
452                elem->addr, elem->model_count, elem->vnd_model_count);
453     }
454 }
455 
bt_mesh_comp_unprovision(void)456 void bt_mesh_comp_unprovision(void)
457 {
458     BT_DBG("%s", __func__);
459 
460     dev_primary_addr = BLE_MESH_ADDR_UNASSIGNED;
461 }
462 
bt_mesh_primary_addr(void)463 uint16_t bt_mesh_primary_addr(void)
464 {
465     return dev_primary_addr;
466 }
467 
bt_mesh_model_find_group(struct bt_mesh_model * mod,uint16_t addr)468 uint16_t *bt_mesh_model_find_group(struct bt_mesh_model *mod, uint16_t addr)
469 {
470     int i;
471 
472     for (i = 0; i < ARRAY_SIZE(mod->groups); i++) {
473         if (mod->groups[i] == addr) {
474             return &mod->groups[i];
475         }
476     }
477 
478     return NULL;
479 }
480 
bt_mesh_elem_find_group(struct bt_mesh_elem * elem,uint16_t group_addr)481 static struct bt_mesh_model *bt_mesh_elem_find_group(struct bt_mesh_elem *elem,
482                                                      uint16_t group_addr)
483 {
484     struct bt_mesh_model *model = NULL;
485     uint16_t *match = NULL;
486     int i;
487 
488     for (i = 0; i < elem->model_count; i++) {
489         model = &elem->models[i];
490 
491         match = bt_mesh_model_find_group(model, group_addr);
492         if (match) {
493             return model;
494         }
495     }
496 
497     for (i = 0; i < elem->vnd_model_count; i++) {
498         model = &elem->vnd_models[i];
499 
500         match = bt_mesh_model_find_group(model, group_addr);
501         if (match) {
502             return model;
503         }
504     }
505 
506     return NULL;
507 }
508 
bt_mesh_elem_find(uint16_t addr)509 struct bt_mesh_elem *bt_mesh_elem_find(uint16_t addr)
510 {
511     uint16_t index = 0U;
512 
513     if (BLE_MESH_ADDR_IS_UNICAST(addr)) {
514         index = (addr - dev_comp->elem[0].addr);
515         if (index < dev_comp->elem_count) {
516             return &dev_comp->elem[index];
517         } else {
518             return NULL;
519         }
520     }
521 
522     for (index = 0; index < dev_comp->elem_count; index++) {
523         struct bt_mesh_elem *elem = &dev_comp->elem[index];
524 
525         if (bt_mesh_elem_find_group(elem, addr)) {
526             return elem;
527         }
528     }
529 
530     return NULL;
531 }
532 
bt_mesh_elem_count(void)533 uint8_t bt_mesh_elem_count(void)
534 {
535     return dev_comp->elem_count;
536 }
537 
model_has_key(struct bt_mesh_model * mod,uint16_t key)538 static bool model_has_key(struct bt_mesh_model *mod, uint16_t key)
539 {
540     int i;
541 
542     for (i = 0; i < ARRAY_SIZE(mod->keys); i++) {
543         if (mod->keys[i] == key) {
544             return true;
545         }
546     }
547 
548     return false;
549 }
550 
model_has_dst(struct bt_mesh_model * model,uint16_t dst)551 static bool model_has_dst(struct bt_mesh_model *model, uint16_t dst)
552 {
553     if (BLE_MESH_ADDR_IS_UNICAST(dst)) {
554         return (dev_comp->elem[model->elem_idx].addr == dst);
555     } else if (BLE_MESH_ADDR_IS_GROUP(dst) || BLE_MESH_ADDR_IS_VIRTUAL(dst)) {
556         return !!bt_mesh_model_find_group(model, dst);
557     }
558 
559     return (model->elem_idx == 0 && bt_mesh_fixed_group_match(dst));
560 }
561 
find_op(struct bt_mesh_model * models,uint8_t model_count,uint32_t opcode,struct bt_mesh_model ** model)562 static const struct bt_mesh_model_op *find_op(struct bt_mesh_model *models,
563                                               uint8_t model_count, uint32_t opcode,
564                                               struct bt_mesh_model **model)
565 {
566     int i;
567 
568     for (i = 0; i < model_count; i++) {
569         const struct bt_mesh_model_op *op;
570 
571         *model = &models[i];
572 
573         for (op = (*model)->op; op->func; op++) {
574             if (op->opcode == opcode) {
575                 return op;
576             }
577         }
578     }
579 
580     *model = NULL;
581     return NULL;
582 }
583 
get_opcode(struct net_buf_simple * buf,uint32_t * opcode)584 static int get_opcode(struct net_buf_simple *buf, uint32_t *opcode)
585 {
586     switch (buf->data[0] >> 6) {
587     case 0x00:
588     case 0x01:
589         if (buf->data[0] == 0x7f) {
590             BT_ERR("Ignoring RFU OpCode");
591             return -EINVAL;
592         }
593 
594         *opcode = net_buf_simple_pull_u8(buf);
595         return 0;
596     case 0x02:
597         if (buf->len < 2) {
598             BT_ERR("Too short payload for 2-octet OpCode");
599             return -EINVAL;
600         }
601 
602         *opcode = net_buf_simple_pull_be16(buf);
603         return 0;
604     case 0x03:
605         if (buf->len < 3) {
606             BT_ERR("Too short payload for 3-octet OpCode");
607             return -EINVAL;
608         }
609 
610         *opcode = net_buf_simple_pull_u8(buf) << 16;
611         /* Using LE for the CID since the model layer is defined as
612          * little-endian in the mesh spec and using BT_MESH_MODEL_OP_3
613          * will declare the opcode in this way.
614          */
615         *opcode |= net_buf_simple_pull_le16(buf);
616         return 0;
617     }
618 
619     return -EINVAL;
620 }
621 
bt_mesh_fixed_group_match(uint16_t addr)622 bool bt_mesh_fixed_group_match(uint16_t addr)
623 {
624     /* Check for fixed group addresses */
625     switch (addr) {
626     case BLE_MESH_ADDR_ALL_NODES:
627         return true;
628     case BLE_MESH_ADDR_PROXIES:
629         return (bt_mesh_gatt_proxy_get() == BLE_MESH_GATT_PROXY_ENABLED);
630     case BLE_MESH_ADDR_FRIENDS:
631         return (bt_mesh_friend_get() == BLE_MESH_FRIEND_ENABLED);
632     case BLE_MESH_ADDR_RELAYS:
633         return (bt_mesh_relay_get() == BLE_MESH_RELAY_ENABLED);
634     default:
635         return false;
636     }
637 }
638 
bt_mesh_model_recv(struct bt_mesh_net_rx * rx,struct net_buf_simple * buf)639 void bt_mesh_model_recv(struct bt_mesh_net_rx *rx, struct net_buf_simple *buf)
640 {
641     struct bt_mesh_model *models = NULL, *model = NULL;
642     const struct bt_mesh_model_op *op = NULL;
643     uint32_t opcode = 0U;
644     uint8_t count = 0U;
645     int i;
646 
647     BT_INFO("recv, app_idx 0x%04x src 0x%04x dst 0x%04x", rx->ctx.app_idx,
648            rx->ctx.addr, rx->ctx.recv_dst);
649     BT_INFO("recv, len %u: %s", buf->len, bt_hex(buf->data, buf->len));
650 
651     if (get_opcode(buf, &opcode) < 0) {
652         BT_WARN("Unable to decode OpCode");
653         return;
654     }
655 
656     BT_DBG("OpCode 0x%08x", opcode);
657 
658     for (i = 0; i < dev_comp->elem_count; i++) {
659         struct bt_mesh_elem *elem = &dev_comp->elem[i];
660         struct net_buf_simple_state state = {0};
661 
662         /* SIG models cannot contain 3-byte (vendor) OpCodes, and
663          * vendor models cannot contain SIG (1- or 2-byte) OpCodes, so
664          * we only need to do the lookup in one of the model lists.
665          */
666         if (BLE_MESH_MODEL_OP_LEN(opcode) < 3) {
667             models = elem->models;
668             count = elem->model_count;
669         } else {
670             models = elem->vnd_models;
671             count = elem->vnd_model_count;
672         }
673 
674         op = find_op(models, count, opcode, &model);
675         if (!op) {
676             BT_DBG("No OpCode 0x%08x for elem %d", opcode, i);
677             continue;
678         }
679 
680         if (!model_has_key(model, rx->ctx.app_idx)) {
681             continue;
682         }
683 
684         if (!model_has_dst(model, rx->ctx.recv_dst)) {
685             continue;
686         }
687 
688         if (buf->len < op->min_len) {
689             BT_ERR("Too short message for OpCode 0x%08x", opcode);
690             continue;
691         }
692 
693         /* The following three operations are added by Espressif.
694          * 1. Update the "recv_op" with the opcode got from the buf;
695          * 2. Update the model pointer with the found model;
696          * 3. Update the "srv_send" to be true when received a message.
697          *    This flag will be used when a server model sends a status
698          *    message, and has no impact on the client messages.
699          * Most of these info will be used by the application layer.
700          */
701         rx->ctx.recv_op = opcode;
702         rx->ctx.model = model;
703         rx->ctx.srv_send = true;
704 
705         /* The callback will likely parse the buffer, so store
706          * the parsing state in case multiple models receive
707          * the message.
708          */
709         net_buf_simple_save(buf, &state);
710         op->func(model, &rx->ctx, buf);
711         net_buf_simple_restore(buf, &state);
712     }
713 }
714 
bt_mesh_model_msg_init(struct net_buf_simple * msg,uint32_t opcode)715 void bt_mesh_model_msg_init(struct net_buf_simple *msg, uint32_t opcode)
716 {
717     net_buf_simple_init(msg, 0);
718 
719     switch (BLE_MESH_MODEL_OP_LEN(opcode)) {
720     case 1:
721         net_buf_simple_add_u8(msg, opcode);
722         break;
723     case 2:
724         net_buf_simple_add_be16(msg, opcode);
725         break;
726     case 3:
727         net_buf_simple_add_u8(msg, ((opcode >> 16) & 0xff));
728         /* Using LE for the CID since the model layer is defined as
729          * little-endian in the mesh spec and using BT_MESH_MODEL_OP_3
730          * will declare the opcode in this way.
731          */
732         net_buf_simple_add_le16(msg, opcode & 0xffff);
733         break;
734     default:
735         BT_WARN("Unknown opcode format");
736         break;
737     }
738 }
739 
ready_to_send(uint8_t role,uint16_t dst)740 static bool ready_to_send(uint8_t role, uint16_t dst)
741 {
742     if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_provisioned() && role == NODE) {
743         return true;
744     } else if (IS_ENABLED(CONFIG_BLE_MESH_PROVISIONER) && bt_mesh_is_provisioner_en() && role == PROVISIONER) {
745         if (!bt_mesh_provisioner_check_msg_dst(dst)) {
746             BT_ERR("Failed to find DST 0x%04x", dst);
747             return false;
748         }
749         return true;
750     } else if (IS_ENABLED(CONFIG_BLE_MESH_FAST_PROV) && bt_mesh_is_provisioned() && role == FAST_PROV) {
751         return true;
752     }
753 
754     return false;
755 }
756 
model_send(struct bt_mesh_model * model,struct bt_mesh_net_tx * tx,bool implicit_bind,struct net_buf_simple * msg,const struct bt_mesh_send_cb * cb,void * cb_data)757 static int model_send(struct bt_mesh_model *model,
758                       struct bt_mesh_net_tx *tx, bool implicit_bind,
759                       struct net_buf_simple *msg,
760                       const struct bt_mesh_send_cb *cb, void *cb_data)
761 {
762     uint8_t role = 0U;
763 
764     role = bt_mesh_get_device_role(model, tx->ctx->srv_send);
765     if (role == ROLE_NVAL) {
766         BT_ERR("Failed to get model role");
767         return -EINVAL;
768     }
769 
770     BT_INFO("send, app_idx 0x%04x src 0x%04x dst 0x%04x",
771         tx->ctx->app_idx, tx->src, tx->ctx->addr);
772     BT_INFO("send, len %u: %s", msg->len, bt_hex(msg->data, msg->len));
773 
774     if (!ready_to_send(role, tx->ctx->addr)) {
775         BT_ERR("Not ready to send");
776         return -EINVAL;
777     }
778 
779     if (net_buf_simple_tailroom(msg) < BLE_MESH_MIC_SHORT) {
780         BT_ERR("Not enough tailroom for TransMIC");
781         return -EINVAL;
782     }
783 
784     if (msg->len > MIN(BLE_MESH_TX_SDU_MAX, BLE_MESH_SDU_MAX_LEN) - BLE_MESH_MIC_SHORT) {
785         BT_ERR("Too big message (len %d)", msg->len);
786         return -EMSGSIZE;
787     }
788 
789     if (!implicit_bind && !model_has_key(model, tx->ctx->app_idx)) {
790         BT_ERR("Model not bound to AppKey 0x%04x", tx->ctx->app_idx);
791         return -EINVAL;
792     }
793 
794     return bt_mesh_trans_send(tx, msg, cb, cb_data);
795 }
796 
bt_mesh_model_send(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx,struct net_buf_simple * msg,const struct bt_mesh_send_cb * cb,void * cb_data)797 int bt_mesh_model_send(struct bt_mesh_model *model,
798                        struct bt_mesh_msg_ctx *ctx,
799                        struct net_buf_simple *msg,
800                        const struct bt_mesh_send_cb *cb, void *cb_data)
801 {
802     struct bt_mesh_subnet *sub = NULL;
803     uint8_t role = 0U;
804 
805     role = bt_mesh_get_device_role(model, ctx->srv_send);
806     if (role == ROLE_NVAL) {
807         BT_ERR("Failed to get model role");
808         return -EINVAL;
809     }
810 
811     sub = bt_mesh_tx_netkey_get(role, ctx->net_idx);
812     if (!sub) {
813         BT_ERR("Invalid NetKeyIndex 0x%04x", ctx->net_idx);
814         return -EINVAL;
815     }
816 
817     ctx->model = model;
818 
819     struct bt_mesh_net_tx tx = {
820         .sub = sub,
821         .ctx = ctx,
822         .src = bt_mesh_model_elem(model)->addr,
823         .xmit = bt_mesh_net_transmit_get(),
824         .friend_cred = 0,
825     };
826 
827     return model_send(model, &tx, false, msg, cb, cb_data);
828 }
829 
bt_mesh_model_publish(struct bt_mesh_model * model)830 int bt_mesh_model_publish(struct bt_mesh_model *model)
831 {
832     struct bt_mesh_model_pub *pub = model->pub;
833     struct bt_mesh_app_key *key = NULL;
834     struct net_buf_simple *sdu = NULL;
835     struct bt_mesh_msg_ctx ctx = {
836         .model = model,
837     };
838     struct bt_mesh_net_tx tx = {
839         .sub = NULL,
840         .ctx = &ctx,
841         .src = bt_mesh_model_elem(model)->addr,
842         .xmit = bt_mesh_net_transmit_get(),
843     };
844     int err = 0;
845 
846     BT_DBG("%s", __func__);
847 
848     if (!pub || !pub->msg) {
849         BT_ERR("Model has no publication support");
850         return -ENOTSUP;
851     }
852 
853     if (pub->addr == BLE_MESH_ADDR_UNASSIGNED) {
854         BT_WARN("Unassigned publish address");
855         return -EADDRNOTAVAIL;
856     }
857 
858     key = bt_mesh_tx_appkey_get(pub->dev_role, pub->key);
859     if (!key) {
860         BT_ERR("Invalid AppKeyIndex 0x%03x", pub->key);
861         return -EADDRNOTAVAIL;
862     }
863 
864     if (pub->msg->len + BLE_MESH_MIC_SHORT > MIN(BLE_MESH_TX_SDU_MAX, BLE_MESH_SDU_MAX_LEN)) {
865         BT_ERR("Message does not fit maximum SDU size");
866         return -EMSGSIZE;
867     }
868 
869     if (pub->count) {
870         BT_WARN("Clearing publish retransmit timer");
871         k_delayed_work_cancel(&pub->timer);
872     }
873 
874     ctx.addr = pub->addr;
875     ctx.send_rel = pub->send_rel;
876     ctx.send_ttl = pub->ttl;
877     ctx.net_idx = key->net_idx;
878     ctx.app_idx = key->app_idx;
879     ctx.srv_send = pub->dev_role == NODE ? true : false;
880 
881     tx.friend_cred = pub->cred;
882 
883     tx.sub = bt_mesh_tx_netkey_get(pub->dev_role, ctx.net_idx);
884     if (!tx.sub) {
885         BT_ERR("Invalid NetKeyIndex 0x%04x", ctx.net_idx);
886         return -EADDRNOTAVAIL;
887     }
888 
889     pub->count = BLE_MESH_PUB_TRANSMIT_COUNT(pub->retransmit);
890 
891     BT_INFO("Publish Retransmit Count %u Interval %ums", pub->count,
892            BLE_MESH_PUB_TRANSMIT_INT(pub->retransmit));
893 
894     sdu = bt_mesh_alloc_buf(pub->msg->len + BLE_MESH_MIC_SHORT);
895     if (!sdu) {
896         BT_ERR("%s, Out of memory", __func__);
897         return -ENOMEM;
898     }
899 
900     net_buf_simple_add_mem(sdu, pub->msg->data, pub->msg->len);
901 
902     err = model_send(model, &tx, true, sdu, &pub_sent_cb, model);
903     if (err) {
904         publish_retransmit_end(err, pub);
905     }
906 
907     bt_mesh_free_buf(sdu);
908     return err;
909 }
910 
bt_mesh_model_find_vnd(struct bt_mesh_elem * elem,uint16_t company,uint16_t id)911 struct bt_mesh_model *bt_mesh_model_find_vnd(struct bt_mesh_elem *elem,
912                                              uint16_t company, uint16_t id)
913 {
914     int i;
915 
916     for (i = 0; i < elem->vnd_model_count; i++) {
917         if (elem->vnd_models[i].vnd.company == company &&
918                 elem->vnd_models[i].vnd.id == id) {
919             return &elem->vnd_models[i];
920         }
921     }
922 
923     return NULL;
924 }
925 
bt_mesh_model_find(struct bt_mesh_elem * elem,uint16_t id)926 struct bt_mesh_model *bt_mesh_model_find(struct bt_mesh_elem *elem, uint16_t id)
927 {
928     int i;
929 
930     for (i = 0; i < elem->model_count; i++) {
931         if (elem->models[i].id == id) {
932             return &elem->models[i];
933         }
934     }
935 
936     return NULL;
937 }
938 
bt_mesh_comp_get(void)939 const struct bt_mesh_comp *bt_mesh_comp_get(void)
940 {
941     return dev_comp;
942 }
943 
944 /* APIs used by messages encryption in upper transport layer & network layer */
bt_mesh_tx_netkey_get(uint8_t role,uint16_t net_idx)945 struct bt_mesh_subnet *bt_mesh_tx_netkey_get(uint8_t role, uint16_t net_idx)
946 {
947     struct bt_mesh_subnet *sub = NULL;
948 
949     if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_provisioned() && role == NODE) {
950         sub = bt_mesh_subnet_get(net_idx);
951     } else if (IS_ENABLED(CONFIG_BLE_MESH_PROVISIONER) && bt_mesh_is_provisioner_en() && role == PROVISIONER) {
952         sub = bt_mesh_provisioner_subnet_get(net_idx);
953     } else if (IS_ENABLED(CONFIG_BLE_MESH_FAST_PROV) && bt_mesh_is_provisioned() && role == FAST_PROV) {
954         sub = bt_mesh_fast_prov_subnet_get(net_idx);
955     }
956 
957     return sub;
958 }
959 
bt_mesh_tx_devkey_get(uint8_t role,uint16_t dst)960 const uint8_t *bt_mesh_tx_devkey_get(uint8_t role, uint16_t dst)
961 {
962     const uint8_t *key = NULL;
963 
964     if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_provisioned() && role == NODE) {
965         key = bt_mesh.dev_key;
966     } else if (IS_ENABLED(CONFIG_BLE_MESH_PROVISIONER) && bt_mesh_is_provisioner_en() && role == PROVISIONER) {
967         key = bt_mesh_provisioner_dev_key_get(dst);
968     } else if (IS_ENABLED(CONFIG_BLE_MESH_FAST_PROV) && bt_mesh_is_provisioned() && role == FAST_PROV) {
969         key = bt_mesh_fast_prov_dev_key_get(dst);
970     }
971 
972     return key;
973 }
974 
bt_mesh_tx_appkey_get(uint8_t role,uint16_t app_idx)975 struct bt_mesh_app_key *bt_mesh_tx_appkey_get(uint8_t role, uint16_t app_idx)
976 {
977     struct bt_mesh_app_key *key = NULL;
978 
979     if (IS_ENABLED(CONFIG_BLE_MESH_NODE) && bt_mesh_is_provisioned() && role == NODE) {
980         key = bt_mesh_app_key_find(app_idx);
981     } else if (IS_ENABLED(CONFIG_BLE_MESH_PROVISIONER) && bt_mesh_is_provisioner_en() && role == PROVISIONER) {
982         key = bt_mesh_provisioner_app_key_find(app_idx);
983     } else if (IS_ENABLED(CONFIG_BLE_MESH_FAST_PROV) && bt_mesh_is_provisioned() && role == FAST_PROV) {
984         key = bt_mesh_fast_prov_app_key_find(app_idx);
985     }
986 
987     return key;
988 }
989 
990 /* APIs used by messages decryption in network layer & upper transport layer */
bt_mesh_rx_netkey_size(void)991 size_t bt_mesh_rx_netkey_size(void)
992 {
993     size_t size = 0U;
994 
995 #if CONFIG_BLE_MESH_NODE && !CONFIG_BLE_MESH_PROVISIONER
996     if (bt_mesh_is_provisioned()) {
997         size = ARRAY_SIZE(bt_mesh.sub);
998     }
999 #endif
1000 
1001 #if !CONFIG_BLE_MESH_NODE && CONFIG_BLE_MESH_PROVISIONER
1002     if (bt_mesh_is_provisioner_en()) {
1003         size = ARRAY_SIZE(bt_mesh.p_sub);
1004     }
1005 #endif
1006 
1007 #if CONFIG_BLE_MESH_NODE && CONFIG_BLE_MESH_PROVISIONER
1008     size = ARRAY_SIZE(bt_mesh.sub);
1009     if (bt_mesh_is_provisioner_en()) {
1010         size += ARRAY_SIZE(bt_mesh.p_sub);
1011     }
1012 #endif
1013 
1014     return size;
1015 }
1016 
bt_mesh_rx_netkey_get(size_t index)1017 struct bt_mesh_subnet *bt_mesh_rx_netkey_get(size_t index)
1018 {
1019     struct bt_mesh_subnet *sub = NULL;
1020 
1021 #if CONFIG_BLE_MESH_NODE && !CONFIG_BLE_MESH_PROVISIONER
1022     if (bt_mesh_is_provisioned()) {
1023         sub = &bt_mesh.sub[index];
1024     }
1025 #endif
1026 
1027 #if !CONFIG_BLE_MESH_NODE && CONFIG_BLE_MESH_PROVISIONER
1028     if (bt_mesh_is_provisioner_en()) {
1029         sub = bt_mesh.p_sub[index];
1030     }
1031 #endif
1032 
1033 #if CONFIG_BLE_MESH_NODE && CONFIG_BLE_MESH_PROVISIONER
1034     if (index < ARRAY_SIZE(bt_mesh.sub)) {
1035         sub = &bt_mesh.sub[index];
1036     } else {
1037         sub = bt_mesh.p_sub[index - ARRAY_SIZE(bt_mesh.sub)];
1038     }
1039 #endif
1040 
1041     return sub;
1042 }
1043 
bt_mesh_rx_devkey_size(void)1044 size_t bt_mesh_rx_devkey_size(void)
1045 {
1046     size_t size = 0U;
1047 
1048 #if CONFIG_BLE_MESH_NODE && !CONFIG_BLE_MESH_PROVISIONER
1049     if (bt_mesh_is_provisioned()) {
1050         size = 1;
1051     }
1052 #endif
1053 
1054 #if !CONFIG_BLE_MESH_NODE && CONFIG_BLE_MESH_PROVISIONER
1055     if (bt_mesh_is_provisioner_en()) {
1056         size = 1;
1057     }
1058 #endif
1059 
1060 #if CONFIG_BLE_MESH_NODE && CONFIG_BLE_MESH_PROVISIONER
1061     size = 1;
1062     if (bt_mesh_is_provisioner_en()) {
1063         size += 1;
1064     }
1065 #endif
1066 
1067     return size;
1068 }
1069 
bt_mesh_rx_devkey_get(size_t index,uint16_t src)1070 const uint8_t *bt_mesh_rx_devkey_get(size_t index, uint16_t src)
1071 {
1072     const uint8_t *key = NULL;
1073 
1074 #if CONFIG_BLE_MESH_NODE && !CONFIG_BLE_MESH_PROVISIONER
1075     if (bt_mesh_is_provisioned()) {
1076         key = bt_mesh.dev_key;
1077     }
1078 #endif
1079 
1080 #if !CONFIG_BLE_MESH_NODE && CONFIG_BLE_MESH_PROVISIONER
1081     if (bt_mesh_is_provisioner_en()) {
1082         key = bt_mesh_provisioner_dev_key_get(src);
1083     }
1084 #endif
1085 
1086 #if CONFIG_BLE_MESH_NODE && CONFIG_BLE_MESH_PROVISIONER
1087     if (index < 1) {
1088         key = bt_mesh.dev_key;
1089     } else {
1090         key = bt_mesh_provisioner_dev_key_get(src);
1091     }
1092 #endif
1093 
1094     return key;
1095 }
1096 
bt_mesh_rx_appkey_size(void)1097 size_t bt_mesh_rx_appkey_size(void)
1098 {
1099     size_t size = 0U;
1100 
1101 #if CONFIG_BLE_MESH_NODE && !CONFIG_BLE_MESH_PROVISIONER
1102     if (bt_mesh_is_provisioned()) {
1103         size = ARRAY_SIZE(bt_mesh.app_keys);
1104     }
1105 #endif
1106 
1107 #if !CONFIG_BLE_MESH_NODE && CONFIG_BLE_MESH_PROVISIONER
1108     if (bt_mesh_is_provisioner_en()) {
1109         size = ARRAY_SIZE(bt_mesh.p_app_keys);
1110     }
1111 #endif
1112 
1113 #if CONFIG_BLE_MESH_NODE && CONFIG_BLE_MESH_PROVISIONER
1114     size = ARRAY_SIZE(bt_mesh.app_keys);
1115     if (bt_mesh_is_provisioner_en()) {
1116         size += ARRAY_SIZE(bt_mesh.p_app_keys);
1117     }
1118 #endif
1119 
1120     return size;
1121 }
1122 
bt_mesh_rx_appkey_get(size_t index)1123 struct bt_mesh_app_key *bt_mesh_rx_appkey_get(size_t index)
1124 {
1125     struct bt_mesh_app_key *key = NULL;
1126 
1127 #if CONFIG_BLE_MESH_NODE && !CONFIG_BLE_MESH_PROVISIONER
1128     if (bt_mesh_is_provisioned()) {
1129         key = &bt_mesh.app_keys[index];
1130     }
1131 #endif
1132 
1133 #if !CONFIG_BLE_MESH_NODE && CONFIG_BLE_MESH_PROVISIONER
1134     if (bt_mesh_is_provisioner_en()) {
1135         key = bt_mesh.p_app_keys[index];
1136     }
1137 #endif
1138 
1139 #if CONFIG_BLE_MESH_NODE && CONFIG_BLE_MESH_PROVISIONER
1140     if (index < ARRAY_SIZE(bt_mesh.app_keys)) {
1141         key = &bt_mesh.app_keys[index];
1142     } else {
1143         key = bt_mesh.p_app_keys[index - ARRAY_SIZE(bt_mesh.app_keys)];
1144     }
1145 #endif
1146 
1147     return key;
1148 }
1149