blob: 0fa068188205ed486faa3ccc742dd660348090d1 [file] [log] [blame]
/*
* 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 "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;
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;
}
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, accept_response);
if (rc) {
console_printf("Server create error: 0x%02x", rc);
}
return 0;
}
/*****************************************************************************
* $l2cap-connect *
*****************************************************************************/
int
cmd_l2cap_connect(int argc, char **argv)
{
uint16_t conn = 0;
uint16_t psm = 0;
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;
}
return btshell_l2cap_connect(conn, psm);
}
/*****************************************************************************
* $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;
}