summaryrefslogtreecommitdiff
path: root/src/libs/mynewt-nimble/apps/btshell/src/cmd_l2cap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/mynewt-nimble/apps/btshell/src/cmd_l2cap.c')
-rw-r--r--src/libs/mynewt-nimble/apps/btshell/src/cmd_l2cap.c325
1 files changed, 325 insertions, 0 deletions
diff --git a/src/libs/mynewt-nimble/apps/btshell/src/cmd_l2cap.c b/src/libs/mynewt-nimble/apps/btshell/src/cmd_l2cap.c
new file mode 100644
index 0000000..e74e3bf
--- /dev/null
+++ b/src/libs/mynewt-nimble/apps/btshell/src/cmd_l2cap.c
@@ -0,0 +1,325 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <inttypes.h>
+#include <errno.h>
+
+#include "syscfg/syscfg.h"
+#include "host/ble_gap.h"
+#include "host/ble_l2cap.h"
+#include "console/console.h"
+#include "btshell.h"
+#include "cmd.h"
+#include "cmd_l2cap.h"
+
+
+/*****************************************************************************
+ * $l2cap-update *
+ *****************************************************************************/
+
+int
+cmd_l2cap_update(int argc, char **argv)
+{
+ struct ble_l2cap_sig_update_params params;
+ uint16_t conn_handle;
+ int rc;
+
+ rc = parse_arg_all(argc - 1, argv + 1);
+ if (rc != 0) {
+ return rc;
+ }
+
+ conn_handle = parse_arg_uint16("conn", &rc);
+ if (rc != 0) {
+ console_printf("invalid 'conn' parameter\n");
+ return rc;
+ }
+
+ params.itvl_min = parse_arg_uint16_dflt("interval_min",
+ BLE_GAP_INITIAL_CONN_ITVL_MIN,
+ &rc);
+ if (rc != 0) {
+ console_printf("invalid 'interval_min' parameter\n");
+ return rc;
+ }
+
+ params.itvl_max = parse_arg_uint16_dflt("interval_max",
+ BLE_GAP_INITIAL_CONN_ITVL_MAX,
+ &rc);
+ if (rc != 0) {
+ console_printf("invalid 'interval_max' parameter\n");
+ return rc;
+ }
+
+ params.slave_latency = parse_arg_uint16_dflt("latency", 0, &rc);
+ if (rc != 0) {
+ console_printf("invalid 'latency' parameter\n");
+ return rc;
+ }
+
+ params.timeout_multiplier = parse_arg_uint16_dflt("timeout", 0x0100, &rc);
+ if (rc != 0) {
+ console_printf("invalid 'timeout' parameter\n");
+ return rc;
+ }
+
+ rc = btshell_l2cap_update(conn_handle, &params);
+ if (rc != 0) {
+ console_printf("error txing l2cap update; rc=%d\n", rc);
+ return rc;
+ }
+
+ return 0;
+}
+
+/*****************************************************************************
+ * $l2cap-create-server *
+ *****************************************************************************/
+
+int
+cmd_l2cap_create_server(int argc, char **argv)
+{
+ uint16_t psm = 0;
+ uint16_t mtu;
+ int error;
+ int accept_response = 0;
+ int rc;
+
+ rc = parse_arg_all(argc - 1, argv + 1);
+ if (rc != 0) {
+ return rc;
+ }
+
+ psm = parse_arg_uint16("psm", &rc);
+ if (rc != 0) {
+ console_printf("invalid 'psm' parameter\n");
+ return rc;
+ }
+
+ error = parse_arg_uint32_dflt("error", 0, &rc);
+ if (rc != 0) {
+ console_printf("invalid 'error' parameter\n");
+ return rc;
+ }
+
+ mtu = parse_arg_uint16_dflt("mtu", 0, &rc);
+ if (rc != 0) {
+ console_printf("invalid 'mtu' parameter\n");
+ return rc;
+ }
+
+ switch (error) {
+ case 1:
+ accept_response = BLE_HS_EAUTHEN;
+ break;
+ case 2:
+ accept_response = BLE_HS_EAUTHOR;
+ break;
+ case 3:
+ accept_response = BLE_HS_EENCRYPT_KEY_SZ;
+ break;
+ }
+
+ rc = btshell_l2cap_create_srv(psm, mtu, accept_response);
+ if (rc) {
+ console_printf("Server create error: 0x%02x\n", rc);
+ return rc;
+ }
+
+ console_printf("Server created successfully\n");
+ return 0;
+}
+
+/*****************************************************************************
+ * $l2cap-connect *
+ *****************************************************************************/
+
+int
+cmd_l2cap_connect(int argc, char **argv)
+{
+ uint16_t conn = 0;
+ uint16_t psm = 0;
+ uint16_t mtu;
+ uint8_t num;
+ int rc;
+
+ rc = parse_arg_all(argc - 1, argv + 1);
+ if (rc != 0) {
+ return rc;
+ }
+
+ conn = parse_arg_uint16("conn", &rc);
+ if (rc != 0) {
+ console_printf("invalid 'conn' parameter\n");
+ return rc;
+ }
+
+ psm = parse_arg_uint16("psm", &rc);
+ if (rc != 0) {
+ console_printf("invalid 'psm' parameter\n");
+ return rc;
+ }
+
+ mtu = parse_arg_uint16_dflt("mtu", 0, &rc);
+ if (rc != 0) {
+ console_printf("invalid 'mtu' parameter\n");
+ return rc;
+ }
+
+ num = parse_arg_uint8_dflt("num", 1, &rc);
+ if (rc != 0) {
+ console_printf("invalid 'num' parameter\n");
+ return rc;
+ }
+
+ return btshell_l2cap_connect(conn, psm, mtu, num);
+}
+
+/*****************************************************************************
+ * $l2cap-disconnect *
+ *****************************************************************************/
+
+int
+cmd_l2cap_disconnect(int argc, char **argv)
+{
+ uint16_t conn;
+ uint16_t idx;
+ int rc;
+
+ rc = parse_arg_all(argc - 1, argv + 1);
+ if (rc != 0) {
+ return rc;
+ }
+
+ conn = parse_arg_uint16("conn", &rc);
+ if (rc != 0) {
+ console_printf("invalid 'conn' parameter\n");
+ return rc;
+ }
+
+ idx = parse_arg_uint16("idx", &rc);
+ if (rc != 0) {
+ console_printf("invalid 'idx' parameter\n");
+ return rc;
+ }
+
+ return btshell_l2cap_disconnect(conn, idx);
+}
+
+/*****************************************************************************
+ * $l2cap-send *
+ *****************************************************************************/
+
+int
+cmd_l2cap_send(int argc, char **argv)
+{
+ uint16_t conn;
+ uint16_t idx;
+ uint16_t bytes;
+ int rc;
+
+ rc = parse_arg_all(argc - 1, argv + 1);
+ if (rc != 0) {
+ return rc;
+ }
+
+ conn = parse_arg_uint16("conn", &rc);
+ if (rc != 0) {
+ console_printf("invalid 'conn' parameter\n");
+ return rc;
+ }
+
+ idx = parse_arg_uint16("idx", &rc);
+ if (rc != 0) {
+ console_printf("invalid 'idx' parameter\n");
+ return rc;
+ }
+
+ bytes = parse_arg_uint16("bytes", &rc);
+ if (rc != 0) {
+ console_printf("invalid 'bytes' parameter\n");
+ return rc;
+ }
+
+ return btshell_l2cap_send(conn, idx, bytes);
+}
+
+int
+cmd_l2cap_show_coc(int argc, char **argv)
+{
+ struct btshell_conn *conn = NULL;
+ struct btshell_l2cap_coc *coc;
+ int i, j;
+
+ for (i = 0; i < btshell_num_conns; i++) {
+ conn = btshell_conns + i;
+
+ if (SLIST_EMPTY(&conn->coc_list)) {
+ continue;
+ }
+
+ console_printf("conn_handle: 0x%04x\n", conn->handle);
+ j = 0;
+ SLIST_FOREACH(coc, &conn->coc_list, next) {
+ console_printf(" idx: %i, chan pointer = %p\n", j++, coc->chan);
+ }
+ }
+
+ return 0;
+}
+
+int
+cmd_l2cap_reconfig(int argc, char **argv)
+{
+#if MYNEWT_VAL(BLE_L2CAP_ENHANCED_COC)
+ uint16_t conn;
+ uint16_t mtu;
+ uint8_t idxs[5];
+ int num;
+ int rc;
+
+ rc = parse_arg_all(argc - 1, argv + 1);
+ if (rc != 0) {
+ return rc;
+ }
+
+ conn = parse_arg_uint16("conn", &rc);
+ if (rc != 0) {
+ console_printf("invalid 'conn' parameter\n");
+ return rc;
+ }
+
+ mtu = parse_arg_uint16_dflt("mtu", 0,&rc);
+ if (rc != 0) {
+ console_printf("invalid 'mtu' parameter\n");
+ return rc;
+ }
+
+ rc = parse_arg_uint8_list_with_separator("idxs", ",", 5, idxs, &num);
+ if (rc != 0) {
+ console_printf("invalid 'idxs' parameter\n");
+ return rc;
+ }
+
+ return btshell_l2cap_reconfig(conn, mtu, num, idxs);
+#else
+ console_printf("To enable this features set BLE_L2CAP_ENHANCED_COC\n");
+ return ENOTSUP;
+#endif
+}