All of lore.kernel.org
 help / color / mirror / Atom feed
From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
To: Marcel Holtmann <marcel@holtmann.org>
Cc: "linux-bluetooth@vger.kernel.org" <linux-bluetooth@vger.kernel.org>
Subject: Re: [PATCH v5 2/2] Bluetooth: Add BT_MODE socket option
Date: Wed, 25 Mar 2020 16:39:29 -0700	[thread overview]
Message-ID: <CABBYNZLLUiC5KuYyiqxAhJDM78yQKy3REM8bNnr-ARtj9OWr4g@mail.gmail.com> (raw)
In-Reply-To: <0C7A165A-3C33-4E7D-949C-8DABB2E1DF05@holtmann.org>

Hi Marcel,

On Wed, Mar 25, 2020 at 2:15 PM Marcel Holtmann <marcel@holtmann.org> wrote:
>
> Hi Luiz,
>
> > This adds BT_MODE socket option which can be used to set L2CAP modes,
> > including modes only supported over LE which were not supported using
> > the L2CAP_OPTIONS.
> >
> > Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> > ---
> > include/net/bluetooth/bluetooth.h |   8 ++
> > net/bluetooth/l2cap_sock.c        | 120 +++++++++++++++++++++++++++++-
> > 2 files changed, 127 insertions(+), 1 deletion(-)
> >
> > diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
> > index 1576353a2773..3fa7b1e3c5d9 100644
> > --- a/include/net/bluetooth/bluetooth.h
> > +++ b/include/net/bluetooth/bluetooth.h
> > @@ -139,6 +139,14 @@ struct bt_voice {
> > #define BT_PHY_LE_CODED_TX    0x00002000
> > #define BT_PHY_LE_CODED_RX    0x00004000
> >
> > +#define BT_MODE                      15
> > +
> > +#define BT_MODE_BASIC                0x00
> > +#define BT_MODE_ERTM         0x01
> > +#define BT_MODE_STREAMING    0x02
> > +#define BT_MODE_LE_FLOWCTL   0x03
> > +#define BT_MODE_EXT_FLOWCTL  0x04
> > +
> > __printf(1, 2)
> > void bt_info(const char *fmt, ...);
> > __printf(1, 2)
> > diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
> > index 117ba20ea194..07f8d60953f2 100644
> > --- a/net/bluetooth/l2cap_sock.c
> > +++ b/net/bluetooth/l2cap_sock.c
> > @@ -395,6 +395,24 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
> >       return sizeof(struct sockaddr_l2);
> > }
> >
> > +static int l2cap_get_mode(struct l2cap_chan *chan)
> > +{
> > +     switch (chan->mode) {
> > +     case L2CAP_MODE_BASIC:
> > +             return BT_MODE_BASIC;
> > +     case L2CAP_MODE_ERTM:
> > +             return BT_MODE_ERTM;
> > +     case L2CAP_MODE_STREAMING:
> > +             return BT_MODE_STREAMING;
> > +     case L2CAP_MODE_LE_FLOWCTL:
> > +             return BT_MODE_LE_FLOWCTL;
> > +     case L2CAP_MODE_EXT_FLOWCTL:
> > +             return BT_MODE_EXT_FLOWCTL;
> > +     }
> > +
> > +     return -EINVAL;
> > +}
> > +
> > static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
> >                                    char __user *optval, int __user *optlen)
> > {
> > @@ -424,6 +442,13 @@ static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
> >                       break;
> >               }
> >
> > +             /* L2CAP_MODE_LE_FLOWCTL and L2CAP_MODE_EXT_FLOWCTL are not
> > +              * supported by L2CAP_OPTIONS.
> > +              */
> > +             if (chan->mode == L2CAP_MODE_LE_FLOWCTL ||
> > +                             chan->mode == L2CAP_MODE_EXT_FLOWCTL)
>
> this is the wrong kernel indentation.

Fixed

> > +                     return -EINVAL;
> > +
> >               memset(&opts, 0, sizeof(opts));
> >               opts.imtu     = chan->imtu;
> >               opts.omtu     = chan->omtu;
> > @@ -508,7 +533,7 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
> >       struct bt_security sec;
> >       struct bt_power pwr;
> >       u32 phys;
> > -     int len, err = 0;
> > +     int len, mode, err = 0;
> >
> >       BT_DBG("sk %p", sk);
> >
> > @@ -624,6 +649,27 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname,
> >                       err = -EFAULT;
> >               break;
> >
> > +     case BT_MODE:
> > +             if (!enable_ecred) {
> > +                     err = -ENOPROTOOPT;
> > +                     break;
> > +             }
> > +
> > +             if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
> > +                     err = -EINVAL;
> > +                     break;
> > +             }
> > +
> > +             mode = l2cap_get_mode(chan);
> > +             if (mode < 0) {
> > +                     err = mode;
> > +                     break;
> > +             }
> > +
> > +             if (put_user(mode, (u8 __user *) optval))
> > +                     err = -EFAULT;
> > +             break;
> > +
> >       default:
> >               err = -ENOPROTOOPT;
> >               break;
> > @@ -763,6 +809,45 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
> >       return err;
> > }
> >
> > +static int l2cap_set_mode(struct l2cap_chan *chan, u8 mode)
> > +{
> > +     switch (mode) {
> > +     case BT_MODE_BASIC:
> > +             if (bdaddr_type_is_le(chan->src_type))
> > +                     return -EINVAL;
> > +             mode = L2CAP_MODE_BASIC;
> > +             clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
> > +             break;
> > +     case BT_MODE_ERTM:
> > +             if (!disable_ertm || bdaddr_type_is_le(chan->src_type))
> > +                     return -EINVAL;
> > +             mode = L2CAP_MODE_ERTM;
> > +             break;
> > +     case BT_MODE_STREAMING:
> > +             if (!disable_ertm || bdaddr_type_is_le(chan->src_type))
> > +                     return -EINVAL;
> > +             mode = L2CAP_MODE_STREAMING;
> > +             break;
> > +     case BT_MODE_LE_FLOWCTL:
> > +             if (!bdaddr_type_is_le(chan->src_type))
> > +                     return -EINVAL;
> > +             mode = L2CAP_MODE_LE_FLOWCTL;
> > +             break;
> > +     case BT_MODE_EXT_FLOWCTL:
> > +             /* TODO: Add support for ECRED PDUs to BR/EDR */
> > +             if (!bdaddr_type_is_le(chan->src_type))
> > +                     return -EINVAL;
> > +             mode = L2CAP_MODE_EXT_FLOWCTL;
> > +             break;
> > +     default:
> > +             return -EINVAL;
> > +     }
> > +
> > +     chan->mode = mode;
> > +
> > +     return 0;
> > +}
> > +
> > static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
> >                                char __user *optval, unsigned int optlen)
> > {
> > @@ -968,6 +1053,39 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
> >
> >               break;
> >
> > +     case BT_MODE:
> > +             if (!enable_ecred) {
> > +                     err = -ENOPROTOOPT;
> > +                     break;
> > +             }
> > +
> > +             BT_DBG("sk->sk_state %u", sk->sk_state);
> > +
> > +             if (sk->sk_state != BT_BOUND) {
> > +                     err = -EINVAL;
> > +                     break;
> > +             }
> > +
> > +             if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
> > +                     err = -EINVAL;
> > +                     break;
> > +             }
> > +
> > +             if (get_user(opt, (u8 __user *) optval)) {
> > +                     err = -EFAULT;
> > +                     break;
> > +             }
> > +
> > +             BT_DBG("opt %u", opt);
> > +
> > +             err = l2cap_set_mode(chan, opt);
> > +             if (err)
> > +                     break;
> > +
> > +             BT_DBG("mode 0x%2.2x", chan->mode);
> > +
> > +             break;
> > +
>
> So do we want BT_MODE as u8 or just simply as int?

For the mode alone I guess it would be fine, the question is if we
want to leave space to add other fields later but I guess we could do
that with use of new options instead.

> Regards
>
> Marcel
>


-- 
Luiz Augusto von Dentz

  reply	other threads:[~2020-03-25 23:39 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-25 19:37 [PATCH v5 1/2] Bluetooth: L2CAP: Use DEFER_SETUP to group ECRED connections Luiz Augusto von Dentz
2020-03-25 19:37 ` [PATCH v5 2/2] Bluetooth: Add BT_MODE socket option Luiz Augusto von Dentz
2020-03-25 21:14   ` Marcel Holtmann
2020-03-25 23:39     ` Luiz Augusto von Dentz [this message]
2020-03-25 21:17 ` [PATCH v5 1/2] Bluetooth: L2CAP: Use DEFER_SETUP to group ECRED connections 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=CABBYNZLLUiC5KuYyiqxAhJDM78yQKy3REM8bNnr-ARtj9OWr4g@mail.gmail.com \
    --to=luiz.dentz@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=marcel@holtmann.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.