Linux bluetooth development
 help / color / mirror / Atom feed
From: Marcel Holtmann <marcel@holtmann.org>
To: Emeltchenko Andrei <Andrei.Emeltchenko.news@gmail.com>
Cc: linux-bluetooth@vger.kernel.org
Subject: Re: [RFCv1 2/3] Bluetooth: Simplify num_comp_pkts_evt function
Date: Wed, 07 Dec 2011 10:20:57 +0200	[thread overview]
Message-ID: <1323246057.1965.3.camel@aeonflux> (raw)
In-Reply-To: <20111207080135.GB15379@aemeltch-MOBL1>

Hi Andrei,

> > > > > Simplify function and remove fourth level of indentation.
> > > > > 
> > > > > Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> > > > > ---
> > > > >  net/bluetooth/hci_event.c |   43 +++++++++++++++++++++++++------------------
> > > > >  1 files changed, 25 insertions(+), 18 deletions(-)
> > > > > 
> > > > > diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> > > > > index 273e1cb..fd7e6b5 100644
> > > > > --- a/net/bluetooth/hci_event.c
> > > > > +++ b/net/bluetooth/hci_event.c
> > > > > @@ -2288,28 +2288,35 @@ static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *s
> > > > >  		count  = get_unaligned_le16(ptr++);
> > > > 
> > > > actually we first need a cleanup of this function. This part is
> > > > horrible. It works because of our ptr cast to uint16, but we should
> > > > actually use a proper struct here. Maybe an info struct like we use for
> > > > inquiry result might be helpful here.
> > > 
> > > Something like the code below?
> > > 
> > > diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
> > > index e33e468..403974c 100644
> > > --- a/include/net/bluetooth/hci.h
> > > +++ b/include/net/bluetooth/hci.h
> > > @@ -1018,9 +1018,14 @@ struct hci_ev_role_change {
> > >  } __packed;
> > >  
> > >  #define HCI_EV_NUM_COMP_PKTS           0x13
> > > +struct hci_comp_pkts_info {
> > > +       __le16   handle;
> > > +       __le16   count;
> > > +} __packed;
> > > +
> > >  struct hci_ev_num_comp_pkts {
> > >         __u8     num_hndl;
> > > -       /* variable length part */
> > > +       struct hci_comp_pkts_info handles[0];
> > >  } __packed;
> > >  
> > >  #define HCI_EV_MODE_CHANGE             0x14
> > > diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> > > index 238fb65..079b94f 100644
> > > --- a/net/bluetooth/hci_event.c
> > > +++ b/net/bluetooth/hci_event.c
> > > @@ -2273,26 +2273,27 @@ static inline void hci_role_change_evt(struct
> > > hci_dev *hdev, struct sk_buff *skb
> > >  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;
> > > -       __le16 *ptr;
> > > +       struct hci_comp_pkts_info *info;
> > >         int i;
> > >  
> > >         skb_pull(skb, sizeof(*ev));
> > >  
> > >         BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl);
> > >  
> > > -       if (skb->len < ev->num_hndl * 4) {
> > > +       if (skb->len < ev->num_hndl * sizeof(*info)) {
> > >                 BT_DBG("%s bad parameters", hdev->name);
> > >                 return;
> > >         }
> > >  
> > >         tasklet_disable(&hdev->tx_task);
> > >  
> > > -       for (i = 0, ptr = (__le16 *) skb->data; i < ev->num_hndl; i++) {
> > > +       for (i = 0; i < ev->num_hndl; i++) {
> > 
> > 		struct hci_comp_pkts_info *info = &ev->handles[i];
> 
> I was actually using "info" to eliminate magic size above, otherwise I have
> to use long "sizeof(struct hci_comp_pkts_info)". This of course might be
> done in a separate trivial patch.

you actually lost me here. Just assign the info struct pointer and then
use it. My point was just to move the variable location localized to its
scope of usage.

> > >                 struct hci_conn *conn;
> > >                 __u16  handle, count;
> > >  
> > > -               handle = get_unaligned_le16(ptr++);
> > > -               count  = get_unaligned_le16(ptr++);
> > > +               info = &ev->handles[i];
> > > +               handle = __le16_to_cpu(info->handle);
> > > +               count  = __le16_to_cpu(info->count);
> > >  
> > >                 conn = hci_conn_hash_lookup_handle(hdev, handle);
> > >                 if (!conn)
> > 
> > And you need to remove the skb_pull above since otherwise you are
> > pointing to the wrong memory location.
> 
> Sorry, cannot get this. I assign "ev" before skb_pull, this should not be a
> problem.

You are fully right. Nevertheless the skb_pull becomes useless now. So
just remove it.

Regards

Marcel



  reply	other threads:[~2011-12-07  8:20 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-05 12:55 [RFCv1 0/3] Implement basic block flow control code Emeltchenko Andrei
2011-12-05 12:55 ` [RFCv1 1/3] Bluetooth: Add HCI Read Data Block Size function Emeltchenko Andrei
2011-12-05 13:55   ` Marcel Holtmann
2011-12-05 12:55 ` [RFCv1 2/3] Bluetooth: Simplify num_comp_pkts_evt function Emeltchenko Andrei
2011-12-05 13:51   ` Marcel Holtmann
2011-12-05 15:32     ` Emeltchenko Andrei
2011-12-05 18:45       ` Marcel Holtmann
2011-12-07  8:01         ` Emeltchenko Andrei
2011-12-07  8:20           ` Marcel Holtmann [this message]
2011-12-07  8:49             ` Emeltchenko Andrei
2011-12-05 12:55 ` [RFCv1 3/3] Bluetooth: Process num completed data blocks event Emeltchenko Andrei
2011-12-05 13:54   ` Marcel Holtmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1323246057.1965.3.camel@aeonflux \
    --to=marcel@holtmann.org \
    --cc=Andrei.Emeltchenko.news@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox