@@ -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+
570649def handle_helper_call (
571650 call ,
572651 module ,
0 commit comments