diff options
author | Marian Chereji <marian.chereji@freescale.com> | 2014-08-08 08:54:18 (GMT) |
---|---|---|
committer | Matthew Weigel <Matthew.Weigel@freescale.com> | 2014-12-11 18:39:29 (GMT) |
commit | de3cff2d7b9506c046f46ac4d699e2d5391018ab (patch) | |
tree | 90ea6560eebe2309205241ce72935be08b800a26 /drivers | |
parent | c484a320889183f15306b13106f304c056b8f461 (diff) | |
download | linux-fsl-qoriq-de3cff2d7b9506c046f46ac4d699e2d5391018ab.tar.xz |
dpa_offload: Fix compat mode IOCTL commands for IPSec sequence number management functions
The two functions that are managing the IPSec sequence numbers,
dpa_ipsec_sa_modify and dpa_ipsec_sa_request_seq_number, don't have
IOCTL support for working in compat mode (32bit user space applications
calling a 64bit kernel). This change adds this support.
Signed-off-by: Grigore Ion <ion.grigore@freescale.com>
Signed-off-by: Marian Chereji <marian.chereji@freescale.com>
Change-Id: I8ce0514d0d40aee7155c2d17dd7cacb52736437a
Reviewed-on: http://git.am.freescale.net:8181/15676
Reviewed-by: Radu-Andrei Bulie <Radu.Bulie@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/fsl_dpa_offload/wrp_dpa_ipsec.c | 76 |
1 files changed, 75 insertions, 1 deletions
diff --git a/drivers/staging/fsl_dpa_offload/wrp_dpa_ipsec.c b/drivers/staging/fsl_dpa_offload/wrp_dpa_ipsec.c index c07df76..d157f95 100644 --- a/drivers/staging/fsl_dpa_offload/wrp_dpa_ipsec.c +++ b/drivers/staging/fsl_dpa_offload/wrp_dpa_ipsec.c @@ -1626,7 +1626,7 @@ long wrp_dpa_ipsec_do_compat_ioctl(struct file *filp, unsigned int cmd, } - case DPA_IPSEC_IOC_SA_MODIFY: { + case DPA_IPSEC_IOC_SA_MODIFY_COMPAT: { struct dpa_ipsec_sa_modify_prm modify_prm; int sa_id, ret; @@ -1645,6 +1645,80 @@ free: break; } + + case DPA_IPSEC_IOC_SA_REQUEST_SEQ_NUMBER: { + int sa_id; + + if (copy_from_user(&sa_id, (int *)args, sizeof(int))) { + log_err("Could not copy SA id\n"); + return -EINVAL; + } + + ret = dpa_ipsec_sa_request_seq_number(sa_id); + break; + } + + case DPA_IPSEC_IOC_SA_GET_SEQ_NUMBER: { + struct ioc_dpa_ipsec_sa_get_seq_num prm; + + if (copy_from_user(&prm, + (struct ioc_dpa_ipsec_sa_get_seq_num *)args, + sizeof(prm))) { + log_err("Could not copy from user stats params\n"); + return -EINVAL; + } + + if (prm.sa_id < 0) { + log_err("Invalid input SA id\n"); + return -EINVAL; + } + + ret = dpa_ipsec_sa_get_seq_number(prm.sa_id, &prm.seq); + if (ret < 0) { + log_err("Get SEQ number for SA %d failed\n", prm.sa_id); + break; + } + + if (copy_to_user((struct ioc_dpa_ipsec_sa_get_seq_num *)args, + &prm, sizeof(prm))) { + log_err("Could not copy SEQ number to user for SA %d\n", + prm.sa_id); + return -EINVAL; + } + break; + } + + case DPA_IPSEC_IOC_SA_GET_OUT_PATH: { + struct ioc_dpa_ipsec_sa_get_out_path prm; + + if (copy_from_user(&prm, + (struct ioc_dpa_ipsec_sa_get_out_path *)args, + sizeof(prm))) { + log_err("Could not copy from user out_path params\n"); + return -EINVAL; + } + + if (prm.sa_id < 0) { + log_err("Invalid input SA id\n"); + return -EINVAL; + } + + ret = dpa_ipsec_sa_get_out_path(prm.sa_id, &prm.fqid); + if (ret < 0) { + log_err("Get out path for SA %d failed\n", prm.sa_id); + break; + } + + if (copy_to_user((struct ioc_dpa_ipsec_sa_get_out_path *)args, + &prm, sizeof(prm))) { + log_err("Could not copy out_path to user for SA %d\n", + prm.sa_id); + return -EINVAL; + } + + break; + } + default: log_err("Invalid DPA IPsec ioctl (0x%x)\n", cmd); ret = -EINVAL; |