Loading drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +3 −0 Original line number Diff line number Diff line Loading @@ -528,6 +528,9 @@ static int ipa3_attrib_dump(struct ipa_rule_attrib *attrib, if (attrib->attrib_mask & IPA_FLT_MAC_ETHER_TYPE) pr_err("ether_type:%x ", attrib->ether_type); if (attrib->attrib_mask & IPA_FLT_VLAN_ID) pr_err("vlan_id:%x ", attrib->vlan_id); if (attrib->attrib_mask & IPA_FLT_TCP_SYN) pr_err("tcp syn "); Loading drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_fltrt.c +72 −0 Original line number Diff line number Diff line Loading @@ -753,6 +753,24 @@ static int ipa_fltrt_generate_hw_rule_bdy_ip4(u16 *en_rule, ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_VLAN_ID) { uint32_t vlan_tag; if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ofst_meq32, ofst_meq32)) { IPAHAL_ERR("ran out of meq32 eq\n"); goto err; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ofst_meq32[ofst_meq32]); /* -6 => offset of 802_1Q tag in L2 hdr */ extra = ipa_write_8((u8)-6, extra); /* filter vlan packets: 0x8100 TPID + required VLAN ID */ vlan_tag = (0x8100 << 16) | (attrib->vlan_id & 0xFFF); rest = ipa_write_32(0xFFFF0FFF, rest); rest = ipa_write_32(vlan_tag, rest); ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { Loading Loading @@ -1106,6 +1124,24 @@ static int ipa_fltrt_generate_hw_rule_bdy_ip6(u16 *en_rule, ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_VLAN_ID) { uint32_t vlan_tag; if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ofst_meq32, ofst_meq32)) { IPAHAL_ERR("ran out of meq32 eq\n"); goto err; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ofst_meq32[ofst_meq32]); /* -6 => offset of 802_1Q tag in L2 hdr */ extra = ipa_write_8((u8)-6, extra); /* filter vlan packets: 0x8100 TPID + required VLAN ID */ vlan_tag = (0x8100 << 16) | (attrib->vlan_id & 0xFFF); rest = ipa_write_32(0xFFFF0FFF, rest); rest = ipa_write_32(vlan_tag, rest); ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { Loading Loading @@ -1907,6 +1943,24 @@ static int ipa_flt_generate_eq_ip4(enum ipa_ip_type ip, ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_VLAN_ID) { uint32_t vlan_tag; if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ofst_meq32, ofst_meq32)) { IPAHAL_ERR("ran out of meq32 eq\n"); return -EPERM; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ofst_meq32[ofst_meq32]); /* -6 => offset of 802_1Q tag in L2 hdr */ eq_atrb->offset_meq_32[ofst_meq32].offset = -6; /* filter vlan packets: 0x8100 TPID + required VLAN ID */ vlan_tag = (0x8100 << 16) | (attrib->vlan_id & 0xFFF); eq_atrb->offset_meq_32[ofst_meq32].mask = 0xFFFF0FFF; eq_atrb->offset_meq_32[ofst_meq32].value = vlan_tag; ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { Loading Loading @@ -2352,6 +2406,24 @@ static int ipa_flt_generate_eq_ip6(enum ipa_ip_type ip, ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_VLAN_ID) { uint32_t vlan_tag; if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ofst_meq32, ofst_meq32)) { IPAHAL_ERR("ran out of meq32 eq\n"); return -EPERM; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ofst_meq32[ofst_meq32]); /* -6 => offset of 802_1Q tag in L2 hdr */ eq_atrb->offset_meq_32[ofst_meq32].offset = -6; /* filter vlan packets: 0x8100 TPID + required VLAN ID */ vlan_tag = (0x8100 << 16) | (attrib->vlan_id & 0xFFF); eq_atrb->offset_meq_32[ofst_meq32].mask = 0xFFFF0FFF; eq_atrb->offset_meq_32[ofst_meq32].value = vlan_tag; ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { Loading include/uapi/linux/msm_ipa.h +3 −0 Original line number Diff line number Diff line Loading @@ -188,6 +188,7 @@ #define IPA_FLT_L2TP_INNER_IP_TYPE (1ul << 25) #define IPA_FLT_L2TP_INNER_IPV4_DST_ADDR (1ul << 26) #define IPA_FLT_IS_PURE_ACK (1ul << 27) #define IPA_FLT_VLAN_ID (1ul << 28) /** * maximal number of NAT PDNs in the PDN config table Loading Loading @@ -728,6 +729,7 @@ enum ipa_hw_type { * @u.v6.src_addr_mask: src address mask * @u.v6.dst_addr: dst address val * @u.v6.dst_addr_mask: dst address mask * @vlan_id: vlan id value */ struct ipa_rule_attrib { uint32_t attrib_mask; Loading Loading @@ -768,6 +770,7 @@ struct ipa_rule_attrib { uint32_t dst_addr_mask[4]; } v6; } u; uint16_t vlan_id; }; /*! @brief The maximum number of Mask Equal 32 Eqns */ Loading Loading
drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +3 −0 Original line number Diff line number Diff line Loading @@ -528,6 +528,9 @@ static int ipa3_attrib_dump(struct ipa_rule_attrib *attrib, if (attrib->attrib_mask & IPA_FLT_MAC_ETHER_TYPE) pr_err("ether_type:%x ", attrib->ether_type); if (attrib->attrib_mask & IPA_FLT_VLAN_ID) pr_err("vlan_id:%x ", attrib->vlan_id); if (attrib->attrib_mask & IPA_FLT_TCP_SYN) pr_err("tcp syn "); Loading
drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_fltrt.c +72 −0 Original line number Diff line number Diff line Loading @@ -753,6 +753,24 @@ static int ipa_fltrt_generate_hw_rule_bdy_ip4(u16 *en_rule, ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_VLAN_ID) { uint32_t vlan_tag; if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ofst_meq32, ofst_meq32)) { IPAHAL_ERR("ran out of meq32 eq\n"); goto err; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ofst_meq32[ofst_meq32]); /* -6 => offset of 802_1Q tag in L2 hdr */ extra = ipa_write_8((u8)-6, extra); /* filter vlan packets: 0x8100 TPID + required VLAN ID */ vlan_tag = (0x8100 << 16) | (attrib->vlan_id & 0xFFF); rest = ipa_write_32(0xFFFF0FFF, rest); rest = ipa_write_32(vlan_tag, rest); ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { Loading Loading @@ -1106,6 +1124,24 @@ static int ipa_fltrt_generate_hw_rule_bdy_ip6(u16 *en_rule, ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_VLAN_ID) { uint32_t vlan_tag; if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ofst_meq32, ofst_meq32)) { IPAHAL_ERR("ran out of meq32 eq\n"); goto err; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ofst_meq32[ofst_meq32]); /* -6 => offset of 802_1Q tag in L2 hdr */ extra = ipa_write_8((u8)-6, extra); /* filter vlan packets: 0x8100 TPID + required VLAN ID */ vlan_tag = (0x8100 << 16) | (attrib->vlan_id & 0xFFF); rest = ipa_write_32(0xFFFF0FFF, rest); rest = ipa_write_32(vlan_tag, rest); ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { Loading Loading @@ -1907,6 +1943,24 @@ static int ipa_flt_generate_eq_ip4(enum ipa_ip_type ip, ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_VLAN_ID) { uint32_t vlan_tag; if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ofst_meq32, ofst_meq32)) { IPAHAL_ERR("ran out of meq32 eq\n"); return -EPERM; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ofst_meq32[ofst_meq32]); /* -6 => offset of 802_1Q tag in L2 hdr */ eq_atrb->offset_meq_32[ofst_meq32].offset = -6; /* filter vlan packets: 0x8100 TPID + required VLAN ID */ vlan_tag = (0x8100 << 16) | (attrib->vlan_id & 0xFFF); eq_atrb->offset_meq_32[ofst_meq32].mask = 0xFFFF0FFF; eq_atrb->offset_meq_32[ofst_meq32].value = vlan_tag; ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { Loading Loading @@ -2352,6 +2406,24 @@ static int ipa_flt_generate_eq_ip6(enum ipa_ip_type ip, ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_VLAN_ID) { uint32_t vlan_tag; if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ofst_meq32, ofst_meq32)) { IPAHAL_ERR("ran out of meq32 eq\n"); return -EPERM; } *en_rule |= IPA_GET_RULE_EQ_BIT_PTRN( ipa3_0_ofst_meq32[ofst_meq32]); /* -6 => offset of 802_1Q tag in L2 hdr */ eq_atrb->offset_meq_32[ofst_meq32].offset = -6; /* filter vlan packets: 0x8100 TPID + required VLAN ID */ vlan_tag = (0x8100 << 16) | (attrib->vlan_id & 0xFFF); eq_atrb->offset_meq_32[ofst_meq32].mask = 0xFFFF0FFF; eq_atrb->offset_meq_32[ofst_meq32].value = vlan_tag; ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_TYPE) { if (IPA_IS_RAN_OUT_OF_EQ(ipa3_0_ihl_ofst_meq32, ihl_ofst_meq32)) { Loading
include/uapi/linux/msm_ipa.h +3 −0 Original line number Diff line number Diff line Loading @@ -188,6 +188,7 @@ #define IPA_FLT_L2TP_INNER_IP_TYPE (1ul << 25) #define IPA_FLT_L2TP_INNER_IPV4_DST_ADDR (1ul << 26) #define IPA_FLT_IS_PURE_ACK (1ul << 27) #define IPA_FLT_VLAN_ID (1ul << 28) /** * maximal number of NAT PDNs in the PDN config table Loading Loading @@ -728,6 +729,7 @@ enum ipa_hw_type { * @u.v6.src_addr_mask: src address mask * @u.v6.dst_addr: dst address val * @u.v6.dst_addr_mask: dst address mask * @vlan_id: vlan id value */ struct ipa_rule_attrib { uint32_t attrib_mask; Loading Loading @@ -768,6 +770,7 @@ struct ipa_rule_attrib { uint32_t dst_addr_mask[4]; } v6; } u; uint16_t vlan_id; }; /*! @brief The maximum number of Mask Equal 32 Eqns */ Loading