Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

core: tcp - add alias for cinfo dst IP #2888

Merged
merged 1 commit into from
Oct 21, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 16 additions & 2 deletions src/core/tcp_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1478,7 +1478,12 @@ inline static struct tcp_connection* tcpconn_add(struct tcp_connection *c)
* the second alias is for (peer_ip, peer_port, local_addr, 0) -- for
* finding any conenction to peer_ip, peer_port from local_addr
* the third alias is for (peer_ip, peer_port, local_addr, local_port)
* -- for finding if a fully specified connection exists */
* -- for finding if a fully specified connection exists
* the fourth alias is for (peer_ip, peer_port, cinfo_addr, 0) -- for
* finding any connection to peer_ip, peer_port from address stored into cinfo (e.g. when proxy protocol is used)
* the fifth alias is for (peer_ip, peer_port, cinfo_addr, cinfo_port)
* -- for finding if a fully specified connection exists using address
* and port stored into cinfo*/
_tcpconn_add_alias_unsafe(c, c->rcv.src_port, &zero_ip, 0,
new_conn_alias_flags);
if (likely(c->rcv.dst_ip.af && ! ip_addr_any(&c->rcv.dst_ip))){
Expand All @@ -1487,6 +1492,14 @@ inline static struct tcp_connection* tcpconn_add(struct tcp_connection *c)
_tcpconn_add_alias_unsafe(c, c->rcv.src_port, &c->rcv.dst_ip,
c->rcv.dst_port, new_conn_alias_flags);
}
if (unlikely(c->cinfo.dst_ip.af && ! ip_addr_any(&c->cinfo.dst_ip) &&
! ip_addr_cmp(&c->rcv.dst_ip, &c->cinfo.dst_ip))){
_tcpconn_add_alias_unsafe(c, c->rcv.src_port, &c->cinfo.dst_ip, 0,
new_conn_alias_flags);
_tcpconn_add_alias_unsafe(c, c->rcv.src_port, &c->cinfo.dst_ip, c->cinfo.dst_port,
new_conn_alias_flags);
}

/* ignore add_alias errors, there are some valid cases when one
* of the add_alias would fail (e.g. first add_alias for 2 connections
* with the same destination but different src. ip*/
Expand Down Expand Up @@ -1604,7 +1617,8 @@ struct tcp_connection* _tcpconn_find(int id, struct ip_addr* ip, int port,
((l_port==0) || (l_port==a->parent->rcv.dst_port)) &&
(ip_addr_cmp(ip, &a->parent->rcv.src_ip)) &&
(is_local_ip_any ||
ip_addr_cmp(l_ip, &a->parent->rcv.dst_ip))
ip_addr_cmp(l_ip, &a->parent->rcv.dst_ip) ||
ip_addr_cmp(l_ip, &a->parent->cinfo.dst_ip))
) {
LM_DBG("found connection by peer address (id: %d)\n",
a->parent->id);
Expand Down