l2cap.c (f32b992e39a13d8c9dd57e49b105856b617efe25) l2cap.c (38e5900edab6d6f4185c46c15f3c021bfbd9781c)
1/*
2 * l2cap.c
3 *
4 * Logical Link Control and Adaption Protocl (L2CAP)
5 *
6 * Created by Matthias Ringwald on 5/16/09.
7 */
8

--- 157 unchanged lines hidden (view full) ---

166
167 (*event_packet_handler)(packet, size);
168}
169
170void l2cap_signaling_handler(l2cap_channel_t *channel, uint8_t *packet, uint16_t size){
171
172 static uint8_t config_options[] = { 1, 2, 150, 0}; // mtu = 48
173
1/*
2 * l2cap.c
3 *
4 * Logical Link Control and Adaption Protocl (L2CAP)
5 *
6 * Created by Matthias Ringwald on 5/16/09.
7 */
8

--- 157 unchanged lines hidden (view full) ---

166
167 (*event_packet_handler)(packet, size);
168}
169
170void l2cap_signaling_handler(l2cap_channel_t *channel, uint8_t *packet, uint16_t size){
171
172 static uint8_t config_options[] = { 1, 2, 150, 0}; // mtu = 48
173
174 uint8_t code = READ_L2CAP_SIGNALING_CODE( packet );
175 uint8_t identifier = READ_L2CAP_SIGNALING_IDENTIFIER( packet );
174 uint8_t code = READ_L2CAP_SIGNALING_CODE( packet );
175 uint8_t identifier = READ_L2CAP_SIGNALING_IDENTIFIER( packet );
176 uint16_t result = 0;
176
177 switch (channel->state) {
178
179 case L2CAP_STATE_WAIT_CONNECT_RSP:
180 switch (code){
181 case CONNECTION_RESPONSE:
177
178 switch (channel->state) {
179
180 case L2CAP_STATE_WAIT_CONNECT_RSP:
181 switch (code){
182 case CONNECTION_RESPONSE:
182 if ( READ_BT_16 (packet, L2CAP_SIGNALING_DATA_OFFSET+3) == 0){
183 // successfull connection
184 channel->dest_cid = READ_BT_16(packet, L2CAP_SIGNALING_DATA_OFFSET + 0);
185 channel->sig_id = l2cap_next_sig_id();
186 l2cap_send_signaling_packet(channel->handle, CONFIGURE_REQUEST, channel->sig_id, channel->dest_cid, 0, 4, &config_options);
187 channel->state = L2CAP_STATE_WAIT_CONFIG_REQ_RSP;
188 } else {
189 // map l2cap connection response result to BTstack status enumeration
190 l2cap_emit_channel_opened(channel, L2CAP_CONNECTION_RESPONSE_RESULT_SUCCESSFUL
191 + READ_BT_16 (packet, L2CAP_SIGNALING_DATA_OFFSET+3));
183 result = READ_BT_16 (packet, L2CAP_SIGNALING_DATA_OFFSET+3);
184 switch (result) {
185 case 0:
186 // successfull connection
187 channel->dest_cid = READ_BT_16(packet, L2CAP_SIGNALING_DATA_OFFSET + 0);
188 channel->sig_id = l2cap_next_sig_id();
189 l2cap_send_signaling_packet(channel->handle, CONFIGURE_REQUEST, channel->sig_id, channel->dest_cid, 0, 4, &config_options);
190 channel->state = L2CAP_STATE_WAIT_CONFIG_REQ_RSP;
191 break;
192 case 1:
193 // connection pending. get some coffee
194 break;
195 default:
196 // map l2cap connection response result to BTstack status enumeration
197 l2cap_emit_channel_opened(channel, L2CAP_CONNECTION_RESPONSE_RESULT_SUCCESSFUL + result);
198 break;
192 }
193 break;
199 }
200 break;
201
202 default:
194 //@TODO: implement other signaling packets
203 //@TODO: implement other signaling packets
204 break;
195 }
196 break;
197
198 case L2CAP_STATE_WAIT_CONFIG_REQ_RSP:
199 switch (code) {
200 case CONFIGURE_RESPONSE:
201 channel->state = L2CAP_STATE_WAIT_CONFIG_REQ;
202 break;

--- 154 unchanged lines hidden ---
205 }
206 break;
207
208 case L2CAP_STATE_WAIT_CONFIG_REQ_RSP:
209 switch (code) {
210 case CONFIGURE_RESPONSE:
211 channel->state = L2CAP_STATE_WAIT_CONFIG_REQ;
212 break;

--- 154 unchanged lines hidden ---