Duplicated packet filter supports IPv4-Based TCP / UDP packet (IPv6 is not supported, because IPv6 does not have an IPid and cannot distinguish between retransmissions and duplicates)
This commit is contained in:
@@ -411,7 +411,7 @@ static int tcp_overload_bypass(struct session_manager *mgr, const struct tuple6
|
||||
{
|
||||
if (key->ip_proto == IPPROTO_TCP && mgr->stat.nr_tcp_sess_used >= mgr->opts.max_tcp_session_num)
|
||||
{
|
||||
mgr->stat.nr_tcp_pkts_bypass_no_space++;
|
||||
mgr->stat.nr_tcp_pkts_nospace_bypass++;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@@ -420,7 +420,7 @@ static int udp_overload_bypass(struct session_manager *mgr, const struct tuple6
|
||||
{
|
||||
if (key->ip_proto == IPPROTO_UDP && mgr->stat.nr_udp_sess_used >= mgr->opts.max_udp_session_num)
|
||||
{
|
||||
mgr->stat.nr_udp_pkts_bypass_no_space++;
|
||||
mgr->stat.nr_udp_pkts_nospace_bypass++;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@@ -429,7 +429,7 @@ static int evicted_session_bypass(struct session_manager *mgr, const struct tupl
|
||||
{
|
||||
if (mgr->opts.evicted_session_filter_enable && evicted_session_filter_lookup(mgr->evicte_sess_filter, key, now))
|
||||
{
|
||||
mgr->stat.nr_udp_pkts_bypass_hit_evc++;
|
||||
mgr->stat.nr_udp_pkts_evctd_bypass++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -450,7 +450,18 @@ static int duplicated_packet_bypass(struct session_manager *mgr, struct session
|
||||
{
|
||||
session_inc_stat(sess, dir, STAT_DUP_PKTS_BYPASS, 1);
|
||||
session_inc_stat(sess, dir, STAT_DUP_BYTES_BYPASS, packet_get_len(pkt));
|
||||
mgr->stat.nr_tcp_pkts_bypass_hit_dup++;
|
||||
switch (session_get_type(sess))
|
||||
{
|
||||
case SESSION_TYPE_TCP:
|
||||
mgr->stat.nr_tcp_pkts_duped_bypass++;
|
||||
break;
|
||||
case SESSION_TYPE_UDP:
|
||||
mgr->stat.nr_udp_pkts_duped_bypass++;
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
session_set_dup_traffic(sess);
|
||||
return 1;
|
||||
}
|
||||
@@ -555,7 +566,7 @@ static struct session *session_manager_new_tcp_session(struct session_manager *m
|
||||
uint8_t flags = tcp_hdr_get_flags(hdr);
|
||||
if (!(flags & TH_SYN))
|
||||
{
|
||||
mgr->stat.nr_tcp_pkts_bypass_miss_sess++;
|
||||
mgr->stat.nr_tcp_pkts_nosess_bypass++;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -935,13 +946,13 @@ int session_manager_update_session(struct session_manager *mgr, struct session *
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
if (duplicated_packet_bypass(mgr, sess, pkt, &key, now))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
switch (session_get_type(sess))
|
||||
{
|
||||
case SESSION_TYPE_TCP:
|
||||
if (duplicated_packet_bypass(mgr, sess, pkt, &key, now))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return session_manager_update_tcp_session(mgr, sess, pkt, &key, now);
|
||||
case SESSION_TYPE_UDP:
|
||||
return session_manager_update_udp_session(mgr, sess, pkt, &key, now);
|
||||
|
||||
Reference in New Issue
Block a user