public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
* [Bluez-devel] Problem automatic flush timeout
@ 2008-08-22  2:41 Jui-Hao Chiang
  2008-08-22 14:03 ` Jui-Hao Chiang
  2008-08-23 19:33 ` [Bluez-devel] [Patch] Flush Occurred Event Jui-Hao Chiang
  0 siblings, 2 replies; 5+ messages in thread
From: Jui-Hao Chiang @ 2008-08-22  2:41 UTC (permalink / raw)
  To: bluez-devel

Hi,
Is there a way to simulate unreliable L2CAP socket in a client-server scenario?
(two PCs, each with single adapter; client sends 48 bytes packet to server every
1 second)
After establishing a L2CAP between two adapters, I tried to set the "automatic
flush timeout" on the client adapter with timeout to be 2. The hci_send_req is
successful, but after 7 to 8 seconds, the server adapter stops to receive any
data while client socket is still sending data. If I set it timeout to 4, then
everything is fine.

What I am imagining is "some data on client adapter may be flushed, but the
later packet should continue to be sent to server adapter".
Am I doing something wrong?

    // build a command packet to send to the bluetooth microcontroller
    cmd_param.handle = connection_handle;
    cmd_param.flush_timeout = htobs(timeout);
    rq.ogf = OGF_HOST_CTL;
    rq.ocf = 0x28;
    rq.cparam = &cmd_param;
    rq.clen = sizeof(cmd_param);
    rq.rparam = &cmd_response;
    rq.rlen = sizeof(cmd_response);
    rq.event = EVT_CMD_COMPLETE;

    // send the command and wait for the response
    err = hci_send_req( dd, &rq, 0 );
    if( err ) goto cleanup;



-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Bluez-devel] Problem automatic flush timeout
  2008-08-22  2:41 [Bluez-devel] Problem automatic flush timeout Jui-Hao Chiang
@ 2008-08-22 14:03 ` Jui-Hao Chiang
  2008-08-23 19:33 ` [Bluez-devel] [Patch] Flush Occurred Event Jui-Hao Chiang
  1 sibling, 0 replies; 5+ messages in thread
From: Jui-Hao Chiang @ 2008-08-22 14:03 UTC (permalink / raw)
  To: bluez-devel

Hi,
What I found in net/bluetooth/hci_core.c and net/bluetooth/hci_event.c are
(1) the "Flush Occured Event" (ocf 0x11) is not handled in hci_event
(2) while the user socket keeps pushing the data via 
l2cap_sock_sendmsg->l2cap_do_send->hci_send_acl
->hci_sched_tx->hci_tx_task->hci_sched_acl

Eventually it stops in hci_sched_acl when checking hdev->acl_cnt.
I consider that hdev->acl_cnt means: "the number of ACL packet we can push to
hci_usb".

Thus, I think the possible way to handle this event is to
(1) add in "include/net/bluetooth/hci.h"
#define HCI_EV_FLUSH_OCCURED 0x11
(2) catch the event in hci_event_packet, and do the following (same as
hci_num_comp_pkts_evt)
if ((++ hdev->acl_cnt) > hdev->acl_pkts) hdev->acl_cnt = hdev->acl_pkts;
(3) decrement the conn->sent by
atomic_sub(count, &conn->sent);

Please correct me if I am wrong.

Jui-Hao


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bluez-devel] [Patch] Flush Occurred Event
  2008-08-22  2:41 [Bluez-devel] Problem automatic flush timeout Jui-Hao Chiang
  2008-08-22 14:03 ` Jui-Hao Chiang
@ 2008-08-23 19:33 ` Jui-Hao Chiang
  2008-08-23 20:22   ` Marcel Holtmann
  1 sibling, 1 reply; 5+ messages in thread
From: Jui-Hao Chiang @ 2008-08-23 19:33 UTC (permalink / raw)
  To: bluez-devel

>
The following is a patch against 2.6.22 kernel to catch HCI "Flush Occurred"
event. (meaningful for ACL; useless for SCO)

One more thing to NOTICE is that the handle in the event packet from my adapter
seems to be "Big Endian", so that I use ntohs to convert it.
Normally it should be __le16_to_cpu(ev->handle)

diff -r linux-source-2.6.22/include/net/bluetooth/hci_core.h
patch-2.6.22/include/net/bluetooth/hci_core.h
27a28
> 
diff -r linux-source-2.6.22/include/net/bluetooth/hci.h
patch-2.6.22/include/net/bluetooth/hci.h
587a588,595
> /* Flush Occurred Event JuiHao --*/
> #define HCI_EV_FLUSH_OCCURRED	0x11
> #define NUM_OF_FLUSH_PKT	0x1
> struct hci_ev_flush_occurred {
> 	__le16   handle;
> } __attribute__ ((packed));
> /* --Flush Occurred Event JuiHao */
> 
diff -r linux-source-2.6.22/net/bluetooth/hci_event.c
patch-2.6.22/net/bluetooth/hci_event.c
854a855,882
> /* Flush Occurred packet JuiHao*/
> static inline void hci_flush_occurred_evt(struct hci_dev *hdev, struct sk_buff
*skb)
> {
> 	struct hci_ev_flush_occurred *ev = (struct hci_ev_flush_occurred *) skb->data;
> 	struct hci_conn *conn;
> 	
> 	tasklet_disable(&hdev->tx_task);
> 
> 	BT_DBG("handle is %x, skb->len %d\n", ev->handle, skb->len);	
> 
> 	/* The handle returned is probably Big Endian such that  __le16_to_cpu is
useless*/
> 	conn = hci_conn_hash_lookup_handle(hdev, ntohs(ev->handle));
> 
> 	if (conn) {
> 		atomic_sub(NUM_OF_FLUSH_PKT, &conn->sent);
> 
> 		if (conn->type == ACL_LINK) {
> 			if ((hdev->acl_cnt += NUM_OF_FLUSH_PKT) > hdev->acl_pkts)
> 				hdev->acl_cnt = hdev->acl_pkts;
> 		}
> 		BT_DBG("conn %p type %d hdev->acl_cnt %d conn->sent %d",
> 			conn, conn->type, hdev->acl_cnt, atomic_read(&conn->sent));
> 	}
> 	hci_sched_tx(hdev);
> 
> 	tasklet_enable(&hdev->tx_task);
> }
> 
1289a1318,1322
> 	/* handle Flush Occurred Event JuiHao --*/
> 	case HCI_EV_FLUSH_OCCURRED:
> 		hci_flush_occurred_evt(hdev, skb);
> 		break;	
> 	/* -- handle Flush Occurred Event JuiHao */

Bests,
Jui-Hao


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Bluez-devel] [Patch] Flush Occurred Event
  2008-08-23 19:33 ` [Bluez-devel] [Patch] Flush Occurred Event Jui-Hao Chiang
@ 2008-08-23 20:22   ` Marcel Holtmann
  2008-08-23 21:13     ` Jui-Hao Chiang
  0 siblings, 1 reply; 5+ messages in thread
From: Marcel Holtmann @ 2008-08-23 20:22 UTC (permalink / raw)
  To: BlueZ development

Hi,

> The following is a patch against 2.6.22 kernel to catch HCI "Flush Occurred"
> event. (meaningful for ACL; useless for SCO)
> 
> One more thing to NOTICE is that the handle in the event packet from my adapter
> seems to be "Big Endian", so that I use ntohs to convert it.
> Normally it should be __le16_to_cpu(ev->handle)

against 2.6.27-rc4 please and in unified diff format. I am not even
going to bother reading context diffs.

Regards

Marcel



-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Bluez-devel] [Patch] Flush Occurred Event
  2008-08-23 20:22   ` Marcel Holtmann
@ 2008-08-23 21:13     ` Jui-Hao Chiang
  0 siblings, 0 replies; 5+ messages in thread
From: Jui-Hao Chiang @ 2008-08-23 21:13 UTC (permalink / raw)
  To: bluez-devel

Hi, Marcel, please see if it is ok
Marcel Holtmann <marcel <at> holtmann.org> writes:

> 
> against 2.6.27-rc4 please and in unified diff format. I am not even
> going to bother reading context diffs.
> 
> Regards
> 
> Marcel

diff -ru orig/include/net/bluetooth/hci.h new/include/net/bluetooth/hci.h
--- orig/include/net/bluetooth/hci.h	2008-08-23 11:42:08.000000000 -0400
+++ new/include/net/bluetooth/hci.h	2008-08-23 11:44:22.000000000 -0400
@@ -682,6 +682,12 @@
 	__le16   opcode;
 } __attribute__ ((packed));
 
+#define HCI_EV_FLUSH_OCCURRED   0x11
+#define NUM_OF_FLUSH_PKT        0x1
+struct hci_ev_flush_occurred {
+        __le16   handle;
+} __attribute__ ((packed));
+
 #define HCI_EV_ROLE_CHANGE		0x12
 struct hci_ev_role_change {
 	__u8     status;
diff -ru orig/net/bluetooth/hci_event.c new/net/bluetooth/hci_event.c
--- orig/net/bluetooth/hci_event.c	2008-08-23 11:42:12.000000000 -0400
+++ new/net/bluetooth/hci_event.c	2008-08-23 11:50:36.000000000 -0400
@@ -1398,6 +1398,32 @@
 	hci_dev_unlock(hdev);
 }
 
+static inline void hci_flush_occurred_evt(struct hci_dev *hdev, struct sk_buff
*skb)
+{
+	struct hci_ev_flush_occurred *ev = (struct hci_ev_flush_occurred *) skb->data;
+	struct hci_conn *conn;
+	
+	tasklet_disable(&hdev->tx_task);
+
+	BT_DBG("handle is %x, skb->len %d\n", ev->handle, skb->len);	
+
+	conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
+
+	if (conn) {
+		atomic_sub(NUM_OF_FLUSH_PKT, &conn->sent);
+
+		if (conn->type == ACL_LINK) {
+			if ((hdev->acl_cnt += NUM_OF_FLUSH_PKT) > hdev->acl_pkts)
+				hdev->acl_cnt = hdev->acl_pkts;
+		}
+		BT_DBG("conn %p type %d hdev->acl_cnt %d conn->sent %d",
+			conn, conn->type, hdev->acl_cnt, atomic_read(&conn->sent));
+	}
+	hci_sched_tx(hdev);
+
+	tasklet_enable(&hdev->tx_task);
+}
+
 static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
 {
 	struct hci_ev_num_comp_pkts *ev = (void *) skb->data;
@@ -1894,6 +1920,10 @@
 		hci_remote_host_features_evt(hdev, skb);
 		break;
 
+	case HCI_EV_FLUSH_OCCURRED:
+		hci_flush_occurred_evt(hdev, skb);
+		break;	
+
 	default:
 		BT_DBG("%s event 0x%x", hdev->name, event);
 		break;


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Bluez-devel mailing list
Bluez-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bluez-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2008-08-23 21:13 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-22  2:41 [Bluez-devel] Problem automatic flush timeout Jui-Hao Chiang
2008-08-22 14:03 ` Jui-Hao Chiang
2008-08-23 19:33 ` [Bluez-devel] [Patch] Flush Occurred Event Jui-Hao Chiang
2008-08-23 20:22   ` Marcel Holtmann
2008-08-23 21:13     ` Jui-Hao Chiang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox