10#define ENTRYPOINT_SECTION "filter_v2"
12#define SECTION(name) __attribute__((section(name), used))
15#define STATIC_ASSERT(x) static_assert(x, "")
17#define STATIC_ASSERT(x) _Static_assert(x, "")
43#define PROGRAM_DISPLAY_ID(id) \
44 SECTION("meta.display_id") \
45 static const char _mitigator_meta_program_id[] = id;
64#define ENTRYPOINT SECTION(ENTRYPOINT_SECTION)
82#define LOCAL static inline __attribute__((always_inline))
98#define PACKED __attribute__((packed))
125#if defined(__clang__)
126#define UNROLL _Pragma("unroll")
141#define MAX_PAYLOAD_LENGTH 1536
152#define MAX_PARAMETERS_LENGTH 1024
242 ETHER_TYPE_IP = 0x0800,
243 ETHER_TYPE_ARP = 0x0806,
244 ETHER_TYPE_8021Q = 0x8100,
245 ETHER_TYPE_IP6 = 0x86DD
331 IP_PROTO_ICMPV6 = 58,
386 uint32_t th_flags2 : 4;
426 TCP_FLAG_PUSH = 0x08,
446 TCP_OPT_SACK_PERM = 4,
448 TCP_OPT_TIMESTAMPS = 8
471 ICMP_DEST_UNREACHABLE = 3,
472 ICMP_SOURCE_QUENCH = 4,
475 ICMP_TIME_EXCEEDED = 11,
476 ICMP_PARAM_PROBLEM = 12,
477 ICMP_TIMESTAMP_REQUEST = 13,
478 ICMP_TIMESTAMP_REPLY = 14,
479 ICMP_INFO_REQUEST = 15,
480 ICMP_INFO_REPLY = 16,
485 ICMP6_DEST_UNREACHABLE = 1,
486 ICMP6_PKT_TOO_BIG = 2,
487 ICMP6_TIME_EXCEEDED = 3,
488 ICMP6_PARAM_PROBLEM = 4,
489 ICMP6_ECHO_REQUEST = 128,
490 ICMP6_ECHO_REPLY = 129,
491 ICMP6_ROUTER_SOL = 133,
492 ICMP6_ROUTER_ADV = 134,
493 ICMP6_NEIGHBOR_SOL = 135,
494 ICMP6_NEIGHBOR_ADV = 136,
770#define TABLE_EX_KEY_SIZE 16
773#define TABLE_EX_VALUE_SIZE 8
785 void* value,
void* value_end);
797 void* value,
void* value_end);
810 const void* value,
const void* value_end);
909 uint32_t acknum_offset);
1000 return __builtin_bswap16(value);
1006 return __builtin_bswap32(value);
1012 return __builtin_bswap64(value);
1015#define VLAN_ID_MASK 0x0fff
1020 return bswap16(vlan->control) & VLAN_ID_MASK;
1033 uint16_t bits = vlan->control & ~bswap16(VLAN_ID_MASK);
1038STATIC_ASSERT(
sizeof(
struct VlanHeader) == 4);
1039STATIC_ASSERT(
sizeof(
struct IpHeader) == 20);
1040STATIC_ASSERT(
sizeof(
struct Ip6Addr) == 16);
1041STATIC_ASSERT(
sizeof(
struct Ip6Header) == 40);
1042STATIC_ASSERT(
sizeof(
struct TcpHeader) == 20);
1043STATIC_ASSERT(
sizeof(
struct UdpHeader) == 8);
1044STATIC_ASSERT(
sizeof(
struct IcmpHeader) == 4);
LOCAL void vlan_set_id(struct VlanHeader *vlan, uint16_t id)
Set VLAN ID in 802.1q header.
Definition: mitigator_bpf.h:1032
EtherType
Ethernet frame type codes.
Definition: mitigator_bpf.h:241
uint8_t packet_transport_proto(Context ctx)
Get packet transport protocol code, e.g. TCP, UDP, or ICMP.
struct TableExResult table_ex_get(Context ctx, const void *key, const void *key_end, void *value, void *value_end)
Lookup value in the extended table by key and modify record update time.
void * packet_ether_header(Context ctx)
Get packet Ethernet header.
uint64_t TableValue
Definition: mitigator_bpf.h:697
void * Context
Opaque filter context.
Definition: mitigator_bpf.h:160
LOCAL uint16_t bswap16(uint16_t value)
Change byte order of a 16-bit value.
Definition: mitigator_bpf.h:999
uint64_t table_ex_size(Context ctx)
Get number of records in the extended table.
IcmpType
ICMPv4 types.
Definition: mitigator_bpf.h:469
void bloom_reset(Context ctx)
Reset bloom filter to the initial state.
uint32_t hash_crc32_data(const void *data, const void *end, uint32_t init)
Compute CRC32 (Castagnoli) over [data; end).
uint32_t Time
Definition: mitigator_bpf.h:196
void set_packet_offset(Context ctx, uint16_t offset)
Set number of bytes to strip from the beginning of transport payload.
uint16_t packet_network_proto(Context ctx)
Get packet network protocol code, e.g. IPv4.
Result
Filter verdict.
Definition: mitigator_bpf.h:167
@ RESULT_LIMIT
Definition: mitigator_bpf.h:175
@ RESULT_DROP
Definition: mitigator_bpf.h:171
@ RESULT_SORB
Definition: mitigator_bpf.h:181
@ RESULT_PASS
Definition: mitigator_bpf.h:169
@ RESULT_BACK
Definition: mitigator_bpf.h:173
void * packet_transport_payload(Context ctx, uint16_t *length)
Get packet transport payload for TCP, UDP, or ICMP.
LOCAL uint16_t vlan_get_id(const struct VlanHeader *vlan)
Get VLAN ID from 802.1q header.
Definition: mitigator_bpf.h:1019
#define LOCAL
Force the compiler to inline a local function.
Definition: mitigator_bpf.h:82
Bool table_get(Context ctx, TableKey key, struct TableRecord *record)
Lookup value in the basic table by key and modify record update time.
uint32_t hash_crc32_u64(uint64_t value, uint32_t init)
Compute CRC32 (Castagnoli) of a 64-bit value.
TcpOption
TCP option codes.
Definition: mitigator_bpf.h:441
void * packet_network_header(Context ctx)
Get packet network header, e.g. IPv4 header.
IpProto
IPv4 and IPv6 transport protocol codes.
Definition: mitigator_bpf.h:326
Cookie cookie_make(Context ctx, const struct Flow *id)
Make a generic cookie value based on random seed, current time, and flow fields that identify the cli...
TcpFlags
TCP flags.
Definition: mitigator_bpf.h:422
Cookie syncookie_make(Context ctx)
Make a cookie value for use as a sequence number in a SYN+ACK packet.
LOCAL uint64_t bswap64(uint64_t value)
Change byte order of a 64-bit value.
Definition: mitigator_bpf.h:1011
void set_packet_length(Context ctx, uint16_t length)
Set new packet transport payload length (max 1400).
uint64_t table_size(Context ctx)
Get number of records in the table.
uint32_t IpAddr
IPv4 address.
Definition: mitigator_bpf.h:249
Bool table_ex_put(Context ctx, const void *key, const void *key_end, const void *value, const void *value_end)
Update value in the extended table, creating a new record if needed.
void * packet_transport_header(Context ctx)
Get packet transport header, e.g. TCP header.
Bool isn_syncookie_check(Context ctx, uint32_t seqnum_offset, uint32_t acknum_offset)
Check if packet is a TCP ACK carrying an ISN SYN cookie.
struct TableExResult table_ex_find(Context ctx, const void *key, const void *key_end, void *value, void *value_end)
Lookup value in the extended table by key.
LOCAL uint32_t bswap32(uint32_t value)
Change byte order of a 32-bit value.
Definition: mitigator_bpf.h:1005
uint64_t rand64(void)
Generate a pseudo-random, non cryptographically-secure value.
uint32_t hash_crc32_u32(uint32_t value, uint32_t init)
Compute CRC32 (Castagnoli) of a 32-bit value.
Icmp6Type
ICMPv6 types.
Definition: mitigator_bpf.h:484
Bool syncookie_check(Context ctx, uint32_t seqnum_offset, uint32_t acknum_offset)
Check if packet is a TCP ACK carrying a SYN cookie.
Bool cookie_check(Context ctx, const struct Flow *id, Cookie cookie)
Check if a generic cookie matches the flow and has not expired.
void set_packet_isn_syncookie(Context ctx)
Convert response packet to an empty TCP SYN+ACK with ISN syncookie.
void set_src_blacklisted(Context ctx, Time duration)
Add packet source address to temporary blacklist.
Bool table_put(Context ctx, TableKey key, TableValue value)
Update value in the basic table, creating a new record if needed.
const void * parameters_get(Context ctx)
Get a pointer to read-only program parameters.
Bool bloom_check(Context ctx, uint64_t hash)
Check if hash value is stored in the bloom filter.
void bloom_add(Context ctx, uint64_t hash)
Add hash value to the bloom filter.
Time time_sec(Context ctx)
Get system time in seconds.
uint64_t Bool
ABI-safe, EBPF-friendly boolean type.
Definition: mitigator_bpf.h:189
void isn_send_ack_packet(Context ctx)
Send ACK packet with ISN syncookie.
Bool table_find(Context ctx, TableKey key, struct TableRecord *record)
Lookup value in the basic table by key.
void set_src_whitelisted(Context ctx, Time duration)
Add packet source address to temporary whitelist.
uint64_t TableKey
Definition: mitigator_bpf.h:690
void set_packet_mangled(Context ctx)
Mark the packet as mangled by the program.
void set_packet_syncookie(Context ctx)
Convert response packet to an empty TCP SYN+ACK with syncookie.
void packet_flow(Context ctx, struct Flow *info)
Get packet flow information, including source and destination.
uint32_t Cookie
Definition: mitigator_bpf.h:816
Ethernet address (MAC address).
Definition: mitigator_bpf.h:209
Packet flow information.
Definition: mitigator_bpf.h:517
IPv6 address representation.
Definition: mitigator_bpf.h:289
Result of a lookup in the extended table.
Definition: mitigator_bpf.h:763
Record in the program-wide table.
Definition: mitigator_bpf.h:711
Network address, either IPv4 or IPv6.
Definition: mitigator_bpf.h:498