/goisis

IS-IS written in Go

Primary LanguageGo

README

Go IS-IS Routing Protocol

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. :)

Basic Structure

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.

Go Routines

  • 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).

No Locks

The code has no locks. It fully utilizes go’s channels to communicate rather than share memory.

Circuits and Links

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.

Mgmt/Yang

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

External Dependencies

  • Adaptive Radix Trie (“github.com/plar/go-adaptive-radix-tree”)
  • Gorilla Mux for serving up state (“github.com/gorilla/mux”)

Implementation notes

  • 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

Missing Items

Immediate need

  • Implement P2P interfaces (RFC5303 3-way, RFC5309 p2pOverLAN)

Want

  • RFC 5304 - Cryptographic Authentication
  • RFC 5306 Restart signaling (neighbor support)
  • RFC 5310 - Generic Cryptographic Authentication
  • Maybe Implement Decision Process (SPF)

Maybe

  • RFC 5307 - GMPLS

Maybe never.

  • RFC 5302 - Domain wide distribution, no route leaking.
  • RFC 5306 - Restart signaling (local support)
  • RFC 5311 - Simplifiied Extension of LSP space?