Skip to content
Snippets Groups Projects
netlink.go 1.04 KiB
Newer Older
cedi's avatar
cedi committed
package protocolnetlink
cedi's avatar
cedi committed

import (
	"github.com/bio-routing/bio-rd/config"
	"github.com/bio-routing/bio-rd/routingtable"
	"github.com/bio-routing/bio-rd/routingtable/locRIB"
)

cedi's avatar
cedi committed
// Netlink is the netlink module which handles the entire NetlinkCommunication
type Netlink struct {
cedi's avatar
cedi committed
	locRib *locRIB.LocRIB

	writer *NetlinkWriter
	reader *NetlinkReader
}

cedi's avatar
cedi committed
// NewNetlink creates a new Netlink object and returns the pointer to it
func NewNetlink(options *config.Netlink, locRib *locRIB.LocRIB) *Netlink {
cedi's avatar
cedi committed

cedi's avatar
cedi committed
	n := &Netlink{
cedi's avatar
cedi committed
		locRib: locRib,
		writer: NewNetlinkWriter(options),
		reader: NewNetlinkReader(options),
	}
	return n
}

cedi's avatar
cedi committed
// Start the Netlink module
func (n *Netlink) Start() {
cedi's avatar
cedi committed
	// connect all RIBs
	options := routingtable.ClientOptions{
		BestOnly: false,
		EcmpOnly: false,
		MaxPaths: ^uint(0), // max int
	}

	// 1. from locRib to Kernel
	n.locRib.ClientManager.RegisterWithOptions(n.writer, options)

	// 2. from Kernel to locRib
cedi's avatar
cedi committed
	n.reader.ClientManager.RegisterWithOptions(n.locRib, options)

	// Listen for new routes from kernel
cedi's avatar
cedi committed
	go n.reader.Read()
}