@@ -1934,7 +1934,7 @@ int session_npf_pack_restore(struct npf_pack_dp_session *pds,
19341934 s -> se_flags = SESSION_INSERTED ;
19351935
19361936 rc = session_npf_pack_stats_restore (s , stats );
1937- if (rc )
1937+ if (rc )
19381938 goto error ;
19391939
19401940 * session = s ;
@@ -2024,3 +2024,79 @@ uint64_t dp_session_unique_id(const struct session *session)
20242024 return 0 ;
20252025 return session -> se_id ;
20262026}
2027+
2028+ /* walk function for query features */
2029+ static int se_feature_query (struct session * s , struct session_feature * sf ,
2030+ void * data )
2031+ {
2032+ struct dp_session_info * info = data ;
2033+
2034+ if (sf -> sf_ops && sf -> sf_ops -> query )
2035+ sf -> sf_ops -> query (info , s , sf );
2036+
2037+ return 0 ;
2038+ }
2039+
2040+ int dp_session_query (struct session * s , enum dp_session_attr query ,
2041+ struct dp_session_info * info )
2042+ {
2043+ if (!s )
2044+ return -1 ;
2045+
2046+ info -> se_id = s -> se_id ;
2047+
2048+ if (query & SESSION_ATTR_PROTOCOL ) {
2049+ info -> se_protocol = s -> se_protocol ;
2050+ info -> se_protocol_state = s -> se_protocol_state ;
2051+ }
2052+ if (query & SESSION_ATTR_BYTES_IN )
2053+ info -> se_bytes_in = rte_atomic64_read (& s -> se_bytes_in );
2054+ if (query & SESSION_ATTR_PKTS_IN )
2055+ info -> se_pkts_in = rte_atomic64_read (& s -> se_pkts_in );
2056+ if (query & SESSION_ATTR_CREATE_TIME )
2057+ info -> se_create_time = s -> se_create_time ;
2058+ if (query & SESSION_ATTR_BYTES_OUT )
2059+ info -> se_bytes_out = rte_atomic64_read (& s -> se_bytes_out );
2060+ if (query & SESSION_ATTR_PKTS_OUT )
2061+ info -> se_pkts_out = rte_atomic64_read (& s -> se_pkts_out );
2062+
2063+ if (query & SESSION_ATTR_SENTRY ) {
2064+ const void * saddr ;
2065+ const void * daddr ;
2066+ uint32_t if_index ;
2067+ uint16_t sid ;
2068+ uint16_t did ;
2069+
2070+ struct sentry * sen = rcu_dereference (s -> se_sen );
2071+ if (sen ) {
2072+ session_sentry_extract (sen , & if_index , & info -> se_af ,
2073+ & saddr , & sid , & daddr , & did );
2074+
2075+ if (query & SESSION_ATTR_L4_SRC_PORT )
2076+ info -> se_src_port = sid ;
2077+ if (query & SESSION_ATTR_IPV4_SRC_ADDR )
2078+ info -> se_src_addr = * (uint32_t * )saddr ;
2079+ if (query & SESSION_ATTR_L4_DST_PORT )
2080+ info -> se_dst_port = did ;
2081+ if (query & SESSION_ATTR_IPV4_DST_ADDR )
2082+ info -> se_dst_addr = * (uint32_t * )daddr ;
2083+ if (query & SESSION_ATTR_IF_NAME )
2084+ info -> se_ifname =
2085+ ifnet_indextoname_safe (if_index );
2086+ }
2087+ }
2088+
2089+ if (query & SESSION_ATTR_DPI ) {
2090+ info -> query = query ;
2091+
2092+ /* set default value in case no info found */
2093+ info -> se_app_name = NULL ;
2094+ info -> se_app_proto = NULL ;
2095+ info -> se_app_type = NULL ;
2096+
2097+ session_feature_walk_session (s , SESSION_FEATURE_ALL ,
2098+ se_feature_query , info );
2099+ }
2100+
2101+ return 0 ;
2102+ }
0 commit comments