Skip to content

Commit ec437bc

Browse files
jaroslavpesekSiskaPavel
authored andcommitted
ndp ctt integration - use ctt metadata for parsing
1 parent e470bf4 commit ec437bc

File tree

3 files changed

+114
-1
lines changed

3 files changed

+114
-1
lines changed

include/ipfixprobe/packet.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,15 @@
3838

3939
#include <ipfixprobe/ipaddr.hpp>
4040
#include <ipfixprobe/flowifc.hpp>
41+
#include "ipfixprobe/cttmeta.hpp"
4142

4243
namespace ipxp {
4344

4445
/**
4546
* \brief Structure for storing parsed packet fields
4647
*/
4748
struct Packet : public Record {
49+
Metadata_CTT cttmeta; /**< Metadata from CTT */
4850
struct timeval ts;
4951

5052
uint8_t dst_mac[6];

input/parser.cpp

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,15 @@
2727
*/
2828

2929
#include <config.h>
30+
#include <cstdint>
3031
#include <cstdio>
3132
#include <cstring>
32-
#include <iostream>
3333
#include <sys/types.h>
3434
#include <limits>
3535

3636
#include "parser.hpp"
3737
#include "headers.hpp"
38+
#include "ipfixprobe/cttmeta.hpp"
3839
#include <ipfixprobe/packet.hpp>
3940

4041
namespace ipxp {
@@ -776,4 +777,110 @@ void parse_packet(parser_opt_t *opt, ParserStats& stats, struct timeval ts, cons
776777
opt->pblock->bytes += len;
777778
}
778779

780+
void parse_packet_ctt_metadata(parser_opt_t *opt, ParserStats& stats, const Metadata_CTT& metadata, const uint8_t *data, uint16_t len, uint16_t caplen)
781+
{
782+
if (opt->pblock->cnt >= opt->pblock->size) {
783+
return;
784+
}
785+
Packet *pkt = &opt->pblock->pkts[opt->pblock->cnt];
786+
pkt->cttmeta = metadata;
787+
788+
pkt->packet_len_wire = len;
789+
pkt->ts = metadata.ts;
790+
pkt->src_port = 0;
791+
pkt->dst_port = 0;
792+
pkt->ip_proto = 0;
793+
pkt->ip_ttl = 0;
794+
pkt->ip_flags = 0;
795+
pkt->ip_version = 0;
796+
pkt->ip_payload_len = 0;
797+
pkt->tcp_flags = 0;
798+
pkt->tcp_window = 0;
799+
pkt->tcp_options = 0;
800+
pkt->tcp_mss = 0;
801+
pkt->mplsTop = 0;
802+
803+
stats.seen_packets++;
804+
805+
uint16_t data_offset;
806+
uint32_t l3_hdr_offset = metadata.l2_len;
807+
uint32_t l4_hdr_offset = metadata.l2_len + metadata.l3_len;
808+
809+
try {
810+
// L2
811+
data_offset = parse_eth_hdr(data, caplen, pkt);
812+
if (pkt->ethertype == ETH_P_TRILL) {
813+
data_offset += parse_trill(data + metadata.l2_len, metadata.l2_len, pkt);
814+
stats.trill_packets++;
815+
data_offset += parse_eth_hdr(data + metadata.l2_len, metadata.l2_len, pkt);
816+
}
817+
818+
// L3
819+
if (metadata.l2_ptype == L2_ETHER_IP) {
820+
if (metadata.l3_ptype == L3_IPV4 || metadata.l3_ptype == L3_IPV4_EXT) {
821+
data_offset += parse_ipv4_hdr(data + metadata.l2_len, metadata.l3_len, pkt);
822+
stats.ipv4_packets++;
823+
} else if (metadata.l3_ptype == L3_IPV6 || metadata.l3_ptype == L3_IPV4_EXT) {
824+
data_offset += parse_ipv6_hdr(data + metadata.l2_len, metadata.l3_len, pkt);
825+
stats.ipv6_packets++;
826+
}
827+
} else if (metadata.l2_ptype == L2_ETHER_MPLS) {
828+
data_offset += process_mpls(data + data_offset, caplen - data_offset, pkt);
829+
stats.mpls_packets++;
830+
} else if (metadata.l2_ptype == L2_ETHER_PPPOE) {
831+
data_offset += process_pppoe(data + data_offset, caplen - data_offset, pkt);
832+
stats.pppoe_packets++;
833+
} else { // if not previous, we try delegate to original parser
834+
parse_packet(opt, stats, metadata.ts, data, len, caplen);
835+
return;
836+
}
837+
838+
// L4
839+
if (metadata.l4_ptype == L4_TCP) {
840+
data_offset += parse_tcp_hdr(data + l4_hdr_offset, metadata.l4_len, pkt);
841+
stats.tcp_packets++;
842+
} else if (metadata.l4_ptype == L4_UDP) {
843+
data_offset += parse_udp_hdr(data + l4_hdr_offset, metadata.l4_len, pkt);
844+
stats.udp_packets++;
845+
} else { // if not previous, we try delegate to original parser
846+
parse_packet(opt, stats, metadata.ts, data, len, caplen);
847+
return;
848+
}
849+
} catch (const char *err) {
850+
DEBUG_MSG("%s\n", err);
851+
return;
852+
}
853+
854+
if (pkt->vlan_id) {
855+
stats.vlan_packets++;
856+
}
857+
858+
uint16_t pkt_len = caplen;
859+
pkt->packet = data;
860+
pkt->packet_len = caplen;
861+
862+
if (l4_hdr_offset != l3_hdr_offset) {
863+
if (l4_hdr_offset + pkt->ip_payload_len < 64) {
864+
// Packet contains 0x00 padding bytes, do not include them in payload
865+
pkt_len = l4_hdr_offset + pkt->ip_payload_len;
866+
}
867+
pkt->payload_len_wire = pkt->ip_payload_len - (data_offset - l4_hdr_offset);
868+
} else {
869+
pkt->payload_len_wire = pkt_len - data_offset;
870+
}
871+
872+
pkt->payload_len = pkt->payload_len_wire;
873+
if (pkt->payload_len + data_offset > pkt_len) {
874+
// Set correct size when payload length is bigger than captured payload length
875+
pkt->payload_len = pkt_len - data_offset;
876+
}
877+
pkt->payload = pkt->packet + data_offset;
878+
879+
DEBUG_MSG("Payload length:\t%u\n", pkt->payload_len);
880+
DEBUG_MSG("Packet parser exits: packet parsed\n");
881+
opt->packet_valid = true;
882+
opt->pblock->cnt++;
883+
opt->pblock->bytes += len;
884+
}
885+
779886
}

input/parser.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
#include <ipfixprobe/packet.hpp>
3333
#include <ipfixprobe/parser-stats.hpp>
3434

35+
#include "ctt.hpp"
36+
3537
#ifdef WITH_PCAP
3638
#include <pcap/pcap.h>
3739
#include <pcap/sll.h>
@@ -85,5 +87,7 @@ typedef struct parser_opt_s {
8587
*/
8688
void parse_packet(parser_opt_t *opt, ParserStats& stats, struct timeval ts, const uint8_t *data, uint16_t len, uint16_t caplen);
8789

90+
void parse_packet_ctt_metadata(parser_opt_t *opt, ParserStats& stats, const Metadata_CTT& metadata, const uint8_t *data, uint16_t len, uint16_t caplen);
91+
8892
}
8993
#endif /* IPXP_INPUT_PARSER_HPP */

0 commit comments

Comments
 (0)