2017-09-20 06:44:24

by Xinming Hu

[permalink] [raw]
Subject: [PATCH] mwifiex: add device specific ioctl handler

From: Xinming Hu <[email protected]>

Add net_dev ndo_do_ioctl handler, which could be used for
downloading host command by utility in manufactory test

Signed-off-by: Xinming Hu <[email protected]>
Signed-off-by: Cathy Luo <[email protected]>
Signed-off-by: Ganapathi Bhat <[email protected]>
---
drivers/net/wireless/marvell/mwifiex/cmdevt.c | 59 +++++++++++++++++++++++++++
drivers/net/wireless/marvell/mwifiex/main.c | 23 +++++++++++
drivers/net/wireless/marvell/mwifiex/main.h | 7 +++-
3 files changed, 88 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
index 0edc5d6..86ee399 100644
--- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c
+++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
@@ -839,6 +839,8 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
hostcmd = adapter->curr_cmd->data_buf;
hostcmd->len = size;
memcpy(hostcmd->cmd, resp, size);
+ adapter->hostcmd_resp_data.len = size;
+ memcpy(adapter->hostcmd_resp_data.cmd, resp, size);
}
}
orig_cmdresp_no = le16_to_cpu(resp->command);
@@ -1221,6 +1223,63 @@ int mwifiex_ret_802_11_hs_cfg(struct mwifiex_private *priv,
}
EXPORT_SYMBOL_GPL(mwifiex_process_hs_config);

+/* This function get hostcmd data from userspace and construct a cmd
+ * to be download to FW.
+ */
+int mwifiex_process_host_command(struct mwifiex_private *priv,
+ struct ifreq *req)
+{
+ struct mwifiex_ds_misc_cmd *hostcmd_buf;
+ struct host_cmd_ds_command *cmd;
+ struct mwifiex_adapter *adapter = priv->adapter;
+ int ret;
+
+ hostcmd_buf = kzalloc(sizeof(*hostcmd_buf), GFP_KERNEL);
+ if (!hostcmd_buf)
+ return -ENOMEM;
+
+ cmd = (void *)hostcmd_buf->cmd;
+
+ if (copy_from_user(cmd, req->ifr_data,
+ sizeof(cmd->command) + sizeof(cmd->size))) {
+ ret = -EFAULT;
+ goto done;
+ }
+
+ hostcmd_buf->len = le16_to_cpu(cmd->size);
+ if (hostcmd_buf->len > MWIFIEX_SIZE_OF_CMD_BUFFER) {
+ ret = -EINVAL;
+ goto done;
+ }
+
+ if (copy_from_user(cmd, req->ifr_data, hostcmd_buf->len)) {
+ ret = -EFAULT;
+ goto done;
+ }
+
+ if (mwifiex_send_cmd(priv, 0, 0, 0, hostcmd_buf, true)) {
+ dev_err(priv->adapter->dev, "Failed to process hostcmd\n");
+ ret = -EFAULT;
+ goto done;
+ }
+
+ if (adapter->hostcmd_resp_data.len > hostcmd_buf->len) {
+ ret = -EFBIG;
+ goto done;
+ }
+
+ if (copy_to_user(req->ifr_data, adapter->hostcmd_resp_data.cmd,
+ adapter->hostcmd_resp_data.len)) {
+ ret = -EFAULT;
+ goto done;
+ }
+
+ ret = 0;
+done:
+ kfree(hostcmd_buf);
+ return ret;
+}
+
/*
* This function handles the command response of a sleep confirm command.
*
diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
index ee40b73..3e7700f 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.c
+++ b/drivers/net/wireless/marvell/mwifiex/main.c
@@ -1265,12 +1265,35 @@ static struct net_device_stats *mwifiex_get_stats(struct net_device *dev)
return mwifiex_1d_to_wmm_queue[skb->priority];
}

+static int mwifiex_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
+{
+ struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
+ int ret;
+
+ if (!priv->adapter->mfg_mode)
+ return -EINVAL;
+
+ mwifiex_dbg(priv->adapter, "ioctl cmd = 0x%x\n", cmd);
+
+ switch (cmd) {
+ case MWIFIEX_HOSTCMD_IOCTL:
+ ret = mwifiex_process_host_command(priv, req);
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+ }
+
+ return ret;
+}
+
/* Network device handlers */
static const struct net_device_ops mwifiex_netdev_ops = {
.ndo_open = mwifiex_open,
.ndo_stop = mwifiex_close,
.ndo_start_xmit = mwifiex_hard_start_xmit,
.ndo_set_mac_address = mwifiex_ndo_set_mac_address,
+ .ndo_do_ioctl = mwifiex_do_ioctl,
.ndo_validate_addr = eth_validate_addr,
.ndo_tx_timeout = mwifiex_tx_timeout,
.ndo_get_stats = mwifiex_get_stats,
diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
index a76bd79..4639f49 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.h
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
@@ -160,6 +160,9 @@ enum {
/* Threshold for tx_timeout_cnt before we trigger a card reset */
#define TX_TIMEOUT_THRESHOLD 6

+/* IOCTL number used for hostcmd process*/
+#define MWIFIEX_HOSTCMD_IOCTL (SIOCDEVPRIVATE + 1)
+
#define MWIFIEX_DRV_INFO_SIZE_MAX 0x40000

/* Address alignment */
@@ -912,6 +915,7 @@ struct mwifiex_adapter {
u8 event_received;
u8 data_received;
u16 seq_num;
+ struct mwifiex_ds_misc_cmd hostcmd_resp_data;
struct cmd_ctrl_node *cmd_pool;
struct cmd_ctrl_node *curr_cmd;
/* spin lock for command */
@@ -1611,7 +1615,8 @@ int mwifiex_get_tdls_list(struct mwifiex_private *priv,
u8 mwifiex_get_center_freq_index(struct mwifiex_private *priv, u8 band,
u32 pri_chan, u8 chan_bw);
int mwifiex_init_channel_scan_gap(struct mwifiex_adapter *adapter);
-
+int mwifiex_process_host_command(struct mwifiex_private *priv,
+ struct ifreq *req);
int mwifiex_tdls_check_tx(struct mwifiex_private *priv, struct sk_buff *skb);
void mwifiex_flush_auto_tdls_list(struct mwifiex_private *priv);
void mwifiex_auto_tdls_update_peer_status(struct mwifiex_private *priv,
--
1.9.1


2017-09-20 08:39:41

by Arend Van Spriel

[permalink] [raw]
Subject: Re: [PATCH] mwifiex: add device specific ioctl handler

On 9/20/2017 8:44 AM, Xinming Hu wrote:
> From: Xinming Hu <[email protected]>
>
> Add net_dev ndo_do_ioctl handler, which could be used for
> downloading host command by utility in manufactory test

Not sure if we want ioctls in upstream wireless drivers. You could look
at nl80211 vendor commands, but that is also under scrutiny if common
wifi functionality is provided by it. I am pretty sure Kalle has his
ideas about this :-)

Regards,
Arend

2017-09-20 08:06:34

by Souptick Joarder

[permalink] [raw]
Subject: Re: [PATCH] mwifiex: add device specific ioctl handler

On Wed, Sep 20, 2017 at 12:14 PM, Xinming Hu <[email protected]> wrote:
> From: Xinming Hu <[email protected]>
>
> Add net_dev ndo_do_ioctl handler, which could be used for
> downloading host command by utility in manufactory test
>
> Signed-off-by: Xinming Hu <[email protected]>
> Signed-off-by: Cathy Luo <[email protected]>
> Signed-off-by: Ganapathi Bhat <[email protected]>
> ---
> drivers/net/wireless/marvell/mwifiex/cmdevt.c | 59 +++++++++++++++++++++++++++
> drivers/net/wireless/marvell/mwifiex/main.c | 23 +++++++++++
> drivers/net/wireless/marvell/mwifiex/main.h | 7 +++-
> 3 files changed, 88 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
> index 0edc5d6..86ee399 100644
> --- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c
> +++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
> @@ -839,6 +839,8 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
> hostcmd = adapter->curr_cmd->data_buf;
> hostcmd->len = size;
> memcpy(hostcmd->cmd, resp, size);
> + adapter->hostcmd_resp_data.len = size;
> + memcpy(adapter->hostcmd_resp_data.cmd, resp, size);
> }
> }
> orig_cmdresp_no = le16_to_cpu(resp->command);
> @@ -1221,6 +1223,63 @@ int mwifiex_ret_802_11_hs_cfg(struct mwifiex_private *priv,
> }
> EXPORT_SYMBOL_GPL(mwifiex_process_hs_config);
>
> +/* This function get hostcmd data from userspace and construct a cmd
> + * to be download to FW.
> + */
> +int mwifiex_process_host_command(struct mwifiex_private *priv,
> + struct ifreq *req)
> +{
> + struct mwifiex_ds_misc_cmd *hostcmd_buf;
> + struct host_cmd_ds_command *cmd;
> + struct mwifiex_adapter *adapter = priv->adapter;
> + int ret;
> +
> + hostcmd_buf = kzalloc(sizeof(*hostcmd_buf), GFP_KERNEL);

will it be sizeof(*hostcmd_buf) or sizeof( struct mwifiex_ds_misc_cmd *) ?

> + if (!hostcmd_buf)
> + return -ENOMEM;
> +
> + cmd = (void *)hostcmd_buf->cmd;
> +
> + if (copy_from_user(cmd, req->ifr_data,
> + sizeof(cmd->command) + sizeof(cmd->size))) {
> + ret = -EFAULT;
> + goto done;
> + }
> +
> + hostcmd_buf->len = le16_to_cpu(cmd->size);
> + if (hostcmd_buf->len > MWIFIEX_SIZE_OF_CMD_BUFFER) {
> + ret = -EINVAL;
> + goto done;
> + }
> +
> + if (copy_from_user(cmd, req->ifr_data, hostcmd_buf->len)) {
> + ret = -EFAULT;
> + goto done;
> + }
> +
> + if (mwifiex_send_cmd(priv, 0, 0, 0, hostcmd_buf, true)) {
> + dev_err(priv->adapter->dev, "Failed to process hostcmd\n");
> + ret = -EFAULT;
> + goto done;
> + }
> +
> + if (adapter->hostcmd_resp_data.len > hostcmd_buf->len) {
> + ret = -EFBIG;
> + goto done;
> + }
> +
> + if (copy_to_user(req->ifr_data, adapter->hostcmd_resp_data.cmd,
> + adapter->hostcmd_resp_data.len)) {
> + ret = -EFAULT;
> + goto done;
> + }
> +
> + ret = 0;
> +done:
> + kfree(hostcmd_buf);
> + return ret;
> +}
> +
> /*
> * This function handles the command response of a sleep confirm command.
> *
> diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
> index ee40b73..3e7700f 100644
> --- a/drivers/net/wireless/marvell/mwifiex/main.c
> +++ b/drivers/net/wireless/marvell/mwifiex/main.c
> @@ -1265,12 +1265,35 @@ static struct net_device_stats *mwifiex_get_stats(struct net_device *dev)
> return mwifiex_1d_to_wmm_queue[skb->priority];
> }
>
> +static int mwifiex_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
> +{
> + struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
> + int ret;
> +
> + if (!priv->adapter->mfg_mode)
> + return -EINVAL;

ret can be used instead of returning -EINVAL.

> +
> + mwifiex_dbg(priv->adapter, "ioctl cmd = 0x%x\n", cmd);
> +
> + switch (cmd) {
> + case MWIFIEX_HOSTCMD_IOCTL:
> + ret = mwifiex_process_host_command(priv, req);
> + break;
> + default:
> + ret = -EINVAL;
> + break;
> + }
> +
> + return ret;
> +}
> +
> /* Network device handlers */
> static const struct net_device_ops mwifiex_netdev_ops = {
> .ndo_open = mwifiex_open,
> .ndo_stop = mwifiex_close,
> .ndo_start_xmit = mwifiex_hard_start_xmit,
> .ndo_set_mac_address = mwifiex_ndo_set_mac_address,
> + .ndo_do_ioctl = mwifiex_do_ioctl,
> .ndo_validate_addr = eth_validate_addr,
> .ndo_tx_timeout = mwifiex_tx_timeout,
> .ndo_get_stats = mwifiex_get_stats,
> diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
> index a76bd79..4639f49 100644
> --- a/drivers/net/wireless/marvell/mwifiex/main.h
> +++ b/drivers/net/wireless/marvell/mwifiex/main.h
> @@ -160,6 +160,9 @@ enum {
> /* Threshold for tx_timeout_cnt before we trigger a card reset */
> #define TX_TIMEOUT_THRESHOLD 6
>
> +/* IOCTL number used for hostcmd process*/
> +#define MWIFIEX_HOSTCMD_IOCTL (SIOCDEVPRIVATE + 1)
> +
> #define MWIFIEX_DRV_INFO_SIZE_MAX 0x40000
>
> /* Address alignment */
> @@ -912,6 +915,7 @@ struct mwifiex_adapter {
> u8 event_received;
> u8 data_received;
> u16 seq_num;
> + struct mwifiex_ds_misc_cmd hostcmd_resp_data;
> struct cmd_ctrl_node *cmd_pool;
> struct cmd_ctrl_node *curr_cmd;
> /* spin lock for command */
> @@ -1611,7 +1615,8 @@ int mwifiex_get_tdls_list(struct mwifiex_private *priv,
> u8 mwifiex_get_center_freq_index(struct mwifiex_private *priv, u8 band,
> u32 pri_chan, u8 chan_bw);
> int mwifiex_init_channel_scan_gap(struct mwifiex_adapter *adapter);
> -
> +int mwifiex_process_host_command(struct mwifiex_private *priv,
> + struct ifreq *req);
> int mwifiex_tdls_check_tx(struct mwifiex_private *priv, struct sk_buff *skb);
> void mwifiex_flush_auto_tdls_list(struct mwifiex_private *priv);
> void mwifiex_auto_tdls_update_peer_status(struct mwifiex_private *priv,
> --
> 1.9.1
>

2017-09-23 02:30:08

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] mwifiex: add device specific ioctl handler

Hi Xinming,

[auto build test ERROR on wireless-drivers-next/master]
[also build test ERROR on v4.14-rc1 next-20170922]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/Xinming-Hu/mwifiex-add-device-specific-ioctl-handler/20170923-094243
base: https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git master
config: x86_64-randconfig-x000-201738 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64

All error/warnings (new ones prefixed by >>):

In file included from drivers/net/wireless/marvell/mwifiex/main.c:22:0:
drivers/net/wireless/marvell/mwifiex/main.c: In function 'mwifiex_do_ioctl':
drivers/net/wireless/marvell/mwifiex/main.h:209:24: error: pasting "MWIFIEX_DBG_" and ""ioctl cmd = 0x%x\n"" does not give a valid preprocessing token
_mwifiex_dbg(adapter, MWIFIEX_DBG_##mask, fmt, ##__VA_ARGS__)
^
>> drivers/net/wireless/marvell/mwifiex/main.c:1276:2: note: in expansion of macro 'mwifiex_dbg'
mwifiex_dbg(priv->adapter, "ioctl cmd = 0x%x\n", cmd);
^~~~~~~~~~~
>> drivers/net/wireless/marvell/mwifiex/main.h:209:24: error: 'MWIFIEX_DBG_' undeclared (first use in this function)
_mwifiex_dbg(adapter, MWIFIEX_DBG_##mask, fmt, ##__VA_ARGS__)
^
>> drivers/net/wireless/marvell/mwifiex/main.c:1276:2: note: in expansion of macro 'mwifiex_dbg'
mwifiex_dbg(priv->adapter, "ioctl cmd = 0x%x\n", cmd);
^~~~~~~~~~~
drivers/net/wireless/marvell/mwifiex/main.h:209:24: note: each undeclared identifier is reported only once for each function it appears in
_mwifiex_dbg(adapter, MWIFIEX_DBG_##mask, fmt, ##__VA_ARGS__)
^
>> drivers/net/wireless/marvell/mwifiex/main.c:1276:2: note: in expansion of macro 'mwifiex_dbg'
mwifiex_dbg(priv->adapter, "ioctl cmd = 0x%x\n", cmd);
^~~~~~~~~~~
>> drivers/net/wireless/marvell/mwifiex/main.c:1276:29: error: expected ')' before string constant
mwifiex_dbg(priv->adapter, "ioctl cmd = 0x%x\n", cmd);
^
drivers/net/wireless/marvell/mwifiex/main.h:209:38: note: in definition of macro 'mwifiex_dbg'
_mwifiex_dbg(adapter, MWIFIEX_DBG_##mask, fmt, ##__VA_ARGS__)
^~~~
>> drivers/net/wireless/marvell/mwifiex/main.h:209:2: error: too few arguments to function '_mwifiex_dbg'
_mwifiex_dbg(adapter, MWIFIEX_DBG_##mask, fmt, ##__VA_ARGS__)
^
>> drivers/net/wireless/marvell/mwifiex/main.c:1276:2: note: in expansion of macro 'mwifiex_dbg'
mwifiex_dbg(priv->adapter, "ioctl cmd = 0x%x\n", cmd);
^~~~~~~~~~~
drivers/net/wireless/marvell/mwifiex/main.h:206:6: note: declared here
void _mwifiex_dbg(const struct mwifiex_adapter *adapter, int mask,
^~~~~~~~~~~~

vim +209 drivers/net/wireless/marvell/mwifiex/main.h

c687a0077 drivers/net/wireless/mwifiex/main.h Zhaoyang Liu 2015-05-12 200
c687a0077 drivers/net/wireless/mwifiex/main.h Zhaoyang Liu 2015-05-12 201 #define MWIFIEX_DEFAULT_DEBUG_MASK (MWIFIEX_DBG_MSG | \
c687a0077 drivers/net/wireless/mwifiex/main.h Zhaoyang Liu 2015-05-12 202 MWIFIEX_DBG_FATAL | \
c687a0077 drivers/net/wireless/mwifiex/main.h Zhaoyang Liu 2015-05-12 203 MWIFIEX_DBG_ERROR)
c687a0077 drivers/net/wireless/mwifiex/main.h Zhaoyang Liu 2015-05-12 204
36925e52c drivers/net/wireless/mwifiex/main.h Joe Perches 2015-08-31 205 __printf(3, 4)
36925e52c drivers/net/wireless/mwifiex/main.h Joe Perches 2015-08-31 206 void _mwifiex_dbg(const struct mwifiex_adapter *adapter, int mask,
36925e52c drivers/net/wireless/mwifiex/main.h Joe Perches 2015-08-31 207 const char *fmt, ...);
36925e52c drivers/net/wireless/mwifiex/main.h Joe Perches 2015-08-31 208 #define mwifiex_dbg(adapter, mask, fmt, ...) \
36925e52c drivers/net/wireless/mwifiex/main.h Joe Perches 2015-08-31 @209 _mwifiex_dbg(adapter, MWIFIEX_DBG_##mask, fmt, ##__VA_ARGS__)
c687a0077 drivers/net/wireless/mwifiex/main.h Zhaoyang Liu 2015-05-12 210

:::::: The code at line 209 was first introduced by commit
:::::: 36925e52c5ac9d10a553d1339e13a61bfbdd4ba4 mwifiex: Make mwifiex_dbg a function, reduce object size

:::::: TO: Joe Perches <[email protected]>
:::::: CC: Kalle Valo <[email protected]>

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation


Attachments:
(No filename) (4.51 kB)
.config.gz (28.03 kB)
Download all attachments

2017-09-23 03:01:28

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] mwifiex: add device specific ioctl handler

Hi Xinming,

[auto build test ERROR on wireless-drivers-next/master]
[also build test ERROR on v4.14-rc1 next-20170922]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/Xinming-Hu/mwifiex-add-device-specific-ioctl-handler/20170923-094243
base: https://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next.git master
config: tile-allyesconfig (attached as .config)
compiler: tilegx-linux-gcc (GCC) 4.6.2
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=tile

All errors (new ones prefixed by >>):

drivers/net//wireless/marvell/mwifiex/main.c: In function 'mwifiex_do_ioctl':
drivers/net//wireless/marvell/mwifiex/main.c:1276:1: error: pasting "MWIFIEX_DBG_" and ""ioctl cmd = 0x%x\n"" does not give a valid preprocessing token
>> drivers/net//wireless/marvell/mwifiex/main.c:1276:1: error: 'MWIFIEX_DBG_' undeclared (first use in this function)
drivers/net//wireless/marvell/mwifiex/main.c:1276:1: note: each undeclared identifier is reported only once for each function it appears in
drivers/net//wireless/marvell/mwifiex/main.c:1276:2: error: expected ')' before string constant
>> drivers/net//wireless/marvell/mwifiex/main.c:1276:2: error: too few arguments to function '_mwifiex_dbg'
drivers/net//wireless/marvell/mwifiex/main.h:206:6: note: declared here

vim +1276 drivers/net//wireless/marvell/mwifiex/main.c

1267
1268 static int mwifiex_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
1269 {
1270 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1271 int ret;
1272
1273 if (!priv->adapter->mfg_mode)
1274 return -EINVAL;
1275
> 1276 mwifiex_dbg(priv->adapter, "ioctl cmd = 0x%x\n", cmd);
1277
1278 switch (cmd) {
1279 case MWIFIEX_HOSTCMD_IOCTL:
1280 ret = mwifiex_process_host_command(priv, req);
1281 break;
1282 default:
1283 ret = -EINVAL;
1284 break;
1285 }
1286
1287 return ret;
1288 }
1289

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation


Attachments:
(No filename) (2.32 kB)
.config.gz (49.32 kB)
Download all attachments

2017-09-20 11:38:56

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH] mwifiex: add device specific ioctl handler

Arend van Spriel <[email protected]> writes:

> On 9/20/2017 8:44 AM, Xinming Hu wrote:
>> From: Xinming Hu <[email protected]>
>>
>> Add net_dev ndo_do_ioctl handler, which could be used for
>> downloading host command by utility in manufactory test
>
> Not sure if we want ioctls in upstream wireless drivers.

Yeah, patches adding ioctls to wireless drivers are automatically
rejected.

> You could look at nl80211 vendor commands, but that is also under
> scrutiny if common wifi functionality is provided by it. I am pretty
> sure Kalle has his ideas about this :-)

For manufacturing tests we have nl80211 testmode command and event.
There are upstream drivers already using it so you even have examples.

--
Kalle Valo

2017-09-20 09:11:54

by Xinming Hu

[permalink] [raw]
Subject: RE: [EXT] Re: [PATCH] mwifiex: add device specific ioctl handler

SGksDQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogU291cHRpY2sgSm9h
cmRlciBbbWFpbHRvOmpyZHIubGludXhAZ21haWwuY29tXQ0KPiBTZW50OiAyMDE35bm0OeaciDIw
5pelIDE2OjA3DQo+IFRvOiBYaW5taW5nIEh1IDxodXhpbm1pbmc4MjBAZ21haWwuY29tPg0KPiBD
YzogTGludXggV2lyZWxlc3MgPGxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZz47IEthbGxl
IFZhbG8NCj4gPGt2YWxvQGNvZGVhdXJvcmEub3JnPjsgQnJpYW4gTm9ycmlzIDxicmlhbm5vcnJp
c0Bnb29nbGUuY29tPjsgRG1pdHJ5DQo+IFRvcm9raG92IDxkdG9yQGdvb2dsZS5jb20+OyByYWph
dGphQGdvb2dsZS5jb207IFpoaXl1YW4gWWFuZw0KPiA8eWFuZ3p5QG1hcnZlbGwuY29tPjsgVGlt
IFNvbmcgPHNvbmd0YW9AbWFydmVsbC5jb20+OyBDYXRoeSBMdW8NCj4gPGNsdW9AbWFydmVsbC5j
b20+OyBHYW5hcGF0aGkgQmhhdCA8Z2JoYXRAbWFydmVsbC5jb20+OyBYaW5taW5nIEh1DQo+IDxo
dXhtQG1hcnZlbGwuY29tPg0KPiBTdWJqZWN0OiBbRVhUXSBSZTogW1BBVENIXSBtd2lmaWV4OiBh
ZGQgZGV2aWNlIHNwZWNpZmljIGlvY3RsIGhhbmRsZXINCj4gDQo+IEV4dGVybmFsIEVtYWlsDQo+
IA0KPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tDQo+IE9uIFdlZCwgU2VwIDIwLCAyMDE3IGF0IDEyOjE0IFBNLCBY
aW5taW5nIEh1IDxodXhpbm1pbmc4MjBAZ21haWwuY29tPg0KPiB3cm90ZToNCj4gPiBGcm9tOiBY
aW5taW5nIEh1IDxodXhtQG1hcnZlbGwuY29tPg0KPiA+DQo+ID4gQWRkIG5ldF9kZXYgbmRvX2Rv
X2lvY3RsIGhhbmRsZXIsIHdoaWNoIGNvdWxkIGJlIHVzZWQgZm9yIGRvd25sb2FkaW5nDQo+ID4g
aG9zdCBjb21tYW5kIGJ5IHV0aWxpdHkgaW4gbWFudWZhY3RvcnkgdGVzdA0KPiA+DQo+ID4gU2ln
bmVkLW9mZi1ieTogWGlubWluZyBIdSA8aHV4bUBtYXJ2ZWxsLmNvbT4NCj4gPiBTaWduZWQtb2Zm
LWJ5OiBDYXRoeSBMdW8gPGNsdW9AbWFydmVsbC5jb20+DQo+ID4gU2lnbmVkLW9mZi1ieTogR2Fu
YXBhdGhpIEJoYXQgPGdiaGF0QG1hcnZlbGwuY29tPg0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL25l
dC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY21kZXZ0LmMgfCA1OQ0KPiArKysrKysrKysrKysr
KysrKysrKysrKysrKysNCj4gPiAgZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4
L21haW4uYyAgIHwgMjMgKysrKysrKysrKysNCj4gPiAgZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFy
dmVsbC9td2lmaWV4L21haW4uaCAgIHwgIDcgKysrLQ0KPiA+ICAzIGZpbGVzIGNoYW5nZWQsIDg4
IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkNCj4gPg0KPiA+IGRpZmYgLS1naXQgYS9kcml2
ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY21kZXZ0LmMNCj4gPiBiL2RyaXZlcnMv
bmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9jbWRldnQuYw0KPiA+IGluZGV4IDBlZGM1ZDYu
Ljg2ZWUzOTkgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t
d2lmaWV4L2NtZGV2dC5jDQo+ID4gKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t
d2lmaWV4L2NtZGV2dC5jDQo+ID4gQEAgLTgzOSw2ICs4MzksOCBAQCBpbnQgbXdpZmlleF9wcm9j
ZXNzX2NtZHJlc3Aoc3RydWN0DQo+IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikNCj4gPiAgICAg
ICAgICAgICAgICAgICAgICAgICBob3N0Y21kID0gYWRhcHRlci0+Y3Vycl9jbWQtPmRhdGFfYnVm
Ow0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RjbWQtPmxlbiA9IHNpemU7DQo+ID4g
ICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGhvc3RjbWQtPmNtZCwgcmVzcCwgc2l6ZSk7
DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci0+aG9zdGNtZF9yZXNwX2RhdGEu
bGVuID0gc2l6ZTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYWRhcHRlci0+
aG9zdGNtZF9yZXNwX2RhdGEuY21kLA0KPiByZXNwLA0KPiA+ICsgc2l6ZSk7DQo+ID4gICAgICAg
ICAgICAgICAgIH0NCj4gPiAgICAgICAgIH0NCj4gPiAgICAgICAgIG9yaWdfY21kcmVzcF9ubyA9
IGxlMTZfdG9fY3B1KHJlc3AtPmNvbW1hbmQpOyBAQCAtMTIyMSw2DQo+ID4gKzEyMjMsNjMgQEAg
aW50IG13aWZpZXhfcmV0XzgwMl8xMV9oc19jZmcoc3RydWN0IG13aWZpZXhfcHJpdmF0ZQ0KPiA+
ICpwcml2LCAgfSAgRVhQT1JUX1NZTUJPTF9HUEwobXdpZmlleF9wcm9jZXNzX2hzX2NvbmZpZyk7
DQo+ID4NCj4gPiArLyogVGhpcyBmdW5jdGlvbiBnZXQgaG9zdGNtZCBkYXRhIGZyb20gdXNlcnNw
YWNlIGFuZCBjb25zdHJ1Y3QgYSBjbWQNCj4gPiArICogdG8gYmUgZG93bmxvYWQgdG8gRlcuDQo+
ID4gKyAqLw0KPiA+ICtpbnQgbXdpZmlleF9wcm9jZXNzX2hvc3RfY29tbWFuZChzdHJ1Y3QgbXdp
ZmlleF9wcml2YXRlICpwcml2LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHN0cnVjdCBpZnJlcSAqcmVxKSB7DQo+ID4gKyAgICAgICBzdHJ1Y3QgbXdpZmlleF9kc19taXNj
X2NtZCAqaG9zdGNtZF9idWY7DQo+ID4gKyAgICAgICBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFu
ZCAqY21kOw0KPiA+ICsgICAgICAgc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHBy
aXYtPmFkYXB0ZXI7DQo+ID4gKyAgICAgICBpbnQgcmV0Ow0KPiA+ICsNCj4gPiArICAgICAgIGhv
c3RjbWRfYnVmID0ga3phbGxvYyhzaXplb2YoKmhvc3RjbWRfYnVmKSwgR0ZQX0tFUk5FTCk7DQo+
IA0KPiB3aWxsIGl0IGJlIHNpemVvZigqaG9zdGNtZF9idWYpIG9yIHNpemVvZiggc3RydWN0IG13
aWZpZXhfZHNfbWlzY19jbWQgKikgPw0KDQpJdCBzaG91bGQgYmUgc2l6ZW9mKCpob3N0Y21kX2J1
ZiksIGFzIHdlIGFyZSB0cnlpbmcgdG8gYWxsb2NhdGUgYSBzdHJ1Y3QsIG5vdCBhIHBvaW50ZXIu
DQoNCj4gDQo+ID4gKyAgICAgICBpZiAoIWhvc3RjbWRfYnVmKQ0KPiA+ICsgICAgICAgICAgICAg
ICByZXR1cm4gLUVOT01FTTsNCj4gPiArDQo+ID4gKyAgICAgICBjbWQgPSAodm9pZCAqKWhvc3Rj
bWRfYnVmLT5jbWQ7DQo+ID4gKw0KPiA+ICsgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGNtZCwg
cmVxLT5pZnJfZGF0YSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY21k
LT5jb21tYW5kKSArIHNpemVvZihjbWQtPnNpemUpKSkNCj4gew0KPiA+ICsgICAgICAgICAgICAg
ICByZXQgPSAtRUZBVUxUOw0KPiA+ICsgICAgICAgICAgICAgICBnb3RvIGRvbmU7DQo+ID4gKyAg
ICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgaG9zdGNtZF9idWYtPmxlbiA9IGxlMTZfdG9fY3B1
KGNtZC0+c2l6ZSk7DQo+ID4gKyAgICAgICBpZiAoaG9zdGNtZF9idWYtPmxlbiA+IE1XSUZJRVhf
U0laRV9PRl9DTURfQlVGRkVSKSB7DQo+ID4gKyAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7
DQo+ID4gKyAgICAgICAgICAgICAgIGdvdG8gZG9uZTsNCj4gPiArICAgICAgIH0NCj4gPiArDQo+
ID4gKyAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoY21kLCByZXEtPmlmcl9kYXRhLCBob3N0Y21k
X2J1Zi0+bGVuKSkgew0KPiA+ICsgICAgICAgICAgICAgICByZXQgPSAtRUZBVUxUOw0KPiA+ICsg
ICAgICAgICAgICAgICBnb3RvIGRvbmU7DQo+ID4gKyAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAg
ICAgaWYgKG13aWZpZXhfc2VuZF9jbWQocHJpdiwgMCwgMCwgMCwgaG9zdGNtZF9idWYsIHRydWUp
KSB7DQo+ID4gKyAgICAgICAgICAgICAgIGRldl9lcnIocHJpdi0+YWRhcHRlci0+ZGV2LCAiRmFp
bGVkIHRvIHByb2Nlc3MNCj4gaG9zdGNtZFxuIik7DQo+ID4gKyAgICAgICAgICAgICAgIHJldCA9
IC1FRkFVTFQ7DQo+ID4gKyAgICAgICAgICAgICAgIGdvdG8gZG9uZTsNCj4gPiArICAgICAgIH0N
Cj4gPiArDQo+ID4gKyAgICAgICBpZiAoYWRhcHRlci0+aG9zdGNtZF9yZXNwX2RhdGEubGVuID4g
aG9zdGNtZF9idWYtPmxlbikgew0KPiA+ICsgICAgICAgICAgICAgICByZXQgPSAtRUZCSUc7DQo+
ID4gKyAgICAgICAgICAgICAgIGdvdG8gZG9uZTsNCj4gPiArICAgICAgIH0NCj4gPiArDQo+ID4g
KyAgICAgICBpZiAoY29weV90b191c2VyKHJlcS0+aWZyX2RhdGEsIGFkYXB0ZXItPmhvc3RjbWRf
cmVzcF9kYXRhLmNtZCwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci0+aG9z
dGNtZF9yZXNwX2RhdGEubGVuKSkgew0KPiA+ICsgICAgICAgICAgICAgICByZXQgPSAtRUZBVUxU
Ow0KPiA+ICsgICAgICAgICAgICAgICBnb3RvIGRvbmU7DQo+ID4gKyAgICAgICB9DQo+ID4gKw0K
PiA+ICsgICAgICAgcmV0ID0gMDsNCj4gPiArZG9uZToNCj4gPiArICAgICAgIGtmcmVlKGhvc3Rj
bWRfYnVmKTsNCj4gPiArICAgICAgIHJldHVybiByZXQ7DQo+ID4gK30NCj4gPiArDQo+ID4gIC8q
DQo+ID4gICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgY29tbWFuZCByZXNwb25zZSBvZiBh
IHNsZWVwIGNvbmZpcm0NCj4gY29tbWFuZC4NCj4gPiAgICoNCj4gPiBkaWZmIC0tZ2l0IGEvZHJp
dmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uYw0KPiA+IGIvZHJpdmVycy9u
ZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uYw0KPiA+IGluZGV4IGVlNDBiNzMuLjNl
NzcwMGYgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lm
aWV4L21haW4uYw0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmll
eC9tYWluLmMNCj4gPiBAQCAtMTI2NSwxMiArMTI2NSwzNSBAQCBzdGF0aWMgc3RydWN0IG5ldF9k
ZXZpY2Vfc3RhdHMNCj4gKm13aWZpZXhfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYp
DQo+ID4gICAgICAgICByZXR1cm4gbXdpZmlleF8xZF90b193bW1fcXVldWVbc2tiLT5wcmlvcml0
eV07DQo+ID4gIH0NCj4gPg0KPiA+ICtzdGF0aWMgaW50IG13aWZpZXhfZG9faW9jdGwoc3RydWN0
IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxDQo+ID4gKypyZXEsIGludCBjbWQpIHsNCj4g
PiArICAgICAgIHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPSBtd2lmaWV4X25ldGRldl9n
ZXRfcHJpdihkZXYpOw0KPiA+ICsgICAgICAgaW50IHJldDsNCj4gPiArDQo+ID4gKyAgICAgICBp
ZiAoIXByaXYtPmFkYXB0ZXItPm1mZ19tb2RlKQ0KPiA+ICsgICAgICAgICAgICAgICByZXR1cm4g
LUVJTlZBTDsNCj4gDQo+IHJldCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIHJldHVybmluZyAtRUlO
VkFMLg0KDQpHZW5lcmFsbHkgc3BlYWtpbmcsIEl0IGlzIGEgZ29vZCBiZWhhdmlvciB0aGF0IEZ1
bmN0aW9uIGhhdmUgYSBzaW5nbGUgcG9pbnQgb2YgZXhpdCwgdGh1cyBtYWtlIHN1cmUgcmlnaHQg
Y2xlYW51cC4NCkluIHRoaXMgZnVuY3Rpb24sIHRoZXJlIGlzIG5vIHN1Y2ggbmVlZHMsIGFuZCB3
ZSBtaWdodCBuZWVkIGFkZCAoMSkgZmxhZyBleGl0ICgyKSBzZXZlcmFsIGdvdG8gLg0KSSB3b3Vs
ZCBsaWtlIHRvIGtlZXAgY3VycmVudCBjb2Rpbmcgc3R5bGUgZm9yIHNpbXBsaWZ5LCBwbGVhc2Ug
c3VnZ2VzdCBpZiB5b3UgaGF2ZSBtb3JlIGNvbmNlcm4uDQoNClJlZ2FyZHMsDQpTaW1vbg0KPiAN
Cj4gPiArDQo+ID4gKyAgICAgICBtd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCAiaW9jdGwgY21k
ID0gMHgleFxuIiwgY21kKTsNCj4gPiArDQo+ID4gKyAgICAgICBzd2l0Y2ggKGNtZCkgew0KPiA+
ICsgICAgICAgY2FzZSBNV0lGSUVYX0hPU1RDTURfSU9DVEw6DQo+ID4gKyAgICAgICAgICAgICAg
IHJldCA9IG13aWZpZXhfcHJvY2Vzc19ob3N0X2NvbW1hbmQocHJpdiwgcmVxKTsNCj4gPiArICAg
ICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICBkZWZhdWx0Og0KPiA+ICsgICAgICAgICAg
ICAgICByZXQgPSAtRUlOVkFMOw0KPiA+ICsgICAgICAgICAgICAgICBicmVhazsNCj4gPiArICAg
ICAgIH0NCj4gPiArDQo+ID4gKyAgICAgICByZXR1cm4gcmV0Ow0KPiA+ICt9DQo+ID4gKw0KPiA+
ICAvKiBOZXR3b3JrIGRldmljZSBoYW5kbGVycyAqLw0KPiA+ICBzdGF0aWMgY29uc3Qgc3RydWN0
IG5ldF9kZXZpY2Vfb3BzIG13aWZpZXhfbmV0ZGV2X29wcyA9IHsNCj4gPiAgICAgICAgIC5uZG9f
b3BlbiA9IG13aWZpZXhfb3BlbiwNCj4gPiAgICAgICAgIC5uZG9fc3RvcCA9IG13aWZpZXhfY2xv
c2UsDQo+ID4gICAgICAgICAubmRvX3N0YXJ0X3htaXQgPSBtd2lmaWV4X2hhcmRfc3RhcnRfeG1p
dCwNCj4gPiAgICAgICAgIC5uZG9fc2V0X21hY19hZGRyZXNzID0gbXdpZmlleF9uZG9fc2V0X21h
Y19hZGRyZXNzLA0KPiA+ICsgICAgICAgLm5kb19kb19pb2N0bCA9IG13aWZpZXhfZG9faW9jdGws
DQo+ID4gICAgICAgICAubmRvX3ZhbGlkYXRlX2FkZHIgPSBldGhfdmFsaWRhdGVfYWRkciwNCj4g
PiAgICAgICAgIC5uZG9fdHhfdGltZW91dCA9IG13aWZpZXhfdHhfdGltZW91dCwNCj4gPiAgICAg
ICAgIC5uZG9fZ2V0X3N0YXRzID0gbXdpZmlleF9nZXRfc3RhdHMsIGRpZmYgLS1naXQNCj4gPiBh
L2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmgNCj4gPiBiL2RyaXZl
cnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmgNCj4gPiBpbmRleCBhNzZiZDc5
Li40NjM5ZjQ5IDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwv
bXdpZmlleC9tYWluLmgNCj4gPiArKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213
aWZpZXgvbWFpbi5oDQo+ID4gQEAgLTE2MCw2ICsxNjAsOSBAQCBlbnVtIHsNCj4gPiAgLyogVGhy
ZXNob2xkIGZvciB0eF90aW1lb3V0X2NudCBiZWZvcmUgd2UgdHJpZ2dlciBhIGNhcmQgcmVzZXQg
Ki8NCj4gPiAgI2RlZmluZSBUWF9USU1FT1VUX1RIUkVTSE9MRCAgIDYNCj4gPg0KPiA+ICsvKiBJ
T0NUTCBudW1iZXIgdXNlZCBmb3IgaG9zdGNtZCBwcm9jZXNzKi8gI2RlZmluZQ0KPiA+ICtNV0lG
SUVYX0hPU1RDTURfSU9DVEwgKFNJT0NERVZQUklWQVRFICsgMSkNCj4gPiArDQo+ID4gICNkZWZp
bmUgTVdJRklFWF9EUlZfSU5GT19TSVpFX01BWCAweDQwMDAwDQo+ID4NCj4gPiAgLyogQWRkcmVz
cyBhbGlnbm1lbnQgKi8NCj4gPiBAQCAtOTEyLDYgKzkxNSw3IEBAIHN0cnVjdCBtd2lmaWV4X2Fk
YXB0ZXIgew0KPiA+ICAgICAgICAgdTggZXZlbnRfcmVjZWl2ZWQ7DQo+ID4gICAgICAgICB1OCBk
YXRhX3JlY2VpdmVkOw0KPiA+ICAgICAgICAgdTE2IHNlcV9udW07DQo+ID4gKyAgICAgICBzdHJ1
Y3QgbXdpZmlleF9kc19taXNjX2NtZCBob3N0Y21kX3Jlc3BfZGF0YTsNCj4gPiAgICAgICAgIHN0
cnVjdCBjbWRfY3RybF9ub2RlICpjbWRfcG9vbDsNCj4gPiAgICAgICAgIHN0cnVjdCBjbWRfY3Ry
bF9ub2RlICpjdXJyX2NtZDsNCj4gPiAgICAgICAgIC8qIHNwaW4gbG9jayBmb3IgY29tbWFuZCAq
Lw0KPiA+IEBAIC0xNjExLDcgKzE2MTUsOCBAQCBpbnQgbXdpZmlleF9nZXRfdGRsc19saXN0KHN0
cnVjdCBtd2lmaWV4X3ByaXZhdGUNCj4gPiAqcHJpdiwNCj4gPiAgdTggbXdpZmlleF9nZXRfY2Vu
dGVyX2ZyZXFfaW5kZXgoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggYmFuZCwNCj4g
PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgcHJpX2NoYW4sIHU4IGNoYW5f
YncpOyAgaW50DQo+ID4gbXdpZmlleF9pbml0X2NoYW5uZWxfc2Nhbl9nYXAoc3RydWN0IG13aWZp
ZXhfYWRhcHRlciAqYWRhcHRlcik7DQo+ID4gLQ0KPiA+ICtpbnQgbXdpZmlleF9wcm9jZXNzX2hv
c3RfY29tbWFuZChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LA0KPiA+ICsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZnJlcSAqcmVxKTsNCj4gPiAgaW50IG13aWZp
ZXhfdGRsc19jaGVja190eChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCBzdHJ1Y3QNCj4g
PiBza19idWZmICpza2IpOyAgdm9pZCBtd2lmaWV4X2ZsdXNoX2F1dG9fdGRsc19saXN0KHN0cnVj
dA0KPiA+IG13aWZpZXhfcHJpdmF0ZSAqcHJpdik7ICB2b2lkDQo+ID4gbXdpZmlleF9hdXRvX3Rk
bHNfdXBkYXRlX3BlZXJfc3RhdHVzKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsDQo+ID4g
LS0NCj4gPiAxLjkuMQ0KPiA+DQo=