You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

193 lines
4.8 KiB
C

// SPDX-License-Identifier: GPL-3.0-or-later
/**
* \file bgpgrep_local.h
*
* `bgpgrep` private header.
*
* \copyright The DoubleFourteen Code Forge (C) All Rights Reserved
* \author Lorenzo Cogotti
*/
#ifndef DF_BGPGREP_LOCAL_H_
#define DF_BGPGREP_LOCAL_H_
#include "bgp/dump.h"
#include "bgp/mrt.h"
#include "bgp/patricia.h"
#include "bgp/vm.h"
#include "bufio.h"
#include <setjmp.h>
// =======================================
// Data structures used during compilation
typedef struct Trielist Trielist;
struct Trielist {
Sint32 kidx;
Patricia trie;
Trielist *next;
};
typedef enum {
ANNOUNCE, WITHDRAWN, NUM_NETPFX_TYPES
} NetpfxType;
typedef struct Pfxnode Pfxnode;
struct Pfxnode {
Prefix pfx;
Uint8 refCount;
Pfxnode *next[NUM_NETPFX_TYPES];
};
typedef struct Pfxlist Pfxlist;
struct Pfxlist {
Boolean8 areListsMatching; // TRUE if head[ANNOUNCE] and head[WITHDRAWN] lists are equal
Boolean8 isEmpty; // TRUE if both lists are NULL
Pfxnode *head[NUM_NETPFX_TYPES];
};
typedef struct Triepair Triepair;
struct Triepair {
Trielist *v4, *v6;
};
typedef enum {
PEER_ADDR_NOP, // operate only on AS
PEER_ADDR_EQ, // test for equality
PEER_ADDR_NE // test for inequality
} Peeraddropc;
typedef struct Peerlistop Peerlistop;
struct Peerlistop {
Peeraddropc opc;
Asn asn;
Ipadr addr;
Peerlistop *next;
};
typedef enum {
TIMESTAMP_LE,
TIMESTAMP_LT,
TIMESTAMP_NE,
TIMESTAMP_EQ,
TIMESTAMP_GT,
TIMESTAMP_GE
} Timestampopc;
typedef struct Timestampop Timestampop;
struct Timestampop {
Sint64 secs;
Uint32 microsecs;
Timestampopc opc;
};
// ==================================
// Non Local Jumps - error management
#if defined(__GNUC__) && !defined(__clang__)
// Faster alternative, less taxing than standard setjmp(), but comes with
// a few gotchas: https://gcc.gnu.org/onlinedocs/gcc/Nonlocal-Gotos.html
typedef Sintptr frame_buf[5];
#define setjmp_fast(frame) __builtin_setjmp(frame)
#define longjmp_fast(frame) __builtin_longjmp(frame, 1)
#else
typedef jmp_buf frame_buf;
#define setjmp_fast(frame) setjmp(frame)
#define longjmp_fast(frame) longjmp(frame, 1)
#endif
// ====================
// Global bgpgrep state
typedef struct BgpgrepState BgpgrepState;
struct BgpgrepState {
// Output
const BgpDumpfmt *outFmt;
void *outf;
const StmOps *outfOps;
// MRT input file stream
const char *filename; // current file being processed
void *inf; // NOTE: may be NULL even in a file is open
const StmOps *infOps; // if NULL no file is open
Stmrdbuf infBuf; // input buffer in case we're reading from uncompressed source
// Miscellaneous global flags and data
Boolean8 noColor;
Boolean8 hasPeerIndex;
Boolean8 dumpBytecode;
Boolean8 isTrivialFilter; // TRUE when `vm` program = "return TRUE"
Boolean8 lenientBgpErrors; // If TRUE bgpgrep won't drop a message on BGP error
// (allows dumping BGP data with corrupted markers)
Mrtrecord peerIndex;
Mrtrecord rec;
Bgpmsg msg;
Bgpvm vm;
Trielist *trieList;
// MRT extensions for Bgpvm (used by bgpgrep VM intrinsice: BgpgrepF_*)
Ipadr peerAddr;
Asn peerAs;
Sint64 timestampSecs;
Uint32 timestampMicrosecs;
// Error tracking and management
frame_buf dropMsgFrame; // used to skip single RIB entry or BGP message
frame_buf dropRecordFrame; // used by `Bgpgrep_DropRecord()`
frame_buf dropFileFrame; // used by `Bgpgrep_DropFile()`
int nerrors; // for `exit()` status
};
extern BgpgrepState S;
// ================
// Error management
CHECK_PRINTF(1, 2) void Bgpgrep_Warning(const char *, ...);
CHECK_PRINTF(1, 2) NORETURN void Bgpgrep_Fatal(const char *, ...);
CHECK_PRINTF(1, 2) NORETURN void Bgpgrep_DropMessage(const char *, ...);
CHECK_PRINTF(1, 2) NORETURN void Bgpgrep_DropRecord(const char *, ...);
CHECK_PRINTF(1, 2) NORETURN void Bgpgrep_DropFile(const char *, ...);
// ===============
// Rules compiler
// -> Entry point
void Bgpgrep_CompileVmProgram(int, char **);
// -> Called by `Bgpgrep_CompileVmProgram()` during compilation stage
char *BgpgrepC_GetToken(void);
char *BgpgrepC_CurTerm(void);
char *BgpgrepC_ExpectAnyToken(void);
char *BgpgrepC_ExpectToken(const char *);
Trielist *BgpgrepC_NewTrie(Afi);
Sint32 BgpgrepC_BakeAsRegexp(void);
void BgpgrepC_ParsePrefixList(Pfxlist *);
void BgpgrepC_FreePrefixList(Pfxlist *);
Sint32 BgpgrepC_ParsePeerExpression(void);
Sint32 BgpgrepC_ParseTimestampExpression(void);
Sint32 BgpgrepC_ParseCommunity(BgpVmOpt);
// -> Specific BGP VM intrinsics for bgpgrep operations (CALL targets)
void BgpgrepF_FindAsLoops(Bgpvm *);
void BgpgrepF_PeerAddrMatch(Bgpvm *);
void BgpgrepF_TimestampCompare(Bgpvm *);
void BgpgrepF_BogonAsn(Bgpvm *);
// ==================
// MRT Dump functions
void BgpgrepD_Bgp4mp(void);
void BgpgrepD_Zebra(void);
void BgpgrepD_TableDumpv2(void);
void BgpgrepD_TableDump(void);
#endif