Hi Johan, > There are several possible reason codes that can be sent in the command > reject L2CAP packet. Before this patch the code has used a hard-coded > single response code ("command not understood"). This patch adds a > helper function to map the return value of an L2CAP handler function to > the correct command reject reason. > > Signed-off-by: Johan Hedberg <johan.hedberg@xxxxxxxxx> > --- > net/bluetooth/l2cap_core.c | 22 ++++++++++++++++++---- > 1 file changed, 18 insertions(+), 4 deletions(-) > > diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c > index b3bb7bc..83acb28 100644 > --- a/net/bluetooth/l2cap_core.c > +++ b/net/bluetooth/l2cap_core.c > @@ -5294,6 +5294,20 @@ static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn, > } > } > > +static u16 l2cap_err_to_reason(int err) what we could to is return __le16 here. And then keep using __constant_cpu_to_le16. > +{ > + switch (err) { > + case -EFAULT: > + return L2CAP_REJ_INVALID_CID; > + case -EMSGSIZE: > + return L2CAP_REJ_MTU_EXCEEDED; > + case -EINVAL: > + case -EPROTO: > + default: > + return L2CAP_REJ_NOT_UNDERSTOOD; > + } > +} Is there really a point in listing EINVAL and EPROTO here. > + > static inline void l2cap_le_sig_channel(struct l2cap_conn *conn, > struct sk_buff *skb) > { > @@ -5323,11 +5337,11 @@ static inline void l2cap_le_sig_channel(struct l2cap_conn *conn, > err = l2cap_le_sig_cmd(conn, &cmd, data); > if (err) { > struct l2cap_cmd_rej_unk rej; > + u16 reason = l2cap_err_to_reason(err); > > BT_ERR("Wrong link type (%d)", err); > > - /* FIXME: Map err to a valid reason */ > - rej.reason = __constant_cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD); > + rej.reason = cpu_to_le16(reason); > l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ, > sizeof(rej), &rej); > } > @@ -5368,11 +5382,11 @@ static inline void l2cap_sig_channel(struct l2cap_conn *conn, > err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data); > if (err) { > struct l2cap_cmd_rej_unk rej; > + u16 reason = l2cap_err_to_reason(err); > > BT_ERR("Wrong link type (%d)", err); > > - /* FIXME: Map err to a valid reason */ > - rej.reason = __constant_cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD); > + rej.reason = cpu_to_le16(reason); > l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ, > sizeof(rej), &rej); > } Regards Marcel -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html