xref: /nrf52832-nimble/packages/NimBLE-latest/nimble/host/src/ble_hs_misc.c (revision 042d53a763ad75cb1465103098bb88c245d95138)
1*042d53a7SEvalZero /*
2*042d53a7SEvalZero  * Licensed to the Apache Software Foundation (ASF) under one
3*042d53a7SEvalZero  * or more contributor license agreements.  See the NOTICE file
4*042d53a7SEvalZero  * distributed with this work for additional information
5*042d53a7SEvalZero  * regarding copyright ownership.  The ASF licenses this file
6*042d53a7SEvalZero  * to you under the Apache License, Version 2.0 (the
7*042d53a7SEvalZero  * "License"); you may not use this file except in compliance
8*042d53a7SEvalZero  * with the License.  You may obtain a copy of the License at
9*042d53a7SEvalZero  *
10*042d53a7SEvalZero  *  http://www.apache.org/licenses/LICENSE-2.0
11*042d53a7SEvalZero  *
12*042d53a7SEvalZero  * Unless required by applicable law or agreed to in writing,
13*042d53a7SEvalZero  * software distributed under the License is distributed on an
14*042d53a7SEvalZero  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15*042d53a7SEvalZero  * KIND, either express or implied.  See the License for the
16*042d53a7SEvalZero  * specific language governing permissions and limitations
17*042d53a7SEvalZero  * under the License.
18*042d53a7SEvalZero  */
19*042d53a7SEvalZero 
20*042d53a7SEvalZero #include <assert.h>
21*042d53a7SEvalZero #include <stdlib.h>
22*042d53a7SEvalZero #include "os/os.h"
23*042d53a7SEvalZero #include "ble_hs_priv.h"
24*042d53a7SEvalZero 
25*042d53a7SEvalZero const uint8_t ble_hs_misc_null_addr[6];
26*042d53a7SEvalZero 
27*042d53a7SEvalZero int
ble_hs_misc_conn_chan_find(uint16_t conn_handle,uint16_t cid,struct ble_hs_conn ** out_conn,struct ble_l2cap_chan ** out_chan)28*042d53a7SEvalZero ble_hs_misc_conn_chan_find(uint16_t conn_handle, uint16_t cid,
29*042d53a7SEvalZero                            struct ble_hs_conn **out_conn,
30*042d53a7SEvalZero                            struct ble_l2cap_chan **out_chan)
31*042d53a7SEvalZero {
32*042d53a7SEvalZero     struct ble_l2cap_chan *chan;
33*042d53a7SEvalZero     struct ble_hs_conn *conn;
34*042d53a7SEvalZero     int rc;
35*042d53a7SEvalZero 
36*042d53a7SEvalZero     conn = ble_hs_conn_find(conn_handle);
37*042d53a7SEvalZero     if (conn == NULL) {
38*042d53a7SEvalZero         chan = NULL;
39*042d53a7SEvalZero         rc = BLE_HS_ENOTCONN;
40*042d53a7SEvalZero     } else {
41*042d53a7SEvalZero         chan = ble_hs_conn_chan_find_by_scid(conn, cid);
42*042d53a7SEvalZero         if (chan == NULL) {
43*042d53a7SEvalZero             rc = BLE_HS_ENOTCONN;
44*042d53a7SEvalZero         } else {
45*042d53a7SEvalZero             rc = 0;
46*042d53a7SEvalZero         }
47*042d53a7SEvalZero     }
48*042d53a7SEvalZero 
49*042d53a7SEvalZero     if (out_conn != NULL) {
50*042d53a7SEvalZero         *out_conn = conn;
51*042d53a7SEvalZero     }
52*042d53a7SEvalZero     if (out_chan != NULL) {
53*042d53a7SEvalZero         *out_chan = chan;
54*042d53a7SEvalZero     }
55*042d53a7SEvalZero 
56*042d53a7SEvalZero     return rc;
57*042d53a7SEvalZero }
58*042d53a7SEvalZero 
59*042d53a7SEvalZero void
ble_hs_misc_conn_chan_find_reqd(uint16_t conn_handle,uint16_t cid,struct ble_hs_conn ** out_conn,struct ble_l2cap_chan ** out_chan)60*042d53a7SEvalZero ble_hs_misc_conn_chan_find_reqd(uint16_t conn_handle, uint16_t cid,
61*042d53a7SEvalZero                                 struct ble_hs_conn **out_conn,
62*042d53a7SEvalZero                                 struct ble_l2cap_chan **out_chan)
63*042d53a7SEvalZero {
64*042d53a7SEvalZero     struct ble_l2cap_chan *chan;
65*042d53a7SEvalZero     struct ble_hs_conn *conn;
66*042d53a7SEvalZero     int rc;
67*042d53a7SEvalZero 
68*042d53a7SEvalZero     rc = ble_hs_misc_conn_chan_find(conn_handle, cid, &conn, &chan);
69*042d53a7SEvalZero     BLE_HS_DBG_ASSERT_EVAL(rc == 0);
70*042d53a7SEvalZero 
71*042d53a7SEvalZero     if (out_conn != NULL) {
72*042d53a7SEvalZero         *out_conn = conn;
73*042d53a7SEvalZero     }
74*042d53a7SEvalZero     if (out_chan != NULL) {
75*042d53a7SEvalZero         *out_chan = chan;
76*042d53a7SEvalZero     }
77*042d53a7SEvalZero }
78*042d53a7SEvalZero 
79*042d53a7SEvalZero uint8_t
ble_hs_misc_addr_type_to_id(uint8_t own_addr_type)80*042d53a7SEvalZero ble_hs_misc_addr_type_to_id(uint8_t own_addr_type)
81*042d53a7SEvalZero {
82*042d53a7SEvalZero     switch (own_addr_type) {
83*042d53a7SEvalZero     case BLE_OWN_ADDR_PUBLIC:
84*042d53a7SEvalZero     case BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT:
85*042d53a7SEvalZero          return BLE_ADDR_PUBLIC;
86*042d53a7SEvalZero 
87*042d53a7SEvalZero     case BLE_OWN_ADDR_RANDOM:
88*042d53a7SEvalZero     case BLE_OWN_ADDR_RPA_RANDOM_DEFAULT:
89*042d53a7SEvalZero          return BLE_ADDR_RANDOM;
90*042d53a7SEvalZero 
91*042d53a7SEvalZero     default:
92*042d53a7SEvalZero         BLE_HS_DBG_ASSERT(0);
93*042d53a7SEvalZero         return BLE_ADDR_PUBLIC;
94*042d53a7SEvalZero     }
95*042d53a7SEvalZero }
96*042d53a7SEvalZero 
97*042d53a7SEvalZero static int
ble_hs_misc_restore_one_irk(int obj_type,union ble_store_value * val,void * cookie)98*042d53a7SEvalZero ble_hs_misc_restore_one_irk(int obj_type, union ble_store_value *val,
99*042d53a7SEvalZero                             void *cookie)
100*042d53a7SEvalZero {
101*042d53a7SEvalZero     const struct ble_store_value_sec *sec;
102*042d53a7SEvalZero     int rc;
103*042d53a7SEvalZero 
104*042d53a7SEvalZero     BLE_HS_DBG_ASSERT(obj_type == BLE_STORE_OBJ_TYPE_PEER_SEC);
105*042d53a7SEvalZero 
106*042d53a7SEvalZero     sec = &val->sec;
107*042d53a7SEvalZero     if (sec->irk_present) {
108*042d53a7SEvalZero         rc = ble_hs_pvcy_add_entry(sec->peer_addr.val, sec->peer_addr.type,
109*042d53a7SEvalZero                                    sec->irk);
110*042d53a7SEvalZero         if (rc != 0) {
111*042d53a7SEvalZero             BLE_HS_LOG(ERROR, "failed to configure restored IRK\n");
112*042d53a7SEvalZero         }
113*042d53a7SEvalZero     }
114*042d53a7SEvalZero 
115*042d53a7SEvalZero     return 0;
116*042d53a7SEvalZero }
117*042d53a7SEvalZero 
118*042d53a7SEvalZero int
ble_hs_misc_restore_irks(void)119*042d53a7SEvalZero ble_hs_misc_restore_irks(void)
120*042d53a7SEvalZero {
121*042d53a7SEvalZero     int rc;
122*042d53a7SEvalZero 
123*042d53a7SEvalZero     rc = ble_store_iterate(BLE_STORE_OBJ_TYPE_PEER_SEC,
124*042d53a7SEvalZero                            ble_hs_misc_restore_one_irk,
125*042d53a7SEvalZero                            NULL);
126*042d53a7SEvalZero     return rc;
127*042d53a7SEvalZero }
128