* [BlueZ PATCH v5 1/4] doc: Add errors.txt to describe errors of D-Bus method returns
2021-08-06 23:47 [BlueZ PATCH v5 0/4] Detailed error string Miao-chen Chou
@ 2021-08-06 23:47 ` Miao-chen Chou
2021-08-07 1:17 ` Detailed error string bluez.test.bot
2021-08-06 23:47 ` [BlueZ PATCH v5 2/4] error: BR/EDR and LE connection failure reasons Miao-chen Chou
` (2 subsequent siblings)
3 siblings, 1 reply; 7+ messages in thread
From: Miao-chen Chou @ 2021-08-06 23:47 UTC (permalink / raw)
To: Bluetooth Kernel Mailing List
Cc: Marcel Holtmann, Howard Chung, Luiz Augusto von Dentz,
Alain Michaud, Miao-chen Chou
Changes in v5:
- Remove the use of error codes.
doc/errors.txt | 233 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 233 insertions(+)
create mode 100644 doc/errors.txt
diff --git a/doc/errors.txt b/doc/errors.txt
new file mode 100644
index 000000000..047610c74
--- /dev/null
+++ b/doc/errors.txt
@@ -0,0 +1,233 @@
+D-Bus Method Return Error Codes
+===============================
+
+The motivation of having detailed error is to provide context-based failure
+reasons along with D-Bus method return so that D-Bus clients can build metrics
+and optimize their application based on these failure reasons. For instance, a
+client can build retry mechanism for a connection failure or improve the
+bottleneck of use scenario based on actionable metrics.
+
+These error codes are context-based but not necessarily tied to interface or
+method calls. For instance, if a pairing request failed due to connection
+failure, connection error would be attached to the method return of Pair().
+
+BR/EDR connection already connected
+===================================
+ errno: EALREADY, EISCONN
+
+ Either the profile is already connected or ACL connection is in place.
+
+BR/EDR connection page timeout
+==============================
+ errno: EHOSTDOWN
+
+ Failed due to page timeout.
+
+BR/EDR connection profile unavailable
+=====================================
+ errno: ENOPROTOOPT
+
+ Failed to find connectable services or the target service.
+
+BR/EDR connection SDP search
+============================
+ errno: none
+
+ Failed to complete the SDP search.
+
+BR/EDR connection create socket
+===============================
+ errno: EIO
+
+ Failed to create or connect to BT IO socket. This can also indicate
+ hardware failure in the controller.
+
+BR/EDR connection invalid arguments
+===================================
+ errno: EHOSTUNREACH
+
+ Failed due to invalid arguments.
+
+BR/EDR connection not powered
+=============================
+ errno: EHOSTUNREACH
+
+ Failed due to adapter not powered.
+
+BR/EDR connection not supported
+===============================
+ errno: EOPNOTSUPP, EPROTONOSUPPORT
+
+ Failed due to unsupported state transition of L2CAP channel or other
+ features either by the local host or the remote.
+
+BR/EDR connection bad socket
+============================
+ errno: EBADFD
+
+ Failed due to the socket is in bad state.
+
+BR/EDR connection memory allocation
+===================================
+ errno: ENOMEM
+
+ Failed to allocate memory in either host stack or controller.
+
+BR/EDR connection busy
+======================
+ errno: EBUSY
+
+ Failed due to other ongoing operations, such as pairing, busy L2CAP
+ channel or the operation disallowed by the controller.
+
+BR/EDR connection concurrent connection limit
+=============================================
+ errno: EMLINK
+
+ Failed due to reaching the concurrent connection limit to a device.
+
+BR/EDR connection timeout
+=========================
+ errno: ETIMEDOUT
+
+ Failed due to connection timeout
+
+BR/EDR connection refused
+=========================
+ errno: ECONNREFUSED
+
+ Refused by the remote device due to limited resource, security reason
+ or unacceptable address type.
+
+BR/EDR connection aborted by remote
+===================================
+ errno: ECONNRESET
+
+ Terminated by the remote device due to limited resource or power off.
+
+BR/EDR connection aborted by local
+==================================
+ errno: ECONNABORTED
+
+ Aborted by the local host.
+
+BR/EDR connection LMP protocol error
+====================================
+ errno: EPROTO
+
+ Failed due to LMP protocol error.
+
+BR/EDR connection canceled
+==========================
+ errno: none
+
+ Failed due to cancellation caused by adapter drop, unexpected device
+ drop, orincoming disconnection request before connection request is
+ completed.
+
+BR/EDR connection unknown error
+===============================
+ errno: ENOSYS
+
+ Failed due to unknown reason.
+
+LE connection invalid arguments
+===============================
+ errno: EINVAL
+
+ Failed due to invalid arguments.
+
+LE connection not powered
+=========================
+ errno: EHOSTUNREACH
+
+ Failed due to adapter not powered.
+
+LE connection not supported
+===========================
+ errno: EOPNOTSUPP, EPROTONOSUPPORT
+
+ Failed due to unsupported state transition of L2CAP channel or other
+ features (e.g. LE features) either by the local host or the remote.
+
+LE connection already connected
+===============================
+ errno: EALREADY, EISCONN
+
+ Either the BT IO is already connected or LE link connection in place.
+
+LE connection bad socket
+========================
+ errno: EBADFD
+
+ Failed due to the socket is in bad state.
+
+LE connection memory allocation
+===============================
+ errno: ENOMEM
+
+ Failed to allocate memory in either host stack or controller.
+
+LE connection busy
+==================
+ errno: EBUSY
+
+ Failed due to other ongoing operations, such as pairing, connecting,
+ busy L2CAP channel or the operation disallowed by the controller.
+
+LE connection refused
+=====================
+ errno: ECONNREFUSED
+
+ Failed due to that LE is not enabled or the attempt is refused by the
+ remote device due to limited resource, security reason or unacceptable
+ address type.
+
+LE connection create socket
+===========================
+ errno: EIO
+
+ Failed to create or connect to BT IO socket. This can also indicate
+ hardware failure in the controller.
+
+LE connection timeout
+=====================
+ errno: ETIMEDOUT
+
+ Failed due to connection timeout
+
+LE connection concurrent connection limit
+=========================================
+ errno: EMLINK
+
+ Failed due to reaching the synchronous connection limit to a device.
+
+LE connection abort by remote
+=============================
+ errno: ECONNRESET
+
+ Aborted by the remote device due to limited resource or power off.
+
+LE connection abort by local
+============================
+ errno: ECONNABORTED
+
+ Aborted by the local host.
+
+LE connection link layer protocol error
+=======================================
+ errno: EPROTO
+
+ Failed due to link layer protocol error.
+
+LE connection GATT browsing
+===========================
+ errno: none
+
+ Failed to complete the GATT browsing.
+
+LE connection unknown error
+===========================
+ errno: ENOSYS
+
+ Failed due to unknown reason.
--
2.32.0.605.g8dce9f2422-goog
^ permalink raw reply related [flat|nested] 7+ messages in thread
* RE: Detailed error string
2021-08-06 23:47 ` [BlueZ PATCH v5 1/4] doc: Add errors.txt to describe errors of D-Bus method returns Miao-chen Chou
@ 2021-08-07 1:17 ` bluez.test.bot
0 siblings, 0 replies; 7+ messages in thread
From: bluez.test.bot @ 2021-08-07 1:17 UTC (permalink / raw)
To: linux-bluetooth, mcchou
[-- Attachment #1: Type: text/plain, Size: 22831 bytes --]
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=527809
---Test result---
Test Summary:
CheckPatch FAIL 1.26 seconds
GitLint PASS 0.53 seconds
Prep - Setup ELL PASS 47.63 seconds
Build - Prep PASS 0.14 seconds
Build - Configure PASS 8.37 seconds
Build - Make FAIL 178.99 seconds
Make Check FAIL 0.60 seconds
Make Distcheck FAIL 165.43 seconds
Build w/ext ELL - Configure PASS 8.42 seconds
Build w/ext ELL - Make FAIL 166.09 seconds
Details
##############################
Test: CheckPatch - FAIL
Desc: Run checkpatch.pl script with rule in .checkpatch.conf
Output:
error: BR/EDR and LE connection failure reasons
ERROR:POINTER_LOCATION: "foo* bar" should be "foo *bar"
#70: FILE: src/error.c:137:
+const char* btd_error_bredr_conn_from_errno(int errno_code)
ERROR:POINTER_LOCATION: "foo* bar" should be "foo *bar"
#112: FILE: src/error.c:179:
+const char* btd_error_le_conn_from_errno(int errno_code)
ERROR:POINTER_LOCATION: "foo* bar" should be "foo *bar"
#232: FILE: src/error.h:90:
+const char* btd_error_bredr_conn_from_errno(int errno_code);
ERROR:POINTER_LOCATION: "foo* bar" should be "foo *bar"
#233: FILE: src/error.h:91:
+const char* btd_error_le_conn_from_errno(int errno_code);
- total: 4 errors, 0 warnings, 205 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
"[PATCH] error: BR/EDR and LE connection failure reasons" has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
##############################
Test: GitLint - PASS
Desc: Run gitlint with rule in .gitlint
##############################
Test: Prep - Setup ELL - PASS
Desc: Clone, build, and install ELL
##############################
Test: Build - Prep - PASS
Desc: Prepare environment for build
##############################
Test: Build - Configure - PASS
Desc: Configure the BlueZ source tree
##############################
Test: Build - Make - FAIL
Desc: Build the BlueZ source tree
Output:
src/error.c: In function ‘btd_error_bredr_conn_from_errno’:
src/error.c:140:7: error: ‘EALREADY’ undeclared (first use in this function)
140 | case EALREADY:
| ^~~~~~~~
src/error.c:140:7: note: each undeclared identifier is reported only once for each function it appears in
src/error.c:141:7: error: ‘EISCONN’ undeclared (first use in this function)
141 | case EISCONN:
| ^~~~~~~
src/error.c:143:7: error: ‘EHOSTDOWN’ undeclared (first use in this function)
143 | case EHOSTDOWN:
| ^~~~~~~~~
src/error.c:145:7: error: ‘ENOPROTOOPT’ undeclared (first use in this function)
145 | case ENOPROTOOPT:
| ^~~~~~~~~~~
src/error.c:147:7: error: ‘EIO’ undeclared (first use in this function)
147 | case EIO:
| ^~~
src/error.c:149:7: error: ‘EINVAL’ undeclared (first use in this function)
149 | case EINVAL:
| ^~~~~~
src/error.c:151:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
151 | case EHOSTUNREACH:
| ^~~~~~~~~~~~
src/error.c:153:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
153 | case EOPNOTSUPP:
| ^~~~~~~~~~
src/error.c:154:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
154 | case EPROTONOSUPPORT:
| ^~~~~~~~~~~~~~~
src/error.c:156:7: error: ‘EBADFD’ undeclared (first use in this function)
156 | case EBADFD:
| ^~~~~~
src/error.c:158:7: error: ‘ENOMEM’ undeclared (first use in this function)
158 | case ENOMEM:
| ^~~~~~
src/error.c:160:7: error: ‘EBUSY’ undeclared (first use in this function)
160 | case EBUSY:
| ^~~~~
src/error.c:162:7: error: ‘EMLINK’ undeclared (first use in this function)
162 | case EMLINK:
| ^~~~~~
src/error.c:164:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
164 | case ETIMEDOUT:
| ^~~~~~~~~
src/error.c:166:7: error: ‘ECONNREFUSED’ undeclared (first use in this function); did you mean ‘ERR_LE_CONN_REFUSED’?
166 | case ECONNREFUSED:
| ^~~~~~~~~~~~
| ERR_LE_CONN_REFUSED
src/error.c:168:7: error: ‘ECONNRESET’ undeclared (first use in this function)
168 | case ECONNRESET:
| ^~~~~~~~~~
src/error.c:170:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
170 | case ECONNABORTED:
| ^~~~~~~~~~~~
src/error.c:172:7: error: ‘EPROTO’ undeclared (first use in this function)
172 | case EPROTO:
| ^~~~~~
src/error.c: In function ‘btd_error_le_conn_from_errno’:
src/error.c:182:7: error: ‘EINVAL’ undeclared (first use in this function)
182 | case EINVAL:
| ^~~~~~
src/error.c:184:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
184 | case EHOSTUNREACH:
| ^~~~~~~~~~~~
src/error.c:186:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
186 | case EOPNOTSUPP:
| ^~~~~~~~~~
src/error.c:187:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
187 | case EPROTONOSUPPORT:
| ^~~~~~~~~~~~~~~
src/error.c:189:7: error: ‘EALREADY’ undeclared (first use in this function)
189 | case EALREADY:
| ^~~~~~~~
src/error.c:190:7: error: ‘EISCONN’ undeclared (first use in this function)
190 | case EISCONN:
| ^~~~~~~
src/error.c:192:7: error: ‘EBADFD’ undeclared (first use in this function)
192 | case EBADFD:
| ^~~~~~
src/error.c:194:7: error: ‘ENOMEM’ undeclared (first use in this function)
194 | case ENOMEM:
| ^~~~~~
src/error.c:196:7: error: ‘EBUSY’ undeclared (first use in this function)
196 | case EBUSY:
| ^~~~~
src/error.c:198:7: error: ‘ECONNREFUSED’ undeclared (first use in this function); did you mean ‘ERR_LE_CONN_REFUSED’?
198 | case ECONNREFUSED:
| ^~~~~~~~~~~~
| ERR_LE_CONN_REFUSED
src/error.c:200:7: error: ‘EIO’ undeclared (first use in this function)
200 | case EIO:
| ^~~
src/error.c:202:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
202 | case ETIMEDOUT:
| ^~~~~~~~~
src/error.c:204:7: error: ‘EMLINK’ undeclared (first use in this function)
204 | case EMLINK:
| ^~~~~~
src/error.c:206:7: error: ‘ECONNRESET’ undeclared (first use in this function)
206 | case ECONNRESET:
| ^~~~~~~~~~
src/error.c:208:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
208 | case ECONNABORTED:
| ^~~~~~~~~~~~
src/error.c:210:7: error: ‘EPROTO’ undeclared (first use in this function)
210 | case EPROTO:
| ^~~~~~
make[1]: *** [Makefile:9331: src/bluetoothd-error.o] Error 1
make: *** [Makefile:4147: all] Error 2
##############################
Test: Make Check - FAIL
Desc: Run 'make check'
Output:
src/error.c: In function ‘btd_error_bredr_conn_from_errno’:
src/error.c:140:7: error: ‘EALREADY’ undeclared (first use in this function)
140 | case EALREADY:
| ^~~~~~~~
src/error.c:140:7: note: each undeclared identifier is reported only once for each function it appears in
src/error.c:141:7: error: ‘EISCONN’ undeclared (first use in this function)
141 | case EISCONN:
| ^~~~~~~
src/error.c:143:7: error: ‘EHOSTDOWN’ undeclared (first use in this function)
143 | case EHOSTDOWN:
| ^~~~~~~~~
src/error.c:145:7: error: ‘ENOPROTOOPT’ undeclared (first use in this function)
145 | case ENOPROTOOPT:
| ^~~~~~~~~~~
src/error.c:147:7: error: ‘EIO’ undeclared (first use in this function)
147 | case EIO:
| ^~~
src/error.c:149:7: error: ‘EINVAL’ undeclared (first use in this function)
149 | case EINVAL:
| ^~~~~~
src/error.c:151:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
151 | case EHOSTUNREACH:
| ^~~~~~~~~~~~
src/error.c:153:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
153 | case EOPNOTSUPP:
| ^~~~~~~~~~
src/error.c:154:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
154 | case EPROTONOSUPPORT:
| ^~~~~~~~~~~~~~~
src/error.c:156:7: error: ‘EBADFD’ undeclared (first use in this function)
156 | case EBADFD:
| ^~~~~~
src/error.c:158:7: error: ‘ENOMEM’ undeclared (first use in this function)
158 | case ENOMEM:
| ^~~~~~
src/error.c:160:7: error: ‘EBUSY’ undeclared (first use in this function)
160 | case EBUSY:
| ^~~~~
src/error.c:162:7: error: ‘EMLINK’ undeclared (first use in this function)
162 | case EMLINK:
| ^~~~~~
src/error.c:164:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
164 | case ETIMEDOUT:
| ^~~~~~~~~
src/error.c:166:7: error: ‘ECONNREFUSED’ undeclared (first use in this function); did you mean ‘ERR_LE_CONN_REFUSED’?
166 | case ECONNREFUSED:
| ^~~~~~~~~~~~
| ERR_LE_CONN_REFUSED
src/error.c:168:7: error: ‘ECONNRESET’ undeclared (first use in this function)
168 | case ECONNRESET:
| ^~~~~~~~~~
src/error.c:170:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
170 | case ECONNABORTED:
| ^~~~~~~~~~~~
src/error.c:172:7: error: ‘EPROTO’ undeclared (first use in this function)
172 | case EPROTO:
| ^~~~~~
src/error.c: In function ‘btd_error_le_conn_from_errno’:
src/error.c:182:7: error: ‘EINVAL’ undeclared (first use in this function)
182 | case EINVAL:
| ^~~~~~
src/error.c:184:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
184 | case EHOSTUNREACH:
| ^~~~~~~~~~~~
src/error.c:186:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
186 | case EOPNOTSUPP:
| ^~~~~~~~~~
src/error.c:187:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
187 | case EPROTONOSUPPORT:
| ^~~~~~~~~~~~~~~
src/error.c:189:7: error: ‘EALREADY’ undeclared (first use in this function)
189 | case EALREADY:
| ^~~~~~~~
src/error.c:190:7: error: ‘EISCONN’ undeclared (first use in this function)
190 | case EISCONN:
| ^~~~~~~
src/error.c:192:7: error: ‘EBADFD’ undeclared (first use in this function)
192 | case EBADFD:
| ^~~~~~
src/error.c:194:7: error: ‘ENOMEM’ undeclared (first use in this function)
194 | case ENOMEM:
| ^~~~~~
src/error.c:196:7: error: ‘EBUSY’ undeclared (first use in this function)
196 | case EBUSY:
| ^~~~~
src/error.c:198:7: error: ‘ECONNREFUSED’ undeclared (first use in this function); did you mean ‘ERR_LE_CONN_REFUSED’?
198 | case ECONNREFUSED:
| ^~~~~~~~~~~~
| ERR_LE_CONN_REFUSED
src/error.c:200:7: error: ‘EIO’ undeclared (first use in this function)
200 | case EIO:
| ^~~
src/error.c:202:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
202 | case ETIMEDOUT:
| ^~~~~~~~~
src/error.c:204:7: error: ‘EMLINK’ undeclared (first use in this function)
204 | case EMLINK:
| ^~~~~~
src/error.c:206:7: error: ‘ECONNRESET’ undeclared (first use in this function)
206 | case ECONNRESET:
| ^~~~~~~~~~
src/error.c:208:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
208 | case ECONNABORTED:
| ^~~~~~~~~~~~
src/error.c:210:7: error: ‘EPROTO’ undeclared (first use in this function)
210 | case EPROTO:
| ^~~~~~
make[1]: *** [Makefile:9331: src/bluetoothd-error.o] Error 1
make: *** [Makefile:10436: check] Error 2
##############################
Test: Make Distcheck - FAIL
Desc: Run distcheck to check the distribution
Output:
../../src/error.c: In function ‘btd_error_bredr_conn_from_errno’:
../../src/error.c:140:7: error: ‘EALREADY’ undeclared (first use in this function)
140 | case EALREADY:
| ^~~~~~~~
../../src/error.c:140:7: note: each undeclared identifier is reported only once for each function it appears in
../../src/error.c:141:7: error: ‘EISCONN’ undeclared (first use in this function)
141 | case EISCONN:
| ^~~~~~~
../../src/error.c:143:7: error: ‘EHOSTDOWN’ undeclared (first use in this function)
143 | case EHOSTDOWN:
| ^~~~~~~~~
../../src/error.c:145:7: error: ‘ENOPROTOOPT’ undeclared (first use in this function)
145 | case ENOPROTOOPT:
| ^~~~~~~~~~~
../../src/error.c:147:7: error: ‘EIO’ undeclared (first use in this function)
147 | case EIO:
| ^~~
../../src/error.c:149:7: error: ‘EINVAL’ undeclared (first use in this function)
149 | case EINVAL:
| ^~~~~~
../../src/error.c:151:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
151 | case EHOSTUNREACH:
| ^~~~~~~~~~~~
../../src/error.c:153:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
153 | case EOPNOTSUPP:
| ^~~~~~~~~~
../../src/error.c:154:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
154 | case EPROTONOSUPPORT:
| ^~~~~~~~~~~~~~~
../../src/error.c:156:7: error: ‘EBADFD’ undeclared (first use in this function)
156 | case EBADFD:
| ^~~~~~
../../src/error.c:158:7: error: ‘ENOMEM’ undeclared (first use in this function)
158 | case ENOMEM:
| ^~~~~~
../../src/error.c:160:7: error: ‘EBUSY’ undeclared (first use in this function)
160 | case EBUSY:
| ^~~~~
../../src/error.c:162:7: error: ‘EMLINK’ undeclared (first use in this function)
162 | case EMLINK:
| ^~~~~~
../../src/error.c:164:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
164 | case ETIMEDOUT:
| ^~~~~~~~~
../../src/error.c:166:7: error: ‘ECONNREFUSED’ undeclared (first use in this function)
166 | case ECONNREFUSED:
| ^~~~~~~~~~~~
../../src/error.c:168:7: error: ‘ECONNRESET’ undeclared (first use in this function)
168 | case ECONNRESET:
| ^~~~~~~~~~
../../src/error.c:170:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
170 | case ECONNABORTED:
| ^~~~~~~~~~~~
../../src/error.c:172:7: error: ‘EPROTO’ undeclared (first use in this function)
172 | case EPROTO:
| ^~~~~~
../../src/error.c: In function ‘btd_error_le_conn_from_errno’:
../../src/error.c:182:7: error: ‘EINVAL’ undeclared (first use in this function)
182 | case EINVAL:
| ^~~~~~
../../src/error.c:184:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
184 | case EHOSTUNREACH:
| ^~~~~~~~~~~~
../../src/error.c:186:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
186 | case EOPNOTSUPP:
| ^~~~~~~~~~
../../src/error.c:187:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
187 | case EPROTONOSUPPORT:
| ^~~~~~~~~~~~~~~
../../src/error.c:189:7: error: ‘EALREADY’ undeclared (first use in this function)
189 | case EALREADY:
| ^~~~~~~~
../../src/error.c:190:7: error: ‘EISCONN’ undeclared (first use in this function)
190 | case EISCONN:
| ^~~~~~~
../../src/error.c:192:7: error: ‘EBADFD’ undeclared (first use in this function)
192 | case EBADFD:
| ^~~~~~
../../src/error.c:194:7: error: ‘ENOMEM’ undeclared (first use in this function)
194 | case ENOMEM:
| ^~~~~~
../../src/error.c:196:7: error: ‘EBUSY’ undeclared (first use in this function)
196 | case EBUSY:
| ^~~~~
../../src/error.c:198:7: error: ‘ECONNREFUSED’ undeclared (first use in this function)
198 | case ECONNREFUSED:
| ^~~~~~~~~~~~
../../src/error.c:200:7: error: ‘EIO’ undeclared (first use in this function)
200 | case EIO:
| ^~~
../../src/error.c:202:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
202 | case ETIMEDOUT:
| ^~~~~~~~~
../../src/error.c:204:7: error: ‘EMLINK’ undeclared (first use in this function)
204 | case EMLINK:
| ^~~~~~
../../src/error.c:206:7: error: ‘ECONNRESET’ undeclared (first use in this function)
206 | case ECONNRESET:
| ^~~~~~~~~~
../../src/error.c:208:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
208 | case ECONNABORTED:
| ^~~~~~~~~~~~
../../src/error.c:210:7: error: ‘EPROTO’ undeclared (first use in this function)
210 | case EPROTO:
| ^~~~~~
make[2]: *** [Makefile:9331: src/bluetoothd-error.o] Error 1
make[1]: *** [Makefile:4147: all] Error 2
make: *** [Makefile:10357: distcheck] Error 1
##############################
Test: Build w/ext ELL - Configure - PASS
Desc: Configure BlueZ source with '--enable-external-ell' configuration
##############################
Test: Build w/ext ELL - Make - FAIL
Desc: Build BlueZ source with '--enable-external-ell' configuration
Output:
src/error.c: In function ‘btd_error_bredr_conn_from_errno’:
src/error.c:140:7: error: ‘EALREADY’ undeclared (first use in this function)
140 | case EALREADY:
| ^~~~~~~~
src/error.c:140:7: note: each undeclared identifier is reported only once for each function it appears in
src/error.c:141:7: error: ‘EISCONN’ undeclared (first use in this function)
141 | case EISCONN:
| ^~~~~~~
src/error.c:143:7: error: ‘EHOSTDOWN’ undeclared (first use in this function)
143 | case EHOSTDOWN:
| ^~~~~~~~~
src/error.c:145:7: error: ‘ENOPROTOOPT’ undeclared (first use in this function)
145 | case ENOPROTOOPT:
| ^~~~~~~~~~~
src/error.c:147:7: error: ‘EIO’ undeclared (first use in this function)
147 | case EIO:
| ^~~
src/error.c:149:7: error: ‘EINVAL’ undeclared (first use in this function)
149 | case EINVAL:
| ^~~~~~
src/error.c:151:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
151 | case EHOSTUNREACH:
| ^~~~~~~~~~~~
src/error.c:153:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
153 | case EOPNOTSUPP:
| ^~~~~~~~~~
src/error.c:154:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
154 | case EPROTONOSUPPORT:
| ^~~~~~~~~~~~~~~
src/error.c:156:7: error: ‘EBADFD’ undeclared (first use in this function)
156 | case EBADFD:
| ^~~~~~
src/error.c:158:7: error: ‘ENOMEM’ undeclared (first use in this function)
158 | case ENOMEM:
| ^~~~~~
src/error.c:160:7: error: ‘EBUSY’ undeclared (first use in this function)
160 | case EBUSY:
| ^~~~~
src/error.c:162:7: error: ‘EMLINK’ undeclared (first use in this function)
162 | case EMLINK:
| ^~~~~~
src/error.c:164:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
164 | case ETIMEDOUT:
| ^~~~~~~~~
src/error.c:166:7: error: ‘ECONNREFUSED’ undeclared (first use in this function); did you mean ‘ERR_LE_CONN_REFUSED’?
166 | case ECONNREFUSED:
| ^~~~~~~~~~~~
| ERR_LE_CONN_REFUSED
src/error.c:168:7: error: ‘ECONNRESET’ undeclared (first use in this function)
168 | case ECONNRESET:
| ^~~~~~~~~~
src/error.c:170:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
170 | case ECONNABORTED:
| ^~~~~~~~~~~~
src/error.c:172:7: error: ‘EPROTO’ undeclared (first use in this function)
172 | case EPROTO:
| ^~~~~~
src/error.c: In function ‘btd_error_le_conn_from_errno’:
src/error.c:182:7: error: ‘EINVAL’ undeclared (first use in this function)
182 | case EINVAL:
| ^~~~~~
src/error.c:184:7: error: ‘EHOSTUNREACH’ undeclared (first use in this function)
184 | case EHOSTUNREACH:
| ^~~~~~~~~~~~
src/error.c:186:7: error: ‘EOPNOTSUPP’ undeclared (first use in this function)
186 | case EOPNOTSUPP:
| ^~~~~~~~~~
src/error.c:187:7: error: ‘EPROTONOSUPPORT’ undeclared (first use in this function)
187 | case EPROTONOSUPPORT:
| ^~~~~~~~~~~~~~~
src/error.c:189:7: error: ‘EALREADY’ undeclared (first use in this function)
189 | case EALREADY:
| ^~~~~~~~
src/error.c:190:7: error: ‘EISCONN’ undeclared (first use in this function)
190 | case EISCONN:
| ^~~~~~~
src/error.c:192:7: error: ‘EBADFD’ undeclared (first use in this function)
192 | case EBADFD:
| ^~~~~~
src/error.c:194:7: error: ‘ENOMEM’ undeclared (first use in this function)
194 | case ENOMEM:
| ^~~~~~
src/error.c:196:7: error: ‘EBUSY’ undeclared (first use in this function)
196 | case EBUSY:
| ^~~~~
src/error.c:198:7: error: ‘ECONNREFUSED’ undeclared (first use in this function); did you mean ‘ERR_LE_CONN_REFUSED’?
198 | case ECONNREFUSED:
| ^~~~~~~~~~~~
| ERR_LE_CONN_REFUSED
src/error.c:200:7: error: ‘EIO’ undeclared (first use in this function)
200 | case EIO:
| ^~~
src/error.c:202:7: error: ‘ETIMEDOUT’ undeclared (first use in this function)
202 | case ETIMEDOUT:
| ^~~~~~~~~
src/error.c:204:7: error: ‘EMLINK’ undeclared (first use in this function)
204 | case EMLINK:
| ^~~~~~
src/error.c:206:7: error: ‘ECONNRESET’ undeclared (first use in this function)
206 | case ECONNRESET:
| ^~~~~~~~~~
src/error.c:208:7: error: ‘ECONNABORTED’ undeclared (first use in this function)
208 | case ECONNABORTED:
| ^~~~~~~~~~~~
src/error.c:210:7: error: ‘EPROTO’ undeclared (first use in this function)
210 | case EPROTO:
| ^~~~~~
make[1]: *** [Makefile:9331: src/bluetoothd-error.o] Error 1
make: *** [Makefile:4147: all] Error 2
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 7+ messages in thread
* [BlueZ PATCH v5 2/4] error: BR/EDR and LE connection failure reasons
2021-08-06 23:47 [BlueZ PATCH v5 0/4] Detailed error string Miao-chen Chou
2021-08-06 23:47 ` [BlueZ PATCH v5 1/4] doc: Add errors.txt to describe errors of D-Bus method returns Miao-chen Chou
@ 2021-08-06 23:47 ` Miao-chen Chou
2021-08-09 13:32 ` Marcel Holtmann
2021-08-06 23:47 ` [BlueZ PATCH v5 3/4] device: Include detailed error string in Connect() return Miao-chen Chou
2021-08-06 23:47 ` [BlueZ PATCH v5 4/4] client: Print error code for connect methods Miao-chen Chou
3 siblings, 1 reply; 7+ messages in thread
From: Miao-chen Chou @ 2021-08-06 23:47 UTC (permalink / raw)
To: Bluetooth Kernel Mailing List
Cc: Marcel Holtmann, Howard Chung, Luiz Augusto von Dentz,
Alain Michaud, Miao-chen Chou
The source of Connect() failures can be divided into the following
three.
- bluetoothd's device interface state transition and profile state
transition
- Kernel's L2CAP layer state transition
- Potential HCI error codes returned by the remote device
Reviewed-by: Alain Michaud <alainm@chromium.org>
Reviewed-by: Howard Chung <howardchung@google.com>
---
Changes in v5:
- Replace uint16_t error code with string
Changes in v4:
- Address make errors
Changes in v3:
- Separate error-code.txt into its own commit
Changes in v2:
- Add error-code.txt
- Remove BtdError from return string
src/error.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++
src/error.h | 59 +++++++++++++++++++++++++++++++
2 files changed, 159 insertions(+)
diff --git a/src/error.c b/src/error.c
index 89517075e..411f36fcb 100644
--- a/src/error.c
+++ b/src/error.c
@@ -27,6 +27,8 @@
#include <config.h>
#endif
+#include <error.h>
+#include <stdio.h>
#include "gdbus/gdbus.h"
#include "error.h"
@@ -79,12 +81,24 @@ DBusMessage *btd_error_in_progress(DBusMessage *msg)
"In Progress");
}
+DBusMessage *btd_error_in_progress_str(DBusMessage *msg, const char *str)
+{
+ return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress",
+ "%s", str);
+}
+
DBusMessage *btd_error_not_available(DBusMessage *msg)
{
return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAvailable",
"Operation currently not available");
}
+DBusMessage *btd_error_not_available_str(DBusMessage *msg, const char *str)
+{
+ return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAvailable",
+ "%s", str);
+}
+
DBusMessage *btd_error_does_not_exist(DBusMessage *msg)
{
return g_dbus_create_error(msg, ERROR_INTERFACE ".DoesNotExist",
@@ -121,8 +135,94 @@ DBusMessage *btd_error_not_ready(DBusMessage *msg)
"Resource Not Ready");
}
+DBusMessage *btd_error_not_ready_str(DBusMessage *msg, const char *str)
+{
+ return g_dbus_create_error(msg, ERROR_INTERFACE ".NotReady",
+ "%s", str);
+}
+
DBusMessage *btd_error_failed(DBusMessage *msg, const char *str)
{
return g_dbus_create_error(msg, ERROR_INTERFACE
".Failed", "%s", str);
}
+
+const char* btd_error_bredr_conn_from_errno(int errno_code)
+{
+ switch (-errno_code) {
+ case EALREADY:
+ case EISCONN:
+ return ERR_BREDR_CONN_ALREADY_CONNECTED;
+ case EHOSTDOWN:
+ return ERR_BREDR_CONN_PAGE_TIMEOUT;
+ case ENOPROTOOPT:
+ return ERR_BREDR_CONN_PROFILE_UNAVAILABLE;
+ case EIO:
+ return ERR_BREDR_CONN_CREATE_SOCKET;
+ case EINVAL:
+ return ERR_BREDR_CONN_INVALID_ARGUMENTS;
+ case EHOSTUNREACH:
+ return ERR_BREDR_CONN_ADAPTER_NOT_POWERED;
+ case EOPNOTSUPP:
+ case EPROTONOSUPPORT:
+ return ERR_BREDR_CONN_NOT_SUPPORTED;
+ case EBADFD:
+ return ERR_BREDR_CONN_BAD_SOCKET;
+ case ENOMEM:
+ return ERR_BREDR_CONN_MEMORY_ALLOC;
+ case EBUSY:
+ return ERR_BREDR_CONN_BUSY;
+ case EMLINK:
+ return ERR_BREDR_CONN_CNCR_CONNECT_LIMIT;
+ case ETIMEDOUT:
+ return ERR_BREDR_CONN_TIMEOUT;
+ case ECONNREFUSED:
+ return ERR_BREDR_CONN_REFUSED;
+ case ECONNRESET:
+ return ERR_BREDR_CONN_ABORT_BY_REMOTE;
+ case ECONNABORTED:
+ return ERR_BREDR_CONN_ABORT_BY_LOCAL;
+ case EPROTO:
+ return ERR_BREDR_CONN_LMP_PROTO_ERROR;
+ default:
+ return ERR_BREDR_CONN_UNKNOWN;
+ }
+}
+
+const char* btd_error_le_conn_from_errno(int errno_code)
+{
+ switch (-errno_code) {
+ case EINVAL:
+ return ERR_LE_CONN_INVALID_ARGUMENTS;
+ case EHOSTUNREACH:
+ return ERR_LE_CONN_ADAPTER_NOT_POWERED;
+ case EOPNOTSUPP:
+ case EPROTONOSUPPORT:
+ return ERR_LE_CONN_NOT_SUPPORTED;
+ case EALREADY:
+ case EISCONN:
+ return ERR_LE_CONN_ALREADY_CONNECTED;
+ case EBADFD:
+ return ERR_LE_CONN_BAD_SOCKET;
+ case ENOMEM:
+ return ERR_LE_CONN_MEMORY_ALLOC;
+ case EBUSY:
+ return ERR_LE_CONN_BUSY;
+ case ECONNREFUSED:
+ return ERR_LE_CONN_REFUSED;
+ case EIO:
+ return ERR_LE_CONN_CREATE_SOCKET;
+ case ETIMEDOUT:
+ return ERR_LE_CONN_TIMEOUT;
+ case EMLINK:
+ return ERR_LE_CONN_SYNC_CONNECT_LIMIT;
+ case ECONNRESET:
+ return ERR_LE_CONN_ABORT_BY_REMOTE;
+ case ECONNABORTED:
+ return ERR_LE_CONN_ABORT_BY_LOCAL;
+ case EPROTO:
+ return ERR_LE_CONN_LL_PROTO_ERROR;
+ default:
+ return ERR_LE_CONN_UNKNOWN;
+ }
+}
diff --git a/src/error.h b/src/error.h
index 7c8cad066..91a02654a 100644
--- a/src/error.h
+++ b/src/error.h
@@ -24,9 +24,62 @@
*/
#include <dbus/dbus.h>
+#include <stdint.h>
#define ERROR_INTERFACE "org.bluez.Error"
+/* BR/EDR connection failure reasons */
+#define ERR_BREDR_CONN_ALREADY_CONNECTED "BR/EDR connection already "\
+ "connected"
+#define ERR_BREDR_CONN_PAGE_TIMEOUT "BR/EDR connection page timeout"
+#define ERR_BREDR_CONN_PROFILE_UNAVAILABLE "BR/EDR connection profile "\
+ "unavailable"
+#define ERR_BREDR_CONN_SDP_SEARCH "BR/EDR connection SDP search"
+#define ERR_BREDR_CONN_CREATE_SOCKET "BR/EDR connection create "\
+ "socket"
+#define ERR_BREDR_CONN_INVALID_ARGUMENTS "BR/EDR connection invalid "\
+ "argument"
+#define ERR_BREDR_CONN_ADAPTER_NOT_POWERED "BR/EDR connection adapter "\
+ "not powered"
+#define ERR_BREDR_CONN_NOT_SUPPORTED "BR/EDR connection not "\
+ "suuported"
+#define ERR_BREDR_CONN_BAD_SOCKET "BR/EDR connection bad socket"
+#define ERR_BREDR_CONN_MEMORY_ALLOC "BR/EDR connection memory "\
+ "allocation"
+#define ERR_BREDR_CONN_BUSY "BR/EDR connection busy"
+#define ERR_BREDR_CONN_CNCR_CONNECT_LIMIT "BR/EDR connection concurrent "\
+ "connection limit"
+#define ERR_BREDR_CONN_TIMEOUT "BR/EDR connection timeout"
+#define ERR_BREDR_CONN_REFUSED "BR/EDR connection refused"
+#define ERR_BREDR_CONN_ABORT_BY_REMOTE "BR/EDR connection aborted by "\
+ "remote"
+#define ERR_BREDR_CONN_ABORT_BY_LOCAL "BR/EDR connection aborted by "\
+ "local"
+#define ERR_BREDR_CONN_LMP_PROTO_ERROR "BR/EDR connection LMP "\
+ "protocol error"
+#define ERR_BREDR_CONN_CANCELED "BR/EDR connection canceled"
+#define ERR_BREDR_CONN_UNKNOWN "BR/EDR connection unknown"
+
+/* LE connection failure reasons */
+#define ERR_LE_CONN_INVALID_ARGUMENTS "LE connection invalid arguments"
+#define ERR_LE_CONN_ADAPTER_NOT_POWERED "LE connection adapter not powered"
+#define ERR_LE_CONN_NOT_SUPPORTED "LE connection not supported"
+#define ERR_LE_CONN_ALREADY_CONNECTED "LE connection already connected"
+#define ERR_LE_CONN_BAD_SOCKET "LE connection bad socket"
+#define ERR_LE_CONN_MEMORY_ALLOC "LE connection memory allocation"
+#define ERR_LE_CONN_BUSY "LE connection busy"
+#define ERR_LE_CONN_REFUSED "LE connection refused"
+#define ERR_LE_CONN_CREATE_SOCKET "LE connection create socket"
+#define ERR_LE_CONN_TIMEOUT "LE connection timeout"
+#define ERR_LE_CONN_SYNC_CONNECT_LIMIT "LE connection concurrent connection "\
+ "limit"
+#define ERR_LE_CONN_ABORT_BY_REMOTE "LE connection abort by remote"
+#define ERR_LE_CONN_ABORT_BY_LOCAL "LE connection abort by local"
+#define ERR_LE_CONN_LL_PROTO_ERROR "LE connection link layer protocol "\
+ "error"
+#define ERR_LE_CONN_GATT_BROWSE "LE connection GATT browsing"
+#define ERR_LE_CONN_UNKNOWN "LE connection unknown"
+
DBusMessage *btd_error_invalid_args(DBusMessage *msg);
DBusMessage *btd_error_invalid_args_str(DBusMessage *msg, const char *str);
DBusMessage *btd_error_busy(DBusMessage *msg);
@@ -35,11 +88,17 @@ DBusMessage *btd_error_not_supported(DBusMessage *msg);
DBusMessage *btd_error_not_connected(DBusMessage *msg);
DBusMessage *btd_error_already_connected(DBusMessage *msg);
DBusMessage *btd_error_not_available(DBusMessage *msg);
+DBusMessage *btd_error_not_available_str(DBusMessage *msg, const char *str);
DBusMessage *btd_error_in_progress(DBusMessage *msg);
+DBusMessage *btd_error_in_progress_str(DBusMessage *msg, const char *str);
DBusMessage *btd_error_does_not_exist(DBusMessage *msg);
DBusMessage *btd_error_not_authorized(DBusMessage *msg);
DBusMessage *btd_error_not_permitted(DBusMessage *msg, const char *str);
DBusMessage *btd_error_no_such_adapter(DBusMessage *msg);
DBusMessage *btd_error_agent_not_available(DBusMessage *msg);
DBusMessage *btd_error_not_ready(DBusMessage *msg);
+DBusMessage *btd_error_not_ready_str(DBusMessage *msg, const char *str);
DBusMessage *btd_error_failed(DBusMessage *msg, const char *str);
+
+const char* btd_error_bredr_conn_from_errno(int errno_code);
+const char* btd_error_le_conn_from_errno(int errno_code);
--
2.32.0.605.g8dce9f2422-goog
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [BlueZ PATCH v5 2/4] error: BR/EDR and LE connection failure reasons
2021-08-06 23:47 ` [BlueZ PATCH v5 2/4] error: BR/EDR and LE connection failure reasons Miao-chen Chou
@ 2021-08-09 13:32 ` Marcel Holtmann
0 siblings, 0 replies; 7+ messages in thread
From: Marcel Holtmann @ 2021-08-09 13:32 UTC (permalink / raw)
To: Miao-chen Chou
Cc: Bluetooth Kernel Mailing List, Howard Chung,
Luiz Augusto von Dentz, Alain Michaud
Hi Miao-chen,
> The source of Connect() failures can be divided into the following
> three.
> - bluetoothd's device interface state transition and profile state
> transition
> - Kernel's L2CAP layer state transition
> - Potential HCI error codes returned by the remote device
>
> Reviewed-by: Alain Michaud <alainm@chromium.org>
> Reviewed-by: Howard Chung <howardchung@google.com>
> ---
>
> Changes in v5:
> - Replace uint16_t error code with string
>
> Changes in v4:
> - Address make errors
>
> Changes in v3:
> - Separate error-code.txt into its own commit
>
> Changes in v2:
> - Add error-code.txt
> - Remove BtdError from return string
>
> src/error.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> src/error.h | 59 +++++++++++++++++++++++++++++++
> 2 files changed, 159 insertions(+)
>
> diff --git a/src/error.c b/src/error.c
> index 89517075e..411f36fcb 100644
> --- a/src/error.c
> +++ b/src/error.c
> @@ -27,6 +27,8 @@
> #include <config.h>
> #endif
>
> +#include <error.h>
> +#include <stdio.h>
> #include "gdbus/gdbus.h"
>
> #include "error.h"
> @@ -79,12 +81,24 @@ DBusMessage *btd_error_in_progress(DBusMessage *msg)
> "In Progress");
> }
>
> +DBusMessage *btd_error_in_progress_str(DBusMessage *msg, const char *str)
> +{
> + return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress",
> + "%s", str);
> +}
> +
> DBusMessage *btd_error_not_available(DBusMessage *msg)
> {
> return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAvailable",
> "Operation currently not available");
> }
>
> +DBusMessage *btd_error_not_available_str(DBusMessage *msg, const char *str)
> +{
> + return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAvailable",
> + "%s", str);
> +}
> +
> DBusMessage *btd_error_does_not_exist(DBusMessage *msg)
> {
> return g_dbus_create_error(msg, ERROR_INTERFACE ".DoesNotExist",
> @@ -121,8 +135,94 @@ DBusMessage *btd_error_not_ready(DBusMessage *msg)
> "Resource Not Ready");
> }
>
> +DBusMessage *btd_error_not_ready_str(DBusMessage *msg, const char *str)
> +{
> + return g_dbus_create_error(msg, ERROR_INTERFACE ".NotReady",
> + "%s", str);
> +}
> +
> DBusMessage *btd_error_failed(DBusMessage *msg, const char *str)
> {
> return g_dbus_create_error(msg, ERROR_INTERFACE
> ".Failed", "%s", str);
> }
> +
> +const char* btd_error_bredr_conn_from_errno(int errno_code)
> +{
> + switch (-errno_code) {
> + case EALREADY:
> + case EISCONN:
> + return ERR_BREDR_CONN_ALREADY_CONNECTED;
> + case EHOSTDOWN:
> + return ERR_BREDR_CONN_PAGE_TIMEOUT;
> + case ENOPROTOOPT:
> + return ERR_BREDR_CONN_PROFILE_UNAVAILABLE;
> + case EIO:
> + return ERR_BREDR_CONN_CREATE_SOCKET;
> + case EINVAL:
> + return ERR_BREDR_CONN_INVALID_ARGUMENTS;
> + case EHOSTUNREACH:
> + return ERR_BREDR_CONN_ADAPTER_NOT_POWERED;
> + case EOPNOTSUPP:
> + case EPROTONOSUPPORT:
> + return ERR_BREDR_CONN_NOT_SUPPORTED;
> + case EBADFD:
> + return ERR_BREDR_CONN_BAD_SOCKET;
> + case ENOMEM:
> + return ERR_BREDR_CONN_MEMORY_ALLOC;
> + case EBUSY:
> + return ERR_BREDR_CONN_BUSY;
> + case EMLINK:
> + return ERR_BREDR_CONN_CNCR_CONNECT_LIMIT;
> + case ETIMEDOUT:
> + return ERR_BREDR_CONN_TIMEOUT;
> + case ECONNREFUSED:
> + return ERR_BREDR_CONN_REFUSED;
> + case ECONNRESET:
> + return ERR_BREDR_CONN_ABORT_BY_REMOTE;
> + case ECONNABORTED:
> + return ERR_BREDR_CONN_ABORT_BY_LOCAL;
> + case EPROTO:
> + return ERR_BREDR_CONN_LMP_PROTO_ERROR;
> + default:
> + return ERR_BREDR_CONN_UNKNOWN;
> + }
> +}
> +
> +const char* btd_error_le_conn_from_errno(int errno_code)
> +{
> + switch (-errno_code) {
> + case EINVAL:
> + return ERR_LE_CONN_INVALID_ARGUMENTS;
> + case EHOSTUNREACH:
> + return ERR_LE_CONN_ADAPTER_NOT_POWERED;
> + case EOPNOTSUPP:
> + case EPROTONOSUPPORT:
> + return ERR_LE_CONN_NOT_SUPPORTED;
> + case EALREADY:
> + case EISCONN:
> + return ERR_LE_CONN_ALREADY_CONNECTED;
> + case EBADFD:
> + return ERR_LE_CONN_BAD_SOCKET;
> + case ENOMEM:
> + return ERR_LE_CONN_MEMORY_ALLOC;
> + case EBUSY:
> + return ERR_LE_CONN_BUSY;
> + case ECONNREFUSED:
> + return ERR_LE_CONN_REFUSED;
> + case EIO:
> + return ERR_LE_CONN_CREATE_SOCKET;
> + case ETIMEDOUT:
> + return ERR_LE_CONN_TIMEOUT;
> + case EMLINK:
> + return ERR_LE_CONN_SYNC_CONNECT_LIMIT;
> + case ECONNRESET:
> + return ERR_LE_CONN_ABORT_BY_REMOTE;
> + case ECONNABORTED:
> + return ERR_LE_CONN_ABORT_BY_LOCAL;
> + case EPROTO:
> + return ERR_LE_CONN_LL_PROTO_ERROR;
> + default:
> + return ERR_LE_CONN_UNKNOWN;
> + }
> +}
> diff --git a/src/error.h b/src/error.h
> index 7c8cad066..91a02654a 100644
> --- a/src/error.h
> +++ b/src/error.h
> @@ -24,9 +24,62 @@
> */
>
> #include <dbus/dbus.h>
> +#include <stdint.h>
>
> #define ERROR_INTERFACE "org.bluez.Error"
>
> +/* BR/EDR connection failure reasons */
> +#define ERR_BREDR_CONN_ALREADY_CONNECTED "BR/EDR connection already "\
> + "connected"
> +#define ERR_BREDR_CONN_PAGE_TIMEOUT "BR/EDR connection page timeout"
> +#define ERR_BREDR_CONN_PROFILE_UNAVAILABLE "BR/EDR connection profile "\
> + "unavailable"
> +#define ERR_BREDR_CONN_SDP_SEARCH "BR/EDR connection SDP search"
> +#define ERR_BREDR_CONN_CREATE_SOCKET "BR/EDR connection create "\
> + "socket"
> +#define ERR_BREDR_CONN_INVALID_ARGUMENTS "BR/EDR connection invalid "\
> + "argument"
> +#define ERR_BREDR_CONN_ADAPTER_NOT_POWERED "BR/EDR connection adapter "\
> + "not powered"
> +#define ERR_BREDR_CONN_NOT_SUPPORTED "BR/EDR connection not "\
> + "suuported"
> +#define ERR_BREDR_CONN_BAD_SOCKET "BR/EDR connection bad socket"
> +#define ERR_BREDR_CONN_MEMORY_ALLOC "BR/EDR connection memory "\
> + "allocation"
> +#define ERR_BREDR_CONN_BUSY "BR/EDR connection busy"
> +#define ERR_BREDR_CONN_CNCR_CONNECT_LIMIT "BR/EDR connection concurrent "\
> + "connection limit"
> +#define ERR_BREDR_CONN_TIMEOUT "BR/EDR connection timeout"
> +#define ERR_BREDR_CONN_REFUSED "BR/EDR connection refused"
> +#define ERR_BREDR_CONN_ABORT_BY_REMOTE "BR/EDR connection aborted by "\
> + "remote"
> +#define ERR_BREDR_CONN_ABORT_BY_LOCAL "BR/EDR connection aborted by "\
> + "local"
> +#define ERR_BREDR_CONN_LMP_PROTO_ERROR "BR/EDR connection LMP "\
> + "protocol error"
> +#define ERR_BREDR_CONN_CANCELED "BR/EDR connection canceled"
> +#define ERR_BREDR_CONN_UNKNOWN "BR/EDR connection unknown"
> +
> +/* LE connection failure reasons */
> +#define ERR_LE_CONN_INVALID_ARGUMENTS "LE connection invalid arguments"
> +#define ERR_LE_CONN_ADAPTER_NOT_POWERED "LE connection adapter not powered"
> +#define ERR_LE_CONN_NOT_SUPPORTED "LE connection not supported"
> +#define ERR_LE_CONN_ALREADY_CONNECTED "LE connection already connected"
> +#define ERR_LE_CONN_BAD_SOCKET "LE connection bad socket"
> +#define ERR_LE_CONN_MEMORY_ALLOC "LE connection memory allocation"
> +#define ERR_LE_CONN_BUSY "LE connection busy"
> +#define ERR_LE_CONN_REFUSED "LE connection refused"
> +#define ERR_LE_CONN_CREATE_SOCKET "LE connection create socket"
> +#define ERR_LE_CONN_TIMEOUT "LE connection timeout"
> +#define ERR_LE_CONN_SYNC_CONNECT_LIMIT "LE connection concurrent connection "\
> + "limit"
> +#define ERR_LE_CONN_ABORT_BY_REMOTE "LE connection abort by remote"
> +#define ERR_LE_CONN_ABORT_BY_LOCAL "LE connection abort by local"
> +#define ERR_LE_CONN_LL_PROTO_ERROR "LE connection link layer protocol "\
> + "error"
> +#define ERR_LE_CONN_GATT_BROWSE "LE connection GATT browsing"
> +#define ERR_LE_CONN_UNKNOWN "LE connection unknown"
I rather have you use strings like “le-connection-not-supported” to make this similar to what we are using for other strings in the API.
And I am always torn between using “bredr-“ and just using “br-“.
Regards
Marcel
^ permalink raw reply [flat|nested] 7+ messages in thread
* [BlueZ PATCH v5 3/4] device: Include detailed error string in Connect() return
2021-08-06 23:47 [BlueZ PATCH v5 0/4] Detailed error string Miao-chen Chou
2021-08-06 23:47 ` [BlueZ PATCH v5 1/4] doc: Add errors.txt to describe errors of D-Bus method returns Miao-chen Chou
2021-08-06 23:47 ` [BlueZ PATCH v5 2/4] error: BR/EDR and LE connection failure reasons Miao-chen Chou
@ 2021-08-06 23:47 ` Miao-chen Chou
2021-08-06 23:47 ` [BlueZ PATCH v5 4/4] client: Print error code for connect methods Miao-chen Chou
3 siblings, 0 replies; 7+ messages in thread
From: Miao-chen Chou @ 2021-08-06 23:47 UTC (permalink / raw)
To: Bluetooth Kernel Mailing List
Cc: Marcel Holtmann, Howard Chung, Luiz Augusto von Dentz,
Alain Michaud, Miao-chen Chou
This replaces generic strerror message with context detailed error
string to better indicate the detailed failure reason so that the D-Bus
clients can optimize their application to work better with BlueZ, e.g.
introducing retry mechanism or building metrics.
Reviewed-by: Alain Michaud <alainm@chromium.org>
Reviewed-by: Howard Chung <howardchung@google.com>
---
Changes in v5:
- Address the changes from error code to string
src/device.c | 46 ++++++++++++++++++++++++++++++----------------
1 file changed, 30 insertions(+), 16 deletions(-)
diff --git a/src/device.c b/src/device.c
index df440ce09..d4795dd6a 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1608,7 +1608,7 @@ void device_request_disconnect(struct btd_device *device, DBusMessage *msg)
if (device->connect) {
DBusMessage *reply = btd_error_failed(device->connect,
- "Cancelled");
+ ERR_BREDR_CONN_CANCELED);
g_dbus_send_message(dbus_conn, reply);
dbus_message_unref(device->connect);
device->connect = NULL;
@@ -1802,7 +1802,8 @@ done:
}
g_dbus_send_message(dbus_conn,
- btd_error_failed(dev->connect, strerror(-err)));
+ btd_error_failed(dev->connect,
+ btd_error_bredr_conn_from_errno(err)));
} else {
/* Start passive SDP discovery to update known services */
if (dev->bredr && !dev->svc_refreshed && dev->refresh_discovery)
@@ -2003,10 +2004,12 @@ static DBusMessage *connect_profiles(struct btd_device *dev, uint8_t bdaddr_type
dbus_message_get_sender(msg));
if (dev->pending || dev->connect || dev->browse)
- return btd_error_in_progress(msg);
+ return btd_error_in_progress_str(msg, ERR_BREDR_CONN_BUSY);
- if (!btd_adapter_get_powered(dev->adapter))
- return btd_error_not_ready(msg);
+ if (!btd_adapter_get_powered(dev->adapter)) {
+ return btd_error_not_ready_str(msg,
+ ERR_BREDR_CONN_ADAPTER_NOT_POWERED);
+ }
btd_device_set_temporary(dev, false);
@@ -2019,10 +2022,12 @@ static DBusMessage *connect_profiles(struct btd_device *dev, uint8_t bdaddr_type
if (dbus_message_is_method_call(msg, DEVICE_INTERFACE,
"Connect") &&
find_service_with_state(dev->services,
- BTD_SERVICE_STATE_CONNECTED))
+ BTD_SERVICE_STATE_CONNECTED)) {
return dbus_message_new_method_return(msg);
- else
- return btd_error_not_available(msg);
+ } else {
+ return btd_error_not_available_str(msg,
+ ERR_BREDR_CONN_PROFILE_UNAVAILABLE);
+ }
}
goto resolve_services;
@@ -2032,7 +2037,8 @@ static DBusMessage *connect_profiles(struct btd_device *dev, uint8_t bdaddr_type
if (err < 0) {
if (err == -EALREADY)
return dbus_message_new_method_return(msg);
- return btd_error_failed(msg, strerror(-err));
+ return btd_error_failed(msg,
+ btd_error_bredr_conn_from_errno(err));
}
dev->connect = dbus_message_ref(msg);
@@ -2046,8 +2052,10 @@ resolve_services:
err = device_browse_sdp(dev, msg);
else
err = device_browse_gatt(dev, msg);
- if (err < 0)
- return btd_error_failed(msg, strerror(-err));
+ if (err < 0) {
+ return btd_error_failed(msg, bdaddr_type == BDADDR_BREDR ?
+ ERR_BREDR_CONN_SDP_SEARCH : ERR_LE_CONN_GATT_BROWSE);
+ }
return NULL;
}
@@ -2157,8 +2165,10 @@ static DBusMessage *connect_profile(DBusConnection *conn, DBusMessage *msg,
DBusMessage *reply;
if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &pattern,
- DBUS_TYPE_INVALID))
- return btd_error_invalid_args(msg);
+ DBUS_TYPE_INVALID)) {
+ return btd_error_invalid_args_str(msg,
+ ERR_BREDR_CONN_INVALID_ARGUMENTS);
+ }
uuid = bt_name2string(pattern);
reply = connect_profiles(dev, BDADDR_BREDR, msg, uuid);
@@ -2541,7 +2551,10 @@ static void browse_request_complete(struct browse_req *req, uint8_t type,
if (err == 0)
goto done;
}
- reply = btd_error_failed(req->msg, strerror(-err));
+ reply = btd_error_failed(req->msg,
+ bdaddr_type == BDADDR_BREDR ?
+ btd_error_bredr_conn_from_errno(err) :
+ btd_error_le_conn_from_errno(err));
goto done;
}
@@ -3027,7 +3040,8 @@ void device_remove_connection(struct btd_device *device, uint8_t bdaddr_type)
*/
if (device->connect) {
DBG("connection removed while Connect() is waiting reply");
- reply = btd_error_failed(device->connect, "Disconnected early");
+ reply = btd_error_failed(device->connect,
+ ERR_BREDR_CONN_CANCELED);
g_dbus_send_message(dbus_conn, reply);
dbus_message_unref(device->connect);
device->connect = NULL;
@@ -5414,7 +5428,7 @@ done:
if (device->connect) {
if (err < 0)
reply = btd_error_failed(device->connect,
- strerror(-err));
+ btd_error_le_conn_from_errno(err));
else
reply = dbus_message_new_method_return(device->connect);
--
2.32.0.605.g8dce9f2422-goog
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [BlueZ PATCH v5 4/4] client: Print error code for connect methods
2021-08-06 23:47 [BlueZ PATCH v5 0/4] Detailed error string Miao-chen Chou
` (2 preceding siblings ...)
2021-08-06 23:47 ` [BlueZ PATCH v5 3/4] device: Include detailed error string in Connect() return Miao-chen Chou
@ 2021-08-06 23:47 ` Miao-chen Chou
3 siblings, 0 replies; 7+ messages in thread
From: Miao-chen Chou @ 2021-08-06 23:47 UTC (permalink / raw)
To: Bluetooth Kernel Mailing List
Cc: Marcel Holtmann, Howard Chung, Luiz Augusto von Dentz,
Alain Michaud, Miao-chen Chou
The following steps were performed.
- Issuing repeated commands to connect the same BLE device.
- Verifying the print in bluetoothctl console
Reviewed-by: Alain Michaud <alainm@chromium.org>
Reviewed-by: Howard Chung <howardchung@google.com>
---
Changes in v5:
- Replace error code with error string
Changes in v4:
- Address make errors.
Changes in v3:
- Correct error-codes.txt.
Changes in v2:
- Add documentation for error codes
client/main.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/client/main.c b/client/main.c
index da877b546..488a24bf6 100644
--- a/client/main.c
+++ b/client/main.c
@@ -1949,7 +1949,8 @@ static void connect_reply(DBusMessage *message, void *user_data)
dbus_error_init(&error);
if (dbus_set_error_from_message(&error, message) == TRUE) {
- bt_shell_printf("Failed to connect: %s\n", error.name);
+ bt_shell_printf("Failed to connect: %s %s\n", error.name,
+ error.message);
dbus_error_free(&error);
return bt_shell_noninteractive_quit(EXIT_FAILURE);
}
--
2.32.0.605.g8dce9f2422-goog
^ permalink raw reply related [flat|nested] 7+ messages in thread