Skip to content

fast IP to CIDR lookup, longest prefix match in golang

License

Notifications You must be signed in to change notification settings

gaissmai/cidrtree

Folders and files

NameName
Last commit message
Last commit date

Latest commit

1479543 · Feb 3, 2024

History

42 Commits
Jan 5, 2024
Feb 4, 2023
Dec 29, 2023
Feb 4, 2023
Feb 3, 2024
Jan 10, 2024
Jan 10, 2024
Jan 10, 2024
Jan 5, 2024
Dec 29, 2023
Jan 10, 2024
Jan 10, 2024
Jan 10, 2024
Jan 10, 2024

Repository files navigation

package cidrtree

Go Reference GitHub release (latest SemVer) CI Coverage Status Stand With Ukraine License: MIT

ATTENTION

This package is frozen, please migrate to the even better package BART - BAlanced Routing Table

Overview

package cidrtree is a datastructure for IP routing tables (IPv4/IPv6) with fast lookup (longest prefix match).

The implementation is based on treaps, which have been augmented here for CIDRs. Treaps are randomized, self-balancing binary search trees. Due to the nature of treaps the lookups (readers) and the update (writer) can be easily decoupled. This is the perfect fit for a software router or firewall.

This package is a specialization of the more generic interval package of the same author, but explicit for CIDRs. It has a narrow focus with a specialized API for IP routing tables.

API

  import "github.com/gaissmai/cidrtree"

  type Table[V any] struct { // Has unexported fields.  }
    Table is an IPv4 and IPv6 routing table. The zero value is ready to use.

  func (t Table[V]) Lookup(ip netip.Addr) (lpm netip.Prefix, value V, ok bool)
  func (t Table[V]) LookupPrefix(pfx netip.Prefix) (lpm netip.Prefix, value V, ok bool)

  func (t *Table[V]) Insert(pfx netip.Prefix, value V)
  func (t *Table[V]) Delete(pfx netip.Prefix) bool
  func (t *Table[V]) Union(other Table[V])

  func (t Table[V]) InsertImmutable(pfx netip.Prefix, value V) *Table[V]
  func (t Table[V]) DeleteImmutable(pfx netip.Prefix) (*Table[V], bool)
  func (t Table[V]) UnionImmutable(other Table[V]) *Table[V]
  func (t Table[V]) Clone() *Table[V]

  func (t Table[V]) String() string
  func (t Table[V]) Fprint(w io.Writer) error

  func (t Table[V]) Walk(cb func(pfx netip.Prefix, value V) bool)