xref: /nrf52832-nimble/packages/NimBLE-latest/apps/btshell/src/cmd_l2cap.c (revision 042d53a763ad75cb1465103098bb88c245d95138)
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, &params);
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