static void sdpc_trysend() { uint8_t buf[128]; if (state != SENDING) return; if (!l2cap_cid) return; if (!l2cap_can_send_packet_now(l2cap_cid)) return; buf[0] = SDP_ServiceSearchAttributeRequest; net_store_16(buf, 1, transitionid++); uint8_t *param = &buf[5]; de_create_sequence(param); de_add_number(param, DE_UUID, DE_SIZE_16, serviceids[current_server]); uint16_t size = de_get_len(param); net_store_16(param, size, 30); // max length is 30 bytes size+=2; de_create_sequence(param + size); //de_add_number(param + size, DE_UINT, DE_SIZE_16, SDP_ServiceClassIDList); de_add_number(param + size, DE_UINT, DE_SIZE_16, SDP_ProtocolDescriptorList); size += de_get_len(param + size); param[size++] = 0; net_store_16(buf, 3, size); hexdump(buf, size + 5); int err = l2cap_send_internal(l2cap_cid, buf, size + 5); if (!err) { state = RECV; log_info("sdp request sent.\n"); } else { log_info("sdpc_trysend l2cap_send_internal error: %d\n", err); } }
static void sdp_try_respond(void) { if (!sdp_response_size ) return; if (!l2cap_cid) return; if (!l2cap_can_send_packet_now(l2cap_cid)) return; // update state before sending packet (avoid getting called when new l2cap credit gets emitted) uint16_t size = sdp_response_size; sdp_response_size = 0; l2cap_send_internal(l2cap_cid, sdp_response_buffer, size); }
static int can_send_now(uint16_t channel){ if (sdp_client_state != W2_SEND) return 0; if (!l2cap_can_send_packet_now(channel)) return 0; return 1; }