yafcore.h
Go to the documentation of this file.
1/*
2 * Copyright 2006-2025 Carnegie Mellon University
3 * See license information in LICENSE.txt.
4 */
5/*
6 *
7 * yafcore.h
8 * YAF core I/O routines
9 *
10 * ------------------------------------------------------------------------
11 * Authors: Brian Trammell
12 * ------------------------------------------------------------------------
13 * @DISTRIBUTION_STATEMENT_BEGIN@
14 * YAF 2.18
15 *
16 * Copyright 2025 Carnegie Mellon University.
17 *
18 * NO WARRANTY. THIS CARNEGIE MELLON UNIVERSITY AND SOFTWARE ENGINEERING
19 * INSTITUTE MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON
20 * UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
21 * AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR
22 * PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF
23 * THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF
24 * ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT
25 * INFRINGEMENT.
26 *
27 * Licensed under a GNU GPL 2.0-style license, please see LICENSE.txt or
28 * contact permission@sei.cmu.edu for full terms.
29 *
30 * [DISTRIBUTION STATEMENT A] This material has been approved for public
31 * release and unlimited distribution. Please see Copyright notice for
32 * non-US Government use and distribution.
33 *
34 * This Software includes and/or makes use of Third-Party Software each
35 * subject to its own license.
36 *
37 * DM25-1281
38 * @DISTRIBUTION_STATEMENT_END@
39 * ------------------------------------------------------------------------
40 */
41
74
81
82#ifndef _YAF_CORE_H_
83#define _YAF_CORE_H_
84
85#include <yaf/autoinc.h>
86#include <fixbuf/public.h>
87#include <yaf/yaftime.h>
88
89
95#define CERT_PEN 6871
96
102#define YAF_ERROR_DOMAIN (g_quark_from_string("certYAFError"))
104#define YAF_ERROR_HEADER 1
106#define YAF_ERROR_ARGUMENT 2
108#define YAF_ERROR_IO 3
110#define YAF_ERROR_IPFIX 4
112#define YAF_ERROR_IMPL 5
114#define YAF_ERROR_INTERNAL 6
116#define YAF_ERROR_LIMIT 7
118#define YAF_ERROR_EOF 8
120#define YAF_ERROR_ALIGNMENT 9
122#define YAF_ERROR_PACKET_PAYLOAD 10
123
124
125
126/* The YAF_END_* values are used as indexes into the
127 * yfFlowTabStats_t.stat_closed[] array in yaftab.h. */
128
133#define YAF_FLOW_ACTIVE 0
135#define YAF_END_IDLE 1
137#define YAF_END_ACTIVE 2
139#define YAF_END_CLOSED 3
141#define YAF_END_FORCED 4
143#define YAF_END_RESOURCE 5
145#define YAF_END_UDPFORCE 0x1F
147#define YAF_END_MASK 0x7F
149#define YAF_ENDF_ISCONT 0x80
150
152/* YAF_ATTR_SAME_SIZE in yaf-3 */
153#define YAF_SAME_SIZE 0x01
155/* YAF_ATTR_OUT_OF_SEQUENCE in yaf-3 */
156#define YAF_OUT_OF_SEQUENCE 0x02
158/* YAF_ATTR_MP_CAPABLE in yaf-3 */
159#define YAF_MP_CAPABLE 0x04
161/* YAF_ATTR_FRAGMENTS in yaf-3 */
162#define YAF_FRAGMENTS 0x08
164#define YAF_PARTIAL_FRAGS 0x10
166#define YAF_FRAG_ACTIVE 0x03
168#define YAF_FRAG_PASSIVE 0x04
169
171#define YAF_IP_ICMP 1
173#define YAF_IP_TCP 6
175#define YAF_IP_UDP 17
176
180#define YFP_IPTCPHEADER_SIZE 128
182#define ETHERNET_MAC_ADDR_LENGTH 6
184#define YAF_MAX_HOOKS 4
185
188#define YAF_HOOKS_MAX_EXPORT 1500
190#define YAF_MAX_PKT_BOUNDARY 25
192#define YAF_PCAP_MAX 5000000
194#define YAF_MAX_MPLS_LABELS 3
195
198#define YAF_SMALL_PKT_BOUND 60
201#define YAF_LARGE_PKT_BOUND 225
202
203
207typedef struct yfConfig_st yfConfig_t;
208
209
223
225#define YF_TIME_IE__FIRST YF_TIME_IE_MILLI
226
228#define YF_TIME_IE__LAST YF_TIME_IE_NANO
229
231#define YF_TIME_IE__DEFAULT (YF_TIME_IE_MILLI | YF_TIME_IE_MICRO)
232
236#define yfRecordTimeIEBitSet(t_) (1 << ((t_) - 1))
237
241#define yfRecordTimeIEBitCheck(bits_, t_) ((bits_) & yfRecordTimeIEBitSet(t_))
242
243
251typedef struct yfFlowKey_st {
253 uint16_t sp;
255 uint16_t dp;
257 uint8_t proto;
259 uint8_t version;
261 uint16_t vlanId;
263 uint8_t tos;
267#if YAF_ENABLE_DAG_SEPARATE_INTERFACES || YAF_ENABLE_SEPARATE_INTERFACES
268 uint8_t netIf;
269#endif
271 uint32_t layer2Id;
273 union {
274 struct {
276 uint32_t sip;
278 uint32_t dip;
279 } v4;
280 struct {
282 uint8_t sip[16];
284 uint8_t dip[16];
285 } v6;
288
292typedef struct yfFlowStats_st {
294 uint64_t iaarray[10];
296 uint32_t pktsize[10];
298 uint64_t payoct;
300 yfTime_t ltime;
302 uint32_t tcpurgct;
304 uint32_t smallpktct;
308 uint32_t largepktct;
310 uint32_t aitime;
312 uint32_t firstpktsize;
314 uint32_t maxpktsize;
316
321typedef struct yfFlowVal_st {
323 uint64_t oct;
325 uint64_t pkt;
326#if YAF_ENABLE_PAYLOAD
331 uint32_t *paybounds;
335 uint8_t *payload;
342 uint32_t paylen;
343#endif /* if YAF_ENABLE_PAYLOAD */
345 uint32_t isn;
347 uint32_t lsn;
351 uint16_t attributes;
353 uint16_t vlan;
355 uint8_t iflags;
357 uint8_t uflags;
359 uint8_t appkt;
362#if YAF_ENABLE_SEPARATE_INTERFACES
363 uint8_t netIf;
364#endif
365#if YAF_ENABLE_ENTROPY
367 uint8_t entropy;
368#endif /* if YAF_ENABLE_ENTROPY */
369#if YAF_ENABLE_P0F
371 const char *osname;
373 const char *osver;
375 char *osFingerPrint;
376#endif /* if YAF_ENABLE_P0F */
377#if YAF_ENABLE_FPEXPORT
379 uint32_t firstPacketLen;
381 uint32_t secondPacketLen;
383 uint8_t *firstPacket;
385 uint8_t *secondPacket;
386#endif /* if YAF_ENABLE_FPEXPORT */
390
391#if YAF_MPLS
392typedef struct yfMPLSNode_st {
394 GHashTable *tab;
396 uint32_t mpls_label[YAF_MAX_MPLS_LABELS];
398 int tab_count;
399} yfMPLSNode_t;
400#endif /* if YAF_MPLS */
401
402typedef struct yaf_mptcp_st {
404 uint64_t idsn;
406 uint32_t token;
408 uint16_t mss;
410 uint8_t addrid;
412 uint8_t flags;
413} yaf_mptcp_t;
414
415
422typedef struct yfFlow_st {
424 yfTime_t stime;
426 yfTime_t etime;
427#ifdef YAF_ENABLE_HOOKS
432 void *hfctx[YAF_MAX_HOOKS];
433#endif
434 /*
435 * Reverse flow delta start time. Equivalent to initial packet round-trip
436 * time; useful for decomposing biflows into uniflows.
437 */
438 yfDiffTime_t rdtime;
439#if YAF_ENABLE_APPLABEL
441 uint16_t appLabel;
442#endif
443#if YAF_ENABLE_NDPI
444 uint16_t ndpi_master;
445 uint16_t ndpi_sub;
446#endif
448 uint8_t reason;
450 uint8_t pcap_serial;
458 uint8_t pktdir;
460 uint8_t rtos;
462 pcap_dumper_t *pcap;
463#if YAF_MPLS
465 yfMPLSNode_t *mpls;
466#endif
468 yaf_mptcp_t mptcp;
476
485void
487 void);
488
489
498void
500 yfFlow_t *flow);
501
509void
511 yfFlow_t *flow);
512
523fBuf_t *
525 const char *path,
526 const yfConfig_t *yfConfig,
527 GError **err);
528
541fBuf_t *
543 FILE *fp,
544 const yfConfig_t *yfConfig,
545 GError **err);
546
555fBuf_t *
557 fbConnSpec_t *spec,
558 const yfConfig_t *yfConfig,
559 GError **err);
560
561
562#ifdef HAVE_SPREAD
574fBuf_t *
575yfWriterForSpread(
576 fbSpreadParams_t *params,
577 uint16_t *spreadGroupIndex,
578 const yfConfig_t *yfConfig,
579 GError **err);
580#endif /* HAVE_SPREAD */
581
594gboolean
596 void *yfContext,
597 uint32_t pcap_drop,
598 GTimer *timer,
599 GError **err);
600
615gboolean
617 void *yfContext,
618 uint32_t pcap_drop,
619 GTimer *timer,
620 GError **err);
621
633gboolean
635 void *yfContext,
636 GError **err);
637
649gboolean
651 void *yfContext,
652 yfFlow_t *flow,
653 GError **err);
654
666gboolean
668 fBuf_t *fbuf,
669 gboolean flush,
670 GError **err);
671
684fBuf_t *
686 fBuf_t *fbuf,
687 FILE *fp,
688 GError **err);
689
705fbListener_t *
707 fbConnSpec_t *spec,
708 fbListenerAppInit_fn appinit,
709 fbListenerAppFree_fn appfree,
710 GError **err);
711
728gboolean
730 fBuf_t *fbuf,
731 yfFlow_t *flow,
732 GError **err);
733
751gboolean
753 fBuf_t *fbuf,
754 yfFlow_t *flow,
755 GError **err);
756
767void
769 GString *rstr,
770 const yfFlow_t *flow);
771
783void
785 GString *rstr,
786 const yfFlow_t *flow,
787 gboolean yaft_mac);
788
801gboolean
803 FILE *out,
804 const yfFlow_t *flow,
805 GError **err);
806
820gboolean
822 FILE *out,
823 const yfFlow_t *flow,
824 gboolean yaft_mac,
825 GError **err);
826
835void
837 FILE *out,
838 gboolean yaft_mac,
839 GError **err);
840
841#if YAF_ENABLE_HOOKS
847fbInfoModel_t *
848yfDPIInfoModel(
849 void);
850#endif /* if YAF_ENABLE_HOOKS */
851
852#endif /* ifndef _YAF_CORE_H_ */
Definition yafcore.h:402
uint64_t idsn
initial data seq no.
Definition yafcore.h:404
uint16_t mss
max segment size
Definition yafcore.h:408
uint8_t flags
hash_flags
Definition yafcore.h:412
uint32_t token
receiver token
Definition yafcore.h:406
uint8_t addrid
addr id
Definition yafcore.h:410
A YAF flow.
Definition yafcore.h:422
yfFlowVal_t rval
Reverse value.
Definition yafcore.h:472
yaf_mptcp_t mptcp
MPTCP Flow.
Definition yafcore.h:468
uint8_t pcap_serial
Keep track of number of pcap files for this flow.
Definition yafcore.h:450
yfTime_t etime
Flow end time.
Definition yafcore.h:426
yfTime_t stime
Flow start time.
Definition yafcore.h:424
uint8_t rtos
reverse ToS (fwd in flowKey)
Definition yafcore.h:460
uint8_t pktdir
non empty packet directions, 1, or 0
Definition yafcore.h:458
yfFlowKey_t key
Flow key.
Definition yafcore.h:474
uint8_t destinationMacAddr[ETHERNET_MAC_ADDR_LENGTH]
destination Mac Address
Definition yafcore.h:454
uint8_t sourceMacAddr[ETHERNET_MAC_ADDR_LENGTH]
src Mac Address
Definition yafcore.h:452
pcap_dumper_t * pcap
Pcap File Ptr.
Definition yafcore.h:462
yfFlowVal_t val
Forward value.
Definition yafcore.h:470
uint8_t pcap_file_no
Pcap File "ID" so we know when to make entries in metadata file.
Definition yafcore.h:456
uint8_t reason
Flow termination reason (YAF_END_ macros, per IPFIX standard)
Definition yafcore.h:448
A YAF flow key.
Definition yafcore.h:251
uint8_t tos
Type of Service/Traffic Class.
Definition yafcore.h:263
uint8_t version
IP Version.
Definition yafcore.h:259
uint32_t sip
Source IPv4 address.
Definition yafcore.h:276
uint32_t dip
Destination IPv4 address.
Definition yafcore.h:278
uint16_t sp
Source transport port.
Definition yafcore.h:253
union yfFlowKey_st::@211325316375037323344324360340235353264331072054 addr
IP address two-tuple union.
uint16_t dp
Destination transport port.
Definition yafcore.h:255
uint16_t vlanId
VLAN Tag - only fwd.
Definition yafcore.h:261
uint8_t proto
IP protocol.
Definition yafcore.h:257
uint32_t layer2Id
for DAG cards need to record the interface, may only be seeing unidirectional flows on each interface...
Definition yafcore.h:271
yaf enhanced flow statistics, used in flowstats_mode (yaf –flow-stats)
Definition yafcore.h:292
uint32_t smallpktct
Number of packets with fewer than YAF_SMALL_PKT_BOUND bytes of data.
Definition yafcore.h:304
uint32_t nonemptypktct
total number of non empty pkts
Definition yafcore.h:306
uint64_t iaarray[10]
to calculate inter-packet delay
Definition yafcore.h:294
uint32_t maxpktsize
largest pkt size
Definition yafcore.h:314
uint32_t largepktct
Number of packets with more than YAF_LARGE_PKT_BOUND bytes of data.
Definition yafcore.h:308
uint32_t aitime
average interarrival time in milliseconds
Definition yafcore.h:310
uint32_t firstpktsize
payload length of first non-empty pkt
Definition yafcore.h:312
uint32_t tcpurgct
Number of urgent packets.
Definition yafcore.h:302
uint32_t pktsize[10]
to calculate distribution of packet payload size
Definition yafcore.h:296
uint64_t payoct
total amount of payload data
Definition yafcore.h:298
yfTime_t ltime
used to calculate interarrival time
Definition yafcore.h:300
A YAF uniflow value.
Definition yafcore.h:321
uint64_t pkt
Packet count.
Definition yafcore.h:325
uint32_t lsn
Last TCP sequence number.
Definition yafcore.h:347
uint8_t appkt
Packets with payload, used when determining YAF_ATTR_SAME_SIZE.
Definition yafcore.h:359
uint8_t iflags
Initial TCP flags.
Definition yafcore.h:355
yfFlowStats_t * stats
Detailed yaf flow statistics used in flowstats_mode.
Definition yafcore.h:388
bool applabel_tried
Whether appLabel has been attempted for this uniflow.
Definition yafcore.h:361
uint64_t oct
Octet count.
Definition yafcore.h:323
uint16_t first_pkt_size
First Packet Size - to determine whether to set YAF_ATTR_SAME_SIZE.
Definition yafcore.h:349
uint16_t attributes
flowAttributes
Definition yafcore.h:351
uint8_t uflags
Union of remaining TCP flags.
Definition yafcore.h:357
uint16_t vlan
VLAN TAG (also in key, but want to record both sides)
Definition yafcore.h:353
uint32_t isn
Initial TCP sequence number.
Definition yafcore.h:345
fBuf_t * yfWriterForSpec(fbConnSpec_t *spec, const yfConfig_t *yfConfig, GError **err)
Get an IPFIX message buffer for writing YAF flows to a socket.
#define YAF_MAX_MPLS_LABELS
Maximum number of labels we're going to keep around.
Definition yafcore.h:194
gboolean yfWriteOptionsDataFlows(void *yfContext, uint32_t pcap_drop, GTimer *timer, GError **err)
A wrapper that calls both yfWriteStatsFlow and yfWriteDataFlow with appropriate condition checking.
struct yfFlowKey_st yfFlowKey_t
A YAF flow key.
enum yfRecordTimeIE_en yfRecordTimeIE_t
Type to specify which timestamps are included.
#define YAF_MAX_HOOKS
maximum number of hooks (plugins) allowed at one time
Definition yafcore.h:184
gboolean yfReadFlowExtended(fBuf_t *fbuf, yfFlow_t *flow, GError **err)
Read a single flow from an IPFIX message buffer.
gboolean yfPrint(FILE *out, const yfFlow_t *flow, GError **err)
Print a textual representation of a YAF flow to a file.
struct yfConfig_st yfConfig_t
YAF Configuration Settings.
Definition yafcore.h:207
gboolean yfReadFlow(fBuf_t *fbuf, yfFlow_t *flow, GError **err)
Read a single flow from an IPFIX message buffer.
gboolean yfWriteFlow(void *yfContext, yfFlow_t *flow, GError **err)
Write a single flow to an IPFIX message buffer.
void yfPrintString(GString *rstr, const yfFlow_t *flow)
Print a YAF flow to a GString.
void yfAlignmentCheck(void)
yfAlignmentCheck
yfRecordTimeIE_en
Type to specify which timestamps are included.
Definition yafcore.h:213
@ YF_TIME_IE_NANO
Include flowStartNanoseconds, etc in the export template.
Definition yafcore.h:221
@ YF_TIME_IE_MICRO
Include flowStartMicrioseconds, etc in the export template.
Definition yafcore.h:219
@ YF_TIME_IE_MILLI
Include flowStartMilliseconds, etc in the export template.
Definition yafcore.h:217
@ YF_TIME_IE__UNSET
Unset value.
Definition yafcore.h:215
fBuf_t * yfWriterForFile(const char *path, const yfConfig_t *yfConfig, GError **err)
Get an IPFIX message buffer for writing YAF flows to a named file.
void yfFlowCleanup(yfFlow_t *flow)
Clean up after a static flow buffer prepared by yfFlowPrepare().
gboolean yfWriteTombstoneFlow(void *yfContext, GError **err)
Write a tombstone options data record to an IPFIX Message buffer.
fBuf_t * yfWriterForFP(FILE *fp, const yfConfig_t *yfConfig, GError **err)
Get an IPFIX message buffer for writing YAF flows to an open file pointer.
void yfPrintDelimitedString(GString *rstr, const yfFlow_t *flow, gboolean yaft_mac)
Print a YAF flow to a GString in pipe-delimited (columnar) format.
void yfFlowPrepare(yfFlow_t *flow)
Prepare a static flow buffer for use with yfReadFlow().
gboolean yfPrintDelimited(FILE *out, const yfFlow_t *flow, gboolean yaft_mac, GError **err)
Print a YAF flow to a file in pipe-delimited (columnar) format.
struct yfFlowVal_st yfFlowVal_t
A YAF uniflow value.
#define ETHERNET_MAC_ADDR_LENGTH
length of Ethernet MAC Address
Definition yafcore.h:182
gboolean yfWriteStatsFlow(void *yfContext, uint32_t pcap_drop, GTimer *timer, GError **err)
Write a statistics options data record to an IPFIX Message buffer.
fBuf_t * yfReaderForFP(fBuf_t *fbuf, FILE *fp, GError **err)
Get an IPFIX message buffer for reading YAF flows from an open file pointer.
struct yfFlow_st yfFlow_t
A YAF flow.
gboolean yfWriterClose(fBuf_t *fbuf, gboolean flush, GError **err)
Close the connection underlying an IPFIX message buffer created by yfWriterForFP() or yfWriterForSpec...
void yfPrintColumnHeaders(FILE *out, gboolean yaft_mac, GError **err)
Print column headers for the pipe-delimited (columnar) format.
fbListener_t * yfListenerForSpec(fbConnSpec_t *spec, fbListenerAppInit_fn appinit, fbListenerAppFree_fn appfree, GError **err)
Get an IPFIX connection listener for collecting YAF flows via IPFIX from the network.
struct yfFlowStats_st yfFlowStats_t
yaf enhanced flow statistics, used in flowstats_mode (yaf –flow-stats)