Loading drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +2 −1 Original line number Diff line number Diff line Loading @@ -491,7 +491,8 @@ static int ipa3_attrib_dump(struct ipa_rule_attrib *attrib, } if ((attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_ETHER_II) || (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_802_3)) { (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_802_3) || (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_L2TP)) { pr_err("dst_mac_addr:%pM ", attrib->dst_mac_addr); } Loading drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +120 −0 Original line number Diff line number Diff line Loading @@ -2274,6 +2274,35 @@ static int ipa3_generate_hw_rule_ip4(u16 *en_rule, ihl_ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_L2TP) { if (ipa_ihl_ofst_meq32[ihl_ofst_meq32] == -1 || ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1] == -1) { IPAERR("ran out of ihl meq32 eq\n"); goto err; } *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32]; *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1]; /* populate first ihl meq eq */ extra = ipa3_write_8(8, extra); rest = ipa3_write_8(attrib->dst_mac_addr_mask[3], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[2], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[1], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[0], rest); rest = ipa3_write_8(attrib->dst_mac_addr[3], rest); rest = ipa3_write_8(attrib->dst_mac_addr[2], rest); rest = ipa3_write_8(attrib->dst_mac_addr[1], rest); rest = ipa3_write_8(attrib->dst_mac_addr[0], rest); /* populate second ihl meq eq */ extra = ipa3_write_8(12, extra); rest = ipa3_write_16(0, rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[5], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[4], rest); rest = ipa3_write_16(0, rest); rest = ipa3_write_8(attrib->dst_mac_addr[5], rest); rest = ipa3_write_8(attrib->dst_mac_addr[4], rest); ihl_ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_META_DATA) { *en_rule |= IPA_METADATA_COMPARE; rest = ipa3_write_32(attrib->meta_data_mask, rest); Loading Loading @@ -2566,6 +2595,35 @@ static int ipa3_generate_hw_rule_ip6(u16 *en_rule, ihl_ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_L2TP) { if (ipa_ihl_ofst_meq32[ihl_ofst_meq32] == -1 || ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1] == -1) { IPAERR("ran out of ihl meq32 eq\n"); goto err; } *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32]; *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1]; /* populate first ihl meq eq */ extra = ipa3_write_8(8, extra); rest = ipa3_write_8(attrib->dst_mac_addr_mask[3], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[2], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[1], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[0], rest); rest = ipa3_write_8(attrib->dst_mac_addr[3], rest); rest = ipa3_write_8(attrib->dst_mac_addr[2], rest); rest = ipa3_write_8(attrib->dst_mac_addr[1], rest); rest = ipa3_write_8(attrib->dst_mac_addr[0], rest); /* populate second ihl meq eq */ extra = ipa3_write_8(12, extra); rest = ipa3_write_16(0, rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[5], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[4], rest); rest = ipa3_write_16(0, rest); rest = ipa3_write_8(attrib->dst_mac_addr[5], rest); rest = ipa3_write_8(attrib->dst_mac_addr[4], rest); ihl_ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_META_DATA) { *en_rule |= IPA_METADATA_COMPARE; rest = ipa3_write_32(attrib->meta_data_mask, rest); Loading Loading @@ -2893,6 +2951,37 @@ int ipa3_generate_flt_eq_ip4(enum ipa_ip_type ip, ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_L2TP) { if (ipa_ihl_ofst_meq32[ihl_ofst_meq32] == -1 || ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1] == -1) { IPAERR("ran out of ihl meq32 eq\n"); return -EPERM; } *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32]; *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1]; /* populate the first ihl meq 32 eq */ eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].offset = 8; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].mask = (attrib->dst_mac_addr_mask[3] & 0xFF) | ((attrib->dst_mac_addr_mask[2] << 8) & 0xFF00) | ((attrib->dst_mac_addr_mask[1] << 16) & 0xFF0000) | ((attrib->dst_mac_addr_mask[0] << 24) & 0xFF000000); eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].value = (attrib->dst_mac_addr[3] & 0xFF) | ((attrib->dst_mac_addr[2] << 8) & 0xFF00) | ((attrib->dst_mac_addr[1] << 16) & 0xFF0000) | ((attrib->dst_mac_addr[0] << 24) & 0xFF000000); /* populate the second ihl meq 32 eq */ eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32 + 1].offset = 12; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32 + 1].mask = ((attrib->dst_mac_addr_mask[5] << 16) & 0xFF0000) | ((attrib->dst_mac_addr_mask[4] << 24) & 0xFF000000); eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32 + 1].value = ((attrib->dst_mac_addr[5] << 16) & 0xFF0000) | ((attrib->dst_mac_addr[4] << 24) & 0xFF000000); ihl_ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_TOS_MASKED) { if (ipa_ofst_meq32[ofst_meq32] == -1) { IPAERR("ran out of meq32 eq\n"); Loading Loading @@ -3237,6 +3326,37 @@ int ipa3_generate_flt_eq_ip6(enum ipa_ip_type ip, ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_L2TP) { if (ipa_ihl_ofst_meq32[ihl_ofst_meq32] == -1 || ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1] == -1) { IPAERR("ran out of ihl meq32 eq\n"); return -EPERM; } *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32]; *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1]; /* populate the first ihl meq 32 eq */ eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].offset = 8; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].mask = (attrib->dst_mac_addr_mask[3] & 0xFF) | ((attrib->dst_mac_addr_mask[2] << 8) & 0xFF00) | ((attrib->dst_mac_addr_mask[1] << 16) & 0xFF0000) | ((attrib->dst_mac_addr_mask[0] << 24) & 0xFF000000); eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].value = (attrib->dst_mac_addr[3] & 0xFF) | ((attrib->dst_mac_addr[2] << 8) & 0xFF00) | ((attrib->dst_mac_addr[1] << 16) & 0xFF0000) | ((attrib->dst_mac_addr[0] << 24) & 0xFF000000); /* populate the second ihl meq 32 eq */ eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32 + 1].offset = 12; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32 + 1].mask = ((attrib->dst_mac_addr_mask[5] << 16) & 0xFF0000) | ((attrib->dst_mac_addr_mask[4] << 24) & 0xFF000000); eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32 + 1].value = ((attrib->dst_mac_addr[5] << 16) & 0xFF0000) | ((attrib->dst_mac_addr[4] << 24) & 0xFF000000); ihl_ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_MAC_ETHER_TYPE) { if (ipa_ofst_meq32[ofst_meq32] == -1) { IPAERR("ran out of meq128 eq\n"); Loading include/uapi/linux/msm_ipa.h +1 −0 Original line number Diff line number Diff line Loading @@ -137,6 +137,7 @@ #define IPA_FLT_MAC_SRC_ADDR_802_3 (1ul << 19) #define IPA_FLT_MAC_DST_ADDR_802_3 (1ul << 20) #define IPA_FLT_MAC_ETHER_TYPE (1ul << 21) #define IPA_FLT_MAC_DST_ADDR_L2TP (1ul << 22) /** * enum ipa_client_type - names for the various IPA "clients" Loading Loading
drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +2 −1 Original line number Diff line number Diff line Loading @@ -491,7 +491,8 @@ static int ipa3_attrib_dump(struct ipa_rule_attrib *attrib, } if ((attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_ETHER_II) || (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_802_3)) { (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_802_3) || (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_L2TP)) { pr_err("dst_mac_addr:%pM ", attrib->dst_mac_addr); } Loading
drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +120 −0 Original line number Diff line number Diff line Loading @@ -2274,6 +2274,35 @@ static int ipa3_generate_hw_rule_ip4(u16 *en_rule, ihl_ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_L2TP) { if (ipa_ihl_ofst_meq32[ihl_ofst_meq32] == -1 || ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1] == -1) { IPAERR("ran out of ihl meq32 eq\n"); goto err; } *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32]; *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1]; /* populate first ihl meq eq */ extra = ipa3_write_8(8, extra); rest = ipa3_write_8(attrib->dst_mac_addr_mask[3], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[2], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[1], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[0], rest); rest = ipa3_write_8(attrib->dst_mac_addr[3], rest); rest = ipa3_write_8(attrib->dst_mac_addr[2], rest); rest = ipa3_write_8(attrib->dst_mac_addr[1], rest); rest = ipa3_write_8(attrib->dst_mac_addr[0], rest); /* populate second ihl meq eq */ extra = ipa3_write_8(12, extra); rest = ipa3_write_16(0, rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[5], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[4], rest); rest = ipa3_write_16(0, rest); rest = ipa3_write_8(attrib->dst_mac_addr[5], rest); rest = ipa3_write_8(attrib->dst_mac_addr[4], rest); ihl_ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_META_DATA) { *en_rule |= IPA_METADATA_COMPARE; rest = ipa3_write_32(attrib->meta_data_mask, rest); Loading Loading @@ -2566,6 +2595,35 @@ static int ipa3_generate_hw_rule_ip6(u16 *en_rule, ihl_ofst_meq32++; } if (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_L2TP) { if (ipa_ihl_ofst_meq32[ihl_ofst_meq32] == -1 || ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1] == -1) { IPAERR("ran out of ihl meq32 eq\n"); goto err; } *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32]; *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1]; /* populate first ihl meq eq */ extra = ipa3_write_8(8, extra); rest = ipa3_write_8(attrib->dst_mac_addr_mask[3], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[2], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[1], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[0], rest); rest = ipa3_write_8(attrib->dst_mac_addr[3], rest); rest = ipa3_write_8(attrib->dst_mac_addr[2], rest); rest = ipa3_write_8(attrib->dst_mac_addr[1], rest); rest = ipa3_write_8(attrib->dst_mac_addr[0], rest); /* populate second ihl meq eq */ extra = ipa3_write_8(12, extra); rest = ipa3_write_16(0, rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[5], rest); rest = ipa3_write_8(attrib->dst_mac_addr_mask[4], rest); rest = ipa3_write_16(0, rest); rest = ipa3_write_8(attrib->dst_mac_addr[5], rest); rest = ipa3_write_8(attrib->dst_mac_addr[4], rest); ihl_ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_META_DATA) { *en_rule |= IPA_METADATA_COMPARE; rest = ipa3_write_32(attrib->meta_data_mask, rest); Loading Loading @@ -2893,6 +2951,37 @@ int ipa3_generate_flt_eq_ip4(enum ipa_ip_type ip, ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_L2TP) { if (ipa_ihl_ofst_meq32[ihl_ofst_meq32] == -1 || ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1] == -1) { IPAERR("ran out of ihl meq32 eq\n"); return -EPERM; } *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32]; *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1]; /* populate the first ihl meq 32 eq */ eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].offset = 8; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].mask = (attrib->dst_mac_addr_mask[3] & 0xFF) | ((attrib->dst_mac_addr_mask[2] << 8) & 0xFF00) | ((attrib->dst_mac_addr_mask[1] << 16) & 0xFF0000) | ((attrib->dst_mac_addr_mask[0] << 24) & 0xFF000000); eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].value = (attrib->dst_mac_addr[3] & 0xFF) | ((attrib->dst_mac_addr[2] << 8) & 0xFF00) | ((attrib->dst_mac_addr[1] << 16) & 0xFF0000) | ((attrib->dst_mac_addr[0] << 24) & 0xFF000000); /* populate the second ihl meq 32 eq */ eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32 + 1].offset = 12; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32 + 1].mask = ((attrib->dst_mac_addr_mask[5] << 16) & 0xFF0000) | ((attrib->dst_mac_addr_mask[4] << 24) & 0xFF000000); eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32 + 1].value = ((attrib->dst_mac_addr[5] << 16) & 0xFF0000) | ((attrib->dst_mac_addr[4] << 24) & 0xFF000000); ihl_ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_TOS_MASKED) { if (ipa_ofst_meq32[ofst_meq32] == -1) { IPAERR("ran out of meq32 eq\n"); Loading Loading @@ -3237,6 +3326,37 @@ int ipa3_generate_flt_eq_ip6(enum ipa_ip_type ip, ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_L2TP) { if (ipa_ihl_ofst_meq32[ihl_ofst_meq32] == -1 || ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1] == -1) { IPAERR("ran out of ihl meq32 eq\n"); return -EPERM; } *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32]; *en_rule |= ipa_ihl_ofst_meq32[ihl_ofst_meq32 + 1]; /* populate the first ihl meq 32 eq */ eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].offset = 8; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].mask = (attrib->dst_mac_addr_mask[3] & 0xFF) | ((attrib->dst_mac_addr_mask[2] << 8) & 0xFF00) | ((attrib->dst_mac_addr_mask[1] << 16) & 0xFF0000) | ((attrib->dst_mac_addr_mask[0] << 24) & 0xFF000000); eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32].value = (attrib->dst_mac_addr[3] & 0xFF) | ((attrib->dst_mac_addr[2] << 8) & 0xFF00) | ((attrib->dst_mac_addr[1] << 16) & 0xFF0000) | ((attrib->dst_mac_addr[0] << 24) & 0xFF000000); /* populate the second ihl meq 32 eq */ eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32 + 1].offset = 12; eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32 + 1].mask = ((attrib->dst_mac_addr_mask[5] << 16) & 0xFF0000) | ((attrib->dst_mac_addr_mask[4] << 24) & 0xFF000000); eq_atrb->ihl_offset_meq_32[ihl_ofst_meq32 + 1].value = ((attrib->dst_mac_addr[5] << 16) & 0xFF0000) | ((attrib->dst_mac_addr[4] << 24) & 0xFF000000); ihl_ofst_meq32 += 2; } if (attrib->attrib_mask & IPA_FLT_MAC_ETHER_TYPE) { if (ipa_ofst_meq32[ofst_meq32] == -1) { IPAERR("ran out of meq128 eq\n"); Loading
include/uapi/linux/msm_ipa.h +1 −0 Original line number Diff line number Diff line Loading @@ -137,6 +137,7 @@ #define IPA_FLT_MAC_SRC_ADDR_802_3 (1ul << 19) #define IPA_FLT_MAC_DST_ADDR_802_3 (1ul << 20) #define IPA_FLT_MAC_ETHER_TYPE (1ul << 21) #define IPA_FLT_MAC_DST_ADDR_L2TP (1ul << 22) /** * enum ipa_client_type - names for the various IPA "clients" Loading