1 /*
2  * Copyright (c) 2020 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_BLUETOOTH_MESH_PRIV_BEACON_CLI_H__
8 #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_PRIV_BEACON_CLI_H__
9 
10 #include <zephyr/bluetooth/mesh.h>
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 /**
17  * @defgroup bt_mesh_priv_beacon_cli Bluetooth Mesh Private Beacon Client
18  * @ingroup bt_mesh
19  * @{
20  */
21 
22 /**
23  *
24  *  @brief Private Beacon Client model composition data entry.
25  *
26  *  @param cli_data Pointer to a @ref bt_mesh_priv_beacon_cli instance.
27  */
28 #define BT_MESH_MODEL_PRIV_BEACON_CLI(cli_data)                                \
29 	BT_MESH_MODEL_CB(BT_MESH_MODEL_ID_PRIV_BEACON_CLI,                     \
30 			 bt_mesh_priv_beacon_cli_op, NULL, cli_data,           \
31 			 &bt_mesh_priv_beacon_cli_cb)
32 
33 struct bt_mesh_priv_beacon_cli;
34 
35 /** Private Beacon */
36 struct bt_mesh_priv_beacon {
37 	/** Private beacon is enabled */
38 	uint8_t enabled;
39 	/** Random refresh interval (in 10 second steps), or 0 to keep current
40 	 *  value.
41 	 */
42 	uint8_t rand_interval;
43 };
44 
45 /** Private Node Identity */
46 struct bt_mesh_priv_node_id {
47 	/** Index of the NetKey. */
48 	uint16_t net_idx;
49 	/** Private Node Identity state */
50 	uint8_t state;
51 	/** Response status code. */
52 	uint8_t status;
53 };
54 
55 /** Private Beacon Client Status messages callbacks */
56 struct bt_mesh_priv_beacon_cli_cb {
57 	/** @brief Optional callback for Private Beacon Status message.
58 	 *
59 	 *  Handles received Private Beacon Status messages from a Private Beacon server.
60 	 *
61 	 *  @param cli         Private Beacon client context.
62 	 *  @param addr        Address of the sender.
63 	 *  @param priv_beacon Mesh Private Beacon state received from the server.
64 	 */
65 	void (*priv_beacon_status)(struct bt_mesh_priv_beacon_cli *cli, uint16_t addr,
66 				   struct bt_mesh_priv_beacon *priv_beacon);
67 
68 	/** @brief Optional callback for Private GATT Proxy Status message.
69 	 *
70 	 *  Handles received Private GATT Proxy Status messages from a Private Beacon server.
71 	 *
72 	 *  @param cli         Private Beacon client context.
73 	 *  @param addr        Address of the sender.
74 	 *  @param gatt_proxy  Private GATT Proxy state received from the server.
75 	 */
76 	void (*priv_gatt_proxy_status)(struct bt_mesh_priv_beacon_cli *cli, uint16_t addr,
77 				       uint8_t gatt_proxy);
78 
79 	/** @brief Optional callback for Private Node Identity Status message.
80 	 *
81 	 *  Handles received Private Node Identity Status messages from a Private Beacon server.
82 	 *
83 	 *  @param cli           Private Beacon client context.
84 	 *  @param addr          Address of the sender.
85 	 *  @param priv_node_id  Private Node Identity state received from the server.
86 	 */
87 	void (*priv_node_id_status)(struct bt_mesh_priv_beacon_cli *cli, uint16_t addr,
88 				    struct bt_mesh_priv_node_id *priv_node_id);
89 };
90 
91 /** Mesh Private Beacon Client model */
92 struct bt_mesh_priv_beacon_cli {
93 	const struct bt_mesh_model *model;
94 
95 	/* Internal parameters for tracking message responses. */
96 	struct bt_mesh_msg_ack_ctx ack_ctx;
97 
98 	/** Optional callback for Private Beacon Client Status messages. */
99 	const struct bt_mesh_priv_beacon_cli_cb *cb;
100 };
101 
102 /** @brief Set the target's Private Beacon state.
103  *
104  *  This method can be used asynchronously by setting @p rsp as NULL.
105  *  This way the method will not wait for response and will return
106  *  immediately after sending the command.
107 
108  *  @param net_idx Network index to encrypt with.
109  *  @param addr    Target node address.
110  *  @param val     New Private Beacon value.
111  *  @param rsp     If set, returns response status on success.
112  *
113  *  @return 0 on success, or (negative) error code otherwise.
114  */
115 int bt_mesh_priv_beacon_cli_set(uint16_t net_idx, uint16_t addr,
116 				struct bt_mesh_priv_beacon *val,
117 				struct bt_mesh_priv_beacon *rsp);
118 
119 /** @brief Get the target's Private Beacon state.
120  *
121  *  @param net_idx Network index to encrypt with.
122  *  @param addr    Target node address.
123  *  @param val     Response buffer for Private Beacon value.
124  *
125  *  @return 0 on success, or (negative) error code otherwise.
126  */
127 int bt_mesh_priv_beacon_cli_get(uint16_t net_idx, uint16_t addr,
128 				struct bt_mesh_priv_beacon *val);
129 
130 /** @brief Set the target's Private GATT Proxy state.
131  *
132  *  This method can be used asynchronously by setting @p rsp as NULL.
133  *  This way the method will not wait for response and will return
134  *  immediately after sending the command.
135  *
136  *  @param net_idx Network index to encrypt with.
137  *  @param addr    Target node address.
138  *  @param val     New Private GATT Proxy value.
139  *  @param rsp     If set, returns response status on success.
140  *
141  *  @return 0 on success, or (negative) error code otherwise.
142  */
143 int bt_mesh_priv_beacon_cli_gatt_proxy_set(uint16_t net_idx, uint16_t addr,
144 					   uint8_t val, uint8_t *rsp);
145 
146 /** @brief Get the target's Private GATT Proxy state.
147  *
148  *  @param net_idx Network index to encrypt with.
149  *  @param addr    Target node address.
150  *  @param val     Response buffer for Private GATT Proxy value.
151  *
152  *  @return 0 on success, or (negative) error code otherwise.
153  */
154 int bt_mesh_priv_beacon_cli_gatt_proxy_get(uint16_t net_idx, uint16_t addr,
155 					   uint8_t *val);
156 
157 /** @brief Set the target's Private Node Identity state.
158  *
159  *  This method can be used asynchronously by setting @p rsp as NULL.
160  *  This way the method will not wait for response and will return
161  *  immediately after sending the command.
162  *
163  *  @param net_idx Network index to encrypt with.
164  *  @param addr    Target node address.
165  *  @param val     New Private Node Identity value.
166  *  @param rsp     If set, returns response status on success.
167  *
168  *  @return 0 on success, or (negative) error code otherwise.
169  */
170 int bt_mesh_priv_beacon_cli_node_id_set(uint16_t net_idx, uint16_t addr,
171 					struct bt_mesh_priv_node_id *val,
172 					struct bt_mesh_priv_node_id *rsp);
173 
174 /** @brief Get the target's Private Node Identity state.
175  *
176  *  @param net_idx     Network index to encrypt with.
177  *  @param addr        Target node address.
178  *  @param key_net_idx Network index to get the Private Node Identity state of.
179  *  @param val         Response buffer for Private Node Identity value.
180  *
181  *  @return 0 on success, or (negative) error code otherwise.
182  */
183 int bt_mesh_priv_beacon_cli_node_id_get(uint16_t net_idx, uint16_t addr,
184 					uint16_t key_net_idx,
185 					struct bt_mesh_priv_node_id *val);
186 
187 /** @cond INTERNAL_HIDDEN */
188 extern const struct bt_mesh_model_op bt_mesh_priv_beacon_cli_op[];
189 extern const struct bt_mesh_model_cb bt_mesh_priv_beacon_cli_cb;
190 /** @endcond */
191 
192 /** @} */
193 
194 #ifdef __cplusplus
195 }
196 #endif
197 
198 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_PRIV_BEACON_CLI_H__ */
199