/fgbgp

Primary LanguageGoBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

FGBGP

This is a BGP library in Go.

Features

  • Decode/encode BGP messages
  • Maintain a connexion with peers
  • RIB data structure (add/remove IPv4/IPv6)
  • Event-based API
  • Encode/decode MRT format

Why use this library?

It was developped to have a flexible BGP server running on a cluster with load-balanced IPs and ready for scale. A full-table will use around 300MB of RAM.

This is not a fully integrated BGP daemon: it does not filter routes or automatically send BGP updates on the routes learned.

The behavior has to be implemented using the event-based API:

  • Peer status change
  • Update received

This library can also be used for standalone BGP Messages decoding, reading MRT files or storing updates into a RIB and perform lookups.

Supported BGP features

  • Add-path (decode/encode only, not storing into the RIB)
  • Route-refresh
  • Basic BGP attributes (Origin, MED...)
  • Aggregator

Supported MRT features

  • TABLEDUMPV2
  • MRT update
  • Status

Example

import (
    "fmt"
    server "fgbgp/server"
)

type Collector struct {

}

func (col *Collector) Notification(msg *messages.BGPMessageNotification, n *server.Neighbor) (bool) {
    return true
}

func (col *Collector) ProcessReceived(v interface{}, n *server.Neighbor) (bool, error) {
    return true, nil
}

func (col *Collector) ProcessSend(v interface{}, n *server.Neighbor) (bool, error) {
    return true, nil
}

func (col *Collector) ProcessUpdateEvent(e *messages.BGPMessageUpdate, n *server.Neighbor) (add bool) {

}

func main() {
    m := server.NewManager(65001, net.ParseIP("10.0.0.1"), false, false)
    m.UseDefaultUpdateHandler(10)
    col := &Collector{}
    m.SetEventHandler(&col)
    m.SetUpdateEventHandler(&col)
    err := m.NewServer(*BgpAddr)
    if err != nil {
        log.Fatal(err)
    } 
}