EtherLib/packet_sieve.h

105 lines
3.0 KiB
C

#ifndef ETHERLIB_PACKET_SIEVE_H
#define ETHERLIB_PACKET_SIEVE_H
#include <stdbool.h>
#include "packet_registry.h"
#include "packet.h"
typedef struct PcktHeaderElement_ {
struct PcktHeaderElement_ * next, * prev; ///< Next and previous header in the linked list
PcktProps props; ///< Properties (allocated to appropriate size)
} PcktHeaderElement;
#define ETH_PCKT_HEADER_ELEMENT_HEAD_SIZE (2 * sizeof(PcktHeaderElement *))
/**
* @union PcktSieveFilterCondition
* Union for storing filter conditions.
*/
typedef union {
uint16_t uw[8];
uint32_t u[4];
uint64_t lu[2];
int16_t sw[8];
int32_t i[4];
int64_t li[2];
uint8_t d[16];
} PcktSieveFilterCondition;
/**
* Function for comparing filter conditions.
* @param c1 condition 1
* @param c2 condition 2
* @return true if cond1 matches cond2, otherwise false
*/
bool packfiltcond_cmp(const PcktSieveFilterCondition * c1, const PcktSieveFilterCondition * c2);
/**
* Clear packet filter condition structure.
* @param cond pointer to existing filter condition structure
*/
void packfiltcond_zero(PcktSieveFilterCondition * cond);
typedef bool (*SieveFilterFn)(const PcktSieveFilterCondition * filtCond, const PcktProps * contProps, const PcktProps * ownProps);
struct PcktSieveLayer_;
typedef int (*SieveCallBackFn)(const Pckt * pckt);
typedef union {
void * p;
uint32_t u;
} PcktSieveLayerTag;
typedef struct PcktSieveLayer_ {
uint16_t packetClass; ///< Packet class (e.g. IP)
PcktSieveFilterCondition filtCond; ///< Filter condition, arbitrary type (e.g. destination IP-address)
SieveFilterFn filtFn; ///< Filter function pointer
SieveCallBackFn cbFn; ///< Associated callback function
PcktSieveLayerTag tag; ///< Layer tag (arbitrary information)
struct PcktSieveLayer_ * parent; ///< Pointer to parent node in the sieve tree
struct PcktSieveLayer_ * next, * prev; ///< Next and previous sieve layer on the same level
struct PcktSieveLayer_ * nodes; ///< Subnodes on the sieve tree
} PcktSieveLayer;
typedef struct {
PcktSieveLayer layer0; ///< Top of sieve tree
} PcktSieve;
/**
* Create new packet sieve.
* @return pointer to packet sieve object or NULL on failure
*/
PcktSieve * packsieve_new();
/**
* Process packet with packet sieve.
* @param bottomLayer
* @param data
* @param size
*/
void packsieve_input(const PcktSieve * sieve, const RawPckt * rawPckt);
/**
* Create a new sieve filter layer.
* @param parent parent layer
* @return pointer to new layer object or NULL on failure
*/
PcktSieveLayer *packsieve_new_layer(PcktSieveLayer *parent, const PcktSieveFilterCondition *filtCond, SieveFilterFn filtFn, SieveCallBackFn cbFn, PcktSieveLayerTag tag, uint16_t pcktClass);
/**
* Remove sieve layer from packet sieve.
* @param layer Layer to remove and deallocate
*/
bool packsieve_remove_layer(PcktSieveLayer * layer);
/**
* Display layer on terminal.
* @param layer pointer to existing layer
* @param indent sub-tree indentation
*/
void packsieve_report(const PcktSieveLayer *layer, uint32_t indent);
#endif //ETHERLIB_PACKET_SIEVE_H