Skip to content

Commit a7461b8

Browse files
committed
CTT - update parser to use CTT metadata
1 parent 96ac252 commit a7461b8

File tree

2 files changed

+122
-1
lines changed

2 files changed

+122
-1
lines changed

input/parser.cpp

Lines changed: 119 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 {
@@ -779,4 +780,121 @@ void parse_packet(parser_opt_t *opt, ParserStats& stats, struct timeval ts, cons
779780
opt->pblock->bytes += len;
780781
}
781782

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

input/parser.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
#include <ipfixprobe/packet.hpp>
3333
#include <ipfixprobe/parser-stats.hpp>
34+
#include <ipfixprobe/cttmeta.hpp>
3435

3536
#ifdef WITH_PCAP
3637
#include <pcap/pcap.h>
@@ -85,5 +86,7 @@ typedef struct parser_opt_s {
8586
*/
8687
void parse_packet(parser_opt_t *opt, ParserStats& stats, struct timeval ts, const uint8_t *data, uint16_t len, uint16_t caplen);
8788

89+
int parse_packet_ctt_metadata(parser_opt_t *opt, ParserStats& stats, const Metadata_CTT& metadata, const uint8_t *data, uint16_t len, uint16_t caplen);
90+
8891
}
8992
#endif /* IPXP_INPUT_PARSER_HPP */

0 commit comments

Comments
 (0)