From: Andrei Emeltchenko <andrei.emeltchenko.news@gmail.com>
To: Mat Martineau <mathewm@codeaurora.org>
Cc: linux-bluetooth@vger.kernel.org, padovan@profusion.mobi,
pkrystad@codeaurora.org, marcel@holtmann.org
Subject: Re: [PATCHv3 2/2] Bluetooth: Functions for handling ERTM control fields
Date: Wed, 4 Apr 2012 10:12:12 +0300 [thread overview]
Message-ID: <20120404071205.GA17251@aemeltch-MOBL1> (raw)
In-Reply-To: <1333493332-24623-3-git-send-email-mathewm@codeaurora.org>
Hi Mat,
On Tue, Apr 03, 2012 at 03:48:52PM -0700, Mat Martineau wrote:
> These functions encode or decode ERTM control fields (extended or
> enhanced) to or from the new l2cap_ctrl structure.
>
> Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
Looks good now.
Acked-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> ---
> net/bluetooth/l2cap_core.c | 99 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 99 insertions(+)
>
> diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
> index 650e9f5..b1eac5a 100644
> --- a/net/bluetooth/l2cap_core.c
> +++ b/net/bluetooth/l2cap_core.c
> @@ -780,6 +780,103 @@ static inline void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, u32 control)
> l2cap_send_sframe(chan, control);
> }
>
> +static u16 __pack_enhanced_control(struct l2cap_ctrl *control)
> +{
> + u16 packed;
> +
> + packed = control->reqseq << L2CAP_CTRL_REQSEQ_SHIFT;
> + packed |= control->final << L2CAP_CTRL_FINAL_SHIFT;
> +
> + if (control->sframe) {
> + packed |= control->poll << L2CAP_CTRL_POLL_SHIFT;
> + packed |= control->super << L2CAP_CTRL_SUPER_SHIFT;
> + packed |= L2CAP_CTRL_FRAME_TYPE;
> + } else {
> + packed |= control->sar << L2CAP_CTRL_SAR_SHIFT;
> + packed |= control->txseq << L2CAP_CTRL_TXSEQ_SHIFT;
> + }
> +
> + return packed;
> +}
> +
> +static void __get_enhanced_control(u16 enh, struct l2cap_ctrl *control)
> +{
> + control->reqseq = (enh & L2CAP_CTRL_REQSEQ) >> L2CAP_CTRL_REQSEQ_SHIFT;
> + control->final = (enh & L2CAP_CTRL_FINAL) >> L2CAP_CTRL_FINAL_SHIFT;
> +
> + if (enh & L2CAP_CTRL_FRAME_TYPE) {
> + /* S-Frame */
> + control->sframe = 1;
> + control->poll = (enh & L2CAP_CTRL_POLL) >> L2CAP_CTRL_POLL_SHIFT;
> + control->super = (enh & L2CAP_CTRL_SUPERVISE) >> L2CAP_CTRL_SUPER_SHIFT;
> +
> + control->sar = 0;
> + control->txseq = 0;
> + } else {
> + /* I-Frame */
> + control->sframe = 0;
> + control->sar = (enh & L2CAP_CTRL_SAR) >> L2CAP_CTRL_SAR_SHIFT;
> + control->txseq = (enh & L2CAP_CTRL_TXSEQ) >> L2CAP_CTRL_TXSEQ_SHIFT;
> +
> + control->poll = 0;
> + control->super = 0;
> + }
> +}
> +
> +static u32 __pack_extended_control(struct l2cap_ctrl *control)
> +{
> + u32 packed;
> +
> + packed = control->reqseq << L2CAP_EXT_CTRL_REQSEQ_SHIFT;
> + packed |= control->final << L2CAP_EXT_CTRL_FINAL_SHIFT;
> +
> + if (control->sframe) {
> + packed |= control->poll << L2CAP_EXT_CTRL_POLL_SHIFT;
> + packed |= control->super << L2CAP_EXT_CTRL_SUPER_SHIFT;
> + packed |= L2CAP_EXT_CTRL_FRAME_TYPE;
> + } else {
> + packed |= control->sar << L2CAP_EXT_CTRL_SAR_SHIFT;
> + packed |= control->txseq << L2CAP_EXT_CTRL_TXSEQ_SHIFT;
> + }
> +
> + return packed;
> +}
> +
> +static void __get_extended_control(u32 ext, struct l2cap_ctrl *control)
> +{
> + control->reqseq = (ext & L2CAP_EXT_CTRL_REQSEQ) >> L2CAP_EXT_CTRL_REQSEQ_SHIFT;
> + control->final = (ext & L2CAP_EXT_CTRL_FINAL) >> L2CAP_EXT_CTRL_FINAL_SHIFT;
> +
> + if (ext & L2CAP_EXT_CTRL_FRAME_TYPE) {
> + /* S-Frame */
> + control->sframe = 1;
> + control->poll = (ext & L2CAP_EXT_CTRL_POLL) >> L2CAP_EXT_CTRL_POLL_SHIFT;
> + control->super = (ext & L2CAP_EXT_CTRL_SUPERVISE) >> L2CAP_EXT_CTRL_SUPER_SHIFT;
> +
> + control->sar = 0;
> + control->txseq = 0;
> + } else {
> + /* I-Frame */
> + control->sframe = 0;
> + control->sar = (ext & L2CAP_EXT_CTRL_SAR) >> L2CAP_EXT_CTRL_SAR_SHIFT;
> + control->txseq = (ext & L2CAP_EXT_CTRL_TXSEQ) >> L2CAP_EXT_CTRL_TXSEQ_SHIFT;
> +
> + control->poll = 0;
> + control->super = 0;
> + }
> +}
> +
> +static void __set_control(struct l2cap_chan *chan, struct sk_buff *skb)
> +{
> + if (test_bit(FLAG_EXT_CTRL, &chan->flags)) {
> + __get_extended_control(get_unaligned_le32(skb->data),
> + &bt_cb(skb)->control);
> + } else {
> + __get_enhanced_control(get_unaligned_le16(skb->data),
> + &bt_cb(skb)->control);
> + }
> +}
> +
> static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan)
> {
> return !test_bit(CONF_CONNECT_PEND, &chan->conf_state);
> @@ -4354,6 +4451,8 @@ static int l2cap_ertm_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
> u16 req_seq;
> int len, next_tx_seq_offset, req_seq_offset;
>
> + __set_control(chan, skb);
> +
> control = __get_control(chan, skb->data);
> skb_pull(skb, __ctrl_size(chan));
> len = skb->len;
> --
> 1.7.9.4
>
> --
> Mat Martineau
> Employee of Qualcomm Innovation Center, Inc.
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
prev parent reply other threads:[~2012-04-04 7:12 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-03 22:48 [PATCHv3 0/2] ERTM state machine changes, part 1 Mat Martineau
2012-04-03 22:48 ` [PATCHv3 1/2] Bluetooth: Add the l2cap_seq_list structure for tracking frames Mat Martineau
2012-04-04 8:44 ` Szymon Janc
2012-04-04 8:56 ` Andrei Emeltchenko
2012-04-04 9:07 ` Szymon Janc
2012-04-04 16:13 ` Mat Martineau
2012-04-03 22:48 ` [PATCHv3 2/2] Bluetooth: Functions for handling ERTM control fields Mat Martineau
2012-04-04 7:12 ` Andrei Emeltchenko [this message]
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=20120404071205.GA17251@aemeltch-MOBL1 \
--to=andrei.emeltchenko.news@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
--cc=marcel@holtmann.org \
--cc=mathewm@codeaurora.org \
--cc=padovan@profusion.mobi \
--cc=pkrystad@codeaurora.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.