Loading drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +9 −0 Original line number Diff line number Diff line Loading @@ -523,6 +523,15 @@ static int ipa3_attrib_dump(struct ipa_rule_attrib *attrib, if (attrib->attrib_mask & IPA_FLT_TCP_SYN_L2TP) pr_err("tcp syn l2tp "); if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IP_TYPE) pr_err("l2tp inner ip type: %d ", attrib->type); if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IPV4_DST_ADDR) { addr[0] = htonl(attrib->u.v4.dst_addr); mask[0] = htonl(attrib->u.v4.dst_addr_mask); pr_err("dst_addr:%pI4 dst_addr_mask:%pI4 ", addr, mask); } pr_err("\n"); return 0; } Loading drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_fltrt.c +67 −0 Original line number Diff line number Diff line Loading @@ -1233,6 +1233,39 @@ static int ipa_fltrt_generate_hw_rule_bdy_ip6(u16 *en_rule, ihl_ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IP_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { IPAHAL_ERR("ran out of ihl_meq32 eq\n"); goto err; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ihl_ofst_meq32[ihl_ofst_meq32]); /* 22 => offset of IP type after v6 header */ extra = ipa_write_8(22, extra); rest = ipa_write_32(0xF0000000, rest); if (attrib->type == 0x40) rest = ipa_write_32(0x40000000, rest); else rest = ipa_write_32(0x60000000, rest); ihl_ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IPV4_DST_ADDR) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { IPAHAL_ERR("ran out of ihl_meq32 eq\n"); goto err; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ihl_ofst_meq32[ihl_ofst_meq32]); /* 38 => offset of inner IPv4 addr */ extra = ipa_write_8(38, extra); rest = ipa_write_32(attrib->u.v4.dst_addr_mask, rest); rest = ipa_write_32(attrib->u.v4.dst_addr, rest); ihl_ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_META_DATA) { *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN(IPA_METADATA_COMPARE); rest = ipa_write_32(attrib->meta_data_mask, rest); Loading Loading @@ -2267,6 +2300,40 @@ static int ipa_flt_generate_eq_ip6(enum ipa_ip_type ip, ihl_ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IP_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { IPAHAL_ERR("ran out of ihl_meq32 eq\n"); return -EPERM; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ihl_ofst_meq32[ihl_ofst_meq32]); /* 22 => offset of inner IP type after v6 header */ eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].offset = 22; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].mask = 0xF0000000; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].value = (u32)attrib->type << 24; ihl_ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IPV4_DST_ADDR) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { IPAHAL_ERR("ran out of ihl_meq32 eq\n"); return -EPERM; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ihl_ofst_meq32[ihl_ofst_meq32]); /* 38 => offset of inner IPv4 addr */ eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].offset = 38; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].mask = attrib->u.v4.dst_addr_mask; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].value = attrib->u.v4.dst_addr; ihl_ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_MAC_ETHER_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ofst_meq32, ofst_meq32)) { IPAHAL_ERR_RL("ran out of meq32 eq\n"); Loading include/uapi/linux/msm_ipa.h +2 −0 Original line number Diff line number Diff line Loading @@ -165,6 +165,8 @@ #define IPA_FLT_MAC_DST_ADDR_L2TP (1ul << 22) #define IPA_FLT_TCP_SYN (1ul << 23) #define IPA_FLT_TCP_SYN_L2TP (1ul << 24) #define IPA_FLT_L2TP_INNER_IP_TYPE (1ul << 25) #define IPA_FLT_L2TP_INNER_IPV4_DST_ADDR (1ul << 26) /** * maximal number of NAT PDNs in the PDN config table Loading Loading
drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +9 −0 Original line number Diff line number Diff line Loading @@ -523,6 +523,15 @@ static int ipa3_attrib_dump(struct ipa_rule_attrib *attrib, if (attrib->attrib_mask & IPA_FLT_TCP_SYN_L2TP) pr_err("tcp syn l2tp "); if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IP_TYPE) pr_err("l2tp inner ip type: %d ", attrib->type); if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IPV4_DST_ADDR) { addr[0] = htonl(attrib->u.v4.dst_addr); mask[0] = htonl(attrib->u.v4.dst_addr_mask); pr_err("dst_addr:%pI4 dst_addr_mask:%pI4 ", addr, mask); } pr_err("\n"); return 0; } Loading
drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_fltrt.c +67 −0 Original line number Diff line number Diff line Loading @@ -1233,6 +1233,39 @@ static int ipa_fltrt_generate_hw_rule_bdy_ip6(u16 *en_rule, ihl_ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IP_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { IPAHAL_ERR("ran out of ihl_meq32 eq\n"); goto err; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ihl_ofst_meq32[ihl_ofst_meq32]); /* 22 => offset of IP type after v6 header */ extra = ipa_write_8(22, extra); rest = ipa_write_32(0xF0000000, rest); if (attrib->type == 0x40) rest = ipa_write_32(0x40000000, rest); else rest = ipa_write_32(0x60000000, rest); ihl_ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IPV4_DST_ADDR) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { IPAHAL_ERR("ran out of ihl_meq32 eq\n"); goto err; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ihl_ofst_meq32[ihl_ofst_meq32]); /* 38 => offset of inner IPv4 addr */ extra = ipa_write_8(38, extra); rest = ipa_write_32(attrib->u.v4.dst_addr_mask, rest); rest = ipa_write_32(attrib->u.v4.dst_addr, rest); ihl_ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_META_DATA) { *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN(IPA_METADATA_COMPARE); rest = ipa_write_32(attrib->meta_data_mask, rest); Loading Loading @@ -2267,6 +2300,40 @@ static int ipa_flt_generate_eq_ip6(enum ipa_ip_type ip, ihl_ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IP_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { IPAHAL_ERR("ran out of ihl_meq32 eq\n"); return -EPERM; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ihl_ofst_meq32[ihl_ofst_meq32]); /* 22 => offset of inner IP type after v6 header */ eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].offset = 22; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].mask = 0xF0000000; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].value = (u32)attrib->type << 24; ihl_ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IPV4_DST_ADDR) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { IPAHAL_ERR("ran out of ihl_meq32 eq\n"); return -EPERM; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ihl_ofst_meq32[ihl_ofst_meq32]); /* 38 => offset of inner IPv4 addr */ eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].offset = 38; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].mask = attrib->u.v4.dst_addr_mask; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].value = attrib->u.v4.dst_addr; ihl_ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_MAC_ETHER_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ofst_meq32, ofst_meq32)) { IPAHAL_ERR_RL("ran out of meq32 eq\n"); Loading
include/uapi/linux/msm_ipa.h +2 −0 Original line number Diff line number Diff line Loading @@ -165,6 +165,8 @@ #define IPA_FLT_MAC_DST_ADDR_L2TP (1ul << 22) #define IPA_FLT_TCP_SYN (1ul << 23) #define IPA_FLT_TCP_SYN_L2TP (1ul << 24) #define IPA_FLT_L2TP_INNER_IP_TYPE (1ul << 25) #define IPA_FLT_L2TP_INNER_IPV4_DST_ADDR (1ul << 26) /** * maximal number of NAT PDNs in the PDN config table Loading