This is a partial implementation of the IS-IS routing protocol (ISO 10589:2002) written in Go. Runs on Linux, OS X, *BSD.
Yes, this is what I occupy my time with for fun on PTO. :)
Is-IS is broken up into 3 processes by design, the Hello, Update and Decision processes. We have moved the update process to a separate sub-package to align with this design.
- One per circuit to read frames (pktflow.go:readPackets)
- One per circuit to write frames (pktflow.go:writePackets)
- One per LAN link (level) or per P2P link for receiving and sending hello frames
- One per LAN link (level) or per P2P link for processing SRM/SSN flags (flooding)
- One per level for Update Process (LSP DB) which also handles CSNP using a cache.
- One for circuit DB to handle interface changes, addressing (needs more work).
The code has no locks. It fully utilizes go’s channels to communicate rather than share memory.
The code calls an interface a “Circuit”. A “Link” then is level specific state for a Circuit. In particular adjacencies are associated with Links. In the case of a LAN Circuit there will be one Link per level. In the case of a point-to-point Circuit there will be only a single Link.
This is still a WIP. To get something in place I used mux and some basic URL routers that mostly correspond to the IS-IS yang data model. I’d like to come up with a better way to isolate all the back and forth between go routines being used by the getter code to be MP safe. Currently just using curl to fetch oper state.
$ curl 'http://localhost:8080/isis' | jq
- Adaptive Radix Trie (“github.com/plar/go-adaptive-radix-tree”)
- Gorilla Mux for serving up state (“github.com/gorilla/mux”)
- Modern only; no legacy {narrow metrics, 2-way p2p, clns/clnp routing}.
- Some extra functionality (RFCs)
- RFC 5301 Dyanmic Hostname
- RFC 5305 Extended Reachability
- RFC 5308 IPv6 supported
- RFC 6232 Purge origination
- Implement P2P interfaces (RFC5303 3-way, RFC5309 p2pOverLAN)
- RFC 5304 - Cryptographic Authentication
- RFC 5306 Restart signaling (neighbor support)
- RFC 5310 - Generic Cryptographic Authentication
- Maybe Implement Decision Process (SPF)
- RFC 5307 - GMPLS
- RFC 5302 - Domain wide distribution, no route leaking.
- RFC 5306 - Restart signaling (local support)
- RFC 5311 - Simplifiied Extension of LSP space?