linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2/3] Replace hci_recv_fragment calls
@ 2010-06-01  6:54 GLOBAL/suraj
  0 siblings, 0 replies; 9+ messages in thread
From: GLOBAL/suraj @ 2010-06-01  6:54 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: marcel, Luis.Rodriguez, Jothikumar.Mothilal


Replace all usages of hci_recv_fragment calls with hci_recv_packet_fragment

Signed-off-by: suraj <suraj@Atheros.com>
---
 drivers/bluetooth/btusb.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 5d9cc53..50aa8d1 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -211,7 +211,7 @@ static void btusb_intr_complete(struct urb *urb)
 	if (urb->status == 0) {
 		hdev->stat.byte_rx += urb->actual_length;
 
-		if (hci_recv_fragment(hdev, HCI_EVENT_PKT,
+		if (hci_recv_packet_fragment(hdev, HCI_EVENT_PKT,
 						urb->transfer_buffer,
 						urb->actual_length) < 0) {
 			BT_ERR("%s corrupted event packet", hdev->name);
@@ -295,7 +295,7 @@ static void btusb_bulk_complete(struct urb *urb)
 	if (urb->status == 0) {
 		hdev->stat.byte_rx += urb->actual_length;
 
-		if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT,
+		if (hci_recv_packet_fragment(hdev, HCI_ACLDATA_PKT,
 						urb->transfer_buffer,
 						urb->actual_length) < 0) {
 			BT_ERR("%s corrupted ACL packet", hdev->name);
@@ -384,7 +384,7 @@ static void btusb_isoc_complete(struct urb *urb)
 
 			hdev->stat.byte_rx += length;
 
-			if (hci_recv_fragment(hdev, HCI_SCODATA_PKT,
+			if (hci_recv_packet_fragment(hdev, HCI_SCODATA_PKT,
 						urb->transfer_buffer + offset,
 								length) < 0) {
 				BT_ERR("%s corrupted SCO packet", hdev->name);
-- 
1.7.0

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

* [PATCH 1/3] Rename hci_recv_fragment to hci_recv_packet_fragment
@ 2010-06-01  8:04 suraj
  2010-06-01  8:08 ` [PATCH 2/3] Replace hci_recv_fragment calls suraj
  0 siblings, 1 reply; 9+ messages in thread
From: suraj @ 2010-06-01  8:04 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: marcel, Luis.Rodriguez, Jothikumar.Mothilal

Renaming hci_recv_fragment to hci_recv_packet_fragment as it will be used 
only for reassembling HCI fragments with know packet type.

Signed-off-by: suraj <suraj@Atheros.com>
---
 include/net/bluetooth/hci_core.h |    3 ++-
 net/bluetooth/hci_core.c         |    5 +++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index e42f6ed..65c3c13 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -427,7 +427,8 @@ int hci_inquiry(void __user *arg);
 void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
 
 int hci_recv_frame(struct sk_buff *skb);
-int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);
+int hci_recv_packet_fragment(struct hci_dev *hdev, int type, void *data,
+				int count);
 
 int hci_register_sysfs(struct hci_dev *hdev);
 void hci_unregister_sysfs(struct hci_dev *hdev);
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 5e83f8e..e7ce432 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1033,7 +1033,8 @@ EXPORT_SYMBOL(hci_recv_frame);
 /* Receive packet type fragment */
 #define __reassembly(hdev, type)  ((hdev)->reassembly[(type) - 2])
 
-int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count)
+int hci_recv_packet_fragment(struct hci_dev *hdev, int type, void *data,
+				int count)
 {
 	if (type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT)
 		return -EILSEQ;
@@ -1112,7 +1113,7 @@ int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count)
 
 	return 0;
 }
-EXPORT_SYMBOL(hci_recv_fragment);
+EXPORT_SYMBOL(hci_recv_packet_fragment);
 
 /* ---- Interface to upper protocols ---- */
 
-- 
1.7.0

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

* [PATCH 2/3] Replace hci_recv_fragment calls
  2010-06-01  8:04 [PATCH 1/3] Rename hci_recv_fragment to hci_recv_packet_fragment suraj
@ 2010-06-01  8:08 ` suraj
  2010-06-01  8:11   ` [PATCH 3/3] frame reassembly implementation for data from stream suraj
  2010-06-01 14:29   ` [PATCH 2/3] Replace hci_recv_fragment calls Luis Rodriguez
  0 siblings, 2 replies; 9+ messages in thread
From: suraj @ 2010-06-01  8:08 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: marcel, Luis.Rodriguez, Jothikumar.Mothilal

Replace all usages of hci_recv_fragment calls with
hci_recv_packet_fragment


Signed-off-by: suraj <suraj@Atheros.com>
---
 drivers/bluetooth/btusb.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 5d9cc53..50aa8d1 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -211,7 +211,7 @@ static void btusb_intr_complete(struct urb *urb)
 	if (urb->status == 0) {
 		hdev->stat.byte_rx += urb->actual_length;
 
-		if (hci_recv_fragment(hdev, HCI_EVENT_PKT,
+		if (hci_recv_packet_fragment(hdev, HCI_EVENT_PKT,
 						urb->transfer_buffer,
 						urb->actual_length) < 0) {
 			BT_ERR("%s corrupted event packet", hdev->name);
@@ -295,7 +295,7 @@ static void btusb_bulk_complete(struct urb *urb)
 	if (urb->status == 0) {
 		hdev->stat.byte_rx += urb->actual_length;
 
-		if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT,
+		if (hci_recv_packet_fragment(hdev, HCI_ACLDATA_PKT,
 						urb->transfer_buffer,
 						urb->actual_length) < 0) {
 			BT_ERR("%s corrupted ACL packet", hdev->name);
@@ -384,7 +384,7 @@ static void btusb_isoc_complete(struct urb *urb)
 
 			hdev->stat.byte_rx += length;
 
-			if (hci_recv_fragment(hdev, HCI_SCODATA_PKT,
+			if (hci_recv_packet_fragment(hdev, HCI_SCODATA_PKT,
 						urb->transfer_buffer + offset,
 								length) < 0) {
 				BT_ERR("%s corrupted SCO packet", hdev->name);
-- 
1.7.0

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

* [PATCH 3/3] frame reassembly implementation for data from stream
  2010-06-01  8:08 ` [PATCH 2/3] Replace hci_recv_fragment calls suraj
@ 2010-06-01  8:11   ` suraj
  2010-06-01 14:29   ` [PATCH 2/3] Replace hci_recv_fragment calls Luis Rodriguez
  1 sibling, 0 replies; 9+ messages in thread
From: suraj @ 2010-06-01  8:11 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: marcel, Luis.Rodriguez, Jothikumar.Mothilal

Implemented hci_recv_stream_fragment to reassemble HCI packets received from a data stream
with packet type not known.

Signed-off-by: suraj <suraj@Atheros.com>
---
 include/net/bluetooth/hci_core.h |    1 +
 net/bluetooth/hci_core.c         |  104 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 105 insertions(+), 0 deletions(-)

diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 65c3c13..9892c26 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -429,6 +429,7 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
 int hci_recv_frame(struct sk_buff *skb);
 int hci_recv_packet_fragment(struct hci_dev *hdev, int type, void *data,
 				int count);
+int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);
 
 int hci_register_sysfs(struct hci_dev *hdev);
 void hci_unregister_sysfs(struct hci_dev *hdev);
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index e7ce432..1587dc8 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1033,6 +1033,110 @@ EXPORT_SYMBOL(hci_recv_frame);
 /* Receive packet type fragment */
 #define __reassembly(hdev, type)  ((hdev)->reassembly[(type) - 2])
 
+#define __get_max_rx_size(type)					\
+		(((type) == HCI_ACLDATA_PKT) ?			\
+		HCI_MAX_FRAME_SIZE :				\
+		((type) == HCI_EVENT_PKT) ? HCI_MAX_EVENT_SIZE :\
+		HCI_MAX_SCO_SIZE)
+
+#define __get_header_len(type)					\
+		(((type) == HCI_ACLDATA_PKT) ?			\
+		HCI_ACL_HDR_SIZE :				\
+		((type) == HCI_EVENT_PKT) ? HCI_EVENT_HDR_SIZE :\
+		HCI_SCO_HDR_SIZE)
+
+/* Receive fragment from data streams */
+int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count)
+{
+	int type;
+
+	while (count) {
+		/*
+		 * Reuse first pointer from reassembly array
+		 */
+		struct sk_buff *skb = __reassembly(hdev, HCI_ACLDATA_PKT);
+
+		struct { int expect; int pkt_type; } *scb;
+		int len = 0;
+
+		if (!skb) {
+			struct { char type; } *pkt;
+
+			/* Start of the frame */
+			pkt = data;
+			type = pkt->type;
+
+			if (type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT)
+				return -EILSEQ;
+
+			len = __get_max_rx_size(type);
+
+			skb = bt_skb_alloc(len, GFP_ATOMIC);
+			if (!skb)
+				return -ENOMEM;
+
+			scb = (void *) skb->cb;
+			scb->expect = __get_header_len(type);
+			scb->pkt_type = type;
+
+			skb->dev = (void *) hdev;
+			__reassembly(hdev, HCI_ACLDATA_PKT) = skb;
+
+			data++;
+			count--;
+
+			continue;
+		} else {
+			/* Continue of frame */
+			scb = (void *) skb->cb;
+			len = min(scb->expect, count);
+			type = scb->pkt_type;
+
+			memcpy(skb_put(skb, len), data, len);
+
+			count -= len;
+			data += len;
+			scb->expect -= len;
+		}
+
+		switch (type) {
+		case HCI_EVENT_PKT:
+			if (skb->len == HCI_EVENT_HDR_SIZE) {
+				struct hci_event_hdr *h = hci_event_hdr(skb);
+				scb->expect = h->plen;
+			}
+			break;
+
+		case HCI_ACLDATA_PKT:
+			if (skb->len  == HCI_ACL_HDR_SIZE) {
+				struct hci_acl_hdr *h = hci_acl_hdr(skb);
+				scb->expect = __le16_to_cpu(h->dlen);
+			}
+			break;
+
+		case HCI_SCODATA_PKT:
+			if (skb->len == HCI_SCO_HDR_SIZE) {
+				struct hci_sco_hdr *h = hci_sco_hdr(skb);
+				scb->expect = h->dlen;
+			}
+			break;
+		}
+
+		if (scb->expect == 0) {
+			/* Complete frame */
+
+			__reassembly(hdev, HCI_ACLDATA_PKT) = NULL;
+
+			bt_cb(skb)->pkt_type = type;
+			hci_recv_frame(skb);
+		}
+
+	}
+	return 0;
+}
+EXPORT_SYMBOL(hci_recv_stream_fragment);
+
+/* Receive packet fragment with known packet type */
 int hci_recv_packet_fragment(struct hci_dev *hdev, int type, void *data,
 				int count)
 {
-- 
1.7.0

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

* RE: [PATCH 2/3] Replace hci_recv_fragment calls
  2010-06-01  8:08 ` [PATCH 2/3] Replace hci_recv_fragment calls suraj
  2010-06-01  8:11   ` [PATCH 3/3] frame reassembly implementation for data from stream suraj
@ 2010-06-01 14:29   ` Luis Rodriguez
  2010-06-01 19:59     ` Marcel Holtmann
  1 sibling, 1 reply; 9+ messages in thread
From: Luis Rodriguez @ 2010-06-01 14:29 UTC (permalink / raw)
  To: Suraj Sumangala, linux-bluetooth@vger.kernel.org
  Cc: marcel@holtmann.org, Jothikumar Mothilal


You want to unify patches 1 and 2. Patches upstream should be atomic so tha=
t if  you apply it, it should make everything still work. Your first patch =
removes hci_recv_fragment() and then this one fixes the places that call it=
, you want to do both in one shot.

  Luis
________________________________________
From: Suraj Sumangala
Sent: Tuesday, June 01, 2010 1:08 AM
To: linux-bluetooth@vger.kernel.org
Cc: marcel@holtmann.org; Luis Rodriguez; Jothikumar Mothilal
Subject: [PATCH 2/3] Replace hci_recv_fragment calls

Replace all usages of hci_recv_fragment calls with
hci_recv_packet_fragment


Signed-off-by: suraj <suraj@Atheros.com>
---
 drivers/bluetooth/btusb.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 5d9cc53..50aa8d1 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -211,7 +211,7 @@ static void btusb_intr_complete(struct urb *urb)
        if (urb->status =3D=3D 0) {
                hdev->stat.byte_rx +=3D urb->actual_length;

-               if (hci_recv_fragment(hdev, HCI_EVENT_PKT,
+               if (hci_recv_packet_fragment(hdev, HCI_EVENT_PKT,
                                                urb->transfer_buffer,
                                                urb->actual_length) < 0) {
                        BT_ERR("%s corrupted event packet", hdev->name);
@@ -295,7 +295,7 @@ static void btusb_bulk_complete(struct urb *urb)
        if (urb->status =3D=3D 0) {
                hdev->stat.byte_rx +=3D urb->actual_length;

-               if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT,
+               if (hci_recv_packet_fragment(hdev, HCI_ACLDATA_PKT,
                                                urb->transfer_buffer,
                                                urb->actual_length) < 0) {
                        BT_ERR("%s corrupted ACL packet", hdev->name);
@@ -384,7 +384,7 @@ static void btusb_isoc_complete(struct urb *urb)

                        hdev->stat.byte_rx +=3D length;

-                       if (hci_recv_fragment(hdev, HCI_SCODATA_PKT,
+                       if (hci_recv_packet_fragment(hdev, HCI_SCODATA_PKT,
                                                urb->transfer_buffer + offs=
et,
                                                                length) < 0=
) {
                                BT_ERR("%s corrupted SCO packet", hdev->nam=
e);
--
1.7.0

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

* RE: [PATCH 2/3] Replace hci_recv_fragment calls
  2010-06-01 14:29   ` [PATCH 2/3] Replace hci_recv_fragment calls Luis Rodriguez
@ 2010-06-01 19:59     ` Marcel Holtmann
  2010-06-01 20:51       ` Luis R. Rodriguez
  0 siblings, 1 reply; 9+ messages in thread
From: Marcel Holtmann @ 2010-06-01 19:59 UTC (permalink / raw)
  To: Luis Rodriguez
  Cc: Suraj Sumangala, linux-bluetooth@vger.kernel.org,
	Jothikumar Mothilal

Hi Luis,

> You want to unify patches 1 and 2. Patches upstream should be atomic so that if  you apply it, it should make everything still work. Your first patch removes hci_recv_fragment() and then this one fixes the places that call it, you want to do both in one shot.

actually I prefer to leave these two patches out for now. Since the
renaming could be done easily later. The important part is actually the
other implementation.

Regards

Marcel



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

* Re: [PATCH 2/3] Replace hci_recv_fragment calls
  2010-06-01 19:59     ` Marcel Holtmann
@ 2010-06-01 20:51       ` Luis R. Rodriguez
  2010-06-01 21:59         ` Marcel Holtmann
  0 siblings, 1 reply; 9+ messages in thread
From: Luis R. Rodriguez @ 2010-06-01 20:51 UTC (permalink / raw)
  To: Marcel Holtmann
  Cc: Luis Rodriguez, Suraj Sumangala, linux-bluetooth@vger.kernel.org,
	Jothikumar Mothilal

On Tue, Jun 01, 2010 at 12:59:13PM -0700, Marcel Holtmann wrote:
> Hi Luis,
> 
> > You want to unify patches 1 and 2. Patches upstream should be atomic so that if  you apply it, it should make everything still work. Your first patch removes hci_recv_fragment() and then this one fixes the places that call it, you want to do both in one shot.
> 
> actually I prefer to leave these two patches out for now. Since the
> renaming could be done easily later. The important part is actually the
> other implementation.

Won't that break compilation on the first patch since all existing
code users no longer have the exported symbol available?

  Luis

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

* Re: [PATCH 2/3] Replace hci_recv_fragment calls
  2010-06-01 20:51       ` Luis R. Rodriguez
@ 2010-06-01 21:59         ` Marcel Holtmann
  2010-06-02  4:11           ` Suraj Sumangala
  0 siblings, 1 reply; 9+ messages in thread
From: Marcel Holtmann @ 2010-06-01 21:59 UTC (permalink / raw)
  To: Luis R. Rodriguez
  Cc: Luis Rodriguez, Suraj Sumangala, linux-bluetooth@vger.kernel.org,
	Jothikumar Mothilal

Hi Luis,

> > > You want to unify patches 1 and 2. Patches upstream should be atomic so that if  you apply it, it should make everything still work. Your first patch removes hci_recv_fragment() and then this one fixes the places that call it, you want to do both in one shot.
> > 
> > actually I prefer to leave these two patches out for now. Since the
> > renaming could be done easily later. The important part is actually the
> > other implementation.
> 
> Won't that break compilation on the first patch since all existing
> code users no longer have the exported symbol available?

no. The important change here is for the H4 specific stream fragment
handling. The rest is just a renaming. So 3/3 is the important patch and
1/2 and 2/2 are just cosmetic changes.

Regards

Marcel



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

* Re: [PATCH 2/3] Replace hci_recv_fragment calls
  2010-06-01 21:59         ` Marcel Holtmann
@ 2010-06-02  4:11           ` Suraj Sumangala
  0 siblings, 0 replies; 9+ messages in thread
From: Suraj Sumangala @ 2010-06-02  4:11 UTC (permalink / raw)
  To: Marcel Holtmann
  Cc: Luis Rodriguez, Suraj Sumangala, linux-bluetooth@vger.kernel.org,
	Jothikumar Mothilal

Hi Marcel,

On 6/2/2010 3:29 AM, Marcel Holtmann wrote:
> Hi Luis,
>
>>>> You want to unify patches 1 and 2. Patches upstream should be atomic so that if  you apply it, it should make everything still work. Your first patch removes hci_recv_fragment() and then this one fixes the places that call it, you want to do both in one shot.
>>>
>>> actually I prefer to leave these two patches out for now. Since the
>>> renaming could be done easily later. The important part is actually the
>>> other implementation.
>>
>> Won't that break compilation on the first patch since all existing
>> code users no longer have the exported symbol available?
>
> no. The important change here is for the H4 specific stream fragment
> handling. The rest is just a renaming. So 3/3 is the important patch and
> 1/2 and 2/2 are just cosmetic changes.
>
> Regards
>
> Marcel
>
>

I will send 3/3 as a separate patch for you to verify.

Regards
Suraj

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

end of thread, other threads:[~2010-06-02  4:11 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-01  8:04 [PATCH 1/3] Rename hci_recv_fragment to hci_recv_packet_fragment suraj
2010-06-01  8:08 ` [PATCH 2/3] Replace hci_recv_fragment calls suraj
2010-06-01  8:11   ` [PATCH 3/3] frame reassembly implementation for data from stream suraj
2010-06-01 14:29   ` [PATCH 2/3] Replace hci_recv_fragment calls Luis Rodriguez
2010-06-01 19:59     ` Marcel Holtmann
2010-06-01 20:51       ` Luis R. Rodriguez
2010-06-01 21:59         ` Marcel Holtmann
2010-06-02  4:11           ` Suraj Sumangala
  -- strict thread matches above, loose matches on Subject: below --
2010-06-01  6:54 GLOBAL/suraj

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).