Skip to content

Commit e014ec7

Browse files
committed
lib: cgen: add gen_inline_log flavor callback
1 parent 21a0a41 commit e014ec7

9 files changed

Lines changed: 75 additions & 12 deletions

File tree

src/libbpfilter/cgen/cgroup_skb.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,5 @@ const struct bf_flavor_ops bf_flavor_ops_cgroup_skb = {
161161
.gen_inline_set_mark = _bf_cgroup_skb_gen_inline_set_mark,
162162
.get_verdict = _bf_cgroup_skb_get_verdict,
163163
.gen_inline_matcher = _bf_cgroup_skb_gen_inline_matcher,
164+
.gen_inline_log = bf_packet_gen_inline_log,
164165
};

src/libbpfilter/cgen/cgroup_sock_addr.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,23 @@ static int _bf_cgroup_sock_addr_get_verdict(enum bf_verdict verdict)
273273
}
274274
}
275275

276+
static int _bf_cgroup_sock_addr_gen_inline_log(struct bf_program *program,
277+
const struct bf_rule *rule)
278+
{
279+
assert(program);
280+
assert(rule);
281+
282+
(void)program;
283+
(void)rule;
284+
285+
return bf_err_r(-ENOTSUP,
286+
"logging is not yet supported for cgroup_sock_addr");
287+
}
288+
276289
const struct bf_flavor_ops bf_flavor_ops_cgroup_sock_addr = {
277290
.gen_inline_prologue = _bf_cgroup_sock_addr_gen_inline_prologue,
278291
.gen_inline_epilogue = _bf_cgroup_sock_addr_gen_inline_epilogue,
279292
.get_verdict = _bf_cgroup_sock_addr_get_verdict,
280293
.gen_inline_matcher = _bf_cgroup_sock_addr_gen_inline_matcher,
294+
.gen_inline_log = _bf_cgroup_sock_addr_gen_inline_log,
281295
};

src/libbpfilter/cgen/nf.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,5 @@ const struct bf_flavor_ops bf_flavor_ops_nf = {
176176
.gen_inline_epilogue = _bf_nf_gen_inline_epilogue,
177177
.get_verdict = _bf_nf_get_verdict,
178178
.gen_inline_matcher = _bf_nf_gen_inline_matcher,
179+
.gen_inline_log = bf_packet_gen_inline_log,
179180
};

src/libbpfilter/cgen/packet.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,17 @@
1414
#include <errno.h>
1515
#include <stdint.h>
1616

17+
#include <bpfilter/elfstub.h>
1718
#include <bpfilter/helper.h>
1819
#include <bpfilter/logger.h>
1920
#include <bpfilter/matcher.h>
21+
#include <bpfilter/rule.h>
2022

2123
#include "cgen/matcher/cmp.h"
2224
#include "cgen/matcher/meta.h"
2325
#include "cgen/matcher/set.h"
2426
#include "cgen/program.h"
27+
#include "cgen/runtime.h"
2528
#include "cgen/stub.h"
2629
#include "filter.h"
2730

@@ -355,3 +358,25 @@ int bf_packet_gen_inline_matcher(struct bf_program *program,
355358
bf_matcher_get_type(matcher));
356359
}
357360
}
361+
362+
int bf_packet_gen_inline_log(struct bf_program *program,
363+
const struct bf_rule *rule)
364+
{
365+
assert(program);
366+
assert(rule);
367+
368+
EMIT(program, BPF_MOV64_REG(BPF_REG_1, BPF_REG_10));
369+
EMIT(program, BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, BF_PROG_CTX_OFF(arg)));
370+
EMIT(program, BPF_MOV64_IMM(BPF_REG_2, rule->index));
371+
EMIT(program, BPF_MOV64_IMM(BPF_REG_3, rule->log));
372+
EMIT(program, BPF_MOV64_IMM(BPF_REG_4, rule->verdict));
373+
374+
// Pack l3_proto and l4_proto
375+
EMIT(program, BPF_MOV64_REG(BPF_REG_5, BPF_REG_7));
376+
EMIT(program, BPF_ALU64_IMM(BPF_LSH, BPF_REG_5, 16));
377+
EMIT(program, BPF_ALU64_REG(BPF_OR, BPF_REG_5, BPF_REG_8));
378+
379+
EMIT_FIXUP_ELFSTUB(program, BF_ELFSTUB_PKT_LOG);
380+
381+
return 0;
382+
}

src/libbpfilter/cgen/packet.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
struct bf_matcher;
99
struct bf_program;
10+
struct bf_rule;
1011

1112
/**
1213
* @brief Generate bytecode for a packet-based matcher.
@@ -25,3 +26,16 @@ struct bf_program;
2526
*/
2627
int bf_packet_gen_inline_matcher(struct bf_program *program,
2728
const struct bf_matcher *matcher);
29+
30+
/**
31+
* @brief Generate bytecode for packet-based rule logging.
32+
*
33+
* Sets up registers and calls the packet log ELF stub. Shared by all
34+
* packet-based flavors (TC, NF, XDP, cgroup_skb).
35+
*
36+
* @param program Program being generated. Can't be NULL.
37+
* @param rule Rule whose log action to generate. Can't be NULL.
38+
* @return 0 on success, negative errno on error.
39+
*/
40+
int bf_packet_gen_inline_log(struct bf_program *program,
41+
const struct bf_rule *rule);

src/libbpfilter/cgen/program.c

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ static int _bf_program_generate_rule(struct bf_program *program,
292292
assert(program);
293293
assert(rule);
294294
assert(program->runtime.ops->gen_inline_matcher);
295+
assert(program->runtime.ops->gen_inline_log);
295296

296297
if (rule->disabled)
297298
return 0;
@@ -346,18 +347,9 @@ static int _bf_program_generate_rule(struct bf_program *program,
346347
}
347348

348349
if (rule->log) {
349-
EMIT(program, BPF_MOV64_REG(BPF_REG_1, BPF_REG_10));
350-
EMIT(program, BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, BF_PROG_CTX_OFF(arg)));
351-
EMIT(program, BPF_MOV64_IMM(BPF_REG_2, rule->index));
352-
EMIT(program, BPF_MOV64_IMM(BPF_REG_3, rule->log));
353-
EMIT(program, BPF_MOV64_IMM(BPF_REG_4, rule->verdict));
354-
355-
// Pack l3_proto and l4_proto
356-
EMIT(program, BPF_MOV64_REG(BPF_REG_5, BPF_REG_7));
357-
EMIT(program, BPF_ALU64_IMM(BPF_LSH, BPF_REG_5, 16));
358-
EMIT(program, BPF_ALU64_REG(BPF_OR, BPF_REG_5, BPF_REG_8));
359-
360-
EMIT_FIXUP_ELFSTUB(program, BF_ELFSTUB_PKT_LOG);
350+
r = program->runtime.ops->gen_inline_log(program, rule);
351+
if (r)
352+
return r;
361353
}
362354

363355
if (rule->counters) {

src/libbpfilter/cgen/tc.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,4 +175,5 @@ const struct bf_flavor_ops bf_flavor_ops_tc = {
175175
.gen_inline_redirect = _bf_tc_gen_inline_redirect,
176176
.get_verdict = _bf_tc_get_verdict,
177177
.gen_inline_matcher = _bf_tc_gen_inline_matcher,
178+
.gen_inline_log = bf_packet_gen_inline_log,
178179
};

src/libbpfilter/cgen/xdp.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,5 @@ const struct bf_flavor_ops bf_flavor_ops_xdp = {
125125
.gen_inline_redirect = _bf_xdp_gen_inline_redirect,
126126
.get_verdict = _bf_xdp_get_verdict,
127127
.gen_inline_matcher = bf_packet_gen_inline_matcher,
128+
.gen_inline_log = bf_packet_gen_inline_log,
128129
};

src/libbpfilter/include/bpfilter/flavor.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
struct bf_matcher;
1313
struct bf_program;
14+
struct bf_rule;
1415

1516
/**
1617
* @file flavor.h
@@ -135,6 +136,19 @@ struct bf_flavor_ops
135136
*/
136137
int (*gen_inline_matcher)(struct bf_program *program,
137138
const struct bf_matcher *matcher);
139+
140+
/**
141+
* @brief Generate bytecode for rule logging.
142+
*
143+
* Each flavor controls its own register setup and ELF stub selection.
144+
* Required for all flavors.
145+
*
146+
* @param program Program being generated. Can't be NULL.
147+
* @param rule Rule whose log action to generate. Can't be NULL.
148+
* @return 0 on success, or negative errno on error.
149+
*/
150+
int (*gen_inline_log)(struct bf_program *program,
151+
const struct bf_rule *rule);
138152
};
139153

140154
/**

0 commit comments

Comments
 (0)