Optimized the function of fill_connection_key.

Remove some unnecessary code to improve the performance of
the filter-rewriter module.

Signed-off-by: Lei Rao <lei.rao@intel.com>
Reviewed-by: Zhang Chen <chen.zhang@intel.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@trasno.org>
This commit is contained in:
Rao, Lei 2021-11-03 10:21:12 +08:00 committed by Juan Quintela
parent e5fdf92096
commit 64153ca613
4 changed files with 17 additions and 32 deletions

View File

@ -264,7 +264,7 @@ static int packet_enqueue(CompareState *s, int mode, Connection **con)
pkt = NULL; pkt = NULL;
return -1; return -1;
} }
fill_connection_key(pkt, &key); fill_connection_key(pkt, &key, false);
conn = connection_get(s->connection_track_table, conn = connection_get(s->connection_track_table,
&key, &key,

View File

@ -83,19 +83,26 @@ int parse_packet_early(Packet *pkt)
return 0; return 0;
} }
void extract_ip_and_port(uint32_t tmp_ports, ConnectionKey *key, Packet *pkt) void extract_ip_and_port(uint32_t tmp_ports, ConnectionKey *key,
Packet *pkt, bool reverse)
{ {
if (reverse) {
key->src = pkt->ip->ip_dst;
key->dst = pkt->ip->ip_src;
key->src_port = ntohs(tmp_ports & 0xffff);
key->dst_port = ntohs(tmp_ports >> 16);
} else {
key->src = pkt->ip->ip_src; key->src = pkt->ip->ip_src;
key->dst = pkt->ip->ip_dst; key->dst = pkt->ip->ip_dst;
key->src_port = ntohs(tmp_ports >> 16); key->src_port = ntohs(tmp_ports >> 16);
key->dst_port = ntohs(tmp_ports & 0xffff); key->dst_port = ntohs(tmp_ports & 0xffff);
}
} }
void fill_connection_key(Packet *pkt, ConnectionKey *key) void fill_connection_key(Packet *pkt, ConnectionKey *key, bool reverse)
{ {
uint32_t tmp_ports; uint32_t tmp_ports = 0;
memset(key, 0, sizeof(*key));
key->ip_proto = pkt->ip->ip_p; key->ip_proto = pkt->ip->ip_p;
switch (key->ip_proto) { switch (key->ip_proto) {
@ -106,29 +113,15 @@ void fill_connection_key(Packet *pkt, ConnectionKey *key)
case IPPROTO_SCTP: case IPPROTO_SCTP:
case IPPROTO_UDPLITE: case IPPROTO_UDPLITE:
tmp_ports = *(uint32_t *)(pkt->transport_header); tmp_ports = *(uint32_t *)(pkt->transport_header);
extract_ip_and_port(tmp_ports, key, pkt);
break; break;
case IPPROTO_AH: case IPPROTO_AH:
tmp_ports = *(uint32_t *)(pkt->transport_header + 4); tmp_ports = *(uint32_t *)(pkt->transport_header + 4);
extract_ip_and_port(tmp_ports, key, pkt);
break; break;
default: default:
break; break;
} }
}
void reverse_connection_key(ConnectionKey *key) extract_ip_and_port(tmp_ports, key, pkt, reverse);
{
struct in_addr tmp_ip;
uint16_t tmp_port;
tmp_ip = key->src;
key->src = key->dst;
key->dst = tmp_ip;
tmp_port = key->src_port;
key->src_port = key->dst_port;
key->dst_port = tmp_port;
} }
Connection *connection_new(ConnectionKey *key) Connection *connection_new(ConnectionKey *key)

View File

@ -89,9 +89,9 @@ typedef struct Connection {
uint32_t connection_key_hash(const void *opaque); uint32_t connection_key_hash(const void *opaque);
int connection_key_equal(const void *opaque1, const void *opaque2); int connection_key_equal(const void *opaque1, const void *opaque2);
int parse_packet_early(Packet *pkt); int parse_packet_early(Packet *pkt);
void extract_ip_and_port(uint32_t tmp_ports, ConnectionKey *key, Packet *pkt); void extract_ip_and_port(uint32_t tmp_ports, ConnectionKey *key,
void fill_connection_key(Packet *pkt, ConnectionKey *key); Packet *pkt, bool reverse);
void reverse_connection_key(ConnectionKey *key); void fill_connection_key(Packet *pkt, ConnectionKey *key, bool reverse);
Connection *connection_new(ConnectionKey *key); Connection *connection_new(ConnectionKey *key);
void connection_destroy(void *opaque); void connection_destroy(void *opaque);
Connection *connection_get(GHashTable *connection_track_table, Connection *connection_get(GHashTable *connection_track_table,

View File

@ -279,15 +279,7 @@ static ssize_t colo_rewriter_receive_iov(NetFilterState *nf,
*/ */
if (pkt && is_tcp_packet(pkt)) { if (pkt && is_tcp_packet(pkt)) {
fill_connection_key(pkt, &key); fill_connection_key(pkt, &key, sender == nf->netdev);
if (sender == nf->netdev) {
/*
* We need make tcp TX and RX packet
* into one connection.
*/
reverse_connection_key(&key);
}
/* After failover we needn't change new TCP packet */ /* After failover we needn't change new TCP packet */
if (s->failover_mode && if (s->failover_mode &&