respond to L2CAP ECHO_REQUEST and INFORMATION_REQUEST

This commit is contained in:
matthias.ringwald 2010-05-25 20:01:46 +00:00
parent ddce1d8d00
commit 4da22db5dc

View File

@ -583,20 +583,49 @@ void l2cap_acl_handler( uint8_t *packet, uint16_t size ){
// Signaling Packet? // Signaling Packet?
if (channel_id == 1) { if (channel_id == 1) {
if (code < 1 || code >= 8){ if (code < 1 || code == ECHO_RESPONSE || code > INFORMATION_REQUEST){
// not for a particular channel, and not CONNECTION_REQUEST // not for a particular channel, and not CONNECTION_REQUEST, ECHO_[REQUEST|RESPONSE], INFORMATION_REQUEST
return; return;
} }
// Get Signaling Identifier // Get Signaling Identifier
uint8_t sig_id = READ_L2CAP_SIGNALING_IDENTIFIER(packet); uint8_t sig_id = READ_L2CAP_SIGNALING_IDENTIFIER(packet);
// CONNECTION_REQUEST // handle general requests
if (code == CONNECTION_REQUEST){ switch(code) {
uint16_t psm = READ_BT_16(packet, L2CAP_SIGNALING_DATA_OFFSET);
uint16_t source_cid = READ_BT_16(packet, L2CAP_SIGNALING_DATA_OFFSET+2); case CONNECTION_REQUEST: {
l2cap_handle_connection_request(handle, sig_id, psm, source_cid); uint16_t psm = READ_BT_16(packet, L2CAP_SIGNALING_DATA_OFFSET);
return; uint16_t source_cid = READ_BT_16(packet, L2CAP_SIGNALING_DATA_OFFSET+2);
l2cap_handle_connection_request(handle, sig_id, psm, source_cid);
return;
}
case ECHO_REQUEST: {
// send back packet
uint16_t len = READ_BT_16(packet, L2CAP_SIGNALING_DATA_OFFSET);
l2cap_send_signaling_packet(handle, ECHO_RESPONSE, sig_id,
size - L2CAP_SIGNALING_DATA_OFFSET,
&packet[L2CAP_SIGNALING_DATA_OFFSET]);
return;
}
case INFORMATION_REQUEST: {
// we neither support connectionless L2CAP data nor support any flow control modes yet
uint16_t infoType = READ_BT_16(packet, L2CAP_SIGNALING_DATA_OFFSET);
if (infoType == 2) {
uint32_t features = 0;
// extended features request supported, however no features present
l2cap_send_signaling_packet(handle, INFORMATION_RESPONSE, sig_id, infoType, 0, 4, &features);
} else {
// all other types are not supported
l2cap_send_signaling_packet(handle, INFORMATION_RESPONSE, sig_id, infoType, 1, 0, NULL);
}
return;
}
default:
break;
} }
// Get potential destination CID // Get potential destination CID