From f75adc74bb17466ebd50deb3c8899a3c2d515c2e Mon Sep 17 00:00:00 2001 From: Lorenz Bauer Date: Thu, 5 Nov 2020 10:04:45 +0000 Subject: [PATCH] elf: assign Name from BTF map definitions When definining a map using BTF-style __type, etc. macros MapSpec.Name is not populated. The tests don't catch this since we never added a test for these map definitions. Set MapSpec.Name and rework the tests to use go-cmp. This means we don't have to manually maintain the comparison logic anymore. --- elf_reader.go | 1 + elf_reader_test.go | 192 +++++++++++-------------------- go.mod | 5 +- go.sum | 4 + testdata/common.h | 2 +- testdata/invalid_map.c | 2 +- testdata/loader-clang-6.0-eb.elf | Bin 8008 -> 7840 bytes testdata/loader-clang-6.0-el.elf | Bin 8008 -> 7840 bytes testdata/loader-clang-7-eb.elf | Bin 8192 -> 8016 bytes testdata/loader-clang-7-el.elf | Bin 8192 -> 8016 bytes testdata/loader-clang-8-eb.elf | Bin 10152 -> 10000 bytes testdata/loader-clang-8-el.elf | Bin 10152 -> 10000 bytes testdata/loader-clang-9-eb.elf | Bin 11888 -> 11584 bytes testdata/loader-clang-9-el.elf | Bin 11888 -> 11584 bytes testdata/loader.c | 57 ++++----- 15 files changed, 104 insertions(+), 159 deletions(-) diff --git a/elf_reader.go b/elf_reader.go index 133239275..9d7829db6 100644 --- a/elf_reader.go +++ b/elf_reader.go @@ -540,6 +540,7 @@ func mapSpecFromBTF(spec *btf.Spec, name string) (*MapSpec, error) { } return &MapSpec{ + Name: SanitizeName(name, -1), Type: MapType(mapType), KeySize: keySize, ValueSize: valueSize, diff --git a/elf_reader_test.go b/elf_reader_test.go index 69b620620..664254073 100644 --- a/elf_reader_test.go +++ b/elf_reader_test.go @@ -3,72 +3,90 @@ package ebpf import ( "flag" "path/filepath" - "reflect" "testing" "github.com/cilium/ebpf/internal" + "github.com/cilium/ebpf/internal/btf" "github.com/cilium/ebpf/internal/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" ) func TestLoadCollectionSpec(t *testing.T) { + const BPF_F_NO_PREALLOC = 1 + + coll := &CollectionSpec{ + Maps: map[string]*MapSpec{ + "hash_map": { + Name: "hash_map", + Type: Hash, + KeySize: 4, + ValueSize: 8, + MaxEntries: 1, + Flags: BPF_F_NO_PREALLOC, + }, + "hash_map2": { + Name: "hash_map2", + Type: Hash, + KeySize: 4, + ValueSize: 8, + MaxEntries: 2, + }, + "array_of_hash_map": { + Name: "array_of_hash_map", + Type: ArrayOfMaps, + KeySize: 4, + MaxEntries: 2, + }, + }, + Programs: map[string]*ProgramSpec{ + "xdp_prog": { + Name: "xdp_prog", + Type: XDP, + License: "MIT", + }, + "no_relocation": { + Name: "no_relocation", + Type: SocketFilter, + License: "MIT", + }, + }, + } + + opts := cmp.Options{ + cmpopts.IgnoreTypes(new(btf.Map), new(btf.Program)), + cmpopts.IgnoreFields(ProgramSpec{}, "Instructions", "ByteOrder"), + cmpopts.IgnoreMapEntries(func(key string, _ *MapSpec) bool { + switch key { + case ".bss", ".data", ".rodata": + return true + + default: + return false + } + }), + } + testutils.TestFiles(t, "testdata/loader-*.elf", func(t *testing.T, file string) { - spec, err := LoadCollectionSpec(file) + have, err := LoadCollectionSpec(file) if err != nil { t.Fatal("Can't parse ELF:", err) } - hashMapSpec := &MapSpec{ - Name: "hash_map", - Type: Hash, - KeySize: 4, - ValueSize: 2, - MaxEntries: 1, - } - checkMapSpec(t, spec.Maps, "hash_map", hashMapSpec) - checkMapSpec(t, spec.Maps, "array_of_hash_map", &MapSpec{ - Name: "hash_map", - Type: ArrayOfMaps, - KeySize: 4, - MaxEntries: 2, - }) - spec.Maps["array_of_hash_map"].InnerMap = spec.Maps["hash_map"] - - hashMap2Spec := &MapSpec{ - Name: "", - Type: Hash, - KeySize: 4, - ValueSize: 1, - MaxEntries: 2, - Flags: 1, + if diff := cmp.Diff(coll, have, opts...); diff != "" { + t.Errorf("MapSpec mismatch (-want +got):\n%s", diff) } - checkMapSpec(t, spec.Maps, "hash_map2", hashMap2Spec) - checkMapSpec(t, spec.Maps, "hash_of_hash_map", &MapSpec{ - Type: HashOfMaps, - KeySize: 4, - MaxEntries: 2, - }) - spec.Maps["hash_of_hash_map"].InnerMap = spec.Maps["hash_map2"] - - checkProgramSpec(t, spec.Programs, "xdp_prog", &ProgramSpec{ - Type: XDP, - License: "MIT", - KernelVersion: 0, - }) - checkProgramSpec(t, spec.Programs, "no_relocation", &ProgramSpec{ - Type: SocketFilter, - License: "MIT", - KernelVersion: 0, - }) - if rodata := spec.Maps[".rodata"]; rodata != nil { - err := spec.RewriteConstants(map[string]interface{}{ + if rodata := have.Maps[".rodata"]; rodata != nil { + err := have.RewriteConstants(map[string]interface{}{ "arg": uint32(1), }) if err != nil { t.Fatal("Can't rewrite constant:", err) } - err = spec.RewriteConstants(map[string]interface{}{ + err = have.RewriteConstants(map[string]interface{}{ "totallyBogus": uint32(1), }) if err == nil { @@ -76,13 +94,14 @@ func TestLoadCollectionSpec(t *testing.T) { } } - t.Log(spec.Programs["xdp_prog"].Instructions) + t.Log(have.Programs["xdp_prog"].Instructions) - if spec.Programs["xdp_prog"].ByteOrder != internal.NativeEndian { + if have.Programs["xdp_prog"].ByteOrder != internal.NativeEndian { return } - coll, err := NewCollectionWithOptions(spec, CollectionOptions{ + have.Maps["array_of_hash_map"].InnerMap = have.Maps["hash_map"] + coll, err := NewCollectionWithOptions(have, CollectionOptions{ Programs: ProgramOptions{ LogLevel: 1, }, @@ -104,81 +123,6 @@ func TestLoadCollectionSpec(t *testing.T) { }) } -func checkMapSpec(t *testing.T, maps map[string]*MapSpec, name string, want *MapSpec) { - t.Helper() - - have, ok := maps[name] - if !ok { - t.Errorf("Missing map %s", name) - return - } - - mapSpecEqual(t, name, have, want) -} - -func mapSpecEqual(t *testing.T, name string, have, want *MapSpec) { - t.Helper() - - if have.Type != want.Type { - t.Errorf("%s: expected type %v, got %v", name, want.Type, have.Type) - } - - if have.KeySize != want.KeySize { - t.Errorf("%s: expected key size %v, got %v", name, want.KeySize, have.KeySize) - } - - if have.ValueSize != want.ValueSize { - t.Errorf("%s: expected value size %v, got %v", name, want.ValueSize, have.ValueSize) - } - - if have.MaxEntries != want.MaxEntries { - t.Errorf("%s: expected max entries %v, got %v", name, want.MaxEntries, have.MaxEntries) - } - - if have.Flags != want.Flags { - t.Errorf("%s: expected flags %v, got %v", name, want.Flags, have.Flags) - } - - switch { - case have.InnerMap != nil && want.InnerMap == nil: - t.Errorf("%s: extraneous InnerMap", name) - case have.InnerMap == nil && want.InnerMap != nil: - t.Errorf("%s: missing InnerMap", name) - case have.InnerMap != nil && want.InnerMap != nil: - mapSpecEqual(t, name+".InnerMap", have.InnerMap, want.InnerMap) - } -} - -func checkProgramSpec(t *testing.T, progs map[string]*ProgramSpec, name string, want *ProgramSpec) { - t.Helper() - - have, ok := progs[name] - if !ok { - t.Fatalf("Missing program %s", name) - return - } - - if have.ByteOrder == nil { - t.Errorf("%s: nil ByteOrder", name) - } - - if have.License != want.License { - t.Errorf("%s: expected %v license, got %v", name, want.License, have.License) - } - - if have.Type != want.Type { - t.Errorf("%s: expected %v program, got %v", name, want.Type, have.Type) - } - - if want.Instructions != nil && !reflect.DeepEqual(have.Instructions, want.Instructions) { - t.Log("Expected program") - t.Log(want.Instructions) - t.Log("Actual program") - t.Log(want.Instructions) - t.Error("Instructions do not match") - } -} - func TestCollectionSpecDetach(t *testing.T) { coll := Collection{ Maps: map[string]*Map{ diff --git a/go.mod b/go.mod index 1de5ffc26..2d1004425 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/cilium/ebpf go 1.14 -require golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 +require ( + github.com/google/go-cmp v0.5.2 + golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 +) diff --git a/go.sum b/go.sum index e8b62417e..47dd82f29 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,6 @@ +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 h1:1/DFK4b7JH8DmkqhUk48onnSfrPzImPoVxuomtbT2nk= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/testdata/common.h b/testdata/common.h index 206235806..98609523e 100644 --- a/testdata/common.h +++ b/testdata/common.h @@ -7,7 +7,7 @@ typedef unsigned long uint64_t; #define __uint(name, val) int(*name)[val] #define __type(name, val) typeof(val) *name -#define BPF_MAP_TYPE_ARRAY (1) +#define BPF_MAP_TYPE_HASH (1) #define BPF_MAP_TYPE_PERF_EVENT_ARRAY (4) #define BPF_MAP_TYPE_ARRAY_OF_MAPS (12) #define BPF_MAP_TYPE_HASH_OF_MAPS (13) diff --git a/testdata/invalid_map.c b/testdata/invalid_map.c index d5cf472e9..2bf0ad31c 100644 --- a/testdata/invalid_map.c +++ b/testdata/invalid_map.c @@ -11,7 +11,7 @@ struct { } invalid_map __section("maps") = { .def = { - .type = BPF_MAP_TYPE_ARRAY, + .type = BPF_MAP_TYPE_HASH, .key_size = 4, .value_size = 2, .max_entries = 1, diff --git a/testdata/loader-clang-6.0-eb.elf b/testdata/loader-clang-6.0-eb.elf index dee65b876dacf531ef21c705d1bf5dfcea02bd55..155fe329349c627cf077ed0c47d8c06711b7861b 100644 GIT binary patch literal 7840 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 diff --git a/testdata/loader-clang-7-el.elf b/testdata/loader-clang-7-el.elf index ee01ba44979b3ea12c9cd77850e14d44900c2ac6..0c1699a686a657e97f35b33f1c535d8403b2e700 100644 GIT binary patch literal 8016 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 literal 8192 zcmbtYZ)_Y#6@Po@b)NKixo0Uw+XAo`)G6-5XkL=Xaj_<)2cqJdWC{buLw z&duFLNIYqF=J$K=&3ijLJ2Sh_PM&#R#BoT(p?^_`geAJu7q%xQazBHF~{+Z?}7`}-`>^V|Ss+P(EZ+P!%nJIM><#bz5d_n{Mz z`#L*yLFLiJJo1+`QG-J*{ASH@r8v~>Twn)*9VDB}iNx;%v##ZS4zuXnb<46kmD4IgQAc0ytfc^I7*pP zDRVVlSV#vkRKq0Tlq(c2uNKo@&Re0yTwyMgOE2U{2^j=%ENoJ_lBq0b*@o8Ui|Jyi zut@nry5!{wSymMC9Cwjc*?nv@t!`ojcQT60m_OXc)uD5O^n9l%J>$G2KS%|3>1xrVLQH#cL);Y~BQ89_WpIc2cxR497*=a@< z!*WWL=iLI&Ly>Nm=f~gRUh}_?GWe{Fu1rP?=nj(HC zr`oUa6+=w)9hw@Xs~iKhuDh z#Y@zZzrB46e@hH?E&TTz@OK*UvKES3`uUX*x)%N~4S2lPrieZE22+IZX~5gx4`TmN z1N%oC@Z$~mi3a=!8t^j>_$M3ivkiF9;(wtAB|@?;m}3+TzA#LdU*O;i#OBquQcW_7 zk~%Qd;rZZIN22O0r&bZAj#`o#K7%&k`K(w+qSRl*{)3sge~78lttq~R_EfQ?_UJf| zj~yA$3A`;w6)#_Iq4o>hjFURWge134Df^b1_5ZWl{z#QI5%$b@opJuH;%lGFwD!kJ zhShvRV@!_}mn8!abNhycU)C7@`*j-?{1aSaTp)tGeHh^F7MAf9d&GnYKI+2&Pg;1^ zz=Pa2^9L?ldRZ^gKlHNh0VlY8l?z1hH+&f2?^syYFR}lnrN3+8KU+9B)-k`6ODj5J zK?NL~^E6Ib`rzQF^%pF?I?l5W&ubSKoHHQ6FqOk6FlKKr7YOiPE&~88z&I=7D+mHS z#N`nH7GTWsaR3(dy^qTo02b&m8_xr<03$bbB-a?L#R3-y{4pO304%V_D)3PN7GTV^ zPXVw1qkJBK1#PS{F9NUte@fDCYF#Hz{4F9sms1jU0Y3MN*UNA8HZx|TGw_3q?->~ScMQCPaSW53MaFZpfss$2#&COx%WgxD z-DAYSI4d79u&ixN2hY=94>4yT=s&?l&hLW3L4XIjnCl}j<{$+6om>tAun3+|$j8Y4 zl!eXp0PnJm<@}HFL2Ns}{klKVoB1HW_gZ>0eu8yRS^8Oxk$-|qMPuoIO=G#g7cBh^ zLy!A?+`tKL+w1@53_Zs0=LUva@9ek+F`xWT7vGMBrulFrP}^B?3z@0bS(I|9}US-J>>sag>!ebP7kyC==Tv!7(*d#b|HX7dH?9kz>zIYH zH`Jcq_czjqJVf3*ABFyc@t)N4|Ft%FMGSQ<@r5pOqh9`} zbb=Gw5cy-@7JtbfYhk_kH$k$9osU9)!T;n2Ozmg*vi5HhLtSe+U=!S`=YLxpP6w8L z!|pGw{fBKky`Dd91r#XtPHsrs>>{sk=ow3CLE6DYz48CF9yl3Cj6cpX_V}YeyHDhC zSKsI!OKCy+Rs;V{`h~!+I#X=_Tdb^?{~mpyEb4JU{y4YU`JZFX?vp7xtqo@Z46$wT z2d-ZHFY8~QH?=R~V@U1zI2YP|!sV7Wv~@PdcZtox|C`$X4FE%I+e56Ym;XV10N2w% ztsgiC+WGHg&h8W8KA}6s_?lwd;#;6z{8M$}V@U1zUEHDFC*r-XJG}{Di1-WD&d&AX zU)1sMXhS?dEa~DeKl-)(V>@2_6?=k%LagqLHU-&O7Tx*&D diff --git a/testdata/loader-clang-8-eb.elf b/testdata/loader-clang-8-eb.elf index 4e14ea57b538bd6ecd9d05d0d1845c61b688f246..a669b1e280fb9c8a538c83e13989ffa9fb14cc50 100644 GIT binary patch literal 10000 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 VqPP7Dd;d0_fq*{!Rw3i}{0}mbg!}*i literal 10152 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 diff --git a/testdata/loader-clang-8-el.elf b/testdata/loader-clang-8-el.elf index 8f9fa45a3b59f60cc05c8ca179dab85f97d1eeec..94cbb7c42d21bff5fb47a6c8ab98d4120d68ebca 100644 GIT binary patch literal 10000 zcmbtZYiwLc8J&CA>-Z7B;yfHDz_n=-J4x4$9h!jCc2h`{v?;hr3Tb()H}?9Wu6NDu zCQZ`P22e$iAmmT~0BR#tL6P_osf8ASYX3o`JVXFhDhNSasEPyGI{%mNE^1JmJ%xc(f@q5a2V!Zp!Ys^4Q zYP|c62>Tkprt$nY=%v&OkZ+>?E)yTJN<9RHlBt2 z!K1nzb>KNfY?Bn>*e}XT6mk^d#`D?2RB$p^D$f)P!S2*xYRC2O5Be(Esq(<#eTVk# zJ+d#edvM3VlbM&s!eVL4!&X%V$v)MUSIX#zCCko}6sX}fd zm?>1$J-O4F^30i>I+@L%$c5@`_EaWUsFY@MWre8BWFAdasFXP}6S>JK;gHIfO4-wy z;$$YOgFg9U@tzZNnOr_MtETeBvM{7rVFZU`Rh28*%FH-?)TxQN%v`BBr3%GN zDVHyf!%!@snkjVx;lo22-R2!^_z-`F!$HQcnYJpSKJ7g!z|2wHsL{yLQN-0#cZj-7 zl$g3q7DS0U7f~N|s!(Dwj~tqFhp1@&2)XK;zn(mY;= zx2d%=nP_cax1qJeyK@~T?oO3xJ=l5k`VTaZH2Y{w!t)MxVq*8GgPpsYl}cU*hnt$4 zq1IDvZoUcXicXIzgK$$?bPj^ufQ@0w(ALz3JW4gMLDntn@z5kSZfQevTQ}pUErnLC zs!w+%S{borJsX1sF{%7@A;tKPrCv&{T1(4)aGPN!EMyyfkp>Q>uXCt&iRH`n}rk z)U)yl82#1ZB-i?yx|mOxPqRzf|%@&$woHiZ>()Y(`&di*P*K` zlk%flnwp@u@+N6%$FFxcRd09$G7@X?hI?5-{*^zW>8h=1fU7ly61MdEBu>yQ4$Qxg0*+R1W1 z>V1~uj%mfquR`79v<*-waBCs{18mUM9~b+0uY`D|biwt1)!6mqt&;CQ#;zw~75j=X z@k*XjjOg}s7~XoUG~aFbR`JGCM3wiq1BHF*3w@$~?lGACLp!{^z_>?stATHa9yU>_ z!$uFlf86M4=#xetgI+TFS?ET5nFz?!Vh&ykYo->t0!TIFxrB;@T~AeVrz&r;!DHt) z2LbGVK_-)}U}rvlqLRyG`uYmRnL>W1kn8UcqK$Q^Pj<=x+h%`opK2`SDkn+>!fo3| zRIxIhD{(VkCR-*`&W&^H?d#R=z8q(!R%2j~jd* zxI68sr!CwCykKD;m}4Yk!ghTIMg1-uU*cy`T3!gpMz9ae?sLp2t z-o5{dAp=kURY=fy75jmOyMfad?gBnw;qAc3EW8zX%)&nKoWUPv1AnO0DTBWZ>@NW5 zcRs#H*5TeY+~2IY)7a8(fXlPx6ye2hOtUf17Er`4{voUMA&0uli~sLot5YfbHhA8@ zTU(R|0YdS>M%xUi@#5@kv5=b9cSAMemWPrU@{)d2Pf~43HsaD-hqMo#P=Qy>Jyh$kn}et+x8{>&B?aJ znOl?omSp#h$u3mpFAe`S!u_UB-)D`>3hj03@A{jA?Rb-pv(6&MD7>D5R)FxkEsm=2 zAFIJc)h|{5#oQu@&6`#eEhlV0z(sv z4xVwcggz_BShPg={vt5CCiI#b!AMC&Yji|uC81<5b9q^XTwc!3E-$NM%>Ni_hu#-M zj;DUgCs8`E-*UyL$oltn=&LXeQu7#%5Nw8;4^h0HzDM(tHQZ6?!{?LvMI`@L_>&hb z*Yj{(WsRHEe@XNDJyEB+Y!Z%|D_5ZFQPKwUc5}6!wlLSC3l3&p3gfqFE&O48fYJ~` zy_OTpn~T`r<=ACiqrC?uZP|%$bMO%d7c3k=Kk4AlI{1qYe$2t&aqv?Pmi3424N#)@ zdFZ_;FQHIqCyrk54VLvn?9m&)vGYDt#9kjlJ>Hw3%iAi)-$#+J4#YeG$qXmv9PLJ- z5OcO|CV&uAmwQOe*|H0T!utDB4iP|TXIo_aiFpFL8-+s5dp}74VLazkkpMz_8_K-| z5Ms`9*u-^W#`zx&tP79P(Enc`E1DgEAfXd zJL5lPFfRd0-m>#v-)mvkf1iaJ{{@422~Zxk?CXFpTA1;VS(x#c4CaON`5DX3Rr4nn z-U$4hg_-X+7Ur|hw;qc0_s8nDMV$nC(e$(nCnU7p22s=EK)owb8;{Bez(1 z1F#6=0~B|?;+&y~U3Lb+fwqSB9_W0=D6|s~5y8?Z^|iC(Mu-Ck z4>~yQ;86!pTet`LPC59TgD+Y*fWORlsET;Ov0riU3l6^OV7*8)86-ey_o;;v;1W1^ z(7|a3b52t@-?yN+^K(0m5U~%2P_bD(C^CPO6DUaWBDy^>Ax9`>uh#>rZ8Ew zb7{Qz--po$$7=s+Oy%<@XEWJ}3H)Pr3Sa%?->JIYVe|Nj)vjW)l$~8f;2)Lo3v>$Y zuVjy_RQdF*zM}K?moNFaXMGMEGGqGxT=;L9M3n@;;35vWnG?bi2kO0(9M2TCqzyQ0 zlh9?I7Mf>?_>?Rx{LBHU-B4Wf`3On8@E-wJt^Nh@6nU;f6vqp`3re;4=Z(Wo0;L1X|FW+Wa?f`A|1!90^c4DWuosLY>*th~cv%ZzC>;FEu u#Gz}P24_(sxoqOiG}QBlMz?-`d3SD+&T)({b&yNuIb>WviqtRb`u_mziG$Ao literal 10152 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 literal 11888 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 T0lRE(gxhnd=_Btrl0WxXz1wS#-t8W{ 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 9 +// Clang < 9 doesn't emit the necessary BTF for this to work. +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, uint32_t); + __type(value, uint64_t); + __uint(max_entries, 1); + __uint(map_flags, BPF_F_NO_PREALLOC); +} hash_map __section(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH); + __uint(key_size, sizeof(uint32_t)); + __uint(value_size, sizeof(uint64_t)); + __uint(max_entries, 2); +} hash_map2 __section(".maps"); +#else struct bpf_map_def hash_map __section("maps") = { - .type = BPF_MAP_TYPE_ARRAY, - .key_size = 4, - .value_size = 2, + .type = BPF_MAP_TYPE_HASH, + .key_size = sizeof(uint32_t), + .value_size = sizeof(uint64_t), .max_entries = 1, - .map_flags = 0, + .map_flags = BPF_F_NO_PREALLOC, }; struct bpf_map_def hash_map2 __section("maps") = { - .type = BPF_MAP_TYPE_ARRAY, - .key_size = 4, - .value_size = 1, + .type = BPF_MAP_TYPE_HASH, + .key_size = sizeof(uint32_t), + .value_size = sizeof(uint64_t), .max_entries = 2, - .map_flags = BPF_F_NO_PREALLOC, }; +#endif struct bpf_map_def array_of_hash_map __section("maps") = { .type = BPF_MAP_TYPE_ARRAY_OF_MAPS, @@ -27,30 +44,6 @@ struct bpf_map_def array_of_hash_map __section("maps") = { .max_entries = 2, }; -struct bpf_map_def hash_of_hash_map __section("maps") = { - .type = BPF_MAP_TYPE_HASH_OF_MAPS, - .key_size = sizeof(uint32_t), - .max_entries = 2, -}; - -#if __clang_major__ >= 9 -// Clang < 9 doesn't emit the necessary BTF for this to work. -struct { - __uint(type, BPF_MAP_TYPE_ARRAY); - __type(key, uint32_t); - __type(value, uint32_t); - __uint(max_entries, 1); - __uint(map_flags, BPF_F_NO_PREALLOC); -} btf_map __section(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_ARRAY); - __uint(key_size, 4); - __uint(value_size, 4); - __uint(max_entries, 1); -} btf_map2 __section(".maps"); -#endif - static int __attribute__((noinline)) static_fn(uint32_t arg) { return arg; }