2727 *
2828 */
2929
30+ #include < cstdint>
3031#include < cstdio>
3132#include < cstring>
32- #include < iostream>
33+ #include < netinet/in.h>
34+ #include < sys/types.h>
35+ #include < cstdint>
36+ #include < cstddef>
37+ #include < inttypes.h>
3338
3439#include " ndp.hpp"
40+ #include " ipfixprobe/packet.hpp"
41+ #include " ipfixprobe/plugin.hpp"
3542#include " parser.hpp"
3643
3744namespace ipxp {
3845
46+ uint64_t extract (const uint8_t * bitvec, size_t start_bit, size_t bit_length) {
47+ size_t start_byte = start_bit / 8 ;
48+ size_t end_bit = start_bit + bit_length;
49+ size_t end_byte = (end_bit + 7 ) / 8 ;
50+ uint64_t value = 0 ;
51+ for (size_t i = 0 ; i < end_byte - start_byte; ++i) {
52+ value |= static_cast <uint64_t >(bitvec[start_byte + i]) << (8 * i);
53+ }
54+ value >>= (start_bit % 8 );
55+ uint64_t mask = (bit_length == 64 ) ? ~0ULL : ((1ULL << bit_length) - 1 );
56+ return value & mask;
57+ }
58+
3959telemetry::Content NdpPacketReader::get_queue_telemetry ()
4060{
4161 telemetry::Dict dict;
4262 dict[" received_packets" ] = m_stats.receivedPackets ;
4363 dict[" received_bytes" ] = m_stats.receivedBytes ;
64+ dict[" bad_metadata" ] = m_stats.bad_metadata ;
4465 return dict;
4566}
4667
@@ -71,6 +92,9 @@ void NdpPacketReader::init(const char *params)
7192 if (parser.m_dev .empty ()) {
7293 throw PluginError (" specify device path" );
7394 }
95+ if (parser.m_metadata == " ctt" ) {
96+ m_ctt_metadata = true ;
97+ }
7498 init_ifc (parser.m_dev );
7599}
76100
@@ -86,6 +110,38 @@ void NdpPacketReader::init_ifc(const std::string &dev)
86110 }
87111}
88112
113+ int NdpPacketReader::parse_ctt_metadata (const ndp_packet *ndp_packet, Metadata_CTT &ctt)
114+ {
115+ if (ndp_packet->header_length != 32 ) {
116+ return -1 ;
117+ }
118+ const uint8_t *metadata = ndp_packet->header ;
119+
120+ ctt.ts .tv_usec = extract (metadata, 0 , 32 );
121+ ctt.ts .tv_sec = extract (metadata, 32 , 32 );
122+ ctt.vlan_tci = extract (metadata, 64 , 16 );
123+ ctt.vlan_vld = extract (metadata, 80 , 1 );
124+ ctt.vlan_stripped = extract (metadata, 81 , 1 );
125+ ctt.ip_csum_status = static_cast <CsumStatus>(extract (metadata, 82 , 2 ));
126+ ctt.l4_csum_status = static_cast <CsumStatus>(extract (metadata, 84 , 2 ));
127+ ctt.parser_status = static_cast <ParserStatus>(extract (metadata, 86 , 2 ));
128+ ctt.ifc = extract (metadata, 88 , 8 );
129+ ctt.filter_bitmap = extract (metadata, 96 , 16 );
130+ ctt.ctt_export_trig = extract (metadata, 112 , 1 );
131+ ctt.ctt_rec_matched = extract (metadata, 113 , 1 );
132+ ctt.ctt_rec_created = extract (metadata, 114 , 1 );
133+ ctt.ctt_rec_deleted = extract (metadata, 115 , 1 );
134+ ctt.flow_hash = extract (metadata, 128 , 64 );
135+ ctt.l2_len = extract (metadata, 192 , 7 );
136+ ctt.l3_len = extract (metadata, 199 , 9 );
137+ ctt.l4_len = extract (metadata, 208 , 8 );
138+ ctt.l2_ptype = static_cast <L2PType>(extract (metadata, 216 , 4 ));
139+ ctt.l3_ptype = static_cast <L3PType>(extract (metadata, 220 , 4 ));
140+ ctt.l4_ptype = static_cast <L4PType>(extract (metadata, 224 , 4 ));
141+
142+ return 0 ;
143+ }
144+
89145InputPlugin::Result NdpPacketReader::get (PacketBlock &packets)
90146{
91147 parser_opt_t opt = {&packets, false , false , 0 };
@@ -107,7 +163,18 @@ InputPlugin::Result NdpPacketReader::get(PacketBlock &packets)
107163 throw PluginError (ndpReader.error_msg );
108164 }
109165 read_pkts++;
110- parse_packet (&opt, m_parser_stats, timestamp, ndp_packet->data , ndp_packet->data_length , ndp_packet->data_length );
166+ if (m_ctt_metadata) {
167+ Metadata_CTT ctt;
168+ int ret = parse_ctt_metadata (ndp_packet, ctt);
169+ if (ret == -1 ) {
170+ m_stats.bad_metadata ++;
171+ parse_packet (&opt, m_parser_stats, timestamp, ndp_packet->data , ndp_packet->data_length , ndp_packet->data_length );
172+ } else {
173+ parse_packet_ctt_metadata (&opt, m_parser_stats, ctt, ndp_packet->data , ndp_packet->data_length , ndp_packet->data_length );
174+ }
175+ } else {
176+ parse_packet (&opt, m_parser_stats, timestamp, ndp_packet->data , ndp_packet->data_length , ndp_packet->data_length );
177+ }
111178 }
112179
113180 m_seen += read_pkts;
0 commit comments