github.com/cilium/cilium@v1.16.2/pkg/maps/worldcidrsmap/worldcidrs.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Cilium 3 4 package worldcidrsmap 5 6 import ( 7 "net" 8 "unsafe" 9 10 "github.com/cilium/cilium/pkg/ebpf" 11 "github.com/cilium/cilium/pkg/types" 12 ) 13 14 const ( 15 MapMaxEntries = 1 << 14 16 MapName4 = "cilium_world_cidrs4" 17 ) 18 19 // WorldCIDRKey4 is the key of a world CIDRs map. 20 type WorldCIDRKey4 struct { 21 // PrefixLen is full 32 bits of mask bits 22 PrefixLen uint32 23 IP types.IPv4 24 } 25 26 // WorldCIDRVal is the value of world CIDRs maps. 27 type WorldCIDRVal struct { 28 Exists uint8 29 } 30 31 // wolrdCIDRsMap is the internal representation of a world CIDRs map. 32 type worldCIDRsMap struct { 33 *ebpf.Map 34 } 35 36 var ( 37 WorldCIDRsMap *worldCIDRsMap 38 ) 39 40 // InitWorldCIDRsMap initializes the world CIDRs map. 41 func InitWorldCIDRsMap() error { 42 return initWorldCIDRsMap(MapName4, true) 43 } 44 45 // OpenWorldCIDRsMap initializes the world CIDRs map. 46 func OpenWorldCIDRsMap() error { 47 return initWorldCIDRsMap(MapName4, false) 48 } 49 50 // initWorldCIDRsMap initializes the world CIDR map. 51 func initWorldCIDRsMap(worldCIDRsMapName string, create bool) error { 52 var m *ebpf.Map 53 54 if create { 55 m = ebpf.NewMap(&ebpf.MapSpec{ 56 Name: worldCIDRsMapName, 57 Type: ebpf.LPMTrie, 58 KeySize: uint32(unsafe.Sizeof(WorldCIDRKey4{})), 59 ValueSize: uint32(unsafe.Sizeof(WorldCIDRVal{})), 60 MaxEntries: uint32(MapMaxEntries), 61 Pinning: ebpf.PinByName, 62 }) 63 64 if err := m.OpenOrCreate(); err != nil { 65 return err 66 } 67 } else { 68 var err error 69 70 if m, err = ebpf.LoadRegisterMap(worldCIDRsMapName); err != nil { 71 return err 72 } 73 } 74 75 WorldCIDRsMap = &worldCIDRsMap{ 76 m, 77 } 78 79 return nil 80 } 81 82 func NewWorldCIDRKey4(cidr *net.IPNet) WorldCIDRKey4 { 83 key := WorldCIDRKey4{} 84 85 ones, _ := cidr.Mask.Size() 86 copy(key.IP[:], cidr.IP.To4()) 87 key.PrefixLen = uint32(ones) 88 89 return key 90 } 91 92 func NewWorldCIDRVal() WorldCIDRVal { 93 return WorldCIDRVal{ 94 Exists: 1, 95 } 96 } 97 98 // Matches returns true if the cidr parameter matches the world CIDR key. 99 func (k *WorldCIDRKey4) Matches(cidr *net.IPNet) bool { 100 return k.GetCIDR().String() == cidr.String() 101 } 102 103 func (k *WorldCIDRKey4) GetCIDR() *net.IPNet { 104 return &net.IPNet{ 105 IP: k.IP.IP(), 106 Mask: net.CIDRMask(int(k.PrefixLen), 32), 107 } 108 } 109 110 // Add adds the givenCIDR to the map. 111 func (m *worldCIDRsMap) Add(cidr *net.IPNet) error { 112 key := NewWorldCIDRKey4(cidr) 113 val := NewWorldCIDRVal() 114 115 return m.Map.Update(key, val, 0) 116 } 117 118 // Delete deletes the given CIDR from the map. 119 func (m *worldCIDRsMap) Delete(cidr *net.IPNet) error { 120 key := NewWorldCIDRKey4(cidr) 121 122 return m.Map.Delete(key) 123 } 124 125 // WorldCIDRsIterateCallback represents the signature of the callback function 126 // expected by the IterateWithCallback method, which in turn is used to iterate 127 // all the keys/values of a world CIDR map. 128 type WorldCIDRsIterateCallback func(*WorldCIDRKey4, *WorldCIDRVal) 129 130 // IterateWithCallback iterates through all the keys/values of a world CIDRs 131 // map, passing each key/value pair to the cb callback. 132 func (m worldCIDRsMap) IterateWithCallback(cb WorldCIDRsIterateCallback) error { 133 return m.Map.IterateWithCallback(&WorldCIDRKey4{}, &WorldCIDRVal{}, 134 func(k, v interface{}) { 135 key := k.(*WorldCIDRKey4) 136 value := v.(*WorldCIDRVal) 137 138 cb(key, value) 139 }) 140 }