tty: n_smux: Add support for broadcast logical channel ID
Add support for broadcast logical channel ID used with the dedicated
power-control commands.
Without this support, power commands sent on the broadcast channel may
get dropped which is currently only a test case issue.
Change-Id: I798ed8a315b3f864fa9afa20ef073b2ab5cab293
Signed-off-by: Eric Holmberg <eholmber@codeaurora.org>
diff --git a/drivers/tty/n_smux.c b/drivers/tty/n_smux.c
index d083117..b6a2ffb 100644
--- a/drivers/tty/n_smux.c
+++ b/drivers/tty/n_smux.c
@@ -1662,24 +1662,44 @@
*/
static int smux_dispatch_rx_pkt(struct smux_pkt_t *pkt)
{
- int ret;
+ int ret = -ENXIO;
SMUX_LOG_PKT_RX(pkt);
switch (pkt->hdr.cmd) {
case SMUX_CMD_OPEN_LCH:
+ if (smux_assert_lch_id(pkt->hdr.lcid)) {
+ pr_err("%s: invalid channel id %d\n",
+ __func__, pkt->hdr.lcid);
+ break;
+ }
ret = smux_handle_rx_open_cmd(pkt);
break;
case SMUX_CMD_DATA:
+ if (smux_assert_lch_id(pkt->hdr.lcid)) {
+ pr_err("%s: invalid channel id %d\n",
+ __func__, pkt->hdr.lcid);
+ break;
+ }
ret = smux_handle_rx_data_cmd(pkt);
break;
case SMUX_CMD_CLOSE_LCH:
+ if (smux_assert_lch_id(pkt->hdr.lcid)) {
+ pr_err("%s: invalid channel id %d\n",
+ __func__, pkt->hdr.lcid);
+ break;
+ }
ret = smux_handle_rx_close_cmd(pkt);
break;
case SMUX_CMD_STATUS:
+ if (smux_assert_lch_id(pkt->hdr.lcid)) {
+ pr_err("%s: invalid channel id %d\n",
+ __func__, pkt->hdr.lcid);
+ break;
+ }
ret = smux_handle_rx_status_cmd(pkt);
break;
@@ -1709,7 +1729,6 @@
static int smux_deserialize(unsigned char *data, int len)
{
struct smux_pkt_t recv;
- uint8_t lcid;
smux_init_pkt(&recv);
@@ -1724,12 +1743,6 @@
return -EINVAL;
}
- lcid = recv.hdr.lcid;
- if (smux_assert_lch_id(lcid)) {
- pr_err("%s: invalid channel id %d\n", __func__, lcid);
- return -ENXIO;
- }
-
if (recv.hdr.payload_len)
recv.payload = data + sizeof(struct smux_hdr_t);