summaryrefslogtreecommitdiff
path: root/drivers/staging/fsl_dpa_offload
diff options
context:
space:
mode:
authorMarian Chereji <marian.chereji@freescale.com>2014-08-08 08:54:18 (GMT)
committerMatthew Weigel <Matthew.Weigel@freescale.com>2014-12-11 18:39:29 (GMT)
commitde3cff2d7b9506c046f46ac4d699e2d5391018ab (patch)
tree90ea6560eebe2309205241ce72935be08b800a26 /drivers/staging/fsl_dpa_offload
parentc484a320889183f15306b13106f304c056b8f461 (diff)
downloadlinux-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/staging/fsl_dpa_offload')
-rw-r--r--drivers/staging/fsl_dpa_offload/wrp_dpa_ipsec.c76
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;