@@ -374,29 +374,39 @@ fn gen_skel_c_skel_constructor(skel: &mut String, object: &Object, name: &str) -
374374 Ok ( ( ) )
375375}
376376
377- fn gen_skel_open_map_defs ( skel : & mut String , maps : & MapsData , raw_obj_name : & str ) -> Result < ( ) > {
377+ fn gen_skel_map_defs (
378+ skel : & mut String ,
379+ maps : & MapsData ,
380+ raw_obj_name : & str ,
381+ open : bool ,
382+ ) -> Result < ( ) > {
383+ let prefix = if open { "Open" } else { "" } ;
384+
378385 let obj_name = capitalize_first_letter ( raw_obj_name) ;
379386 write ! (
380387 skel,
381388 "\
382- pub struct Open {obj_name}Maps<'obj> {{
389+ pub struct {prefix} {obj_name}Maps<'obj> {{
383390 " ,
384391 ) ?;
385392
386393 for map in maps. iter ( ) {
387394 write ! (
388395 skel,
389396 "\
390- pub {name}: libbpf_rs::OpenMapMut <'obj>,
397+ pub {name}: libbpf_rs::{prefix}MapMut <'obj>,
391398 " ,
392399 name = map. name
393400 ) ?;
394401
395- if let MapMeta :: Datasec { .. } = map. meta {
402+ if let MapMeta :: Datasec { read_only, .. } = map. meta {
403+ // After "open" all maps are writable. That's the point,
404+ // they can be modified.
405+ let ref_mut = if open || !read_only { " mut" } else { "" } ;
396406 write ! (
397407 skel,
398408 "\
399- pub {name}_data: &'obj mut types::{name},
409+ pub {name}_data: &'obj{ref_mut} types::{name},
400410 " ,
401411 name = map. name,
402412 ) ?;
@@ -409,11 +419,11 @@ fn gen_skel_open_map_defs(skel: &mut String, maps: &MapsData, raw_obj_name: &str
409419 _phantom: std::marker::PhantomData<&'obj ()>,
410420 }}
411421
412- impl<'obj> Open {obj_name}Maps<'obj> {{
422+ impl<'obj> {prefix} {obj_name}Maps<'obj> {{
413423 #[allow(unused_variables)]
414424 unsafe fn new(
415425 config: &libbpf_rs::__internal_skel::ObjectSkeletonConfig<'_>,
416- object: &mut libbpf_rs::OpenObject ,
426+ object: &mut libbpf_rs::{prefix}Object ,
417427 ) -> libbpf_rs::Result<Self> {{
418428 " ,
419429 ) ?;
@@ -426,7 +436,7 @@ fn gen_skel_open_map_defs(skel: &mut String, maps: &MapsData, raw_obj_name: &str
426436 skel,
427437 "\
428438 let object = unsafe {{
429- std::mem::transmute::<&mut libbpf_rs::OpenObject , &'obj mut libbpf_rs::OpenObject >(object)
439+ std::mem::transmute::<&mut libbpf_rs::{prefix}Object , &'obj mut libbpf_rs::{prefix}Object >(object)
430440 }};
431441 for map in object.maps_mut() {{
432442 let name = map
@@ -473,7 +483,12 @@ fn gen_skel_open_map_defs(skel: &mut String, maps: &MapsData, raw_obj_name: &str
473483 name = map. name
474484 ) ?;
475485
476- if let MapMeta :: Datasec { mmap_idx, .. } = map. meta {
486+ if let MapMeta :: Datasec {
487+ mmap_idx,
488+ read_only,
489+ } = map. meta
490+ {
491+ let ref_conv = if open || !read_only { "mut" } else { "ref" } ;
477492 write ! (
478493 skel,
479494 "\
@@ -482,7 +497,7 @@ fn gen_skel_open_map_defs(skel: &mut String, maps: &MapsData, raw_obj_name: &str
482497 .map_mmap_ptr({mmap_idx})
483498 .expect(\" BPF map `{name}` does not have mmap pointer\" )
484499 .cast::<types::{name}>()
485- .as_mut ()
500+ .as_{ref_conv} ()
486501 .expect(\" BPF map `{name}` mmap pointer is NULL\" )
487502 }},
488503 " ,
@@ -504,84 +519,6 @@ fn gen_skel_open_map_defs(skel: &mut String, maps: &MapsData, raw_obj_name: &str
504519 Ok ( ( ) )
505520}
506521
507- fn gen_skel_map_defs ( skel : & mut String , maps : & MapsData , raw_obj_name : & str ) -> Result < ( ) > {
508- let obj_name = capitalize_first_letter ( raw_obj_name) ;
509- write ! (
510- skel,
511- "\
512- pub struct {obj_name}Maps<'obj> {{
513- " ,
514- ) ?;
515-
516- for map in maps. iter ( ) {
517- write ! (
518- skel,
519- "\
520- pub {name}: libbpf_rs::MapMut<'obj>,
521- " ,
522- name = map. name
523- ) ?;
524-
525- if let MapMeta :: Datasec { read_only, .. } = map. meta {
526- let ref_mut = if read_only { "" } else { " mut" } ;
527-
528- write ! (
529- skel,
530- "\
531- pub {name}_data: &'obj{ref_mut} types::{name},
532- " ,
533- name = map. name,
534- ) ?;
535- }
536- }
537-
538- write ! (
539- skel,
540- "\
541- _phantom: std::marker::PhantomData<&'obj ()>,
542- }}
543-
544- impl<'obj> {obj_name}Maps<'obj> {{
545- #[allow(unused_variables)]
546- fn new(open_maps: Open{obj_name}Maps<'obj>) -> Self {{
547- Self {{
548- " ,
549- ) ?;
550-
551- for map in maps. iter ( ) {
552- write ! (
553- skel,
554- "\
555- {name}: unsafe {{
556- libbpf_rs::MapMut::new_mut(libbpf_rs::AsRawLibbpf::as_libbpf_object(&open_maps.{name}).as_mut())
557- }},
558- " ,
559- name = map. name
560- ) ?;
561-
562- if let MapMeta :: Datasec { .. } = map. meta {
563- write ! (
564- skel,
565- "\
566- {name}_data: open_maps.{name}_data,
567- " ,
568- name = map. name,
569- ) ?;
570- }
571- }
572-
573- write ! (
574- skel,
575- "\
576- _phantom: std::marker::PhantomData,
577- }}
578- }}
579- }}
580- " ,
581- ) ?;
582- Ok ( ( ) )
583- }
584-
585522fn gen_skel_open_prog_defs ( skel : & mut String , progs : & ProgsData , raw_obj_name : & str ) -> Result < ( ) > {
586523 let obj_name = capitalize_first_letter ( raw_obj_name) ;
587524 write ! (
@@ -917,6 +854,7 @@ fn gen_skel_contents(_debug: bool, raw_obj_name: &str, obj_file_path: &Path) ->
917854 #[allow(unused_imports)]
918855 use super::*;
919856 use libbpf_rs::libbpf_sys;
857+ use libbpf_rs::MapCore as _;
920858 use libbpf_rs::skel::OpenSkel;
921859 use libbpf_rs::skel::Skel;
922860 use libbpf_rs::skel::SkelBuilder;
@@ -941,8 +879,8 @@ fn gen_skel_contents(_debug: bool, raw_obj_name: &str, obj_file_path: &Path) ->
941879 let progs = ProgsData :: new ( & object) ?;
942880
943881 gen_skel_c_skel_constructor ( & mut skel, & object, & libbpf_obj_name) ?;
944- gen_skel_open_map_defs ( & mut skel, & maps, raw_obj_name) ?;
945- gen_skel_map_defs ( & mut skel, & maps, raw_obj_name) ?;
882+ gen_skel_map_defs ( & mut skel, & maps, raw_obj_name, true ) ?;
883+ gen_skel_map_defs ( & mut skel, & maps, raw_obj_name, false ) ?;
946884 gen_skel_open_prog_defs ( & mut skel, & progs, raw_obj_name) ?;
947885 gen_skel_prog_defs ( & mut skel, & progs, raw_obj_name) ?;
948886
@@ -1135,12 +1073,12 @@ pub struct StructOps {{}}
11351073 }};
11361074 let _obj = obj_ref.write(obj);
11371075 // SAFETY: We just wrote initialized data to `obj_ref`.
1138- let obj_ref = unsafe {{ OwnedRef::new(obj_ref) }};
1076+ let mut obj_ref = unsafe {{ OwnedRef::new(obj_ref) }};
11391077
11401078 Ok({name}Skel {{
1141- obj: obj_ref,
1142- maps: {name}Maps::new(self.maps),
1079+ maps: unsafe {{ {name}Maps::new(&self.skel_config, obj_ref.as_mut())? }},
11431080 progs: {name}Progs::new(self.progs),
1081+ obj: obj_ref,
11441082 struct_ops: self.struct_ops,
11451083 skel_config: self.skel_config,
11461084 {links}
0 commit comments