also provide rfcomm_register_service_with_initial_credits

This commit is contained in:
matthias.ringwald 2011-09-11 18:57:03 +00:00
parent 8d3b3b9f90
commit 3b0467287d

View File

@ -314,6 +314,8 @@ static void rfcomm_channel_initialize(rfcomm_channel_t *channel, rfcomm_multiple
if (channel->max_frame_size > service->max_frame_size) { if (channel->max_frame_size > service->max_frame_size) {
channel->max_frame_size = service->max_frame_size; channel->max_frame_size = service->max_frame_size;
} }
channel->incoming_flow_control = service->incoming_flow_control;
channel->new_credits_incoming = service->incoming_initial_credits;
} else { } else {
// outgoing connection // outgoing connection
channel->outgoing = 1; channel->outgoing = 1;
@ -962,7 +964,7 @@ static void rfcomm_channel_packet_handler_uih(rfcomm_multiplexer_t *multiplexer,
&packet[payload_offset], size-payload_offset-1); &packet[payload_offset], size-payload_offset-1);
} }
// provide new credits to remote device, if no incoming flow control // automatically provide new credits to remote device, if no incoming flow control
if (!channel->incoming_flow_control && channel->credits_incoming < 5){ if (!channel->incoming_flow_control && channel->credits_incoming < 5){
channel->new_credits_incoming = 0x30; channel->new_credits_incoming = 0x30;
} }
@ -1642,9 +1644,9 @@ int rfcomm_send_internal(uint8_t rfcomm_cid, uint8_t *data, uint16_t len){
return result; return result;
} }
void rfcomm_create_channel_internal(void * connection, bd_addr_t *addr, uint8_t server_channel){ void rfcomm_create_channel2(void * connection, bd_addr_t *addr, uint8_t server_channel, uint8_t incoming_flow_control, uint8_t initial_credits){
log_info("rfcomm_create_channel_internal to %s, at channel #%02x, flow control %u, init credits %u\n", bd_addr_to_str(*addr), server_channel,
log_info("rfcomm_create_channel_internal to %s, at channel #%02x\n", bd_addr_to_str(*addr), server_channel); incoming_flow_control, initial_credits);
// create new multiplexer if necessary // create new multiplexer if necessary
rfcomm_multiplexer_t * multiplexer = rfcomm_multiplexer_for_addr(addr); rfcomm_multiplexer_t * multiplexer = rfcomm_multiplexer_for_addr(addr);
@ -1657,31 +1659,41 @@ void rfcomm_create_channel_internal(void * connection, bd_addr_t *addr, uint8_t
multiplexer->outgoing = 1; multiplexer->outgoing = 1;
multiplexer->state = RFCOMM_MULTIPLEXER_W4_CONNECT; multiplexer->state = RFCOMM_MULTIPLEXER_W4_CONNECT;
} }
// prepare channel // prepare channel
rfcomm_channel_t * channel = rfcomm_channel_create(multiplexer, 0, server_channel); rfcomm_channel_t * channel = rfcomm_channel_create(multiplexer, NULL, server_channel);
if (!channel){ if (!channel){
rfcomm_emit_channel_open_failed_outgoing_memory(connection, addr, server_channel); rfcomm_emit_channel_open_failed_outgoing_memory(connection, addr, server_channel);
return; return;
} }
channel->connection = connection; channel->connection = connection;
channel->incoming_flow_control = incoming_flow_control;
channel->new_credits_incoming = initial_credits;
// start multiplexer setup // start multiplexer setup
if (multiplexer->state != RFCOMM_MULTIPLEXER_OPEN) { if (multiplexer->state != RFCOMM_MULTIPLEXER_OPEN) {
channel->state = RFCOMM_CHANNEL_W4_MULTIPLEXER; channel->state = RFCOMM_CHANNEL_W4_MULTIPLEXER;
l2cap_create_channel_internal(connection, rfcomm_packet_handler, *addr, PSM_RFCOMM, l2cap_max_mtu()); l2cap_create_channel_internal(connection, rfcomm_packet_handler, *addr, PSM_RFCOMM, l2cap_max_mtu());
return; return;
} }
channel->state = RFCOMM_CHANNEL_SEND_UIH_PN; channel->state = RFCOMM_CHANNEL_SEND_UIH_PN;
// start connecting, if multiplexer is already up and running // start connecting, if multiplexer is already up and running
rfcomm_run(); rfcomm_run();
} }
void rfcomm_create_channel_with_initial_credits(void * connection, bd_addr_t *addr, uint8_t server_channel, uint8_t initial_credits){
rfcomm_create_channel2(connection, addr, server_channel, 1, initial_credits);
}
void rfcomm_create_channel_internal(void * connection, bd_addr_t *addr, uint8_t server_channel){
rfcomm_create_channel2(connection, addr, server_channel, 0, 0x30);
}
void rfcomm_disconnect_internal(uint16_t rfcomm_cid){ void rfcomm_disconnect_internal(uint16_t rfcomm_cid){
rfcomm_channel_t * channel = rfcomm_channel_for_rfcomm_cid(rfcomm_cid); rfcomm_channel_t * channel = rfcomm_channel_for_rfcomm_cid(rfcomm_cid);
if (channel) { if (channel) {
@ -1689,8 +1701,8 @@ void rfcomm_disconnect_internal(uint16_t rfcomm_cid){
} }
} }
void rfcomm_register_service_internal(void * connection, uint8_t channel, uint16_t max_frame_size){
void rfcomm_register_service2(void * connection, uint8_t channel, uint16_t max_frame_size, uint8_t incoming_flow_control, uint8_t initial_credits){
// check if already registered // check if already registered
rfcomm_service_t * service = rfcomm_service_for_channel(channel); rfcomm_service_t * service = rfcomm_service_for_channel(channel);
if (service){ if (service){
@ -1704,16 +1716,18 @@ void rfcomm_register_service_internal(void * connection, uint8_t channel, uint16
rfcomm_emit_service_registered(service->connection, BTSTACK_MEMORY_ALLOC_FAILED, channel); rfcomm_emit_service_registered(service->connection, BTSTACK_MEMORY_ALLOC_FAILED, channel);
return; return;
} }
// register with l2cap if not registered before, max MTU // register with l2cap if not registered before, max MTU
if (linked_list_empty(&rfcomm_services)){ if (linked_list_empty(&rfcomm_services)){
l2cap_register_service_internal(NULL, rfcomm_packet_handler, PSM_RFCOMM, 0xffff); l2cap_register_service_internal(NULL, rfcomm_packet_handler, PSM_RFCOMM, 0xffff);
} }
// fill in // fill in
service->connection = connection; service->connection = connection;
service->server_channel = channel; service->server_channel = channel;
service->max_frame_size = max_frame_size; service->max_frame_size = max_frame_size;
service->incoming_flow_control = incoming_flow_control;
service->incoming_initial_credits = initial_credits;
// add to services list // add to services list
linked_list_add(&rfcomm_services, (linked_item_t *) service); linked_list_add(&rfcomm_services, (linked_item_t *) service);
@ -1722,6 +1736,14 @@ void rfcomm_register_service_internal(void * connection, uint8_t channel, uint16
rfcomm_emit_service_registered(service->connection, 0, channel); rfcomm_emit_service_registered(service->connection, 0, channel);
} }
void rfcomm_register_service_with_initial_credits(void * connection, uint8_t channel, uint16_t max_frame_size, uint8_t initial_credits){
rfcomm_register_service2(connection, channel, max_frame_size, 1, initial_credits);
}
void rfcomm_register_service_internal(void * connection, uint8_t channel, uint16_t max_frame_size){
rfcomm_register_service2(connection, channel, max_frame_size, 0, 0x30);
}
void rfcomm_unregister_service_internal(uint8_t service_channel){ void rfcomm_unregister_service_internal(uint8_t service_channel){
rfcomm_service_t *service = rfcomm_service_for_channel(service_channel); rfcomm_service_t *service = rfcomm_service_for_channel(service_channel);
if (!service) return; if (!service) return;