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  }