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:
parent
e5fdf92096
commit
64153ca613
|
@ -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,
|
||||||
|
|
31
net/colo.c
31
net/colo.c
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 &&
|
||||||
|
|
Loading…
Reference in New Issue