Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fc654638 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: ipa: support ioctl about upstream wan iface"

parents e49f3dc5 32b4ad52
Loading
Loading
Loading
Loading
+78 −2
Original line number Diff line number Diff line
@@ -130,6 +130,12 @@
#define IPA_IOC_MDFY_FLT_RULE32 _IOWR(IPA_IOC_MAGIC, \
				IPA_IOCTL_MDFY_FLT_RULE, \
				compat_uptr_t)
#define IPA_IOC_NOTIFY_WAN_UPSTREAM_ROUTE_ADD32 _IOWR(IPA_IOC_MAGIC, \
				IPA_IOCTL_NOTIFY_WAN_UPSTREAM_ROUTE_ADD, \
				compat_uptr_t)
#define IPA_IOC_NOTIFY_WAN_UPSTREAM_ROUTE_DEL32 _IOWR(IPA_IOC_MAGIC, \
				IPA_IOCTL_NOTIFY_WAN_UPSTREAM_ROUTE_DEL, \
				compat_uptr_t)

/**
 * struct ipa_ioc_nat_alloc_mem32 - nat table memory allocation
@@ -177,6 +183,19 @@ static int ipa_open(struct inode *inode, struct file *filp)
	return 0;
}

static void ipa_wan_msg_free_cb(void *buff, u32 len, u32 type)
{
	if (!buff || (type != WAN_UPSTREAM_ROUTE_ADD
			&& type != WAN_UPSTREAM_ROUTE_DEL)) {
		IPAERR("Null buffer or wrong type give. buff %p type %d\n",
			buff, type);
		return;
	}

	kfree(buff);
}


static long ipa_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
	int retval = 0;
@@ -187,6 +206,8 @@ static long ipa_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
	struct ipa_ioc_v4_nat_init nat_init;
	struct ipa_ioc_v4_nat_del nat_del;
	struct ipa_ioc_rm_dependency rm_depend;
	struct ipa_wan_msg *wan_msg;
	struct ipa_msg_meta msg_meta;
	size_t sz;

	IPADBG("cmd=%x nr=%d\n", cmd, _IOC_NR(cmd));
@@ -774,7 +795,56 @@ static long ipa_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
			break;
		}
		break;
	case IPA_IOC_NOTIFY_WAN_UPSTREAM_ROUTE_ADD:
		wan_msg = kzalloc(sizeof(struct ipa_wan_msg), GFP_KERNEL);
		if (!wan_msg) {
			IPAERR("no memory\n");
			retval = -ENOMEM;
			break;
		}

		if (copy_from_user((u8 *)wan_msg, (u8 *)arg,
			sizeof(struct ipa_wan_msg))) {
				kfree(wan_msg);
				retval = -EFAULT;
				break;
		}

		memset(&msg_meta, 0, sizeof(struct ipa_msg_meta));
		msg_meta.msg_type = WAN_UPSTREAM_ROUTE_ADD;
		msg_meta.msg_len = sizeof(struct ipa_wan_msg);
		retval = ipa_send_msg(&msg_meta, wan_msg, ipa_wan_msg_free_cb);
		if (retval) {
			IPAERR("ipa_send_msg failed: %d\n", retval);
			kfree(wan_msg);
			break;
		}
		break;
	case IPA_IOC_NOTIFY_WAN_UPSTREAM_ROUTE_DEL:
		wan_msg = kzalloc(sizeof(struct ipa_wan_msg), GFP_KERNEL);
		if (!wan_msg) {
			IPAERR("no memory\n");
			retval = -ENOMEM;
			break;
		}

		if (copy_from_user((u8 *)wan_msg, (u8 *)arg,
			sizeof(struct ipa_wan_msg))) {
				kfree(wan_msg);
				retval = -EFAULT;
				break;
		}

		memset(&msg_meta, 0, sizeof(struct ipa_msg_meta));
		msg_meta.msg_type = WAN_UPSTREAM_ROUTE_DEL;
		msg_meta.msg_len = sizeof(struct ipa_wan_msg);
		retval = ipa_send_msg(&msg_meta, wan_msg, ipa_wan_msg_free_cb);
		if (retval) {
			IPAERR("ipa_send_msg failed: %d\n", retval);
			kfree(wan_msg);
			break;
		}
		break;
	default:        /* redundant, as cmd was checked against MAXNR */
		ipa_dec_client_disable_clks();
		return -ENOTTY;
@@ -1413,6 +1483,12 @@ ret:
	case IPA_IOC_MDFY_FLT_RULE32:
		cmd = IPA_IOC_MDFY_FLT_RULE;
		break;
	case IPA_IOC_NOTIFY_WAN_UPSTREAM_ROUTE_ADD32:
		cmd = IPA_IOC_NOTIFY_WAN_UPSTREAM_ROUTE_ADD;
		break;
	case IPA_IOC_NOTIFY_WAN_UPSTREAM_ROUTE_DEL32:
		cmd = IPA_IOC_NOTIFY_WAN_UPSTREAM_ROUTE_DEL;
		break;
	case IPA_IOC_COMMIT_HDR:
	case IPA_IOC_RESET_HDR:
	case IPA_IOC_COMMIT_RT:
+2 −0
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ const char *ipa_event_name[] = {
	__stringify(WLAN_STA_CONNECT),
	__stringify(WLAN_STA_DISCONNECT),
	__stringify(WLAN_CLIENT_CONNECT_EX),
	__stringify(WAN_UPSTREAM_ROUTE_ADD),
	__stringify(WAN_UPSTREAM_ROUTE_DEL),
	__stringify(ECM_CONNECT),
	__stringify(ECM_DISCONNECT),
};
+33 −2
Original line number Diff line number Diff line
@@ -58,7 +58,9 @@
#define IPA_IOCTL_QUERY_RT_TBL_INDEX 34
#define IPA_IOCTL_WRITE_QMAPID 35
#define IPA_IOCTL_MDFY_FLT_RULE 36
#define IPA_IOCTL_MAX            37
#define IPA_IOCTL_NOTIFY_WAN_UPSTREAM_ROUTE_ADD	37
#define IPA_IOCTL_NOTIFY_WAN_UPSTREAM_ROUTE_DEL	38
#define IPA_IOCTL_MAX            39

/**
 * max size of the header to be inserted
@@ -223,8 +225,19 @@ enum ipa_wlan_event {
	IPA_WLAN_EVENT_MAX
};

/**
 * enum ipa_wan_event - Events for wan client
 *
 * wan default route add/del
 */
enum ipa_wan_event {
	WAN_UPSTREAM_ROUTE_ADD = IPA_WLAN_EVENT_MAX,
	WAN_UPSTREAM_ROUTE_DEL,
	IPA_WAN_EVENT_MAX
};

enum ipa_ecm_event {
	ECM_CONNECT = IPA_WLAN_EVENT_MAX,
	ECM_CONNECT = IPA_WAN_EVENT_MAX,
	ECM_DISCONNECT,
	IPA_EVENT_MAX_NUM
};
@@ -1027,6 +1040,17 @@ struct ipa_ecm_msg {
	int ifindex;
};

/**
 * struct ipa_wan_msg - To hold information about wan client
 * @name: name of the wan interface
 *
 * CnE need to pass the name of default wan iface when connected/disconnected.
 */
struct ipa_wan_msg {
	char name[IPA_RESOURCE_NAME_MAX];
	enum ipa_ip_type ip;
};

/**
 * struct ipa_ioc_rm_dependency - parameters for add/delete dependency
 * @resource_name: name of dependent resource
@@ -1162,6 +1186,13 @@ struct ipa_ioc_write_qmapid {
					IPA_IOCTL_MDFY_FLT_RULE, \
					struct ipa_ioc_mdfy_flt_rule *)

#define IPA_IOC_NOTIFY_WAN_UPSTREAM_ROUTE_ADD _IOWR(IPA_IOC_MAGIC, \
				IPA_IOCTL_NOTIFY_WAN_UPSTREAM_ROUTE_ADD, \
				struct ipa_wan_msg *)

#define IPA_IOC_NOTIFY_WAN_UPSTREAM_ROUTE_DEL _IOWR(IPA_IOC_MAGIC, \
				IPA_IOCTL_NOTIFY_WAN_UPSTREAM_ROUTE_DEL, \
				struct ipa_wan_msg *)
/*
 * unique magic number of the Tethering bridge ioctls
 */