@@ -51,72 +51,6 @@ static void server_cert_cleanup(struct bt_conn *conn)
5151 }
5252}
5353
54- static uint8_t server_cert_read_cb (struct bt_conn * conn ,
55- uint8_t err ,
56- struct bt_gatt_read_params * params ,
57- const void * data ,
58- uint16_t length )
59- {
60- if (err )
61- {
62- LOG_ERR ("Failed to read BLE GATT %s (err %d)" , "server cert" , err );
63- return BT_GATT_ITER_STOP ;
64- }
65-
66- if (length == 0 )
67- {
68- gateway_server_cert_write_start (conn );
69- return BT_GATT_ITER_STOP ;
70- }
71-
72- bool is_first = false;
73- bool is_last = false;
74- const void * payload = NULL ;
75- ssize_t payload_len = pouch_gatt_packetizer_decode (data , length , & payload , & is_first , & is_last );
76- if (payload_len < 0 )
77- {
78- LOG_ERR ("Failed to decode BLE GATT %s (err %d)" , "server cert" , (int ) payload_len );
79- server_cert_cleanup (conn );
80- pouch_gateway_bt_finished (conn );
81- return BT_GATT_ITER_STOP ;
82- }
83-
84- if (data )
85- {
86- LOG_HEXDUMP_DBG (data , length , "[READ] BLE GATT server cert" );
87- }
88-
89- if (is_last )
90- {
91- uint8_t serial [CERT_SERIAL_MAXLEN ];
92- size_t serial_len = sizeof (serial );
93-
94- pouch_gateway_server_cert_get_serial (serial , & serial_len );
95-
96- if (payload_len > 0 && payload_len == serial_len
97- && memcmp (serial , payload , payload_len ) == 0 )
98- {
99- LOG_DBG ("server cert match" );
100- gateway_device_cert_read_start (conn );
101- }
102- else
103- {
104- LOG_DBG ("server cert mismatch" );
105- gateway_server_cert_write_start (conn );
106- }
107-
108- return BT_GATT_ITER_STOP ;
109- }
110-
111- err = bt_gatt_read (conn , params );
112- if (err )
113- {
114- LOG_ERR ("BT (re)read request failed: %d" , err );
115- return BT_GATT_ITER_STOP ;
116- }
117-
118- return BT_GATT_ITER_STOP ;
119- }
12054
12155static void device_cert_cleanup (struct bt_conn * conn )
12256{
@@ -262,6 +196,7 @@ static void write_response_cb(struct bt_conn *conn,
262196 {
263197 // There was certificate update in the meantime, so send it once again.
264198 LOG_INF ("Noticed certificate update, sending once again" );
199+ node -> server_cert_provisioned = false;
265200 gateway_server_cert_write_start (conn );
266201 }
267202 }
@@ -301,6 +236,12 @@ static void gateway_server_cert_write_start(struct bt_conn *conn)
301236{
302237 struct pouch_gateway_node_info * node = pouch_gateway_get_node_info (conn );
303238
239+ if (node -> server_cert_provisioned )
240+ {
241+ gateway_device_cert_read_start (conn );
242+ return ;
243+ }
244+
304245 if (0 == node -> attr_handles [POUCH_GATEWAY_GATT_ATTR_SERVER_CERT ].value )
305246 {
306247 LOG_ERR ("%s characteristic undiscovered" , "server cert" );
@@ -325,28 +266,15 @@ static void gateway_server_cert_write_start(struct bt_conn *conn)
325266 write_server_cert_characteristic (conn );
326267}
327268
328- static void gateway_server_cert_serial_read_start (struct bt_conn * conn )
269+ static void gateway_device_cert_read_start (struct bt_conn * conn )
329270{
330271 struct pouch_gateway_node_info * node = pouch_gateway_get_node_info (conn );
331272
332- struct bt_gatt_read_params * read_params = & node -> read_params ;
333- memset (read_params , 0 , sizeof (* read_params ));
334-
335- read_params -> func = server_cert_read_cb ;
336- read_params -> handle_count = 1 ;
337- read_params -> single .handle = node -> attr_handles [POUCH_GATEWAY_GATT_ATTR_SERVER_CERT ].value ;
338- int err = bt_gatt_read (conn , read_params );
339- if (err )
273+ if (node -> device_cert_provisioned )
340274 {
341- LOG_ERR ("BT read request failed: %d" , err );
342- server_cert_cleanup (conn );
343- pouch_gateway_bt_finished (conn );
275+ pouch_gateway_uplink_start (conn );
276+ return ;
344277 }
345- }
346-
347- static void gateway_device_cert_read_start (struct bt_conn * conn )
348- {
349- struct pouch_gateway_node_info * node = pouch_gateway_get_node_info (conn );
350278
351279 struct bt_gatt_read_params * read_params = & node -> read_params ;
352280 memset (read_params , 0 , sizeof (* read_params ));
@@ -366,5 +294,5 @@ static void gateway_device_cert_read_start(struct bt_conn *conn)
366294
367295void pouch_gateway_cert_exchange_start (struct bt_conn * conn )
368296{
369- gateway_server_cert_serial_read_start (conn );
297+ gateway_server_cert_write_start (conn );
370298}
0 commit comments