Skip to content

Commit f757a32

Browse files
committed
Implement bpf_skb_store_bytes_emitter
1 parent c5de92b commit f757a32

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

pythonbpf/helper/bpf_helper_handler.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,85 @@ def bpf_get_current_uid_gid_emitter(
567567
return pid, ir.IntType(64)
568568

569569

570+
@HelperHandlerRegistry.register("skb_store_bytes")
571+
def bpf_skb_store_bytes_emitter(
572+
call,
573+
map_ptr,
574+
module,
575+
builder,
576+
func,
577+
local_sym_tab=None,
578+
struct_sym_tab=None,
579+
map_sym_tab=None,
580+
):
581+
"""
582+
Emit LLVM IR for bpf_skb_store_bytes helper function call.
583+
Expected call signature: skb_store_bytes(skb, offset, from, len, flags)
584+
"""
585+
586+
if len(call.args) not in (4, 5):
587+
raise ValueError(
588+
f"skb_store_bytes expects 4 or 5 args (skb, offset, from, len, flags), got {len(call.args)}"
589+
)
590+
591+
skb_ptr = get_or_create_ptr_from_arg(
592+
func, module, call.args[0], builder, local_sym_tab, map_sym_tab, struct_sym_tab
593+
)
594+
offset_val = get_int_value_from_arg(
595+
call.args[1],
596+
func,
597+
module,
598+
builder,
599+
local_sym_tab,
600+
map_sym_tab,
601+
struct_sym_tab,
602+
)
603+
from_ptr = get_or_create_ptr_from_arg(
604+
func, module, call.args[2], builder, local_sym_tab, map_sym_tab, struct_sym_tab
605+
)
606+
len_val = get_int_value_from_arg(
607+
call.args[3],
608+
func,
609+
module,
610+
builder,
611+
local_sym_tab,
612+
map_sym_tab,
613+
struct_sym_tab,
614+
)
615+
if len(call.args) == 5:
616+
flags_val = get_flags_val(call.args[4], builder, local_sym_tab)
617+
else:
618+
flags_val = ir.Constant(ir.IntType(64), 0)
619+
fn_type = ir.FunctionType(
620+
ir.IntType(64),
621+
[
622+
ir.PointerType(), # skb
623+
ir.IntType(32), # offset
624+
ir.PointerType(), # from
625+
ir.IntType(32), # len
626+
ir.IntType(64), # flags
627+
],
628+
var_arg=False,
629+
)
630+
fn_ptr = builder.inttoptr(
631+
ir.Constant(ir.IntType(64), BPFHelperID.BPF_SKB_STORE_BYTES.value),
632+
ir.PointerType(fn_type),
633+
)
634+
result = builder.call(
635+
fn_ptr,
636+
[
637+
builder.bitcast(skb_ptr, ir.PointerType()),
638+
builder.trunc(offset_val, ir.IntType(32)),
639+
builder.bitcast(from_ptr, ir.PointerType()),
640+
builder.trunc(len_val, ir.IntType(32)),
641+
flags_val,
642+
],
643+
tail=False,
644+
)
645+
logger.info("Emitted bpf_skb_store_bytes call")
646+
return result, ir.IntType(64)
647+
648+
570649
def handle_helper_call(
571650
call,
572651
module,

0 commit comments

Comments
 (0)