[Feature][Modem]Update MTK MODEM V1.6 baseline version: MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.P4.T800.L1.240604.240828

MTK modem version: MOLY01418741_AUTO00328685(For_MOBILETEK2735_IVT_T800_V1_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.P4).tar.gz
RF  modem version: T800/l1-2024_0604.rar

Change-Id: Id0662cc6ffa76d34e194774629945078070f4e64
diff --git a/PatchList_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.P4.xls b/PatchList_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.P4.xls
new file mode 100644
index 0000000..ad1c1ae
--- /dev/null
+++ b/PatchList_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.P4.xls
Binary files differ
diff --git a/mcu/interface/middleware/hif/ipc_api.h b/mcu/interface/middleware/hif/ipc_api.h
index 02a3237..4f93146 100644
--- a/mcu/interface/middleware/hif/ipc_api.h
+++ b/mcu/interface/middleware/hif/ipc_api.h
@@ -497,6 +497,7 @@
 #define IPC_HDR_PROT_ICMPV6             58 /* ICMP for IPv6 */
 #define IPC_HDR_PROT_IPV6_NONEXT        59 /* No Next Header for IPv6 */
 #define IPC_HDR_PROT_IPV6_DEST          60 /* Destination Options for IPv6 */
+#define IPC_HDR_PROT_RESERVED           255 /* 255 is reserved in IANA IP Protocol Numbers */
 
 /*
  * IPv4.
diff --git a/mcu/interface/middleware/hif/pfm_api.h b/mcu/interface/middleware/hif/pfm_api.h
index f0d2144..112e6c2 100644
--- a/mcu/interface/middleware/hif/pfm_api.h
+++ b/mcu/interface/middleware/hif/pfm_api.h
@@ -116,4 +116,24 @@
  */
 void pfm_dereg_cbk_wake_type_pkt();
 
+/*!
+ * @brief pfm_ip_packet_filter_reg_cbk_wake_type_pkt
+ * Register callback for MBIM WAKE REASON wake type pkt
+ *
+ * @param [IN]pf_wake_type_pkt
+ *        [IN]priv_data
+ */
+void pfm_ip_packet_filter_reg_cbk_wake_type_pkt(pfm_garbage_str_wake_type_pkt_f pf_wake_type_pkt, void* priv_data);
+
+/*!
+ * @brief pfm_ip_packet_filter_dereg_cbk_wake_type_pkt
+ * De-register callback for MBIM WAKE REASON wake type pkt
+ *
+ */
+void pfm_ip_packet_filter_dereg_cbk_wake_type_pkt();
+
+
+void pfm_ip_packet_filter_deregister_callback(void *buf, kal_uint32 filter_cnt, kal_bool uplink);
+
+
 #endif /* __INC_PFM_API_H */
diff --git a/mcu/interface/middleware/hif/pfm_config.h b/mcu/interface/middleware/hif/pfm_config.h
index f282fff..99ad19a 100644
--- a/mcu/interface/middleware/hif/pfm_config.h
+++ b/mcu/interface/middleware/hif/pfm_config.h
@@ -105,3 +105,6 @@
 PFM_FILTER_SET_PREFIX(ul_disable_all_packets_filter)       /* 5 */
 PFM_FILTER_SET_FEATURE_NAME(UL_ICMP_PING_WHITELIST_FILTER) /* 6 */
 PFM_FILTER_SET_PREFIX(ul_icmp_ping_whitelist_filter)       /* 6 */
+
+PFM_FILTER_SET_FEATURE_NAME(IP_PACKET_FILTER)  /* 10 */
+PFM_FILTER_SET_PREFIX(ip_packet_filter)        /* 10 */
diff --git a/mcu/interface/middleware/hif/pfm_struct.h b/mcu/interface/middleware/hif/pfm_struct.h
index 546b1ec..6f8a302 100644
--- a/mcu/interface/middleware/hif/pfm_struct.h
+++ b/mcu/interface/middleware/hif/pfm_struct.h
@@ -100,6 +100,20 @@
 /*
  * Local parameter structure for MSG_ID_PFM_REGISTER_FILTER_REQ & MSG_ID_PFM_DEREGISTER_FILTER_REQ
  */
+typedef struct _pfm_ip_packet_filter_filter_t {
+    kal_int32   filter_id;
+    kal_uint32  pdn_id;    /* L5 invoke UPCM API to transfer from CID to PDN_ID */
+                           /*  pdn_id=0 then no need to set filter config, to support all pdn_id(cid=-1) filter*/
+    kal_uint8   ip_type;
+    kal_uint8   protocol;
+    kal_uint8   reserve[2];
+    kal_uint16  src_port;
+    kal_uint16  dst_port;
+    kal_uint8   ip_src[16];     /* IP Src: 4bytes / 16 bytes (IPV4/IPV6) */
+    kal_uint8   ip_dest[16];    /* IP Dest: 4bytes / 16 bytes (IPV4/IPV6) */
+    kal_uint32  magic_code;
+} pfm_ip_packet_filter_filter_t;
+
 typedef struct _pfm_filter_set_t {
     LOCAL_PARA_HDR
 
@@ -132,4 +146,7 @@
 typedef pfm_filter_set_t pfm_register_filter_req_struct;
 typedef pfm_filter_set_t pfm_deregister_filter_req_struct;
 
+typedef pfm_filter_set_t pfm_register_ip_packet_filter_req_struct;
+typedef pfm_filter_set_t pfm_deregister_ip_packet_filter_req_struct;
+
 #endif /* __INC_PFM_STRUCT_H */
diff --git a/mcu/interface/sap/md/l5_msgid.h b/mcu/interface/sap/md/l5_msgid.h
index 1fb3e8c..eaebacb 100644
--- a/mcu/interface/sap/md/l5_msgid.h
+++ b/mcu/interface/sap/md/l5_msgid.h
@@ -541,6 +541,10 @@
         MSG_ID_L5UPDN_GET_5GQOS_REQ,
 		MSG_ID_L5UPDN_GET_NSSAI_REQ,
         MSG_ID_L5UPDN_DATA_RETRY_TIMER_REQ,
+        MSG_ID_L5UPDN_SET_IP_TUPLE_PACKET_FILTER_REQ,
+        MSG_ID_L5UPDN_DEL_IP_TUPLE_PACKET_FILTER_REQ,
+        MSG_ID_L5UPDN_SET_IP_TUPLE_PACKET_FILTER_MODE_REQ,
+        MSG_ID_L5UPDN_GET_IP_TUPLE_PACKET_FILTER_MODE_REQ,
     MSG_ID_L5IO_L5UPDN_MSG_FROM_L5IO_END,
 
     MSG_ID_L5IO_L5UPDN_MSG_FROM_LOWLAYER_BEGIN,
@@ -587,6 +591,11 @@
 		MSG_ID_L5UPDN_PACKET_WAKE_UP_IND,
 		MSG_ID_L5UPDN_GET_NSSAI_CNF,
         MSG_ID_L5UPDN_DATA_RETRY_TIMER_CNF,
+        MSG_ID_L5UPDN_IP_PACKET_RECV_IND,
+        MSG_ID_L5UPDN_SET_IP_TUPLE_PACKET_FILTER_CNF,
+        MSG_ID_L5UPDN_DEL_IP_TUPLE_PACKET_FILTER_CNF,
+        MSG_ID_L5UPDN_SET_IP_TUPLE_PACKET_FILTER_MODE_CNF,
+        MSG_ID_L5UPDN_GET_IP_TUPLE_PACKET_FILTER_MODE_CNF,
     MSG_ID_L5IO_L5UPDN_MSG_FROM_LOWLAYER_END,
 
     MSG_ID_L5IO_L5UCC_REQ_MSG_BEGIN,
diff --git a/mcu/interface/sap/mw/pfm_msgid_source.h b/mcu/interface/sap/mw/pfm_msgid_source.h
index 468ecbb..0cbdf4a 100644
--- a/mcu/interface/sap/mw/pfm_msgid_source.h
+++ b/mcu/interface/sap/mw/pfm_msgid_source.h
@@ -1,5 +1,7 @@
 MSG_ID_PFM_REGISTER_FILTER_REQ,
 MSG_ID_PFM_DEREGISTER_FILTER_REQ,
+MSG_ID_PFM_REGISTER_IP_PACKET_FILTER_REQ,
+MSG_ID_PFM_DEREGISTER_IP_PACKET_FILTER_REQ,
 MSG_ID_AP_STATUS_IND,
 MSG_ID_PFM_PCIE_STATE_CHANGE_IND,
 MSG_ID_PFM_ICMP_PING_REG_FILTER_REQ,
diff --git "a/mcu/make/projects/MOBILETEK2735_IVT_T800_V1\050NLWG_WIDE_TEMP_CUSTOM\051.mak" "b/mcu/make/projects/MOBILETEK2735_IVT_T800_V1\050NLWG_WIDE_TEMP_CUSTOM\051.mak"
index c4a18bd..d1a7ac8 100644
--- "a/mcu/make/projects/MOBILETEK2735_IVT_T800_V1\050NLWG_WIDE_TEMP_CUSTOM\051.mak"
+++ "b/mcu/make/projects/MOBILETEK2735_IVT_T800_V1\050NLWG_WIDE_TEMP_CUSTOM\051.mak"
@@ -3195,10 +3195,10 @@
 
 HW_VER = MOBILETEK2735_IVT_T800_V1_HW
 
-ORIGINAL_VERNO = MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.P3
+ORIGINAL_VERNO = MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.P4
 
-VERNO = MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.P3.T800.L1.240604.240828
-CUSTOMER_LABEL = MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6_MOBILETEK2735.IVT.T800.V1_P3
+VERNO = MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.P4.T800.L1.240604.240828
+CUSTOMER_LABEL = MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6_MOBILETEK2735.IVT.T800.V1_P4
 
 
 # *************************************************************************
diff --git a/mcu/middleware/hif/ipcore/include/ipc_filter.h b/mcu/middleware/hif/ipcore/include/ipc_filter.h
index 2cfa5eb..71eba58 100644
--- a/mcu/middleware/hif/ipcore/include/ipc_filter.h
+++ b/mcu/middleware/hif/ipcore/include/ipc_filter.h
@@ -251,7 +251,9 @@
     IPC_HW_DL_MODE = 0,
     IPC_SW_DL_MODE_STR = (1 << 0),
     IPC_SW_DL_MODE_PCI = (1 << 1),
+    IPC_SW_DL_MODE_IPP = (1 << 2),
     IPC_SW_DL_MODE_MAX = (1 << 7),
+    IPC_HW_DL_MODE_IPP = (~IPC_SW_DL_MODE_IPP),
     IPC_HW_DL_MODE_PCI = (~IPC_SW_DL_MODE_PCI),
     IPC_HW_DL_MODE_STR = (~IPC_SW_DL_MODE_STR)
 } ipc_sw_dl_mode_e;
diff --git a/mcu/middleware/hif/ipcore/include/pfm_defs.h b/mcu/middleware/hif/ipcore/include/pfm_defs.h
index f460868..75635ff 100644
--- a/mcu/middleware/hif/ipcore/include/pfm_defs.h
+++ b/mcu/middleware/hif/ipcore/include/pfm_defs.h
@@ -181,6 +181,8 @@
 
 void pfm_deregister_filters(local_para_struct *local_para_ptr);
 
+void pfm_dispatch_ip_packet_filter_cmd(ilm_struct *ilm, kal_bool is_register);
+
 void pfm_delete_filter_set(pfm_internal_filter_set_t *filter_set);
 
 void pfm_deregister_filter(kal_bool uplink, pfm_internal_filter_set_t *filter_set, kal_int32 filter_id);
diff --git a/mcu/middleware/hif/ipcore/src/ipc_filter.c b/mcu/middleware/hif/ipcore/src/ipc_filter.c
index 0b7f163..e976602 100644
--- a/mcu/middleware/hif/ipcore/src/ipc_filter.c
+++ b/mcu/middleware/hif/ipcore/src/ipc_filter.c
@@ -972,10 +972,12 @@
         return KAL_TRUE;
     }
 
-    if (0 == rules->valid_fields) {
-        hif_trace_error(IPC_TR_INVALID_RULES_ZERO_VALID_FIELD);
-        return KAL_FALSE;
-    }
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
 
     if ((UL_DIRECT == data_path_direct) &&
         (_RULES_CONTAIN(rules, EBI)    /* EBI is used for downlink filter only */||
@@ -996,8 +998,7 @@
     }
 
     if ((IPC_IP_TYPE_IPV4 == rules->ip_type) &&
-        (((UL_DIRECT == data_path_direct) ||
-        ((DL_DIRECT == data_path_direct) && !_RULES_CONTAIN(rules, EBI))) &&
+        (((UL_DIRECT == data_path_direct)) &&
          !_RULES_CONTAIN(rules, NETIF_ID) &&
          !_RULES_CONTAIN(rules, PROTOCOL) &&
          !_RULES_CONTAIN(rules, SRC_PORT) && !_RULES_CONTAIN(rules, DST_PORT) &&
@@ -1008,8 +1009,7 @@
     }
 
     if ((IPC_IP_TYPE_IPV6 == rules->ip_type) &&
-        (((UL_DIRECT == data_path_direct) ||
-        ((DL_DIRECT == data_path_direct) && !_RULES_CONTAIN(rules, EBI))) &&
+        (((UL_DIRECT == data_path_direct)) &&
          !_RULES_CONTAIN(rules, NETIF_ID) &&
          !_RULES_CONTAIN(rules, PROTOCOL) &&
          !_RULES_CONTAIN(rules, SRC_PORT) && !_RULES_CONTAIN(rules, DST_PORT) &&
@@ -2478,6 +2478,15 @@
                     ret = IPC_PKT_DO_FILTER_NOT_MATCHED;
                 }
                 hif_data_trace(MD_TRC_IPC_TR_CUST_FILTER_CBK, packet_des->packet, packet_des->packet_len, filter->filter_id, ret);
+            } else if (_FEATURES_CONTAIN(&filter->rules, CUST_FILTER) && (IPC_PKT_DO_FILTER_BWM_MATCHED == ret)) {
+                if (filter->cust_cbk_func) {
+                    filter->cust_cbk_func(packet_des->packet,
+                                          (kal_int32)packet_des->packet_len,
+                                          filter->filter_id,
+                                          filter->p_cust_cbk_args);
+                }
+                hif_data_trace(MD_TRC_IPC_TR_CUST_FILTER_CBK, packet_des->packet,
+                 packet_des->packet_len, filter->filter_id, -1);
             }
 
             if (IPC_PKT_DO_FILTER_NOT_MATCHED != ret) {
@@ -3636,7 +3645,8 @@
                                                                filter->p_cust_cbk_args)) {
                             match_result = IPC_PKT_DO_FILTER_NOT_MATCHED;
                         }
-                        hif_data_trace(MD_TRC_IPC_TR_CUST_FILTER_CBK, packet_des->packet, packet_des->packet_len, filter->filter_id, ret);
+                        hif_data_trace(MD_TRC_IPC_TR_CUST_FILTER_CBK, packet_des->packet,
+                        packet_des->packet_len, filter->filter_id, ret);
                     } else if (_FEATURES_CONTAIN(&filter->rules, CUST_FILTER_W_INFO) && (IPC_PKT_DO_FILTER_MATCHED == match_result)) {
                         p_filter_info->src_desc_type = IPC_FI_DESC_TYPE_NONE;
                         if (KAL_FALSE == filter->cust_cbk_func(packet_des->packet,
@@ -3645,7 +3655,18 @@
                                                                p_filter_info)) {
                             match_result = IPC_PKT_DO_FILTER_NOT_MATCHED;
                         }
-                        hif_data_trace(MD_TRC_IPC_TR_CUST_FILTER_CBK, packet_des->packet, packet_des->packet_len, filter->filter_id, ret);
+                        hif_data_trace(MD_TRC_IPC_TR_CUST_FILTER_CBK, packet_des->packet,
+                        packet_des->packet_len, filter->filter_id, ret);
+                    } else if (_FEATURES_CONTAIN(&filter->rules, CUST_FILTER) &&
+                              (IPC_PKT_DO_FILTER_BWM_MATCHED == match_result)) {
+                        if (filter->cust_cbk_func) {
+                            filter->cust_cbk_func(packet_des->packet,
+                                                  (kal_int32)packet_des->packet_len,
+                                                  filter->filter_id,
+                                                  filter->p_cust_cbk_args);
+                        }
+                        hif_data_trace(MD_TRC_IPC_TR_CUST_FILTER_CBK, packet_des->packet,
+                        packet_des->packet_len, filter->filter_id, -1);
                     }
 
                     if (match_result) {
diff --git a/mcu/middleware/hif/ipcore/src/ipc_if.c b/mcu/middleware/hif/ipcore/src/ipc_if.c
index a1a0a11..ef48ca1 100644
--- a/mcu/middleware/hif/ipcore/src/ipc_if.c
+++ b/mcu/middleware/hif/ipcore/src/ipc_if.c
@@ -2398,6 +2398,8 @@
             /* MSG to PFM (Packet Filter Manager) */
         case MSG_ID_PFM_REGISTER_FILTER_REQ:
         case MSG_ID_PFM_DEREGISTER_FILTER_REQ:
+        case MSG_ID_PFM_REGISTER_IP_PACKET_FILTER_REQ:
+        case MSG_ID_PFM_DEREGISTER_IP_PACKET_FILTER_REQ:
         case MSG_ID_AP_STATUS_IND:
         case MSG_ID_IPCORE_UDP_IGMP_REG_FILTER_REQ:
         case MSG_ID_IPCORE_UDP_IGMP_DEREG_FILTER_REQ:
diff --git a/mcu/middleware/hif/ipcore/src/ipc_ut.c b/mcu/middleware/hif/ipcore/src/ipc_ut.c
index 8f32406..bd54c6a 100644
--- a/mcu/middleware/hif/ipcore/src/ipc_ut.c
+++ b/mcu/middleware/hif/ipcore/src/ipc_ut.c
@@ -627,6 +627,7 @@
 #include "ipc_utils.h"
 #include "ipc_filter.h"
 #include "ipc_enums.h"
+#include "ipc_api.h"
 #include "ipc_data.h"
 #include "ipc_data_ipf.h"
 #include "sim_public_enum.h"
@@ -2258,6 +2259,14 @@
 #if defined(__MTK_TARGET__)
 kal_bool ipc_ut_struct(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz);
 #endif
+void ipc_ut_prepare_dl_did_list_garbage(kal_uint32 ipv4_cnt,
+    kal_uint32 ipv6_cnt,
+    kal_uint32 ipv4_idx,
+    kal_uint32 ipv6_idx,
+    kal_uint32 align_offset,
+    upcm_did   **did_head,
+    upcm_did   **did_tail,
+    kal_uint32 did_cnt);
 
 void ipc_ut_msg_reset(void * latest_local_param_p,
                       kal_uint32 latest_local_param_size,
@@ -6572,6 +6581,312 @@
 }
 #endif
 
+void ipc_ut_garbage_str_wake_type_pkt(const kal_uint8 *packet,
+    kal_int32 packet_len,
+    kal_int32 pfm_filter_id,
+    void* priv_data) {
+}
+
+/* Return expected number of packets that matched filter*/
+kal_uint32 ipc_ut_prepare_pfm_ip_filter(pfm_ip_packet_filter_filter_t* raw_filter, kal_int32 filter_id) {
+    kal_uint32 expected_num;
+
+    raw_filter->magic_code = PFM_FILTER_STRUCT_MAGIC_CODE;
+    raw_filter->pdn_id = IPC_UT_PDN_ID;
+    switch (filter_id) {
+        case 0:
+            /* All fields are specified */
+            raw_filter->ip_type = IPC_IP_TYPE_IPV4;
+            raw_filter->protocol = IPC_HDR_PROT_TCP;
+            raw_filter->src_port = 56668;
+            raw_filter->dst_port = 443;
+            raw_filter->ip_src[0] = 0xAC;
+            raw_filter->ip_src[1] = 0x16;
+            raw_filter->ip_src[2] = 0x97;
+            raw_filter->ip_src[3] = 0x94;
+            raw_filter->ip_dest[0] = 0x4A;
+            raw_filter->ip_dest[1] = 0x7D;
+            raw_filter->ip_dest[2] = 0x17;
+            raw_filter->ip_dest[3] = 0x5E;
+            /* Expected matched packet: ipc_ut_ipv4_tcp_fin_ack_packet */
+            expected_num = 1;
+            break;
+        case 1:
+            /* IPv4 + IPv4 DST_ADDR + SRC_PORT + TCP */
+            raw_filter->ip_type = IPC_IP_TYPE_IPV4;
+            raw_filter->protocol = IPC_HDR_PROT_TCP;
+            raw_filter->src_port = 56668;
+            raw_filter->ip_dest[0] = 0x4A;
+            raw_filter->ip_dest[1] = 0x7D;
+            raw_filter->ip_dest[2] = 0x17;
+            raw_filter->ip_dest[3] = 0x5E;
+            /* Expected matched packet: 
+               * ipc_ut_ipv4_tcp_fin_ack_packet & ipc_ut_ipv4_tcp_fin_ack_packet_2 */
+            expected_num = 2;
+            break;
+        case 2:
+            // IPv6 + IPv6 DST_ADDR + DST_PORT + UDP
+            raw_filter->ip_type = IPC_IP_TYPE_IPV6;
+            raw_filter->protocol = IPC_HDR_PROT_UDP;
+            raw_filter->dst_port = 547;
+            kal_uint8 dst_addr[16] = {0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                      0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02};
+            kal_mem_cpy(&raw_filter->ip_dest, &dst_addr, 16);
+            /* Expected matched packet
+               * ipc_ut_ipv6_dhcp_ul_packet & ipc_ut_ipv6_dhcp_packet */
+            expected_num = 2;
+            break;
+        case 3:
+            // IP_FAMILY_ALL + ICMP
+            raw_filter->ip_type = IPC_IP_TYPE_MIXED;
+            raw_filter->protocol = IPC_HDR_PROT_ICMP;
+            /* Expected matched packet
+               * g_ipc_ut_icmpv6_ra_pkt & g_ipc_ut_icmp_ra_pkt */
+            expected_num = 2;
+            break;
+        case 4:
+            // IP_FAMILY_ALL + IPv4 SRC_ADDR
+            raw_filter->ip_type = IPC_IP_TYPE_MIXED;
+            raw_filter->protocol = IPC_HDR_PROT_RESERVED;
+            raw_filter->ip_src[0] = 0xAC;
+            raw_filter->ip_src[1] = 0x16;
+            raw_filter->ip_src[2] = 0x97;
+            raw_filter->ip_src[3] = 0x94;
+            /* Expected matched packet: ipc_ut_ipv4_tcp_fin_ack_packet */
+            expected_num = 1;
+            break;
+        case 5:
+            // IP_FAMILY_ALL, pdn_id only, expect all packets
+            raw_filter->ip_type = IPC_IP_TYPE_MIXED;
+            raw_filter->protocol = IPC_HDR_PROT_RESERVED;
+            /* Expected matched packet: 6 */
+            expected_num = 6;
+            break;
+        case 6:
+            // set ip_family only, expect IPv4 packets
+            raw_filter->ip_type = IPC_IP_TYPE_IPV4;
+            raw_filter->protocol = IPC_HDR_PROT_RESERVED;
+            raw_filter->pdn_id = 0;
+            /* Expected matched packet: 3 */
+            expected_num = 3;
+            break;
+        default:
+            // all fields not set, expect all packets
+            raw_filter->ip_type = IPC_IP_TYPE_MIXED;
+            raw_filter->protocol = IPC_HDR_PROT_RESERVED;
+            raw_filter->pdn_id = 0;
+            /* Expected matched packet: 6 */
+            expected_num = 6;
+            break;
+    }
+    return expected_num;
+}
+
+
+void ipc_ut_pfm_ip_filter_prepare_dl_meta(
+                                 kal_uint32 *p_head_idx,
+                                 kal_uint32 *p_tail_idx,
+                                 ipfc_dl_filter_queue_type *q_type,
+                                 kal_uint32 netif_id,
+                                 kal_uint8 match_result) {
+    kal_uint32          idx;
+    kal_uint32          curr_meta_idx;
+    ipf_dl_meta         *curr_meta;
+    kal_uint8           *packet_buf;
+    kal_uint32          packet_len;
+    kal_uint32          netif_id_prefix = (netif_id & 0xFFFFFF00);
+
+    if (6 != ipc_ut_alloc_meta(
+                        IPC_UT_IPF_DL_0,  // LHIF_HWQ_AP_UL_Q0,
+                        6,
+                        p_head_idx,
+                        p_tail_idx)) {
+        UT_ASSERT(KAL_FALSE);
+        return;
+    }
+    *q_type = IPFC_META_QUEUE_DL;
+    curr_meta_idx = *p_head_idx;
+
+    for (idx = 0; idx < 6; idx++) {
+        curr_meta = &ipc_ut_dl_meta_tbl_s[curr_meta_idx];
+        curr_meta->channel_id = ((((netif_id & IPC_NETIF_ID_LHIF_BEGIN) == IPC_NETIF_ID_LHIF_BEGIN) ?
+                                    LHIF_NET_TYPE_LHIF : LHIF_NET_TYPE_RNDIS) <<8 )
+                            |(netif_id & 0x000000FF);
+
+        switch (idx) {
+            case 0:
+                packet_buf = ipc_ut_ipv4_tcp_fin_ack_packet;
+                packet_len = sizeof(ipc_ut_ipv4_tcp_fin_ack_packet);
+                curr_meta->ip = 0;
+                break;
+            case 1:
+                packet_buf = ipc_ut_ipv4_tcp_fin_ack_packet_2;
+                packet_len = sizeof(ipc_ut_ipv4_tcp_fin_ack_packet_2);
+                curr_meta->ip = 0;
+                break;
+            case 2:
+                packet_buf = ipc_ut_ipv6_dhcp_ul_packet;
+                packet_len = sizeof(ipc_ut_ipv6_dhcp_ul_packet);
+                curr_meta->ip = 1;
+                break;
+            case 3:
+                packet_buf = ipc_ut_ipv6_dhcp_packet;
+                packet_len = sizeof(ipc_ut_ipv6_dhcp_packet);
+                curr_meta->ip = 1;
+                break;
+            case 4:
+                packet_buf = g_ipc_ut_icmpv6_ra_pkt;
+                packet_len = sizeof(g_ipc_ut_icmpv6_ra_pkt);
+                curr_meta->ip = 1;
+                break;
+            case 5:
+                packet_buf = g_ipc_ut_icmp_ra_pkt;
+                packet_len = sizeof(g_ipc_ut_icmp_ra_pkt);
+                curr_meta->ip = 0;
+                break;
+            default:
+                packet_buf = ipc_ut_ipv4_tcp_fin_ack_packet;
+                packet_len = sizeof(ipc_ut_ipv4_tcp_fin_ack_packet);
+                curr_meta->ip = 0;
+                break;
+            }
+
+        kal_mem_cpy((kal_uint8*)curr_meta->addr, packet_buf, packet_len);
+        curr_meta->len = packet_len;
+
+        // Fill Match index (don't care value)
+        // we assgin the same value as ip type. it will be reused for querey filter id.
+        curr_meta->match_idx = 0;
+
+        curr_meta->mr = (match_result & 0x07);
+
+        curr_meta->pdn_sim_id = IPC_UT_PDN_ID;
+
+        curr_meta_idx++;
+        if (curr_meta_idx == IPC_UT_META_TABLE_SIZE) {
+            curr_meta_idx = 0;
+        }
+        if (curr_meta_idx == *p_tail_idx) {
+            return;
+        }
+    }
+}
+
+
+kal_bool ipc_ut_pfm_ip_pkt(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz) {
+    ipc_ut_netif_t *net;
+    ipcore_upcm_pdn_bind_ind_struct *bind_req;
+    ipcore_upcm_pdn_unbind_ind_struct *deact_req;
+    kal_bool result;
+    kal_uint32        netif_id = IPC_UT_LHIF_NETID_START;
+    kal_uint32 head_idx;
+    kal_uint32 tail_idx;
+    ipfc_dl_filter_queue_type q_type;
+    kal_uint32 idx;
+    kal_uint32 expected_num;
+
+    // init before test
+    ipc_ut_init();
+
+    /*
+     *   Reset IPCore before test
+     */
+    if (KAL_TRUE != ipc_reset()) {
+        utELOG("ipc_reset() FAIL!\r\n");
+        return KAL_FALSE;
+    }
+
+    /* ipc_attach() */
+    net = &(ipc_ut_nets_s[0]);
+    kal_mem_set(net, 0, sizeof(ipc_ut_netif_t));
+    net->conf.module_id = MOD_IPCORE;
+    net->conf.netif_id = IPC_UT_LHIF_NETID_START;
+    net->conf.ul_reload_context = net;
+    net->conf.ipc_ul_reload_callback_t = ipc_ut_ul_reload;
+    net->conf.callback_context = net;
+    net->conf.ipc_dlink_did_cb_t = ipc_ut_dl_callback_did;
+    net->conf.ipc_dlink_callback_t = ipc_ut_dl_callback;
+    net->conf.features = 0;
+    result = ipc_attach(&net->conf, &net->handle);
+    if (!result) {
+        utELOG("ipc_attach() returns KAL_FALSE!\r\n");
+        return KAL_FALSE;
+    }
+
+    /* PDN activation. */
+    bind_req = (ipcore_upcm_pdn_bind_ind_struct *)construct_local_para
+                (sizeof(ipcore_upcm_pdn_bind_ind_struct), TD_RESET);
+    bind_req->network_interface_id = net->conf.netif_id;
+    bind_req->pdn_id = IPC_UT_PDN_ID;
+    bind_req->ip_addr.ip_addr_type = IPV4V6_ADDR_TYPE;
+    ipc_on_pdn_bind_top(MOD_NIL, (local_para_struct *)bind_req);
+    free_local_para((local_para_struct *)bind_req);
+
+    /*
+     *   Register 0-7 IPv4 filter, 8-16 IPv6 filter
+     */
+    for (idx = 0; idx < 8; idx++) {
+        /* set IP packet filter */
+        pfm_register_ip_packet_filter_req_struct *pfm_set_req_ptr = (pfm_register_ip_packet_filter_req_struct *)
+                                construct_local_para(sizeof(pfm_register_ip_packet_filter_req_struct), TD_RESET);
+        kal_uint16 set_peer_pdu_len = 0;
+        pfm_set_req_ptr->filter_cnt = 1;
+        pfm_set_req_ptr->filter_set_id = PFM_IP_PACKET_FILTER_SET_ID;  // GARBAGE_STR_FILTER;
+        pfm_set_req_ptr->uplink = 0;  // 1 for uplink, 0 for downlink, always be downlink
+        peer_buff_struct * set_peer_buf_ptr = (peer_buff_struct *)construct_peer_buff
+                                              (sizeof(pfm_ip_packet_filter_filter_t), 0, 0, TD_RESET);
+        pfm_ip_packet_filter_filter_t *set_peer_pdu_ptr = (pfm_ip_packet_filter_filter_t *)
+                                                        get_peer_buff_pdu(set_peer_buf_ptr, &set_peer_pdu_len);
+        //    kal_mem_cpy(set_peer_pdu_ptr, (void*)all_pf_info_set, pf_count * sizeof(pfm_ip_packet_filter_filter_t));
+        kal_mem_set(set_peer_pdu_ptr, 0, sizeof(pfm_ip_packet_filter_filter_t));
+
+        expected_num = ipc_ut_prepare_pfm_ip_filter(set_peer_pdu_ptr, idx);
+
+        msg_send6(kal_get_active_module_id(), MOD_IPCORE, 0, MSG_ID_PFM_REGISTER_IP_PACKET_FILTER_REQ,
+                  (local_para_struct*)pfm_set_req_ptr, set_peer_buf_ptr);
+
+        pfm_ip_packet_filter_reg_cbk_wake_type_pkt(ipc_ut_garbage_str_wake_type_pkt, NULL);
+
+        /* simulate DL traffic from IPC_UT_PDN_ID */
+        ipc_ut_pfm_ip_filter_prepare_dl_meta(&head_idx, &tail_idx, &q_type, netif_id, IPC_IPF_MR_FILTER_MATCH);
+        ipc_meta_downlink(head_idx, tail_idx, q_type);
+        kal_sleep_task(IPC_UT_MSG_LATENCY);
+        UT_ASSERT(expected_num == ipc_ut_dl_callback_did_cnt);
+
+        /* remove IP packet filter */
+        pfm_deregister_ip_packet_filter_req_struct *l5updn_dereg_all_pf_ptr =
+         (pfm_deregister_ip_packet_filter_req_struct *)construct_local_para
+         (sizeof(pfm_deregister_ip_packet_filter_req_struct), TD_RESET);
+        l5updn_dereg_all_pf_ptr->filter_cnt = -1;  // if filter count = -1, IPCORE will deregister all packet filter
+        l5updn_dereg_all_pf_ptr->filter_set_id = PFM_IP_PACKET_FILTER_SET_ID;
+        l5updn_dereg_all_pf_ptr->uplink = 0;  // 1 is for uplink, 0 is for downlink
+
+        msg_send6(kal_get_active_module_id(), MOD_IPCORE, 0, MSG_ID_PFM_DEREGISTER_IP_PACKET_FILTER_REQ,
+                 (local_para_struct*)l5updn_dereg_all_pf_ptr, NULL);
+
+        pfm_ip_packet_filter_dereg_cbk_wake_type_pkt();
+
+        ipc_ut_reset_dl_callback_info();
+    }
+
+    /* PDN deactivation. */
+    deact_req = (ipcore_upcm_pdn_unbind_ind_struct *)construct_local_para
+                 (sizeof(ipcore_upcm_pdn_unbind_ind_struct), TD_RESET);
+    deact_req->pdn_id = IPC_UT_PDN_ID;
+    ipc_on_pdn_unbind((local_para_struct *)deact_req);
+    free_local_para((local_para_struct *)deact_req);
+
+    /* ipc_detach(). */
+    result = ipc_detach(net->handle);
+    if (!result) {
+        utELOG("ipc_detach() returns KAL_FALSE!\r\n");
+        return KAL_FALSE;
+    }
+
+    IPC_UT_PASS();
+    return KAL_TRUE;
+}
+
 kal_bool ipc_ut_helper_macro(void *p_param, kal_char *p_ret_err_str, kal_uint32 *p_ret_err_str_sz) {
     static kal_uint8 in_buf[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
     static kal_uint8 out_buf[40];
@@ -26203,6 +26518,7 @@
         IPC_UT_CASE(ipc_ut_data_usage, NULL),
         IPC_UT_CASE(ipc_ut_meta_downlink_with_large_pkt, NULL),
         IPC_UT_CASE(ipc_ut_str_garbage_filter_with_wakeup_pkt_cbk, NULL),
+        IPC_UT_CASE(ipc_ut_pfm_ip_pkt, NULL),
     };
 
     return st_reg_test("IPCORE", &(ipc_ut_cases_s[0]), (sizeof(ipc_ut_cases_s)/sizeof(ST_TCASE_T)));
diff --git a/mcu/middleware/hif/ipcore/src/pfm_garbage_filter.c b/mcu/middleware/hif/ipcore/src/pfm_garbage_filter.c
index 5885d78..92a01a6 100644
--- a/mcu/middleware/hif/ipcore/src/pfm_garbage_filter.c
+++ b/mcu/middleware/hif/ipcore/src/pfm_garbage_filter.c
@@ -158,6 +158,9 @@
 #include "pfm_object.h"
 
 #define PFM_GARBAGE_FILTER_MAX_FILTER   128
+/* max IP packet filter num is half of max garbage filter num, because two IP 
+ * packet filters (one IPv4 and one IPv6) will be registered for IP_FAMILY_ALL case */
+#define PFM_IP_PACKET_FILTER_MAX_FILTER (PFM_GARBAGE_FILTER_MAX_FILTER/2)
 #define PFM_INVALID_FILTER_ID           -10
 #define PFM_STR_FILTER_NETIF_MAX_NUM    16
 #define PFM_STR_FILTER_MAGIC_CODE       0x1798
@@ -224,12 +227,40 @@
 static kal_int32 g_ul_non_ping_filter_id = PFM_INVALID_FILTER_ID;
 static pfm_garbage_str_wake_type_pkt_f g_funcptr_mbim_wake_type_pkt_cbk = NULL;
 static void* g_priv_data = NULL;
+static kal_int32 g_pfm_ip_pkt_filter_id = PFM_INVALID_FILTER_ID;
+// TODO    currently using old variable
+static pfm_garbage_str_wake_type_pkt_f g_funcptr_wake_type_ip_packet_filter_cbk = NULL;
+static void* g_ip_packet_filter_priv_data = NULL;
 
 /*
 * API to register PFM callback function for MBIM WAKE REASON wake type pkt 
 */
-void pfm_reg_cbk_wake_type_pkt(pfm_garbage_str_wake_type_pkt_f pf_wake_type_pkt, void* priv_data)
-{
+void pfm_ip_packet_filter_reg_cbk_wake_type_pkt(pfm_garbage_str_wake_type_pkt_f pf_wake_type_pkt, void* priv_data) {
+    hif_trace_info(PFM_TR_REG_CBK_WAKE_TYPE_PKT, __FUNCTION__, pf_wake_type_pkt);
+    PFM_SPIN_LOCK(pfm_spinlock_g);
+    g_funcptr_wake_type_ip_packet_filter_cbk = pf_wake_type_pkt;
+    g_ip_packet_filter_priv_data = priv_data;
+
+    PFM_SPIN_UNLOCK(pfm_spinlock_g);
+}
+
+/*
+* API to De-register PFM callback function for MBIM WAKE REASON wake type pkt
+*/
+void pfm_ip_packet_filter_dereg_cbk_wake_type_pkt() {
+    hif_trace_info(PFM_TR_DEREG_CBK_WAKE_TYPE_PKT, __FUNCTION__);
+    PFM_SPIN_LOCK(pfm_spinlock_g);
+    g_funcptr_wake_type_ip_packet_filter_cbk = NULL;
+    g_ip_packet_filter_priv_data = NULL;
+
+    PFM_SPIN_UNLOCK(pfm_spinlock_g);
+}
+
+
+/*
+* API to register PFM callback function for MBIM WAKE REASON wake type pkt 
+*/
+void pfm_reg_cbk_wake_type_pkt(pfm_garbage_str_wake_type_pkt_f pf_wake_type_pkt, void* priv_data) {
     hif_trace_info(PFM_TR_REG_CBK_WAKE_TYPE_PKT, __FUNCTION__, pf_wake_type_pkt);
     PFM_SPIN_LOCK(pfm_spinlock_g);
     g_funcptr_mbim_wake_type_pkt_cbk = pf_wake_type_pkt;
@@ -240,8 +271,7 @@
 /*
 * API to De-register PFM callback function for MBIM WAKE REASON wake type pkt
 */
-void pfm_dereg_cbk_wake_type_pkt()
-{
+void pfm_dereg_cbk_wake_type_pkt() {
     hif_trace_info(PFM_TR_DEREG_CBK_WAKE_TYPE_PKT, __FUNCTION__);
     PFM_SPIN_LOCK(pfm_spinlock_g);
     g_funcptr_mbim_wake_type_pkt_cbk = NULL;
@@ -269,8 +299,7 @@
     kal_int32               filter_id,
     qbm_gpd                *head_gpd,
     qbm_gpd                *tail_gpd,
-    kal_uint32              length)
-{
+    kal_uint32              length) {
     ipc_pkt_t       ipc_pkt;
     qbm_gpd        *ul_gpd;
     qbm_gpd        *bd;
@@ -401,8 +430,7 @@
 
 void pfm_garbage_filter_register_parser(void *buf,
                                         kal_uint32 filter_cnt,
-                                        kal_bool uplink)
-{
+                                        kal_bool uplink) {
     kal_uint32              idx;
     pfm_garbage_filter_t *raw_filters = (pfm_garbage_filter_t *) buf;
     ipc_filter_rules_t      rules;
@@ -451,10 +479,320 @@
     PFM_GARBAGE_FILTER_MAX_FILTER, KAL_FALSE, &rules, pfm_ipc_dl_filter_with_info_cb, NULL);
 }
 
+static void pfm_garbage_ip_pkt_with_info_cb(ipc_filter_info_t *info_p,
+                                         void *context,
+                                         kal_int32 filter_id,
+                                         qbm_gpd *head_gpd,
+                                         qbm_gpd *tail_gpd,
+                                         kal_uint32 length) {
+    qbmt_dest_q(head_gpd, tail_gpd);
+    return;
+}
+
+static void pfm_bypass_ip_pkt_with_info_cb(ipc_filter_info_t *info_p,
+    void *context,
+    kal_int32 filter_id,
+    qbm_gpd *head_gpd,
+    qbm_gpd *tail_gpd,
+    kal_uint32 length) {
+    ipc_pkt_t pkt = { 0 };
+    pkt.isGPD = 1;
+    pkt.head = head_gpd;
+    pkt.tail = tail_gpd;
+    ipc_send_dl_pkt(&pkt, NULL, info_p->netif_id);
+    return;
+}
+
+kal_bool pfm_garbage_ip_pkt_cust_filter_cbk(const kal_uint8 *p_pkt,
+                                         kal_int32 pkt_len,
+                                         kal_int32 filter_id,
+                                         void *p_args) {
+    pfm_garbage_str_wake_type_pkt_f pf_wake_type_pkt_cbk = NULL;
+    void* priv_data = NULL;
+
+    PFM_SPIN_LOCK(pfm_spinlock_g);
+    pf_wake_type_pkt_cbk = g_funcptr_wake_type_ip_packet_filter_cbk;
+    priv_data = g_ip_packet_filter_priv_data;
+    PFM_SPIN_UNLOCK(pfm_spinlock_g);
+
+    if (pf_wake_type_pkt_cbk) {
+        hif_trace_info(PFM_TR_GARBAGE_STR_FILTER_PKT_FW, __FUNCTION__, pf_wake_type_pkt_cbk, p_pkt, pkt_len, filter_id);
+        pf_wake_type_pkt_cbk(p_pkt, pkt_len, filter_id, priv_data);
+    } else {
+        /*no callback registered for wake type packet*/
+        hif_trace_error(PFM_TR_GARBAGE_STR_FILTER_CBK_NULL, __FUNCTION__);
+    }
+    return KAL_TRUE;
+}
+
+void pfm_ip_packet_filter_register_parser(void *buf,
+                                        kal_uint32 filter_cnt,
+                                        kal_bool uplink) {
+    kal_uint32              idx;
+    pfm_ip_packet_filter_filter_t *raw_filters = (pfm_ip_packet_filter_filter_t *) buf;
+    ipc_filter_rules_t      rules;
+    kal_uint32*             addr32_src;
+    kal_uint32*             addr32_dst;
+
+    for (idx = 0; idx < filter_cnt; idx++) {
+        kal_mem_set(&rules, 0, sizeof(rules));
+
+        if (PFM_FILTER_STRUCT_MAGIC_CODE != raw_filters[idx].magic_code) {
+            hif_trace_error(PFM_TR_GARBAGE_FILTER_WRONG_MAGIC_CODE, __FUNCTION__, idx);
+            PFM_ASSERT(KAL_FALSE);
+            return;
+        }
+        hif_trace_info(PFM_TR_GARBAGE_FILTER_REG_PARSER, raw_filters[idx].filter_id,
+         raw_filters[idx].ip_type, raw_filters[idx].protocol, raw_filters[idx].dst_port);
+
+        addr32_src = (kal_uint32*) &raw_filters[idx].ip_src[0];
+        addr32_dst = (kal_uint32*) &raw_filters[idx].ip_dest[0];
+
+        rules.features = IPC_FILTER_FEATURE_BWM | IPC_FILTER_FEATURE_CUST_FILTER;
+        rules.priority = IPC_DL_FILTER_PRIORITY_PFM_GARBAGE_FILTER_BEGIN;
+        rules.cust_cbk_func = pfm_garbage_ip_pkt_cust_filter_cbk;
+
+        /* Register filter for port */
+        if (raw_filters[idx].src_port == 0) {
+            /* src port don't care case */
+        } else {
+            rules.valid_fields |= IPC_FILTER_BY_SRC_PORT;
+            rules.src_port = raw_filters[idx].src_port;
+        }
+        if (raw_filters[idx].dst_port == 0) {
+            /* dst port don't care case */
+        } else {
+            rules.valid_fields |= IPC_FILTER_BY_DST_PORT;
+            rules.dst_port = raw_filters[idx].dst_port;
+        }
+
+        /*  Register filter for PDN ID  */
+        if ( raw_filters[idx].pdn_id != 0 ) {
+            rules.valid_fields |= IPC_FILTER_BY_PDN_ID;
+            rules.pdn_id = raw_filters[idx].pdn_id;
+        }/* if pdn not set than register filer all pdn id so no need to set confg , cid  = -1 case   */
+
+
+        /* SRC_ADDR/DST_ADDR may also be specified when IP_FAMILY_ALL */
+        /* Deal with this case as IP_TYPE is specified */
+        if ( raw_filters[idx].ip_type == IPC_IP_TYPE_MIXED ) {
+            if ((addr32_src[0] != 0) &&
+                (addr32_src[1] == 0) &&
+                (addr32_src[2] == 0) &&
+                (addr32_src[3] == 0)) {
+                /* First word is non-zero and the other 3 words are zero. 
+                   * Think as IPv4 SRC_ADDR is specified. Deal as IPv4 filter */
+                raw_filters[idx].ip_type = IPC_IP_TYPE_IPV4;
+            } else if ((addr32_src[0] != 0) ||
+                      (addr32_src[1] != 0) ||
+                      (addr32_src[2] != 0) ||
+                      (addr32_src[3] != 0)) {
+                /* At least one word is non-zero. 
+                   * Think as IPv6 SRC_ADDR is specified. Deal as IPv6 filter */
+                raw_filters[idx].ip_type = IPC_IP_TYPE_IPV6;
+            } else if ((addr32_dst[0] != 0) &&
+                      (addr32_dst[1] == 0) &&
+                      (addr32_dst[2] == 0) &&
+                      (addr32_dst[3] == 0)) {
+                /* First word is non-zero and the other 3 words are zero. 
+                   * Think as IPv4 DST_ADDR is specified. Deal as IPv4 filter */
+                raw_filters[idx].ip_type = IPC_IP_TYPE_IPV4;
+            } else if ((addr32_dst[0] != 0) ||
+                      (addr32_dst[1] != 0) ||
+                      (addr32_dst[2] != 0) ||
+                      (addr32_dst[3] != 0)) {
+                /* At least one word is non-zero. 
+                   * Think as IPv6 SRC_ADDR is specified. Deal as IPv6 filter */
+                raw_filters[idx].ip_type = IPC_IP_TYPE_IPV6;
+            } else {
+                /* Both SRC_ADDR and DST_ADDR are zero. 
+                   * Need to register both IPv4 and IPv6 filter. */
+            }
+        }
+
+        /* IP_FAMILY_ALL case, register both IPv4 and IPv6 filter
+          * No need to check IP SRC_ADDR/DST_ADDR */
+        if ( raw_filters[idx].ip_type == IPC_IP_TYPE_MIXED ) {
+            /* register IPv4 filter */
+            rules.ip_type = IPC_IP_TYPE_IPV4;
+
+            /* Register filter for protocol */
+            if (raw_filters[idx].protocol == IPC_HDR_PROT_RESERVED) {
+                /* Protocol don't care case */
+            } else if ((raw_filters[idx].protocol == IPC_HDR_PROT_TCP)  ||
+                      (raw_filters[idx].protocol == IPC_HDR_PROT_UDP)  ||
+                      (raw_filters[idx].protocol == IPC_HDR_PROT_ICMP)) {
+                rules.valid_fields |= IPC_FILTER_BY_PROTOCOL;
+                rules.protocol = raw_filters[idx].protocol;
+            } else {
+                /* error msg */
+            }
+
+            if (PFM_IP_PACKET_FILTER_MAX_FILTER < raw_filters[idx].filter_id) {
+                hif_trace_error(PFM_TR_GARBAGE_FILTER_INVALID_FILTER_ID, __FUNCTION__);
+                PFM_ASSERT(KAL_FALSE);
+            } else {
+                pfm_register_filter_with_info_cbk(PFM_IP_PACKET_FILTER_SET_ID, raw_filters[idx].filter_id,
+                 KAL_FALSE, &rules, pfm_bypass_ip_pkt_with_info_cb, NULL);
+            }
+
+            /* register IPv6 filter, filter_id is mapped to filter_id + PFM_IP_PACKET_FILTER_MAX_FILTER */
+            rules.ip_type = IPC_IP_TYPE_IPV6;
+
+            /* need to update protocol for ICMP */
+            if (raw_filters[idx].protocol == IPC_HDR_PROT_ICMP) {
+                rules.protocol = IPC_HDR_PROT_ICMPV6;
+            }
+
+            if (PFM_IP_PACKET_FILTER_MAX_FILTER < raw_filters[idx].filter_id) {
+                hif_trace_error(PFM_TR_GARBAGE_FILTER_INVALID_FILTER_ID, __FUNCTION__);
+                PFM_ASSERT(KAL_FALSE);
+            } else {
+                pfm_register_filter_with_info_cbk(PFM_IP_PACKET_FILTER_SET_ID,
+                                                  raw_filters[idx].filter_id + PFM_IP_PACKET_FILTER_MAX_FILTER,
+                                                  KAL_FALSE, &rules, pfm_bypass_ip_pkt_with_info_cb, NULL);
+            }
+        } else {
+            /* IP type is specified */
+            if ( raw_filters[idx].ip_type == IPC_IP_TYPE_IPV4 ) {
+                rules.ip_type = IPC_IP_TYPE_IPV4;
+
+                /* Register filter for protocol */
+                if (raw_filters[idx].protocol == IPC_HDR_PROT_RESERVED) {
+                    /* Protocol don't care case */
+                } else if ((raw_filters[idx].protocol == IPC_HDR_PROT_TCP) ||
+                          (raw_filters[idx].protocol == IPC_HDR_PROT_UDP) ||
+                          (raw_filters[idx].protocol == IPC_HDR_PROT_ICMP)) {
+                    rules.valid_fields |= IPC_FILTER_BY_PROTOCOL;
+                    rules.protocol = raw_filters[idx].protocol;
+                } else {
+                    /* error msg */
+                }
+
+                /* Register filter for IPv4 SRC_ADDR/DST_ADDR */
+                if (*addr32_src == 0) {
+                    /* IPv4 source address don't care case */
+                } else {
+                    rules.valid_fields |= IPC_FILTER_BY_SRC_IPV4;
+                    kal_mem_cpy(&rules.src_ipv4.addr8[0], &raw_filters[idx].ip_src, 4);
+                }
+                if (*addr32_dst == 0) {
+                    /* IPv4 destination address don't care case */
+                } else {
+                    rules.valid_fields |= IPC_FILTER_BY_DST_IPV4;
+                    kal_mem_cpy(&rules.dst_ipv4.addr8[0], &raw_filters[idx].ip_dest, 4);
+                }
+            } else if ( raw_filters[idx].ip_type == IPC_IP_TYPE_IPV6 ) {
+                rules.ip_type = IPC_IP_TYPE_IPV6;
+                /* Register filter for protocol */
+                if (raw_filters[idx].protocol == IPC_HDR_PROT_RESERVED) {
+                    /* Protocol don't care case */
+                } else if ((raw_filters[idx].protocol == IPC_HDR_PROT_TCP)  ||
+                          (raw_filters[idx].protocol == IPC_HDR_PROT_UDP)  ||
+                          (raw_filters[idx].protocol == IPC_HDR_PROT_ICMP)) {
+                    rules.valid_fields |= IPC_FILTER_BY_PROTOCOL;
+                    rules.protocol = (raw_filters[idx].protocol == IPC_HDR_PROT_ICMP)?
+                                     IPC_HDR_PROT_ICMPV6:raw_filters[idx].protocol;
+                } else {
+                    /* error msg */
+                }
+
+                /* Register filter for IPv6 SRC_ADDR/DST_ADDR */
+                if ((addr32_src[0] == 0) &&
+                    (addr32_src[1] == 0) &&
+                    (addr32_src[2] == 0) &&
+                    (addr32_src[3] == 0)) {
+                    /* IPv6 source address don't care case */
+                } else {
+                    rules.valid_fields |= IPC_FILTER_BY_SRC_IPV6;
+                    kal_mem_cpy(&rules.src_ipv6.addr8[0], &raw_filters[idx].ip_src, 16);
+                }
+                if ((addr32_dst[0] == 0) &&
+                    (addr32_dst[1] == 0) &&
+                    (addr32_dst[2] == 0) &&
+                    (addr32_dst[3] == 0)) {
+                    /* IPv6 destination address don't care case */
+                } else {
+                    rules.valid_fields |= IPC_FILTER_BY_DST_IPV6;
+                    kal_mem_cpy(&rules.dst_ipv6.addr8[0], &raw_filters[idx].ip_dest, 16);
+                }
+            } else {
+                /* error msg */
+            }
+
+            if (PFM_IP_PACKET_FILTER_MAX_FILTER < raw_filters[idx].filter_id) {
+                hif_trace_error(PFM_TR_GARBAGE_FILTER_INVALID_FILTER_ID, __FUNCTION__);
+                PFM_ASSERT(KAL_FALSE);
+            } else {
+                pfm_register_filter_with_info_cbk(PFM_IP_PACKET_FILTER_SET_ID, raw_filters[idx].filter_id,
+                 KAL_FALSE, &rules, pfm_bypass_ip_pkt_with_info_cb, NULL);
+            }
+        }
+    }
+
+    if (PFM_INVALID_FILTER_ID == g_pfm_ip_pkt_filter_id) {
+        ipc_filter_ntfy_ctxt_t ntfy_context = {0};
+        ipc_filter_switch_dl_mode(IPC_SW_DL_MODE_IPP);
+        /* Register filter to trap all left TCP SYN packets. */
+        kal_mem_set(&rules, 0, sizeof(rules));
+        rules.priority = IPC_DL_FILTER_PRIORITY_PFM_GARBAGE_FILTER_END;
+        rules.features = IPC_FILTER_FEATURE_PFM_DL | IPC_FILTER_FEATURE_WC;
+
+        ntfy_context.ntfy_type = IPC_FILTER_NTFY_CBK_FUNC_WITH_FILTER_INFO;
+        ntfy_context.ntfy_mod.with_info_cbk_func = pfm_garbage_ip_pkt_with_info_cb;
+
+        g_pfm_ip_pkt_filter_id = ipc_reg_filter(DL_DIRECT, &rules, &ntfy_context);
+    }
+}
+
+void pfm_ip_packet_bwm_filter_deregister_callback(void *buf,
+                                            kal_uint32 filter_cnt,
+                                            kal_bool uplink) {
+    pfm_internal_filter_set_t *filter_set = NULL;
+    pfm_internal_filter_set_t *filter_set_list = pfm_get_filter_set_list(uplink);
+    kal_int32 idx;
+
+    filter_set = pfm_get_filter_set_by_id(filter_set_list, NUM_OF_PFM_FILTER_SET_ID, PFM_IP_PACKET_FILTER_SET_ID);
+    if (filter_set) {
+        hif_trace_info(PFM_TR_DEREG_FILTERS_INFO, uplink, PFM_IP_PACKET_FILTER_SET_ID, filter_cnt);
+        if (-1 == filter_cnt) {
+            /* Deregister all filters. */
+            for (idx = 0; idx < PFM_FILTER_SET_MAX_SIZE; idx++) {
+                if (-1 != filter_set->filters[idx]) {
+                    pfm_deregister_filter((uplink == 1) ? KAL_TRUE : KAL_FALSE, filter_set, idx);
+                    if (0 == filter_set->filter_cnt) {
+                        pfm_delete_filter_set(filter_set);
+                        break;
+                    }
+                }
+            }
+        } else {
+            /* Deregister the specified filters. */
+            /* Currently not supported */
+            PFM_ASSERT(KAL_FALSE);
+        }
+    } else {
+        hif_trace_error(PFM_TR_DEREG_FILTERS_FILTER_SET_NOT_FOUND, uplink, PFM_IP_PACKET_FILTER_SET_ID);
+    }
+
+    return;
+}
+
+void pfm_ip_packet_filter_deregister_callback(void *buf,
+                                            kal_uint32 filter_cnt,
+                                            kal_bool uplink) {
+    pfm_ip_packet_bwm_filter_deregister_callback(buf, filter_cnt, uplink);
+    if (PFM_INVALID_FILTER_ID != g_pfm_ip_pkt_filter_id) {
+        ipc_dereg_filter(g_pfm_ip_pkt_filter_id);
+        g_pfm_ip_pkt_filter_id = PFM_INVALID_FILTER_ID;
+    }
+    /* Switch IPCORE DL mode to HW mode*/
+    ipc_filter_switch_dl_mode((kal_uint8)IPC_HW_DL_MODE_IPP);
+}
+
 void pfm_garbage_filter_deregister_callback(void *buf,
                                             kal_uint32 filter_cnt,
-                                            kal_bool uplink)
-{
+                                            kal_bool uplink) {
     kal_int32 *filters_buf = buf;
     pfm_internal_filter_set_t *filter_set = NULL;
     pfm_internal_filter_set_t *filter_set_list = pfm_get_filter_set_list(uplink);
@@ -500,8 +838,7 @@
                             kal_int32 filter_id,
                             qbm_gpd *head_gpd,
                             qbm_gpd *tail_gpd,
-                            kal_uint32 length)
-{
+                            kal_uint32 length) {
     ipc_pkt_t ipc_pkt;
     qbm_gpd *ul_gpd;
     qbm_gpd *bd;
@@ -655,8 +992,7 @@
 
 void pfm_fin_ack_filter_register_parser(void *buf,
                                         kal_uint32 filter_cnt,
-                                        kal_bool uplink)
-{
+                                        kal_bool uplink) {
     ipc_filter_rules_t v4_rules = {0};
     ipc_filter_rules_t v6_rules = {0};
 
@@ -701,8 +1037,7 @@
 
 void pfm_fin_ack_filter_deregister_callback(void *buf,
                                             kal_uint32 filter_cnt,
-                                            kal_bool uplink)
-{
+                                            kal_bool uplink) {
     ipc_deregister_dl_filter(g_fin_ack_filter_id_v4);
     ipc_deregister_dl_filter(g_fin_ack_filter_id_v6);
     g_fin_ack_filter_id_v4 = PFM_INVALID_FILTER_ID;
@@ -717,8 +1052,7 @@
                              kal_int32 filter_id,
                              qbm_gpd *head_gpd,
                              qbm_gpd *tail_gpd,
-                             kal_uint32 length)
-{
+                             kal_uint32 length) {
     hif_trace_info(PFM_TR_UDP_IGMP_FILTER_DROP, __FUNCTION__, filter_id);
     qbmt_dest_q(head_gpd, tail_gpd);
 
@@ -727,8 +1061,7 @@
 
 void pfm_udp_igmp_filter_register_parser(void *buf,
                                          kal_uint32 filter_cnt,
-                                         kal_bool uplink)
-{
+                                         kal_bool uplink) {
     ipc_filter_rules_t igmp_v4_rules = {0};
     ipc_filter_rules_t igmp_v6_rules = {0};
     ipc_filter_rules_t udp_v4_rules = {0};
@@ -807,8 +1140,7 @@
 
 void pfm_udp_igmp_filter_deregister_callback(void *buf,
                                              kal_uint32 filter_cnt,
-                                             kal_bool uplink)
-{
+                                             kal_bool uplink) {
     ipc_deregister_dl_filter(g_igmp_filter_id_v4);
     ipc_deregister_dl_filter(g_igmp_filter_id_v6);
     ipc_deregister_dl_filter(g_udp_filter_id_v4);
@@ -824,13 +1156,11 @@
     return;
 }
 
-static kal_int32 pfm_str_find_empty_object_idx(kal_uint32 *mask, kal_uint32 max_num, kal_uint32 *total_num)
-{
+static kal_int32 pfm_str_find_empty_object_idx(kal_uint32 *mask, kal_uint32 max_num, kal_uint32 *total_num) {
     kal_uint32 i;
 
-    for(i = 0; i < max_num; i ++)
-    {
-        if( 0 == ((1 << i) & (*mask))){
+    for (i = 0; i < max_num; i ++) {
+        if (0 == ((1 << i) & (*mask))) {
             *mask = (*mask) | (1 << i);
             (*total_num)++;
             return i;
@@ -839,20 +1169,18 @@
     return -1;
 }
 
-static void pfm_str_release_object_by_idx(kal_uint32 index, kal_uint32 *mask, kal_uint32 *total_num)
-{
+static void pfm_str_release_object_by_idx(kal_uint32 index, kal_uint32 *mask, kal_uint32 *total_num) {
     *mask = (*mask) & ~(1 << index);
     (*total_num)--;
     return;
 }
 
-static pfmStrFilterNetifInfo* pfm_str_find_netif_by_id(kal_uint32 netif_id)
-{
+static pfmStrFilterNetifInfo* pfm_str_find_netif_by_id(kal_uint32 netif_id) {
     kal_uint32 i = 0;
 
-    for(i = 0; i < PFM_STR_FILTER_NETIF_MAX_NUM; i++){
-        if(g_pfm_str_filter_netif_pool_mask & (1 << i)){
-            if( netif_id == g_pfm_str_filter_netif_pool[i].netif_id){
+    for (i = 0; i < PFM_STR_FILTER_NETIF_MAX_NUM; i++) {
+        if (g_pfm_str_filter_netif_pool_mask & (1 << i)) {
+            if (netif_id == g_pfm_str_filter_netif_pool[i].netif_id) {
                 return &g_pfm_str_filter_netif_pool[i];
             }
         }
@@ -860,23 +1188,22 @@
     return NULL;
 }
 
-static void pfm_str_netif_remove_filter_by_id(pfmStrFilterNetifInfo *p_netif_info, kal_uint32 filter_id)
-{
+static void pfm_str_netif_remove_filter_by_id(pfmStrFilterNetifInfo *p_netif_info, kal_uint32 filter_id) {
     pfmStrFilterInfo *filter = NULL;
     pfmStrFilterInfo *prev_filter = NULL;
 
-    if((NULL == p_netif_info) || (0 == p_netif_info->filter_num)){
+    if ((NULL == p_netif_info) || (0 == p_netif_info->filter_num)) {
         return;
     }
 
     filter = p_netif_info->p_head_filter;
 
-    while(NULL != filter){
-        if(filter_id == filter->filter_id){
-            if(NULL == prev_filter){
+    while (NULL != filter) {
+        if (filter_id == filter->filter_id) {
+            if (NULL == prev_filter) {
                 /* 1st filter */
                 p_netif_info->p_head_filter = filter->p_next_filter;
-            }else{
+            } else {
                 /* Non 1st filter */
                 prev_filter->p_next_filter = filter->p_next_filter;
             }
@@ -889,8 +1216,8 @@
     return;
 }
 
-static void pfm_garbage_str_forward_matched_pkt(const kal_uint8 *packet_buff, kal_int32 packet_len, kal_int32 pfm_filter_id)
-{
+static void pfm_garbage_str_forward_matched_pkt(const kal_uint8 *packet_buff,
+    kal_int32 packet_len, kal_int32 pfm_filter_id) {
     pfm_garbage_str_wake_type_pkt_f pf_wake_type_pkt_cbk = NULL;
     void* priv_data = NULL;
 
@@ -914,8 +1241,7 @@
                                          kal_int32 filter_id,
                                          qbm_gpd *head_gpd,
                                          qbm_gpd *tail_gpd,
-                                         kal_uint32 length)
-{
+                                         kal_uint32 length) {
     qbmt_dest_q(head_gpd, tail_gpd);
     return;
 }
@@ -923,8 +1249,7 @@
 kal_bool pfm_garbage_str_cust_filter_cbk(const kal_uint8 *p_pkt,
                                          kal_int32 pkt_len,
                                          kal_int32 filter_id,
-                                         void *p_args)
-{
+                                         void *p_args) {
     kal_uint32 j = 0;
     kal_uint32 netif_id = 0;
     kal_bool is_matched = KAL_FALSE;
@@ -942,20 +1267,20 @@
     p_netif_info = pfm_str_find_netif_by_id(netif_id);
 
     /* if packet is not continueous, merge it */
-    if(IPC_FI_DESC_TYPE_DID == p_ipc_info->src_desc_type){
+    if (IPC_FI_DESC_TYPE_DID == p_ipc_info->src_desc_type) {
         p_did = p_ipc_info->src_desc_ptr;
         p_si = UPCM_DID_GET_SIT_ENTRY_PTR(p_did, p_ipc_info->src_desc_indx);
         p_tmp_buf = get_ctrl_buffer(pkt_len);
-        if(NULL == p_tmp_buf){
+        if (NULL == p_tmp_buf) {
             goto _return;
         }
         result = ipc_get_continuous_content_did(p_si->p_data, UPCM_DID_SI_GET_OFFSET(p_si), p_did, p_ipc_info->src_desc_indx, pkt_len, &p_in_pkt, p_tmp_buf);
-        if(KAL_FALSE == result){
+        if (KAL_FALSE == result) {
             goto _return;
         }
     }
 
-    if(NULL != p_netif_info){
+    if (NULL != p_netif_info) {
         p_filter_info = p_netif_info->p_head_filter;
         while ((NULL != p_filter_info) && (KAL_FALSE == is_matched)) {
             if (pkt_len >= p_filter_info->filter_len) {
@@ -963,13 +1288,13 @@
                     if (0 == p_filter_info->mask_str[j]) {
                         continue;
                     }
-                    if(NULL != p_in_pkt){
+                    if (NULL != p_in_pkt) {
                         if ((p_filter_info->mask_str[j] & p_in_pkt[j]) !=
                             (p_filter_info->mask_str[j] & p_filter_info->filter_str[j])) {
                             is_matched = KAL_FALSE;
                             break;
                         }
-                    }else{
+                    } else {
                         if ((p_filter_info->mask_str[j] & p_pkt[j]) !=
                             (p_filter_info->mask_str[j] & p_filter_info->filter_str[j])) {
                             is_matched = KAL_FALSE;
@@ -985,8 +1310,8 @@
     }
 
 _return:
-    if(NULL != p_tmp_buf){
-        free_ctrl_buffer(p_tmp_buf);    
+    if (NULL != p_tmp_buf) {
+        free_ctrl_buffer(p_tmp_buf);
     }
 
     return !is_matched;
@@ -994,8 +1319,7 @@
 
 void pfm_garbage_str_filter_register_parser(void *buf,
                                             kal_uint32 filter_cnt,
-                                            kal_bool uplink)
-{
+                                            kal_bool uplink) {
     kal_uint8 i = 0;
     kal_uint32 index = 0;
     pfm_str_filter_t *p_single_filter = (pfm_str_filter_t*)buf;
@@ -1015,8 +1339,8 @@
     PFM_ASSERT(NULL != p_filter_set);
     
     /* Store string filter */
-    for(i = 0; i < filter_cnt; i++){
-        if(PFM_STR_FILTER_MAGIC_CODE != p_single_filter->magic_code) {
+    for (i = 0; i < filter_cnt; i++) {
+        if (PFM_STR_FILTER_MAGIC_CODE != p_single_filter->magic_code) {
             hif_trace_info(PFM_TR_GARBAGE_FILTER_WRONG_MAGIC_CODE, __FUNCTION__, i);
             PFM_ASSERT(KAL_FALSE);
             return;
@@ -1030,7 +1354,7 @@
         hif_trace_info(PFM_TR_GARBAGE_STR_FILTER_REG_PARSER, __FUNCTION__, p_single_filter->filter_id, p_single_filter->netif_id, p_single_filter->filter_len, p_single_filter->mask_len);
 
         /* Check if filter_id is already used */
-        if(-1 != p_filter_set->filters[p_single_filter->filter_id]){
+        if (-1 != p_filter_set->filters[p_single_filter->filter_id]) {
             /* remove previous first */
             hif_trace_info(PFM_TR_GARBAGE_STR_FILTER_FLT_ID_EXIST, __FUNCTION__, p_single_filter->filter_id);
             index = p_filter_set->filters[p_single_filter->filter_id];
@@ -1043,17 +1367,17 @@
             p_filter_set->filters[p_single_filter->filter_id] = -1;
             p_filter_set->filter_cnt--;
 
-            if(0 == p_netif->filter_num){
+            if (0 == p_netif->filter_num) {
                 pfm_str_release_object_by_idx(p_netif->index, &g_pfm_str_filter_netif_pool_mask, &g_pfm_str_filter_netif_num);
             }
         }
         
         p_netif = pfm_str_find_netif_by_id(p_single_filter->netif_id);
-        if(NULL == p_netif)
+        if (NULL == p_netif)
         {
             /* Allocate new one */
             index = pfm_str_find_empty_object_idx(&g_pfm_str_filter_netif_pool_mask, PFM_STR_FILTER_NETIF_MAX_NUM, &g_pfm_str_filter_netif_num);
-            if(-1 == index)
+            if (-1 == index)
             {
                 hif_trace_info(PFM_TR_GARBAGE_STR_FILTER_NETIF_ALLOC_NG, __FUNCTION__, g_pfm_str_filter_netif_pool_mask, g_pfm_str_filter_netif_num, p_single_filter->netif_id);
                 PFM_ASSERT(KAL_FALSE);
@@ -1065,7 +1389,7 @@
         }
         
         index = pfm_str_find_empty_object_idx(&g_pfm_str_filter_pool_mask, PFM_STR_FILTER_MAX_NUM, &g_pfm_str_filter_num);
-        if(-1 == index){
+        if (-1 == index) {
             hif_trace_info(PFM_TR_GARBAGE_STR_FILTER_ALLOC_NG, __FUNCTION__, g_pfm_str_filter_pool_mask, g_pfm_str_filter_num, p_single_filter->filter_id);
             PFM_ASSERT(KAL_FALSE);
             return;
@@ -1077,9 +1401,9 @@
         p_filter_info->p_netif = p_netif;
         p_filter_info->p_next_filter = NULL;
 
-        if(NULL == p_netif->p_head_filter){
+        if (NULL == p_netif->p_head_filter) {
             p_netif->p_head_filter = p_filter_info;
-        }else{
+        } else {
             p_filter_info->p_next_filter = p_netif->p_head_filter;
             p_netif->p_head_filter = p_filter_info;
         }
@@ -1089,7 +1413,7 @@
         p_filter_set->filters[p_single_filter->filter_id] = index;
         p_single_filter++;
     }
-    if(PFM_INVALID_FILTER_ID == g_pfm_str_filter_id){
+    if (PFM_INVALID_FILTER_ID == g_pfm_str_filter_id) {
         /* Switch IPCORE DL mode to SW mode*/
         ipc_filter_switch_dl_mode(IPC_SW_DL_MODE_STR);
     
@@ -1112,8 +1436,7 @@
 
 void pfm_garbage_str_filter_deregister_callback(void *buf,
                                                 kal_uint32 filter_cnt,
-                                                kal_bool uplink)
-{
+                                                kal_bool uplink) {
     kal_uint32 i = 0;
     kal_uint32 netif_id = 0;
     kal_int32 *filter_ids = (kal_int32*) buf;
@@ -1129,28 +1452,28 @@
 
     PFM_ASSERT(NULL != p_filter_set);
     
-    if(-1 == filter_cnt){
+    if (-1 == filter_cnt) {
         /* Deregister all filters */
-        for(i = 0; i < PFM_STR_FILTER_MAX_NUM; i++){
-            if(g_pfm_str_filter_pool_mask & (1 << i)){
+        for (i = 0; i < PFM_STR_FILTER_MAX_NUM; i++) {
+            if (g_pfm_str_filter_pool_mask & (1 << i)) {
                 pfm_str_release_object_by_idx(i, &g_pfm_str_filter_pool_mask, &g_pfm_str_filter_num);
                 p_filter_info = &g_pfm_str_filter_pool[i];
                 p_filter_set->filters[p_filter_info->filter_id] = -1;
                 p_filter_set->filter_cnt--;
             }
         }
-        for(i = 0; i < PFM_STR_FILTER_NETIF_MAX_NUM; i++){
-            if(g_pfm_str_filter_netif_pool_mask & (1 << i)){
+        for (i = 0; i < PFM_STR_FILTER_NETIF_MAX_NUM; i++) {
+            if (g_pfm_str_filter_netif_pool_mask & (1 << i)) {
                 pfm_str_release_object_by_idx(i, &g_pfm_str_filter_netif_pool_mask, &g_pfm_str_filter_netif_num);
             }
         }   
         PFM_ASSERT(!g_pfm_str_filter_num && !g_pfm_str_filter_netif_num && !p_filter_set->filter_cnt);
-    }else{
+    } else {
         /* Deregister specific filters */
         PFM_ASSERT(NULL != buf);
-        if(filter_cnt <= g_pfm_str_filter_num){
-            for(i = 0; i < filter_cnt; i++){
-                if((filter_ids[i] < 0) || (filter_ids[i] > PFM_FILTER_SET_MAX_SIZE)){
+        if (filter_cnt <= g_pfm_str_filter_num) {
+            for (i = 0; i < filter_cnt; i++) {
+                if ((filter_ids[i] < 0) || (filter_ids[i] > PFM_FILTER_SET_MAX_SIZE)) {
                     PFM_ASSERT(KAL_FALSE);
                     return;
                 }
@@ -1166,21 +1489,21 @@
                 p_filter_set->filters[filter_ids[i]] = -1;
                 p_filter_set->filter_cnt--;
 
-                if(0 == p_netif_info->filter_num){
+                if (0 == p_netif_info->filter_num) {
                     pfm_str_release_object_by_idx(p_netif_info->index, &g_pfm_str_filter_netif_pool_mask, &g_pfm_str_filter_netif_num);
                 }
             }
-        }else{
+        } else {
             hif_trace_info(PFM_TR_GARBAGE_STR_FILTER_DEREG_CNT_NG, __FUNCTION__);
             PFM_ASSERT(KAL_FALSE);
         }
     }
 
-    if(0 == p_filter_set->filter_cnt){
+    if (0 == p_filter_set->filter_cnt) {
         hif_trace_info(PFM_TR_GARBAGE_STR_FILTER_DEREG_DEL, __FUNCTION__, g_pfm_str_filter_id);
         pfm_delete_filter_set(p_filter_set);
 
-        if(PFM_INVALID_FILTER_ID != g_pfm_str_filter_id){
+        if (PFM_INVALID_FILTER_ID != g_pfm_str_filter_id) {
             ipc_dereg_filter(g_pfm_str_filter_id);
             g_pfm_str_filter_id = PFM_INVALID_FILTER_ID;
         }
@@ -1196,8 +1519,7 @@
                                          kal_int32 filter_id,
                                          qbm_gpd *head_gpd,
                                          qbm_gpd *tail_gpd,
-                                         kal_uint32 length)
-{
+                                         kal_uint32 length) {
     qbmt_dest_q(head_gpd, tail_gpd);
     return;
 }
@@ -1205,16 +1527,14 @@
 kal_bool pfm_icmp_ping_filter_cust_cbk(const kal_uint8 *p_pkt,
                                          kal_int32 pkt_len,
                                          kal_int32 filter_id,
-                                         void *p_args)
-{
+                                         void *p_args) {
 	/* Do nothing */
     return KAL_FALSE;
 }
 
 void pfm_icmp_ping_filter_register_parser(void *buf,
                                          kal_uint32 filter_cnt,
-                                         kal_bool uplink)
-{
+                                         kal_bool uplink) {
     ipc_filter_rules_t icmpv4_req_rules = {0};
     ipc_filter_rules_t icmpv4_reply_rules = {0};
     ipc_filter_rules_t icmpv6_req_rules = {0};
@@ -1305,8 +1625,7 @@
 
 void pfm_icmp_ping_filter_deregister_callback(void *buf,
                                              kal_uint32 filter_cnt,
-                                             kal_bool uplink)
-{
+                                             kal_bool uplink) {
     ipc_deregister_dl_filter(g_icmpv4_echo_req_filter_id);
     ipc_deregister_dl_filter(g_icmpv4_echo_reply_filter_id);
     ipc_deregister_dl_filter(g_icmpv6_echo_req_filter_id);
@@ -1327,8 +1646,7 @@
                              kal_int32 filter_id,
                              qbm_gpd *head_gpd,
                              qbm_gpd *tail_gpd,
-                             kal_uint32 length)
-{
+                             kal_uint32 length) {
     hif_trace_info(PFM_TR_DISABLE_ALL_PACKETS_FILTER_DROP, __FUNCTION__, filter_id);
     qbmt_dest_q(head_gpd, tail_gpd);
 
@@ -1337,8 +1655,7 @@
 
 void pfm_ul_disable_all_packets_filter_register_parser(void *buf,
                                          kal_uint32 filter_cnt,
-                                         kal_bool uplink)
-{
+                                         kal_bool uplink) {
     ipc_filter_rules_t wc_rules = {0};
 
     wc_rules.features = IPC_FILTER_FEATURE_WC;
@@ -1359,8 +1676,7 @@
 
 void pfm_ul_disable_all_packets_filter_deregister_callback(void *buf,
                                              kal_uint32 filter_cnt,
-                                             kal_bool uplink)
-{
+                                             kal_bool uplink) {
     ipc_deregister_ul_filter(g_ul_disable_all_packets_filter_id);
     g_ul_disable_all_packets_filter_id = PFM_INVALID_FILTER_ID;
 	
@@ -1373,8 +1689,7 @@
 kal_bool pfm_ul_icmp_ping_whitelist_filter_cust_cbk(const kal_uint8 *p_pkt,
                                          kal_int32 pkt_len,
                                          kal_int32 filter_id,
-                                         void *p_args)
-{
+                                         void *p_args) {
 	/* Do nothing */
     return KAL_FALSE;
 }
@@ -1384,8 +1699,7 @@
                              kal_int32 filter_id,
                              qbm_gpd *head_gpd,
                              qbm_gpd *tail_gpd,
-                             kal_uint32 length)
-{
+                             kal_uint32 length) {
     hif_trace_info(PFM_TR_ICMP_PING_WHITELIST_FILTER_DROP, __FUNCTION__, filter_id);
     qbmt_dest_q(head_gpd, tail_gpd);
 
@@ -1394,8 +1708,7 @@
 
 void pfm_ul_icmp_ping_whitelist_filter_register_parser(void *buf,
                                          kal_uint32 filter_cnt,
-                                         kal_bool uplink)
-{
+                                         kal_bool uplink) {
     ipc_filter_rules_t icmpv4_req_rules = {0};
     ipc_filter_rules_t icmpv4_reply_rules = {0};
     ipc_filter_rules_t icmpv6_req_rules = {0};
@@ -1525,8 +1838,7 @@
 
 void pfm_ul_icmp_ping_whitelist_filter_deregister_callback(void *buf,
                                              kal_uint32 filter_cnt,
-                                             kal_bool uplink)
-{
+                                             kal_bool uplink) {
     ipc_deregister_ul_filter(g_ul_icmpv4_echo_req_whitelist_filter_id);
     ipc_deregister_ul_filter(g_ul_icmpv4_echo_reply_whitelist_filter_id);
     ipc_deregister_ul_filter(g_ul_icmpv6_echo_req_whitelist_filter_id);
diff --git a/mcu/middleware/hif/ipcore/src/pfm_if.c b/mcu/middleware/hif/ipcore/src/pfm_if.c
index 9cffd05..20d7576 100644
--- a/mcu/middleware/hif/ipcore/src/pfm_if.c
+++ b/mcu/middleware/hif/ipcore/src/pfm_if.c
@@ -247,6 +247,10 @@
     }
 }
 
+void pfm_dispatch_ip_packet_filter_cmd(ilm_struct *ilm, kal_bool is_register) {
+    pfm_dispatch_cmd(ilm, is_register);
+}
+
 void pfm_dispatch_cmd(ilm_struct *ilm, kal_bool is_register)
 {
     pfm_filter_set_t    *fs;
@@ -754,6 +758,12 @@
     ASSERT(NULL != ilm);
 
     switch (ilm->msg_id) {
+        case MSG_ID_PFM_REGISTER_IP_PACKET_FILTER_REQ:
+            pfm_dispatch_ip_packet_filter_cmd(ilm, KAL_TRUE);
+            break;
+        case MSG_ID_PFM_DEREGISTER_IP_PACKET_FILTER_REQ:
+            pfm_dispatch_ip_packet_filter_cmd(ilm, KAL_FALSE);
+            break;
         case MSG_ID_PFM_REGISTER_FILTER_REQ:
             pfm_dispatch_cmd(ilm, KAL_TRUE);
             break;
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/MDDB_MT2735_S00_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P3.EDB b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/MDDB_MT2735_S00_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P3.EDB
deleted file mode 100644
index 3b66602..0000000
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/MDDB_MT2735_S00_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P3.EDB
+++ /dev/null
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/MDDB_MT2735_S00_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P4.EDB b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/MDDB_MT2735_S00_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P4.EDB
new file mode 100644
index 0000000..e72f355
--- /dev/null
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/MDDB_MT2735_S00_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P4.EDB
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/_MDDB_MT2735_S00_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P3.EDB.check b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/_MDDB_MT2735_S00_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P3.EDB.check
deleted file mode 100644
index b605c37..0000000
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/_MDDB_MT2735_S00_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P3.EDB.check
+++ /dev/null
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/_MDDB_MT2735_S00_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P4.EDB.check b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/_MDDB_MT2735_S00_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P4.EDB.check
new file mode 100644
index 0000000..44f6b85
--- /dev/null
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/_MDDB_MT2735_S00_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P4.EDB.check
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/mcddll.dll b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/mcddll.dll
index 5b6a838..2b20c46 100755
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/mcddll.dll
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/dhl/database/mcddll.dll
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libddm.a b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libddm.a
index 28e2324..291c30a 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libddm.a
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libddm.a
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libl4.a b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libl4.a
index 76d73db..a58e647 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libl4.a
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libl4.a
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libl5.a b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libl5.a
index 487ed46..916c54d 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libl5.a
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libl5.a
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libmd_idc.a b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libmd_idc.a
index cf0aeb7..8a37129 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libmd_idc.a
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libmd_idc.a
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libmml1.a b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libmml1.a
index 4f43d40..645b354 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libmml1.a
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libmml1.a
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libmml1_rf.a b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libmml1_rf.a
index 67a4f7f..e1bd68e 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libmml1_rf.a
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libmml1_rf.a
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libncccidev.a b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libncccidev.a
index db38be0..cc599fb 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libncccidev.a
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libncccidev.a
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libnl1.a b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libnl1.a
index e361473..3e21894 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libnl1.a
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libnl1.a
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libnucleus_tcpip_v3.a b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libnucleus_tcpip_v3.a
index dbfa8e3..5dc25df 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libnucleus_tcpip_v3.a
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libnucleus_tcpip_v3.a
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libtfwk_drv.a b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libtfwk_drv.a
index 8854e9b..ac6d9a7 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libtfwk_drv.a
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libtfwk_drv.a
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libupcm.a b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libupcm.a
index 8427ef2..14f513e 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libupcm.a
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/lib/libupcm.a
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/modem/mipc/include/mipc_msg_tlv_api.h b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/modem/mipc/include/mipc_msg_tlv_api.h
index 489b93e..c41cf55 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/modem/mipc/include/mipc_msg_tlv_api.h
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/modem/mipc/include/mipc_msg_tlv_api.h
@@ -2536,6 +2536,125 @@
     return mipc_msg_add_idx(msg_ptr, array, index, len, (const void *)value);
 }
 
+static inline mipc_msg_api_result_enum mipc_data_set_ip_tuple_packet_filter_req_add_global_set(mipc_msg_t *msg_ptr, uint8_t value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint8(msg_ptr, MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_GLOBAL_SET, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline mipc_msg_api_result_enum mipc_data_set_ip_tuple_packet_filter_req_add_cid(mipc_msg_t *msg_ptr, uint8_t value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint8(msg_ptr, MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_CID, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline mipc_msg_api_result_enum mipc_data_set_ip_tuple_packet_filter_req_add_ip_type(mipc_msg_t *msg_ptr, enum mipc_packet_filter_ip_type_const_enum value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint8(msg_ptr, MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_IP_TYPE, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline mipc_msg_api_result_enum mipc_data_set_ip_tuple_packet_filter_req_add_protocol(mipc_msg_t *msg_ptr, enum mipc_packet_filter_protocol_type_const_enum value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint8(msg_ptr, MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_PROTOCOL, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline mipc_msg_api_result_enum mipc_data_set_ip_tuple_packet_filter_req_add_ip_src(mipc_msg_t *msg_ptr, uint16_t len, const void  *value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    if (!value) return MIPC_MSG_API_RESULT_FAIL;
+    if (len >  16) return MIPC_MSG_API_RESULT_FAIL;
+    return mipc_msg_add_tlv(msg_ptr, MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_IP_SRC, len, (const void *)value);
+}
+
+static inline mipc_msg_api_result_enum mipc_data_set_ip_tuple_packet_filter_req_add_ip_dst(mipc_msg_t *msg_ptr, uint16_t len, const void  *value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    if (!value) return MIPC_MSG_API_RESULT_FAIL;
+    if (len >  16) return MIPC_MSG_API_RESULT_FAIL;
+    return mipc_msg_add_tlv(msg_ptr, MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_IP_DST, len, (const void *)value);
+}
+
+static inline mipc_msg_api_result_enum mipc_data_set_ip_tuple_packet_filter_req_add_src_port(mipc_msg_t *msg_ptr, uint16_t value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint16(msg_ptr, MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_SRC_PORT, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline mipc_msg_api_result_enum mipc_data_set_ip_tuple_packet_filter_req_add_dst_port(mipc_msg_t *msg_ptr, uint16_t value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint16(msg_ptr, MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_DST_PORT, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline mipc_msg_api_result_enum mipc_data_del_ip_tuple_packet_filter_req_add_global_set(mipc_msg_t *msg_ptr, uint8_t value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint8(msg_ptr, MIPC_DATA_DEL_IP_TUPLE_PACKET_FILTER_REQ_T_GLOBAL_SET, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline mipc_msg_api_result_enum mipc_data_del_ip_tuple_packet_filter_req_add_cid(mipc_msg_t *msg_ptr, uint8_t value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint8(msg_ptr, MIPC_DATA_DEL_IP_TUPLE_PACKET_FILTER_REQ_T_CID, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline mipc_msg_api_result_enum mipc_data_set_ip_tuple_packet_filter_mode_req_add_global_set(mipc_msg_t *msg_ptr, uint8_t value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint8(msg_ptr, MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_MODE_REQ_T_GLOBAL_SET, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline mipc_msg_api_result_enum mipc_data_set_ip_tuple_packet_filter_mode_req_add_cid(mipc_msg_t *msg_ptr, uint8_t value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint8(msg_ptr, MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_MODE_REQ_T_CID, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline mipc_msg_api_result_enum mipc_data_set_ip_tuple_packet_filter_mode_req_add_operation(mipc_msg_t *msg_ptr, uint8_t value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint8(msg_ptr, MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_MODE_REQ_T_OPERATION, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline mipc_msg_api_result_enum mipc_data_get_ip_tuple_packet_filter_mode_req_add_global_set(mipc_msg_t *msg_ptr, uint8_t value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint8(msg_ptr, MIPC_DATA_GET_IP_TUPLE_PACKET_FILTER_MODE_REQ_T_GLOBAL_SET, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline mipc_msg_api_result_enum mipc_data_get_ip_tuple_packet_filter_mode_req_add_cid(mipc_msg_t *msg_ptr, uint8_t value)
+{
+    if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
+    mipc_msg_add_tlv_uint8(msg_ptr, MIPC_DATA_GET_IP_TUPLE_PACKET_FILTER_MODE_REQ_T_CID, value);
+    return MIPC_MSG_API_RESULT_SUCCESS;
+}
+
+static inline uint8_t mipc_data_get_ip_tuple_packet_filter_mode_cnf_get_filter_count(mipc_msg_t *msg_ptr, uint8_t def_val)
+{
+    if (!msg_ptr) return def_val;
+    return (uint8_t)mipc_msg_get_val_uint8(msg_ptr, MIPC_DATA_GET_IP_TUPLE_PACKET_FILTER_MODE_CNF_T_FILTER_COUNT, def_val);
+}
+
+static inline uint8_t mipc_data_get_ip_tuple_packet_filter_mode_cnf_get_filter_mode(mipc_msg_t *msg_ptr, uint8_t def_val)
+{
+    if (!msg_ptr) return def_val;
+    return (uint8_t)mipc_msg_get_val_uint8(msg_ptr, MIPC_DATA_GET_IP_TUPLE_PACKET_FILTER_MODE_CNF_T_FILTER_MODE, def_val);
+}
+
 static inline mipc_msg_api_result_enum mipc_internal_open_req_add_version(mipc_msg_t *msg_ptr, uint32_t value)
 {
     if (!msg_ptr) return MIPC_MSG_API_RESULT_FAIL;
@@ -8659,30 +8778,6 @@
     return (uint16_t)mipc_msg_get_val_uint16(msg_ptr, MIPC_NW_ECELL_IND_T_FAIL_CAUSE, def_val);
 }
 
-static inline uint8_t mipc_nw_nruw_info_ind_get_display_5guw(mipc_msg_t *msg_ptr, uint8_t def_val)
-{
-    if (!msg_ptr) return def_val;
-    return (uint8_t)mipc_msg_get_val_uint8(msg_ptr, MIPC_NW_NRUW_INFO_IND_T_DISPLAY_5GUW, def_val);
-}
-
-static inline uint8_t mipc_nw_nruw_info_ind_get_on_n77_band(mipc_msg_t *msg_ptr, uint8_t def_val)
-{
-    if (!msg_ptr) return def_val;
-    return (uint8_t)mipc_msg_get_val_uint8(msg_ptr, MIPC_NW_NRUW_INFO_IND_T_ON_N77_BAND, def_val);
-}
-
-static inline uint8_t mipc_nw_nruw_info_ind_get_on_fr2_band(mipc_msg_t *msg_ptr, uint8_t def_val)
-{
-    if (!msg_ptr) return def_val;
-    return (uint8_t)mipc_msg_get_val_uint8(msg_ptr, MIPC_NW_NRUW_INFO_IND_T_ON_FR2_BAND, def_val);
-}
-
-static inline uint8_t mipc_nw_nruw_info_ind_get_5guw_allowed(mipc_msg_t *msg_ptr, uint8_t def_val)
-{
-    if (!msg_ptr) return def_val;
-    return (uint8_t)mipc_msg_get_val_uint8(msg_ptr, MIPC_NW_NRUW_INFO_IND_T_5GUW_ALLOWED, def_val);
-}
-
 static inline uint32_t mipc_nw_etxpwr_ind_get_act(mipc_msg_t *msg_ptr, uint32_t def_val)
 {
     if (!msg_ptr) return def_val;
@@ -8707,6 +8802,30 @@
     return (int16_t)mipc_msg_get_val_int16(msg_ptr, MIPC_NW_ETXPWRSTUS_IND_T_SAR_SCENARIO_INDEX, def_val);
 }
 
+static inline uint8_t mipc_nw_nruw_info_ind_get_display_5guw(mipc_msg_t *msg_ptr, uint8_t def_val)
+{
+    if (!msg_ptr) return def_val;
+    return (uint8_t)mipc_msg_get_val_uint8(msg_ptr, MIPC_NW_NRUW_INFO_IND_T_DISPLAY_5GUW, def_val);
+}
+
+static inline uint8_t mipc_nw_nruw_info_ind_get_on_n77_band(mipc_msg_t *msg_ptr, uint8_t def_val)
+{
+    if (!msg_ptr) return def_val;
+    return (uint8_t)mipc_msg_get_val_uint8(msg_ptr, MIPC_NW_NRUW_INFO_IND_T_ON_N77_BAND, def_val);
+}
+
+static inline uint8_t mipc_nw_nruw_info_ind_get_on_fr2_band(mipc_msg_t *msg_ptr, uint8_t def_val)
+{
+    if (!msg_ptr) return def_val;
+    return (uint8_t)mipc_msg_get_val_uint8(msg_ptr, MIPC_NW_NRUW_INFO_IND_T_ON_FR2_BAND, def_val);
+}
+
+static inline uint8_t mipc_nw_nruw_info_ind_get_5guw_allowed(mipc_msg_t *msg_ptr, uint8_t def_val)
+{
+    if (!msg_ptr) return def_val;
+    return (uint8_t)mipc_msg_get_val_uint8(msg_ptr, MIPC_NW_NRUW_INFO_IND_T_5GUW_ALLOWED, def_val);
+}
+
 static inline mipc_sim_state_const_enum mipc_sim_state_ind_get_state(mipc_msg_t *msg_ptr, mipc_sim_state_const_enum def_val)
 {
     if (!msg_ptr) return def_val;
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/modem/mipc/include/mipc_msg_tlv_const.h b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/modem/mipc/include/mipc_msg_tlv_const.h
index a2c39dc..4ae3d9b 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/modem/mipc/include/mipc_msg_tlv_const.h
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/modem/mipc/include/mipc_msg_tlv_const.h
@@ -312,6 +312,22 @@
     MIPC_DATA_SET_PCO_REQ                                   = MIPC_DATA_REQ_BEGIN + 59,
     /* response of SET_PCO_REQ */
     MIPC_DATA_SET_PCO_CNF                                   = MIPC_DATA_REQ_BEGIN + 60,
+    /* set packet filter with IP tuple white list (not matched packets will be dropped), filter will be stored in modem, and it is needed MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_MODE_REQ or enter sleep mode to trigger it activated, when Host leave sleep mode, flter will be deactivated automatically */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ                = MIPC_DATA_REQ_BEGIN + 71,
+    /* response of SET_IP_TUPLE_PACKET_FILTER_REQ */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_CNF                = MIPC_DATA_REQ_BEGIN + 72,
+    /* delete packet filter which is set by SET_IP_TUPLE_PACKET_FILTER_REQ */
+    MIPC_DATA_DEL_IP_TUPLE_PACKET_FILTER_REQ                = MIPC_DATA_REQ_BEGIN + 73,
+    /* response of DEL_IP_TUPLE_PACKET_FILTER_REQ */
+    MIPC_DATA_DEL_IP_TUPLE_PACKET_FILTER_CNF                = MIPC_DATA_REQ_BEGIN + 74,
+    /* trigger the packet filter which is set by SET_IP_TUPLE_PACKET_FILTER_REQ activated or deactivated */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_MODE_REQ           = MIPC_DATA_REQ_BEGIN + 75,
+    /* response of SET_IP_TUPLE_PACKET_FILTER_MODE_REQ */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_MODE_CNF           = MIPC_DATA_REQ_BEGIN + 76,
+    /* It is used to get current filter count and mode */
+    MIPC_DATA_GET_IP_TUPLE_PACKET_FILTER_MODE_REQ           = MIPC_DATA_REQ_BEGIN + 77,
+    /* response of SET_IP_TUPLE_PACKET_FILTER_MODE_REQ */
+    MIPC_DATA_GET_IP_TUPLE_PACKET_FILTER_MODE_CNF           = MIPC_DATA_REQ_BEGIN + 78,
     MIPC_DATA_REQ_END                                       = MIPC_DATA_REQ_BEGIN + 0xFF,
 
     MIPC_INTERNAL_REQ_BEGIN                                 = MIPC_REQ_BEGIN + 0x300,
@@ -1074,6 +1090,8 @@
     MIPC_DATA_KEEPALIVE_STATUS_IND                          = MIPC_DATA_IND_BEGIN + 16,
     /* the commond is to indicate which apn timer has been reset */
     MIPC_DATA_RETRY_TIMER_IND                               = MIPC_DATA_IND_BEGIN + 21,
+    /* the commond is to indicate a white list packet have received, the filter is set by MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ */
+    MIPC_DATA_IP_PACKET_RECV_IND                            = MIPC_DATA_IND_BEGIN + 27,
     MIPC_DATA_IND_END                                       = MIPC_DATA_IND_BEGIN + 0xFF,
 
     MIPC_INTERNAL_IND_BEGIN                                 = MIPC_IND_BEGIN + 0x300,
@@ -1118,12 +1136,12 @@
     MIPC_NW_PSBEARER_IND                                    = MIPC_NW_IND_BEGIN + 15,
     /* Preferred provider list changed by network flow. */
     MIPC_NW_ECELL_IND                                       = MIPC_NW_IND_BEGIN + 16,
-    /* handle E5GUW URC */
-    MIPC_NW_NRUW_INFO_IND                                   = MIPC_NW_IND_BEGIN + 37,
     /* onNotifyTXPower URC. */
     MIPC_NW_ETXPWR_IND                                      = MIPC_NW_IND_BEGIN + 33,
     /* handleTXPowerStatus URC. */
     MIPC_NW_ETXPWRSTUS_IND                                  = MIPC_NW_IND_BEGIN + 34,
+    /* handle E5GUW URC */
+    MIPC_NW_NRUW_INFO_IND                                   = MIPC_NW_IND_BEGIN + 37,
     MIPC_NW_IND_END                                         = MIPC_NW_IND_BEGIN + 0xFF,
 
     MIPC_SIM_IND_BEGIN                                      = MIPC_IND_BEGIN + 0x500,
@@ -3155,6 +3173,100 @@
     /* no proprietary TLV */
 };
 
+    /* MIPC_MSG.DATA_SET_IP_TUPLE_PACKET_FILTER_REQ */
+enum mipc_data_set_ip_tuple_packet_filter_req_tlv_enum {
+    mipc_data_set_ip_tuple_packet_filter_req_tlv_NONE = 0,
+    /* indicate this is for all CID or not, if it is set and it is 1, means this filter is for all cid, ID TLV will be not used, if filter is for specific cid, please do not set this field */
+    /* type = uint8_t */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_GLOBAL_SET   = 0x100,
+    /* data call id (apply to which data call) */
+    /* type = uint8_t */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_CID          = 0x101,
+    /* refer to PACKET_FILTER_IP_TYPE, 0 means IPv4, 1 means IPv6 */
+    /* type = uint8_t, refer to PACKET_FILTER_IP_TYPE */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_IP_TYPE      = 0x102,
+    /* refer to PACKET_FILTER_PROTOCOL_TYPE, 0 means TCP, 1 means UDP */
+    /* type = uint8_t, refer to PACKET_FILTER_PROTOCOL_TYPE */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_PROTOCOL     = 0x103,
+    /* source ip */
+    /* type = byte_array */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_IP_SRC       = 0x104,
+    /* dest ip */
+    /* type = byte_array */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_IP_DST       = 0x105,
+    /* source port */
+    /* type = uint16_t */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_SRC_PORT     = 0x106,
+    /* dest port */
+    /* type = uint16_t */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_REQ_T_DST_PORT     = 0x107,
+};
+
+    /* MIPC_MSG.DATA_SET_IP_TUPLE_PACKET_FILTER_CNF */
+enum mipc_data_set_ip_tuple_packet_filter_cnf_tlv_enum {
+    mipc_data_set_ip_tuple_packet_filter_cnf_tlv_NONE = 0,
+    /* no proprietary TLV */
+};
+
+    /* MIPC_MSG.DATA_DEL_IP_TUPLE_PACKET_FILTER_REQ */
+enum mipc_data_del_ip_tuple_packet_filter_req_tlv_enum {
+    mipc_data_del_ip_tuple_packet_filter_req_tlv_NONE = 0,
+    /* indicate this is for all CID or not, if it is set and it is 1, means all cid flter will be removed, ID TLV will be not used, if filter is for specific cid, please do not set this field. Delete filter will not disable the activated filter, please deactivate the filter before delete it */
+    /* type = uint8_t */
+    MIPC_DATA_DEL_IP_TUPLE_PACKET_FILTER_REQ_T_GLOBAL_SET   = 0x100,
+    /* indicate the CID which filter will be removed */
+    /* type = uint8_t */
+    MIPC_DATA_DEL_IP_TUPLE_PACKET_FILTER_REQ_T_CID          = 0x101,
+};
+
+    /* MIPC_MSG.DATA_DEL_IP_TUPLE_PACKET_FILTER_CNF */
+enum mipc_data_del_ip_tuple_packet_filter_cnf_tlv_enum {
+    mipc_data_del_ip_tuple_packet_filter_cnf_tlv_NONE = 0,
+    /* no proprietary TLV */
+};
+
+    /* MIPC_MSG.DATA_SET_IP_TUPLE_PACKET_FILTER_MODE_REQ */
+enum mipc_data_set_ip_tuple_packet_filter_mode_req_tlv_enum {
+    mipc_data_set_ip_tuple_packet_filter_mode_req_tlv_NONE = 0,
+    /* indicate this is for all CID or not, if it is set and it is 1, means all flter will be activated or deactivated, ID TLV will be not used, if filter is for specific cid, please do not set this field */
+    /* type = uint8_t */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_MODE_REQ_T_GLOBAL_SET = 0x100,
+    /* indicate the CID which filter will be activated, currently it is not supported to deactivate filter by cid */
+    /* type = uint8_t */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_MODE_REQ_T_CID     = 0x101,
+    /* indicate the filter to be activated or not, 1 means activated, 0 means deactivated */
+    /* type = uint8_t */
+    MIPC_DATA_SET_IP_TUPLE_PACKET_FILTER_MODE_REQ_T_OPERATION = 0x102,
+};
+
+    /* MIPC_MSG.DATA_SET_IP_TUPLE_PACKET_FILTER_MODE_CNF */
+enum mipc_data_set_ip_tuple_packet_filter_mode_cnf_tlv_enum {
+    mipc_data_set_ip_tuple_packet_filter_mode_cnf_tlv_NONE = 0,
+    /* no proprietary TLV */
+};
+
+    /* MIPC_MSG.DATA_GET_IP_TUPLE_PACKET_FILTER_MODE_REQ */
+enum mipc_data_get_ip_tuple_packet_filter_mode_req_tlv_enum {
+    mipc_data_get_ip_tuple_packet_filter_mode_req_tlv_NONE = 0,
+    /* If this field is 1, It is to get all global set filter count and mode */
+    /* type = uint8_t */
+    MIPC_DATA_GET_IP_TUPLE_PACKET_FILTER_MODE_REQ_T_GLOBAL_SET = 0x100,
+    /* It is used to get all filter count and mode for cid */
+    /* type = uint8_t */
+    MIPC_DATA_GET_IP_TUPLE_PACKET_FILTER_MODE_REQ_T_CID     = 0x101,
+};
+
+    /* MIPC_MSG.DATA_GET_IP_TUPLE_PACKET_FILTER_MODE_CNF */
+enum mipc_data_get_ip_tuple_packet_filter_mode_cnf_tlv_enum {
+    mipc_data_get_ip_tuple_packet_filter_mode_cnf_tlv_NONE = 0,
+    /* The ffilter count */
+    /* type = uint8_t */
+    MIPC_DATA_GET_IP_TUPLE_PACKET_FILTER_MODE_CNF_T_FILTER_COUNT = 0x100,
+    /* Filter Mode,1 means activated, 0 means deactivated */
+    /* type = uint8_t */
+    MIPC_DATA_GET_IP_TUPLE_PACKET_FILTER_MODE_CNF_T_FILTER_MODE = 0x101,
+};
+
     /* MIPC_MSG.INTERNAL_OPEN_REQ */
 enum mipc_internal_open_req_tlv_enum {
     mipc_internal_open_req_tlv_NONE = 0,
@@ -7585,6 +7697,11 @@
     MIPC_DATA_RETRY_TIMER_IND_T_APN_NAME                    = 0x100,
 };
 
+    /* MIPC_MSG.DATA_IP_PACKET_RECV_IND */
+enum mipc_data_ip_packet_recv_ind_tlv_enum {
+    mipc_data_ip_packet_recv_ind_tlv_NONE = 0,
+};
+
     /* MIPC_MSG.INTERNAL_TEST_IND */
 enum mipc_internal_test_ind_tlv_enum {
     mipc_internal_test_ind_tlv_NONE = 0,
@@ -7935,23 +8052,6 @@
     MIPC_NW_ECELL_IND_T_FAIL_CAUSE                          = 0x10C,
 };
 
-    /* MIPC_MSG.NW_NRUW_INFO_IND */
-enum mipc_nw_nruw_info_ind_tlv_enum {
-    mipc_nw_nruw_info_ind_tlv_NONE = 0,
-    /* 0: don't display 5G UW, 1: display 5G UW. */
-    /* type = uint8_t */
-    MIPC_NW_NRUW_INFO_IND_T_DISPLAY_5GUW                    = 0x100,
-    /* 0: not on n77 band, 1: on n77 band */
-    /* type = uint8_t */
-    MIPC_NW_NRUW_INFO_IND_T_ON_N77_BAND                     = 0x101,
-    /* 0: not on fr2 band, 1: on fr2 band */
-    /* type = uint8_t */
-    MIPC_NW_NRUW_INFO_IND_T_ON_FR2_BAND                     = 0x102,
-    /* 0: not allowed, 1: allowed */
-    /* type = uint8_t */
-    MIPC_NW_NRUW_INFO_IND_T_5GUW_ALLOWED                    = 0x103,
-};
-
     /* MIPC_MSG.NW_ETXPWR_IND */
 enum mipc_nw_etxpwr_ind_tlv_enum {
     mipc_nw_etxpwr_ind_tlv_NONE = 0,
@@ -7974,6 +8074,23 @@
     MIPC_NW_ETXPWRSTUS_IND_T_SAR_SCENARIO_INDEX             = 0x101,
 };
 
+    /* MIPC_MSG.NW_NRUW_INFO_IND */
+enum mipc_nw_nruw_info_ind_tlv_enum {
+    mipc_nw_nruw_info_ind_tlv_NONE = 0,
+    /* 0: don't display 5G UW, 1: display 5G UW. */
+    /* type = uint8_t */
+    MIPC_NW_NRUW_INFO_IND_T_DISPLAY_5GUW                    = 0x100,
+    /* 0: not on n77 band, 1: on n77 band */
+    /* type = uint8_t */
+    MIPC_NW_NRUW_INFO_IND_T_ON_N77_BAND                     = 0x101,
+    /* 0: not on fr2 band, 1: on fr2 band */
+    /* type = uint8_t */
+    MIPC_NW_NRUW_INFO_IND_T_ON_FR2_BAND                     = 0x102,
+    /* 0: not allowed, 1: allowed */
+    /* type = uint8_t */
+    MIPC_NW_NRUW_INFO_IND_T_5GUW_ALLOWED                    = 0x103,
+};
+
     /* MIPC_MSG.SIM_STATE_IND */
 enum mipc_sim_state_ind_tlv_enum {
     mipc_sim_state_ind_tlv_NONE = 0,
@@ -9052,6 +9169,27 @@
 };
 typedef enum mipc_apn_enabled_type_const_enum mipc_apn_enabled_type_const_enum;
 
+enum mipc_packet_filter_ip_type_const_enum {
+    mipc_packet_filter_ip_type_const_NONE = 0,
+    /* PACKET_FILTER_IP_TYPE */
+    MIPC_PACKET_FILTER_IP_TYPE_IPV4                         = 0,
+    MIPC_PACKET_FILTER_IP_TYPE_IPV6                         = 1,
+    MIPC_PACKET_FILTER_IP_TYPE_IP_ALL                       = 2,
+    MIPC_PACKET_FILTER_IP_TYPE_MAX                          = 0x7F,
+};
+typedef enum mipc_packet_filter_ip_type_const_enum mipc_packet_filter_ip_type_const_enum;
+
+enum mipc_packet_filter_protocol_type_const_enum {
+    mipc_packet_filter_protocol_type_const_NONE = 0,
+    /* PACKET_FILTER_PROTOCOL_TYPE */
+    MIPC_PACKET_FILTER_PROTOCOL_TYPE_TCP                    = 0,
+    MIPC_PACKET_FILTER_PROTOCOL_TYPE_UDP                    = 1,
+    MIPC_PACKET_FILTER_PROTOCOL_TYPE_ICMP                   = 2,
+    MIPC_PACKET_FILTER_PROTOCOL_TYPE_PROTOCOL_ALL           = 3,
+    MIPC_PACKET_FILTER_PROTOCOL_TYPE_MAX                    = 0x7F,
+};
+typedef enum mipc_packet_filter_protocol_type_const_enum mipc_packet_filter_protocol_type_const_enum;
+
 enum mipc_eif_address_type_const_enum {
     mipc_eif_address_type_const_NONE = 0,
     /* EIF_ADDRESS_TYPE */
@@ -12482,6 +12620,7 @@
 #define MIPC_IMS_MAX_ERROR_MESSAGE_LEN                     (256) /*  */
 #define MIPC_MAX_IMS_EVENT_PACKAGE_DATA_LEN                (64000) /*  */
 #define MIPC_MAX_CALL_NUM                                  (7) /* Maximum call count */
+#define MIPC_MAX_IP_TUPLE_FILTER_COUNT                     (16) /* Maximum pco struct count of pco list */
 #define MIPC_MAX_PCO_COUNT                                 (16) /* Maximum pco struct count of pco list */
 #define MIPC_MAX_SBP_STR_LEN                               (256) /* Maximum length of sbp string */
 #define MIPC_MAX_PLMN_ID_LEN                               (7) /* Maximum length of plmn id(mcc + mnc) */
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/modem/mipc/mipc.release.tar.gz b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/modem/mipc/mipc.release.tar.gz
index 3e86174..ad0fc23 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/modem/mipc/mipc.release.tar.gz
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/TARGET/modem/mipc/mipc.release.tar.gz
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/dsp_rel/CHIP10992/DEFAULT_ASIC_TELEMATICS/final_bin/DbgInfo_DSP_CHIP10992_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P3_2024_08_23_16_57 b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/dsp_rel/CHIP10992/DEFAULT_ASIC_TELEMATICS/final_bin/DbgInfo_DSP_CHIP10992_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P4_2024_08_26_17_41
similarity index 85%
rename from mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/dsp_rel/CHIP10992/DEFAULT_ASIC_TELEMATICS/final_bin/DbgInfo_DSP_CHIP10992_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P3_2024_08_23_16_57
rename to mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/dsp_rel/CHIP10992/DEFAULT_ASIC_TELEMATICS/final_bin/DbgInfo_DSP_CHIP10992_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P4_2024_08_26_17_41
index 6f891ee..ea9c470 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/dsp_rel/CHIP10992/DEFAULT_ASIC_TELEMATICS/final_bin/DbgInfo_DSP_CHIP10992_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P3_2024_08_23_16_57
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/dsp_rel/CHIP10992/DEFAULT_ASIC_TELEMATICS/final_bin/DbgInfo_DSP_CHIP10992_MOLY_NR15_R3_MD700_IVT_MP1MR3_MP_V1_6_P4_2024_08_26_17_41
Binary files differ
diff --git a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/dsp_rel/CHIP10992/DEFAULT_ASIC_TELEMATICS/final_bin/dsp.bin b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/dsp_rel/CHIP10992/DEFAULT_ASIC_TELEMATICS/final_bin/dsp.bin
index 814aac5..4b0cc83 100644
--- a/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/dsp_rel/CHIP10992/DEFAULT_ASIC_TELEMATICS/final_bin/dsp.bin
+++ b/mcu/mtk_rel/MOBILETEK2735_IVT_T800_V1/NLWG_WIDE_TEMP_CUSTOM/dsp_rel/CHIP10992/DEFAULT_ASIC_TELEMATICS/final_bin/dsp.bin
Binary files differ