Loading drivers/platform/msm/ipa/ipa_v2/ipa_debugfs.c +4 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,10 @@ const char *ipa_event_name[] = { __stringify(IPA_TETHERING_STATS_UPDATE_NETWORK_STATS), __stringify(IPA_PER_CLIENT_STATS_CONNECT_EVENT), __stringify(IPA_PER_CLIENT_STATS_DISCONNECT_EVENT), __stringify(ADD_VLAN_IFACE), __stringify(DEL_VLAN_IFACE), __stringify(ADD_L2TP_VLAN_MAPPING), __stringify(DEL_L2TP_VLAN_MAPPING) }; const char *ipa_hdr_l2_type_name[] = { Loading drivers/platform/msm/ipa/ipa_v3/ipa.c +112 −0 Original line number Diff line number Diff line Loading @@ -611,6 +611,90 @@ static int ipa3_send_wan_msg(unsigned long usr_param, uint8_t msg_type) return 0; } static void ipa3_vlan_l2tp_msg_free_cb(void *buff, u32 len, u32 type) { if (!buff) { IPAERR("Null buffer\n"); return; } if (type != ADD_VLAN_IFACE && type != DEL_VLAN_IFACE && type != ADD_L2TP_VLAN_MAPPING && type != DEL_L2TP_VLAN_MAPPING) { IPAERR("Wrong type given. buff %pK type %d\n", buff, type); return; } kfree(buff); } static int ipa3_send_vlan_l2tp_msg(unsigned long usr_param, uint8_t msg_type) { int retval; struct ipa_ioc_vlan_iface_info *vlan_info; struct ipa_ioc_l2tp_vlan_mapping_info *mapping_info; struct ipa_msg_meta msg_meta; if (msg_type == ADD_VLAN_IFACE || msg_type == DEL_VLAN_IFACE) { vlan_info = kzalloc(sizeof(struct ipa_ioc_vlan_iface_info), GFP_KERNEL); if (!vlan_info) { IPAERR("no memory\n"); return -ENOMEM; } if (copy_from_user((u8 *)vlan_info, (void __user *)usr_param, sizeof(struct ipa_ioc_vlan_iface_info))) { kfree(vlan_info); return -EFAULT; } memset(&msg_meta, 0, sizeof(msg_meta)); msg_meta.msg_type = msg_type; msg_meta.msg_len = sizeof(struct ipa_ioc_vlan_iface_info); retval = ipa3_send_msg(&msg_meta, vlan_info, ipa3_vlan_l2tp_msg_free_cb); if (retval) { IPAERR("ipa3_send_msg failed: %d\n", retval); kfree(vlan_info); return retval; } } else if (msg_type == ADD_L2TP_VLAN_MAPPING || msg_type == DEL_L2TP_VLAN_MAPPING) { mapping_info = kzalloc(sizeof(struct ipa_ioc_l2tp_vlan_mapping_info), GFP_KERNEL); if (!mapping_info) { IPAERR("no memory\n"); return -ENOMEM; } if (copy_from_user((u8 *)mapping_info, (void __user *)usr_param, sizeof(struct ipa_ioc_l2tp_vlan_mapping_info))) { kfree(mapping_info); return -EFAULT; } memset(&msg_meta, 0, sizeof(msg_meta)); msg_meta.msg_type = msg_type; msg_meta.msg_len = sizeof(struct ipa_ioc_l2tp_vlan_mapping_info); retval = ipa3_send_msg(&msg_meta, mapping_info, ipa3_vlan_l2tp_msg_free_cb); if (retval) { IPAERR("ipa3_send_msg failed: %d\n", retval); kfree(mapping_info); return retval; } } else { IPAERR("Unexpected event\n"); return -EFAULT; } return 0; } static long ipa3_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { Loading Loading @@ -1625,6 +1709,34 @@ static long ipa3_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) } break; case IPA_IOC_ADD_VLAN_IFACE: if (ipa3_send_vlan_l2tp_msg(arg, ADD_VLAN_IFACE)) { retval = -EFAULT; break; } break; case IPA_IOC_DEL_VLAN_IFACE: if (ipa3_send_vlan_l2tp_msg(arg, DEL_VLAN_IFACE)) { retval = -EFAULT; break; } break; case IPA_IOC_ADD_L2TP_VLAN_MAPPING: if (ipa3_send_vlan_l2tp_msg(arg, ADD_L2TP_VLAN_MAPPING)) { retval = -EFAULT; break; } break; case IPA_IOC_DEL_L2TP_VLAN_MAPPING: if (ipa3_send_vlan_l2tp_msg(arg, DEL_L2TP_VLAN_MAPPING)) { retval = -EFAULT; break; } break; default: /* redundant, as cmd was checked against MAXNR */ IPA_ACTIVE_CLIENTS_DEC_SIMPLE(); return -ENOTTY; Loading drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +4 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,10 @@ const char *ipa3_event_name[] = { __stringify(IPA_TETHERING_STATS_UPDATE_NETWORK_STATS), __stringify(IPA_PER_CLIENT_STATS_CONNECT_EVENT), __stringify(IPA_PER_CLIENT_STATS_DISCONNECT_EVENT), __stringify(ADD_VLAN_IFACE), __stringify(DEL_VLAN_IFACE), __stringify(ADD_L2TP_VLAN_MAPPING), __stringify(DEL_L2TP_VLAN_MAPPING) }; const char *ipa3_hdr_l2_type_name[] = { Loading include/uapi/linux/msm_ipa.h +53 −2 Original line number Diff line number Diff line Loading @@ -69,7 +69,11 @@ #define IPA_IOCTL_ADD_FLT_RULE_AFTER 44 #define IPA_IOCTL_GET_HW_VERSION 45 #define IPA_IOCTL_ADD_RT_RULE_EXT 46 #define IPA_IOCTL_MAX 47 #define IPA_IOCTL_ADD_VLAN_IFACE 47 #define IPA_IOCTL_DEL_VLAN_IFACE 48 #define IPA_IOCTL_ADD_L2TP_VLAN_MAPPING 49 #define IPA_IOCTL_DEL_L2TP_VLAN_MAPPING 50 #define IPA_IOCTL_MAX 51 /** * max size of the header to be inserted Loading Loading @@ -416,9 +420,17 @@ enum ipa_per_client_stats_event { IPA_PER_CLIENT_STATS_CONNECT_EVENT = IPA_TETHERING_STATS_EVENT_MAX, IPA_PER_CLIENT_STATS_DISCONNECT_EVENT, IPA_PER_CLIENT_STATS_EVENT_MAX, IPA_EVENT_MAX_NUM = IPA_PER_CLIENT_STATS_EVENT_MAX, }; enum ipa_vlan_l2tp_event { ADD_VLAN_IFACE = IPA_PER_CLIENT_STATS_EVENT_MAX, DEL_VLAN_IFACE, ADD_L2TP_VLAN_MAPPING, DEL_L2TP_VLAN_MAPPING, IPA_VLAN_L2TP_EVENT_MAX, }; #define IPA_EVENT_MAX_NUM (IPA_VLAN_L2TP_EVENT_MAX) #define IPA_EVENT_MAX ((int)IPA_EVENT_MAX_NUM) /** Loading Loading @@ -1414,6 +1426,30 @@ struct ipa_ioc_nat_dma_cmd { }; /** * struct ipa_ioc_vlan_iface_info - add vlan interface * @name: interface name * @vlan_id: VLAN ID */ struct ipa_ioc_vlan_iface_info { char name[IPA_RESOURCE_NAME_MAX]; uint8_t vlan_id; }; /** * struct ipa_ioc_l2tp_vlan_mapping_info - l2tp->vlan mapping info * @iptype: l2tp tunnel IP type * @l2tp_iface_name: l2tp interface name * @l2tp_session_id: l2tp session id * @vlan_iface_name: vlan interface name */ struct ipa_ioc_l2tp_vlan_mapping_info { enum ipa_ip_type iptype; char l2tp_iface_name[IPA_RESOURCE_NAME_MAX]; uint8_t l2tp_session_id; char vlan_iface_name[IPA_RESOURCE_NAME_MAX]; }; /** * struct ipa_msg_meta - Format of the message meta-data. * @msg_type: the type of the message Loading Loading @@ -1737,6 +1773,21 @@ struct ipa_tether_device_info { IPA_IOCTL_GET_HW_VERSION, \ enum ipa_hw_type *) #define IPA_IOC_ADD_VLAN_IFACE _IOWR(IPA_IOC_MAGIC, \ IPA_IOCTL_ADD_VLAN_IFACE, \ struct ipa_ioc_vlan_iface_info *) #define IPA_IOC_DEL_VLAN_IFACE _IOWR(IPA_IOC_MAGIC, \ IPA_IOCTL_DEL_VLAN_IFACE, \ struct ipa_ioc_vlan_iface_info *) #define IPA_IOC_ADD_L2TP_VLAN_MAPPING _IOWR(IPA_IOC_MAGIC, \ IPA_IOCTL_ADD_L2TP_VLAN_MAPPING, \ struct ipa_ioc_l2tp_vlan_mapping_info *) #define IPA_IOC_DEL_L2TP_VLAN_MAPPING _IOWR(IPA_IOC_MAGIC, \ IPA_IOCTL_DEL_L2TP_VLAN_MAPPING, \ struct ipa_ioc_l2tp_vlan_mapping_info *) /* * unique magic number of the Tethering bridge ioctls */ Loading Loading
drivers/platform/msm/ipa/ipa_v2/ipa_debugfs.c +4 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,10 @@ const char *ipa_event_name[] = { __stringify(IPA_TETHERING_STATS_UPDATE_NETWORK_STATS), __stringify(IPA_PER_CLIENT_STATS_CONNECT_EVENT), __stringify(IPA_PER_CLIENT_STATS_DISCONNECT_EVENT), __stringify(ADD_VLAN_IFACE), __stringify(DEL_VLAN_IFACE), __stringify(ADD_L2TP_VLAN_MAPPING), __stringify(DEL_L2TP_VLAN_MAPPING) }; const char *ipa_hdr_l2_type_name[] = { Loading
drivers/platform/msm/ipa/ipa_v3/ipa.c +112 −0 Original line number Diff line number Diff line Loading @@ -611,6 +611,90 @@ static int ipa3_send_wan_msg(unsigned long usr_param, uint8_t msg_type) return 0; } static void ipa3_vlan_l2tp_msg_free_cb(void *buff, u32 len, u32 type) { if (!buff) { IPAERR("Null buffer\n"); return; } if (type != ADD_VLAN_IFACE && type != DEL_VLAN_IFACE && type != ADD_L2TP_VLAN_MAPPING && type != DEL_L2TP_VLAN_MAPPING) { IPAERR("Wrong type given. buff %pK type %d\n", buff, type); return; } kfree(buff); } static int ipa3_send_vlan_l2tp_msg(unsigned long usr_param, uint8_t msg_type) { int retval; struct ipa_ioc_vlan_iface_info *vlan_info; struct ipa_ioc_l2tp_vlan_mapping_info *mapping_info; struct ipa_msg_meta msg_meta; if (msg_type == ADD_VLAN_IFACE || msg_type == DEL_VLAN_IFACE) { vlan_info = kzalloc(sizeof(struct ipa_ioc_vlan_iface_info), GFP_KERNEL); if (!vlan_info) { IPAERR("no memory\n"); return -ENOMEM; } if (copy_from_user((u8 *)vlan_info, (void __user *)usr_param, sizeof(struct ipa_ioc_vlan_iface_info))) { kfree(vlan_info); return -EFAULT; } memset(&msg_meta, 0, sizeof(msg_meta)); msg_meta.msg_type = msg_type; msg_meta.msg_len = sizeof(struct ipa_ioc_vlan_iface_info); retval = ipa3_send_msg(&msg_meta, vlan_info, ipa3_vlan_l2tp_msg_free_cb); if (retval) { IPAERR("ipa3_send_msg failed: %d\n", retval); kfree(vlan_info); return retval; } } else if (msg_type == ADD_L2TP_VLAN_MAPPING || msg_type == DEL_L2TP_VLAN_MAPPING) { mapping_info = kzalloc(sizeof(struct ipa_ioc_l2tp_vlan_mapping_info), GFP_KERNEL); if (!mapping_info) { IPAERR("no memory\n"); return -ENOMEM; } if (copy_from_user((u8 *)mapping_info, (void __user *)usr_param, sizeof(struct ipa_ioc_l2tp_vlan_mapping_info))) { kfree(mapping_info); return -EFAULT; } memset(&msg_meta, 0, sizeof(msg_meta)); msg_meta.msg_type = msg_type; msg_meta.msg_len = sizeof(struct ipa_ioc_l2tp_vlan_mapping_info); retval = ipa3_send_msg(&msg_meta, mapping_info, ipa3_vlan_l2tp_msg_free_cb); if (retval) { IPAERR("ipa3_send_msg failed: %d\n", retval); kfree(mapping_info); return retval; } } else { IPAERR("Unexpected event\n"); return -EFAULT; } return 0; } static long ipa3_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { Loading Loading @@ -1625,6 +1709,34 @@ static long ipa3_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) } break; case IPA_IOC_ADD_VLAN_IFACE: if (ipa3_send_vlan_l2tp_msg(arg, ADD_VLAN_IFACE)) { retval = -EFAULT; break; } break; case IPA_IOC_DEL_VLAN_IFACE: if (ipa3_send_vlan_l2tp_msg(arg, DEL_VLAN_IFACE)) { retval = -EFAULT; break; } break; case IPA_IOC_ADD_L2TP_VLAN_MAPPING: if (ipa3_send_vlan_l2tp_msg(arg, ADD_L2TP_VLAN_MAPPING)) { retval = -EFAULT; break; } break; case IPA_IOC_DEL_L2TP_VLAN_MAPPING: if (ipa3_send_vlan_l2tp_msg(arg, DEL_L2TP_VLAN_MAPPING)) { retval = -EFAULT; break; } break; default: /* redundant, as cmd was checked against MAXNR */ IPA_ACTIVE_CLIENTS_DEC_SIMPLE(); return -ENOTTY; Loading
drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +4 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,10 @@ const char *ipa3_event_name[] = { __stringify(IPA_TETHERING_STATS_UPDATE_NETWORK_STATS), __stringify(IPA_PER_CLIENT_STATS_CONNECT_EVENT), __stringify(IPA_PER_CLIENT_STATS_DISCONNECT_EVENT), __stringify(ADD_VLAN_IFACE), __stringify(DEL_VLAN_IFACE), __stringify(ADD_L2TP_VLAN_MAPPING), __stringify(DEL_L2TP_VLAN_MAPPING) }; const char *ipa3_hdr_l2_type_name[] = { Loading
include/uapi/linux/msm_ipa.h +53 −2 Original line number Diff line number Diff line Loading @@ -69,7 +69,11 @@ #define IPA_IOCTL_ADD_FLT_RULE_AFTER 44 #define IPA_IOCTL_GET_HW_VERSION 45 #define IPA_IOCTL_ADD_RT_RULE_EXT 46 #define IPA_IOCTL_MAX 47 #define IPA_IOCTL_ADD_VLAN_IFACE 47 #define IPA_IOCTL_DEL_VLAN_IFACE 48 #define IPA_IOCTL_ADD_L2TP_VLAN_MAPPING 49 #define IPA_IOCTL_DEL_L2TP_VLAN_MAPPING 50 #define IPA_IOCTL_MAX 51 /** * max size of the header to be inserted Loading Loading @@ -416,9 +420,17 @@ enum ipa_per_client_stats_event { IPA_PER_CLIENT_STATS_CONNECT_EVENT = IPA_TETHERING_STATS_EVENT_MAX, IPA_PER_CLIENT_STATS_DISCONNECT_EVENT, IPA_PER_CLIENT_STATS_EVENT_MAX, IPA_EVENT_MAX_NUM = IPA_PER_CLIENT_STATS_EVENT_MAX, }; enum ipa_vlan_l2tp_event { ADD_VLAN_IFACE = IPA_PER_CLIENT_STATS_EVENT_MAX, DEL_VLAN_IFACE, ADD_L2TP_VLAN_MAPPING, DEL_L2TP_VLAN_MAPPING, IPA_VLAN_L2TP_EVENT_MAX, }; #define IPA_EVENT_MAX_NUM (IPA_VLAN_L2TP_EVENT_MAX) #define IPA_EVENT_MAX ((int)IPA_EVENT_MAX_NUM) /** Loading Loading @@ -1414,6 +1426,30 @@ struct ipa_ioc_nat_dma_cmd { }; /** * struct ipa_ioc_vlan_iface_info - add vlan interface * @name: interface name * @vlan_id: VLAN ID */ struct ipa_ioc_vlan_iface_info { char name[IPA_RESOURCE_NAME_MAX]; uint8_t vlan_id; }; /** * struct ipa_ioc_l2tp_vlan_mapping_info - l2tp->vlan mapping info * @iptype: l2tp tunnel IP type * @l2tp_iface_name: l2tp interface name * @l2tp_session_id: l2tp session id * @vlan_iface_name: vlan interface name */ struct ipa_ioc_l2tp_vlan_mapping_info { enum ipa_ip_type iptype; char l2tp_iface_name[IPA_RESOURCE_NAME_MAX]; uint8_t l2tp_session_id; char vlan_iface_name[IPA_RESOURCE_NAME_MAX]; }; /** * struct ipa_msg_meta - Format of the message meta-data. * @msg_type: the type of the message Loading Loading @@ -1737,6 +1773,21 @@ struct ipa_tether_device_info { IPA_IOCTL_GET_HW_VERSION, \ enum ipa_hw_type *) #define IPA_IOC_ADD_VLAN_IFACE _IOWR(IPA_IOC_MAGIC, \ IPA_IOCTL_ADD_VLAN_IFACE, \ struct ipa_ioc_vlan_iface_info *) #define IPA_IOC_DEL_VLAN_IFACE _IOWR(IPA_IOC_MAGIC, \ IPA_IOCTL_DEL_VLAN_IFACE, \ struct ipa_ioc_vlan_iface_info *) #define IPA_IOC_ADD_L2TP_VLAN_MAPPING _IOWR(IPA_IOC_MAGIC, \ IPA_IOCTL_ADD_L2TP_VLAN_MAPPING, \ struct ipa_ioc_l2tp_vlan_mapping_info *) #define IPA_IOC_DEL_L2TP_VLAN_MAPPING _IOWR(IPA_IOC_MAGIC, \ IPA_IOCTL_DEL_L2TP_VLAN_MAPPING, \ struct ipa_ioc_l2tp_vlan_mapping_info *) /* * unique magic number of the Tethering bridge ioctls */ Loading