Loading drivers/platform/msm/ipa/ipa.c +78 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading @@ -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)); Loading Loading @@ -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; Loading Loading @@ -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: Loading drivers/platform/msm/ipa/ipa_debugfs.c +2 −0 Original line number Diff line number Diff line Loading @@ -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), }; Loading include/uapi/linux/msm_ipa.h +33 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 }; Loading Loading @@ -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 Loading Loading @@ -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 */ Loading Loading
drivers/platform/msm/ipa/ipa.c +78 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading @@ -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)); Loading Loading @@ -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; Loading Loading @@ -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: Loading
drivers/platform/msm/ipa/ipa_debugfs.c +2 −0 Original line number Diff line number Diff line Loading @@ -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), }; Loading
include/uapi/linux/msm_ipa.h +33 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 }; Loading Loading @@ -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 Loading Loading @@ -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 */ Loading