summaryrefslogtreecommitdiffstats
path: root/src/flow_stat_parser.h
diff options
context:
space:
mode:
authorIdo Barnea <ibarnea@cisco.com>2016-12-21 15:36:35 +0200
committerIdo Barnea <ibarnea@cisco.com>2016-12-22 10:18:40 +0200
commite528048b2a9c99899cf1f69a2c11f51a383384db (patch)
treeac62991d084126877afe505de4dfbd58ddedefe1 /src/flow_stat_parser.h
parent1eea3fc8a3721b10e062401f7e47ccf18e59fbe5 (diff)
Support for UDP with --learn_mode 1 and 3 (TCP ACK) using IP_ID
Signed-off-by: Ido Barnea <ibarnea@cisco.com>
Diffstat (limited to 'src/flow_stat_parser.h')
-rw-r--r--src/flow_stat_parser.h72
1 files changed, 46 insertions, 26 deletions
diff --git a/src/flow_stat_parser.h b/src/flow_stat_parser.h
index df70e4ec..51816e1a 100644
--- a/src/flow_stat_parser.h
+++ b/src/flow_stat_parser.h
@@ -52,24 +52,34 @@ class CFlowStatParser {
uint8_t * get_l4() {return m_l4;}
inline bool IsNatInfoPkt(bool &first) {
- if (!m_ipv4 || (m_l4_proto != IPPROTO_TCP)) {
+ if (! m_ipv4 ) {
return false;
}
- if ((m_l4 + TCP_HEADER_LEN) > (uint8_t *)m_ipv4 + get_pkt_size()) {
- return false;
- }
- // If we are here, relevant fields from tcp header are inside the packet boundaries
- // We want to handle SYN and SYN+ACK packets
- TCPHeader *tcp = (TCPHeader *)m_l4;
- if (! tcp->getSynFlag())
- return false;
- if (! tcp->getAckFlag()) {
- first = true;
+ if (m_l4_proto == IPPROTO_TCP) {
+ if ((m_l4 + TCP_HEADER_LEN) > (uint8_t *)m_ipv4 + get_pkt_size()) {
+ return false;
+ }
+ // If we are here, relevant fields from tcp header are inside the packet boundaries
+ // We want to handle SYN and SYN+ACK packets
+ TCPHeader *tcp = (TCPHeader *)m_l4;
+ if (! tcp->getSynFlag())
+ return false;
+
+ if (! tcp->getAckFlag()) {
+ first = true;
+ } else {
+ first = false;
+ }
+ return true;
} else {
- first = false;
+ if ((m_ipv4->getId() & 0x8000) != 0) {
+ first = true;
+ return true;
+ } else {
+ return false;
+ }
}
- return true;
}
private:
@@ -122,24 +132,34 @@ class CSimplePacketParser {
// first - set to true if this is the first packet of the flow. false otherwise.
// relevant only if return value is true
inline bool IsNatInfoPkt(bool &first) {
- if (!m_ipv4 || (m_protocol != IPPROTO_TCP)) {
+ if (! m_ipv4 ) {
return false;
}
- if (! m_l4 || (m_l4 - rte_pktmbuf_mtod(m_m, uint8_t*) + TCP_HEADER_LEN) > m_m->data_len) {
- return false;
- }
- // If we are here, relevant fields from tcp header are guaranteed to be in first mbuf
- // We want to handle SYN and SYN+ACK packets
- TCPHeader *tcp = (TCPHeader *)m_l4;
- if (! tcp->getSynFlag())
- return false;
- if (! tcp->getAckFlag()) {
- first = true;
+ if (m_ipv4->getProtocol() == IPPROTO_TCP) {
+ if (! m_l4 || (m_l4 - rte_pktmbuf_mtod(m_m, uint8_t*) + TCP_HEADER_LEN) > m_m->data_len) {
+ return false;
+ }
+ // If we are here, relevant fields from tcp header are inside the packet boundaries
+ // We want to handle SYN and SYN+ACK packets
+ TCPHeader *tcp = (TCPHeader *)m_l4;
+ if (! tcp->getSynFlag())
+ return false;
+
+ if (! tcp->getAckFlag()) {
+ first = true;
+ } else {
+ first = false;
+ }
+ return true;
} else {
- first = false;
+ if ((m_ipv4->getId() & 0x8000) != 0) {
+ first = true;
+ return true;
+ } else {
+ return false;
+ }
}
- return true;
}
public: