1*042d53a7SEvalZero /*
2*042d53a7SEvalZero * Licensed to the Apache Software Foundation (ASF) under one
3*042d53a7SEvalZero * or more contributor license agreements. See the NOTICE file
4*042d53a7SEvalZero * distributed with this work for additional information
5*042d53a7SEvalZero * regarding copyright ownership. The ASF licenses this file
6*042d53a7SEvalZero * to you under the Apache License, Version 2.0 (the
7*042d53a7SEvalZero * "License"); you may not use this file except in compliance
8*042d53a7SEvalZero * with the License. You may obtain a copy of the License at
9*042d53a7SEvalZero *
10*042d53a7SEvalZero * http://www.apache.org/licenses/LICENSE-2.0
11*042d53a7SEvalZero *
12*042d53a7SEvalZero * Unless required by applicable law or agreed to in writing,
13*042d53a7SEvalZero * software distributed under the License is distributed on an
14*042d53a7SEvalZero * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15*042d53a7SEvalZero * KIND, either express or implied. See the License for the
16*042d53a7SEvalZero * specific language governing permissions and limitations
17*042d53a7SEvalZero * under the License.
18*042d53a7SEvalZero */
19*042d53a7SEvalZero
20*042d53a7SEvalZero #include <inttypes.h>
21*042d53a7SEvalZero #include <errno.h>
22*042d53a7SEvalZero
23*042d53a7SEvalZero #include "host/ble_gap.h"
24*042d53a7SEvalZero #include "host/ble_l2cap.h"
25*042d53a7SEvalZero #include "btshell.h"
26*042d53a7SEvalZero #include "cmd.h"
27*042d53a7SEvalZero #include "cmd_l2cap.h"
28*042d53a7SEvalZero
29*042d53a7SEvalZero #include "nimble/npl_shell.h"
30*042d53a7SEvalZero
31*042d53a7SEvalZero /*****************************************************************************
32*042d53a7SEvalZero * $l2cap-update *
33*042d53a7SEvalZero *****************************************************************************/
34*042d53a7SEvalZero
35*042d53a7SEvalZero int
cmd_l2cap_update(int argc,char ** argv)36*042d53a7SEvalZero cmd_l2cap_update(int argc, char **argv)
37*042d53a7SEvalZero {
38*042d53a7SEvalZero struct ble_l2cap_sig_update_params params;
39*042d53a7SEvalZero uint16_t conn_handle;
40*042d53a7SEvalZero int rc;
41*042d53a7SEvalZero
42*042d53a7SEvalZero rc = parse_arg_all(argc - 1, argv + 1);
43*042d53a7SEvalZero if (rc != 0) {
44*042d53a7SEvalZero return rc;
45*042d53a7SEvalZero }
46*042d53a7SEvalZero
47*042d53a7SEvalZero conn_handle = parse_arg_uint16("conn", &rc);
48*042d53a7SEvalZero if (rc != 0) {
49*042d53a7SEvalZero console_printf("invalid 'conn' parameter\n");
50*042d53a7SEvalZero return rc;
51*042d53a7SEvalZero }
52*042d53a7SEvalZero
53*042d53a7SEvalZero params.itvl_min = parse_arg_uint16_dflt("interval_min",
54*042d53a7SEvalZero BLE_GAP_INITIAL_CONN_ITVL_MIN,
55*042d53a7SEvalZero &rc);
56*042d53a7SEvalZero if (rc != 0) {
57*042d53a7SEvalZero console_printf("invalid 'interval_min' parameter\n");
58*042d53a7SEvalZero return rc;
59*042d53a7SEvalZero }
60*042d53a7SEvalZero
61*042d53a7SEvalZero params.itvl_max = parse_arg_uint16_dflt("interval_max",
62*042d53a7SEvalZero BLE_GAP_INITIAL_CONN_ITVL_MAX,
63*042d53a7SEvalZero &rc);
64*042d53a7SEvalZero if (rc != 0) {
65*042d53a7SEvalZero console_printf("invalid 'interval_max' parameter\n");
66*042d53a7SEvalZero return rc;
67*042d53a7SEvalZero }
68*042d53a7SEvalZero
69*042d53a7SEvalZero params.slave_latency = parse_arg_uint16_dflt("latency", 0, &rc);
70*042d53a7SEvalZero if (rc != 0) {
71*042d53a7SEvalZero console_printf("invalid 'latency' parameter\n");
72*042d53a7SEvalZero return rc;
73*042d53a7SEvalZero }
74*042d53a7SEvalZero
75*042d53a7SEvalZero params.timeout_multiplier = parse_arg_uint16_dflt("timeout", 0x0100, &rc);
76*042d53a7SEvalZero if (rc != 0) {
77*042d53a7SEvalZero console_printf("invalid 'timeout' parameter\n");
78*042d53a7SEvalZero return rc;
79*042d53a7SEvalZero }
80*042d53a7SEvalZero
81*042d53a7SEvalZero rc = btshell_l2cap_update(conn_handle, ¶ms);
82*042d53a7SEvalZero if (rc != 0) {
83*042d53a7SEvalZero console_printf("error txing l2cap update; rc=%d\n", rc);
84*042d53a7SEvalZero return rc;
85*042d53a7SEvalZero }
86*042d53a7SEvalZero
87*042d53a7SEvalZero return 0;
88*042d53a7SEvalZero }
89*042d53a7SEvalZero
90*042d53a7SEvalZero /*****************************************************************************
91*042d53a7SEvalZero * $l2cap-create-server *
92*042d53a7SEvalZero *****************************************************************************/
93*042d53a7SEvalZero
94*042d53a7SEvalZero int
cmd_l2cap_create_server(int argc,char ** argv)95*042d53a7SEvalZero cmd_l2cap_create_server(int argc, char **argv)
96*042d53a7SEvalZero {
97*042d53a7SEvalZero uint16_t psm = 0;
98*042d53a7SEvalZero int error;
99*042d53a7SEvalZero int accept_response = 0;
100*042d53a7SEvalZero int rc;
101*042d53a7SEvalZero
102*042d53a7SEvalZero rc = parse_arg_all(argc - 1, argv + 1);
103*042d53a7SEvalZero if (rc != 0) {
104*042d53a7SEvalZero return rc;
105*042d53a7SEvalZero }
106*042d53a7SEvalZero
107*042d53a7SEvalZero psm = parse_arg_uint16("psm", &rc);
108*042d53a7SEvalZero if (rc != 0) {
109*042d53a7SEvalZero console_printf("invalid 'psm' parameter\n");
110*042d53a7SEvalZero return rc;
111*042d53a7SEvalZero }
112*042d53a7SEvalZero
113*042d53a7SEvalZero error = parse_arg_uint32_dflt("error", 0, &rc);
114*042d53a7SEvalZero if (rc != 0) {
115*042d53a7SEvalZero console_printf("invalid 'error' parameter\n");
116*042d53a7SEvalZero return rc;
117*042d53a7SEvalZero }
118*042d53a7SEvalZero
119*042d53a7SEvalZero switch (error) {
120*042d53a7SEvalZero case 1:
121*042d53a7SEvalZero accept_response = BLE_HS_EAUTHEN;
122*042d53a7SEvalZero break;
123*042d53a7SEvalZero case 2:
124*042d53a7SEvalZero accept_response = BLE_HS_EAUTHOR;
125*042d53a7SEvalZero break;
126*042d53a7SEvalZero case 3:
127*042d53a7SEvalZero accept_response = BLE_HS_EENCRYPT_KEY_SZ;
128*042d53a7SEvalZero break;
129*042d53a7SEvalZero }
130*042d53a7SEvalZero
131*042d53a7SEvalZero rc = btshell_l2cap_create_srv(psm, accept_response);
132*042d53a7SEvalZero if (rc) {
133*042d53a7SEvalZero console_printf("Server create error: 0x%02x", rc);
134*042d53a7SEvalZero }
135*042d53a7SEvalZero
136*042d53a7SEvalZero return 0;
137*042d53a7SEvalZero }
138*042d53a7SEvalZero
139*042d53a7SEvalZero /*****************************************************************************
140*042d53a7SEvalZero * $l2cap-connect *
141*042d53a7SEvalZero *****************************************************************************/
142*042d53a7SEvalZero
143*042d53a7SEvalZero int
cmd_l2cap_connect(int argc,char ** argv)144*042d53a7SEvalZero cmd_l2cap_connect(int argc, char **argv)
145*042d53a7SEvalZero {
146*042d53a7SEvalZero uint16_t conn = 0;
147*042d53a7SEvalZero uint16_t psm = 0;
148*042d53a7SEvalZero int rc;
149*042d53a7SEvalZero
150*042d53a7SEvalZero rc = parse_arg_all(argc - 1, argv + 1);
151*042d53a7SEvalZero if (rc != 0) {
152*042d53a7SEvalZero return rc;
153*042d53a7SEvalZero }
154*042d53a7SEvalZero
155*042d53a7SEvalZero conn = parse_arg_uint16("conn", &rc);
156*042d53a7SEvalZero if (rc != 0) {
157*042d53a7SEvalZero console_printf("invalid 'conn' parameter\n");
158*042d53a7SEvalZero return rc;
159*042d53a7SEvalZero }
160*042d53a7SEvalZero
161*042d53a7SEvalZero psm = parse_arg_uint16("psm", &rc);
162*042d53a7SEvalZero if (rc != 0) {
163*042d53a7SEvalZero console_printf("invalid 'psm' parameter\n");
164*042d53a7SEvalZero return rc;
165*042d53a7SEvalZero }
166*042d53a7SEvalZero
167*042d53a7SEvalZero return btshell_l2cap_connect(conn, psm);
168*042d53a7SEvalZero }
169*042d53a7SEvalZero
170*042d53a7SEvalZero /*****************************************************************************
171*042d53a7SEvalZero * $l2cap-disconnect *
172*042d53a7SEvalZero *****************************************************************************/
173*042d53a7SEvalZero
174*042d53a7SEvalZero int
cmd_l2cap_disconnect(int argc,char ** argv)175*042d53a7SEvalZero cmd_l2cap_disconnect(int argc, char **argv)
176*042d53a7SEvalZero {
177*042d53a7SEvalZero uint16_t conn;
178*042d53a7SEvalZero uint16_t idx;
179*042d53a7SEvalZero int rc;
180*042d53a7SEvalZero
181*042d53a7SEvalZero rc = parse_arg_all(argc - 1, argv + 1);
182*042d53a7SEvalZero if (rc != 0) {
183*042d53a7SEvalZero return rc;
184*042d53a7SEvalZero }
185*042d53a7SEvalZero
186*042d53a7SEvalZero conn = parse_arg_uint16("conn", &rc);
187*042d53a7SEvalZero if (rc != 0) {
188*042d53a7SEvalZero console_printf("invalid 'conn' parameter\n");
189*042d53a7SEvalZero return rc;
190*042d53a7SEvalZero }
191*042d53a7SEvalZero
192*042d53a7SEvalZero idx = parse_arg_uint16("idx", &rc);
193*042d53a7SEvalZero if (rc != 0) {
194*042d53a7SEvalZero console_printf("invalid 'idx' parameter\n");
195*042d53a7SEvalZero return rc;
196*042d53a7SEvalZero }
197*042d53a7SEvalZero
198*042d53a7SEvalZero return btshell_l2cap_disconnect(conn, idx);
199*042d53a7SEvalZero }
200*042d53a7SEvalZero
201*042d53a7SEvalZero /*****************************************************************************
202*042d53a7SEvalZero * $l2cap-send *
203*042d53a7SEvalZero *****************************************************************************/
204*042d53a7SEvalZero
205*042d53a7SEvalZero int
cmd_l2cap_send(int argc,char ** argv)206*042d53a7SEvalZero cmd_l2cap_send(int argc, char **argv)
207*042d53a7SEvalZero {
208*042d53a7SEvalZero uint16_t conn;
209*042d53a7SEvalZero uint16_t idx;
210*042d53a7SEvalZero uint16_t bytes;
211*042d53a7SEvalZero int rc;
212*042d53a7SEvalZero
213*042d53a7SEvalZero rc = parse_arg_all(argc - 1, argv + 1);
214*042d53a7SEvalZero if (rc != 0) {
215*042d53a7SEvalZero return rc;
216*042d53a7SEvalZero }
217*042d53a7SEvalZero
218*042d53a7SEvalZero conn = parse_arg_uint16("conn", &rc);
219*042d53a7SEvalZero if (rc != 0) {
220*042d53a7SEvalZero console_printf("invalid 'conn' parameter\n");
221*042d53a7SEvalZero return rc;
222*042d53a7SEvalZero }
223*042d53a7SEvalZero
224*042d53a7SEvalZero idx = parse_arg_uint16("idx", &rc);
225*042d53a7SEvalZero if (rc != 0) {
226*042d53a7SEvalZero console_printf("invalid 'idx' parameter\n");
227*042d53a7SEvalZero return rc;
228*042d53a7SEvalZero }
229*042d53a7SEvalZero
230*042d53a7SEvalZero bytes = parse_arg_uint16("bytes", &rc);
231*042d53a7SEvalZero if (rc != 0) {
232*042d53a7SEvalZero console_printf("invalid 'bytes' parameter\n");
233*042d53a7SEvalZero return rc;
234*042d53a7SEvalZero }
235*042d53a7SEvalZero
236*042d53a7SEvalZero return btshell_l2cap_send(conn, idx, bytes);
237*042d53a7SEvalZero }
238*042d53a7SEvalZero
239*042d53a7SEvalZero int
cmd_l2cap_show_coc(int argc,char ** argv)240*042d53a7SEvalZero cmd_l2cap_show_coc(int argc, char **argv)
241*042d53a7SEvalZero {
242*042d53a7SEvalZero struct btshell_conn *conn = NULL;
243*042d53a7SEvalZero struct btshell_l2cap_coc *coc;
244*042d53a7SEvalZero int i, j;
245*042d53a7SEvalZero
246*042d53a7SEvalZero for (i = 0; i < btshell_num_conns; i++) {
247*042d53a7SEvalZero conn = btshell_conns + i;
248*042d53a7SEvalZero
249*042d53a7SEvalZero if (SLIST_EMPTY(&conn->coc_list)) {
250*042d53a7SEvalZero continue;
251*042d53a7SEvalZero }
252*042d53a7SEvalZero
253*042d53a7SEvalZero console_printf("conn_handle: 0x%04x\n", conn->handle);
254*042d53a7SEvalZero j = 0;
255*042d53a7SEvalZero SLIST_FOREACH(coc, &conn->coc_list, next) {
256*042d53a7SEvalZero console_printf(" idx: %i, chan pointer = %p\n", j++, coc->chan);
257*042d53a7SEvalZero }
258*042d53a7SEvalZero }
259*042d53a7SEvalZero
260*042d53a7SEvalZero return 0;
261*042d53a7SEvalZero }
262