Return-Path: Message-ID: <43526851.3030406@ruault.com> From: Charles-Edouard Ruault MIME-Version: 1.0 To: bluez-users@lists.sourceforge.net Content-Type: text/plain; charset=ISO-8859-1; format=flowed Subject: [Bluez-users] SEGV when searching for L2CAP port Sender: bluez-users-admin@lists.sourceforge.net Errors-To: bluez-users-admin@lists.sourceforge.net Reply-To: bluez-users@lists.sourceforge.net List-Unsubscribe: , List-Id: BlueZ users List-Post: List-Help: List-Subscribe: , List-Archive: Date: Sun, 16 Oct 2005 16:48:49 +0200 Hi All, I'm writing an app in C on linux using the latest bluez-libs (2.2.21 ). The app is very simple, it's seaching for service on a device using it's UUID and retrives the SDP port to be used to connect to the remote service. I'm kind of new to bluez programming so forgive me if i'm totally off tracks but here's what i'm doing : uint32_t addlistener_uuid_int[] = { 0xAAA2689C, 0xD711C01E, 0xB0006C9E, 0xEC763DD0 }; if (!(s = sdp_connect(src, dst, 0))) { printf("Failed to connect\n"); return ERROR; } sdp_uuid128_create(&svclass, &addlistener_uuid_int); srch = sdp_list_append(NULL, &svclass); uint32_t range = 0x0000ffff; attrs = sdp_list_append( NULL, &range ); err = sdp_service_search_attr_req( s, srch, SDP_ATTR_REQ_RANGE, attrs, &rsp); sdp_close(s); if (err) { printf("sdp_service_search_req failed : %d\n", err); return ERROR; } sdp_list_t *r = rsp; if ((r==NULL) || (r->next==NULL)) { printf("Empty service list ...\n"); return -1; } psm=sdp_get_proto_port(rsp, L2CAP_UUID); I'm getting a SEGV in the function sdp_get_proto_port. I've debugged into the function and i found that sdp_get_port crashes on the outlined line below because p->next does not contains a valid address, it contains 0x10008 which is the service record handler of the service i'm looking for. int sdp_get_proto_port(const sdp_list_t *list, int proto) { if (proto != L2CAP_UUID && proto != RFCOMM_UUID) { errno = EINVAL; return -1; } for (; list; list = list->next) { sdp_list_t *p; for (p = list->data; p; p = p->next) { sdp_data_t *seq = (sdp_data_t *) p->data; /// CRASH HERE BECAUSE p==0x10008 int port = __find_port(seq, proto); if (port) return port; } } return 0; } Here's what an hcidump of the transaction looks like: device: hci0 snap_len: 1028 filter: 0xffffffff < HCI Command: Create Connection (0x01|0x0005) plen 13 > HCI Event: Command Status (0x0f) plen 4 > HCI Event: Link Key Request (0x17) plen 6 < HCI Command: Link Key Request Reply (0x01|0x000b) plen 22 > HCI Event: Command Complete (0x0e) plen 10 > HCI Event: Connect Complete (0x03) plen 11 < ACL data: handle 6 flags 0x02 dlen 12 L2CAP(s): Connect req: psm 1 scid 0x0040 < HCI Command: Write Link Policy Settings (0x02|0x000d) plen 4 > HCI Event: Command Complete (0x0e) plen 6 > HCI Event: Max Slots Change (0x1b) plen 3 > HCI Event: Number of Completed Packets (0x13) plen 5 > ACL data: handle 6 flags 0x02 dlen 16 L2CAP(s): Connect rsp: dcid 0x0044 scid 0x0040 result 1 status 2 Connection pending - Authorization pending > ACL data: handle 6 flags 0x02 dlen 16 L2CAP(s): Connect rsp: dcid 0x0044 scid 0x0040 result 0 status 0 Connection successful < ACL data: handle 6 flags 0x02 dlen 12 L2CAP(s): Config req: dcid 0x0044 flags 0x00 clen 0 > ACL data: handle 6 flags 0x02 dlen 12 L2CAP(s): Config req: dcid 0x0040 flags 0x00 clen 0 < ACL data: handle 6 flags 0x02 dlen 14 L2CAP(s): Config rsp: scid 0x0044 flags 0x00 result 0 clen 0 Success > HCI Event: Number of Completed Packets (0x13) plen 5 > HCI Event: Number of Completed Packets (0x13) plen 5 > ACL data: handle 6 flags 0x02 dlen 14 L2CAP(s): Config rsp: scid 0x0040 flags 0x00 result 0 clen 0 Success < ACL data: handle 6 flags 0x02 dlen 38 L2CAP(d): cid 0x0044 len 34 [psm 1] SDP SSA Req: tid 0x0 len 0x1d pat uuid-128 9c68a2aa-1ec0-11d7-9e6c-00b0d03d76ec max 65535 aid(s) 0x0000 - 0xffff cont 00 > HCI Event: Number of Completed Packets (0x13) plen 5 > ACL data: handle 6 flags 0x02 dlen 105 L2CAP(d): cid 0x0040 len 101 [psm 1] SDP SSA Rsp: tid 0x0 len 0x60 count 93 record #0 aid 0x0000 (SrvRecHndl) uint 0x10008 aid 0x0001 (SrvClassIDList) < uuid-128 9c68a2aa-1ec0-11d7-9e6c-00b0d03d76ec > aid 0x0004 (ProtocolDescList) < < uuid-16 0x0100 (L2CAP) uint 0x1001 > > aid 0x0005 (BrwGrpList) uuid-16 0x1002 (PubBrwsGrp) aid 0x0006 (LangBaseAttrIDList) < uint 0x656e uint 0x6a uint 0x100 > aid 0x0100 (SrvName) str "AdListener" aid 0x4321 (unknown) str "Coucou" cont 00 < ACL data: handle 6 flags 0x02 dlen 12 L2CAP(s): Disconn req: dcid 0x0044 scid 0x0040 > HCI Event: Number of Completed Packets (0x13) plen 5 > ACL data: handle 6 flags 0x02 dlen 12 L2CAP(s): Disconn rsp: dcid 0x0044 scid 0x0040 < HCI Command: Disconnect (0x01|0x0006) plen 3 > HCI Event: Command Status (0x0f) plen 4 > HCI Event: Disconn Complete (0x05) plen 4 So my question is : What am i doing wrong ? What's the correct method to retrive the psm to use to connect to my L2CAP service ? Thanks in advance. Regards. -- Charles-Edouard Ruault PGP Key ID E4D2B80C ------------------------------------------------------- This SF.Net email is sponsored by: Power Architecture Resource Center: Free content, downloads, discussions, and more. http://solutions.newsforge.com/ibmarch.tmpl _______________________________________________ Bluez-users mailing list Bluez-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bluez-users