Skip to content
Snippets Groups Projects
Select Git revision
  • 017846eae9946a637608dd2516ac528bfd2b348c
  • master default protected
  • renovate/configure
  • 2-create-ospf-example
  • feature/isis
  • migrate-to-github-actions
  • aspath/convenience
  • hashroute/public
  • cmd/rismirror
  • riscli/vrf
  • fix/bmp_down
  • ris/logging
  • fix/ris_race
  • fix/bmp_metrics
  • please-go-vet
  • fix/lock_copy
  • fix/dedup_mem
  • add-get-routers-rpc
  • feature/bgp_md5
  • is-is/srv
  • feature/ris/lpm_any
  • v0.0.3-pre4
  • v0.0.3-pre3
  • v0.0.3-pre2
  • v0.0.3-pre1
  • v0.0.2-pre9
  • v0.0.2-pre8
  • v0.0.2-pre7
  • v0.0.2-pre6
  • v0.0.2-pre5
  • v0.0.2-pre4
  • v0.0.2-pre3
  • v0.0.2-pre2
  • v0.0.2-pre1
  • v0.0.1-pre10
  • v0.0.1-pre9
  • v0.0.1-pre7
  • v0.0.1-pre8
  • v0.0.1-pre6
  • v0.0.1-pre4
  • v0.0.1-pre5
41 results

server.go

Blame
  • user avatar
    Julian Kornberger authored and takt committed
    Package errors provides simple error handling primitives.
    Read more on https://github.com/pkg/errors
    017846ea
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    server.go 1.97 KiB
    package server
    
    import (
    	"fmt"
    	"io"
    	"net"
    	"sync"
    	"time"
    
    	"github.com/bio-routing/bio-rd/protocols/bgp/packet"
    	"github.com/bio-routing/bio-rd/routingtable/locRIB"
    	"github.com/pkg/errors"
    	log "github.com/sirupsen/logrus"
    	"github.com/taktv6/tflow2/convert"
    )
    
    const (
    	defaultBufferLen = 4096
    )
    
    type BMPServer struct {
    	routers       map[string]*router
    	routersMu     sync.RWMutex
    	reconnectTime uint
    }
    
    func NewServer() *BMPServer {
    	return &BMPServer{
    		routers: make(map[string]*router),
    	}
    }
    
    func (b *BMPServer) AddRouter(addr net.IP, port uint16, rib4 *locRIB.LocRIB, rib6 *locRIB.LocRIB) {
    	r := &router{
    		address:          addr,
    		port:             port,
    		reconnectTimeMin: 30,  // Suggested by RFC 7854
    		reconnectTimeMax: 720, // Suggested by RFC 7854
    		reconnectTimer:   time.NewTimer(time.Duration(0)),
    		rib4:             rib4,
    		rib6:             rib6,
    	}
    
    	b.routersMu.Lock()
    	b.routers[fmt.Sprintf("%s:%d", r.address.String(), r.port)] = r
    	b.routersMu.Unlock()
    
    	go func(r *router) {
    		for {
    			<-r.reconnectTimer.C
    			c, err := net.Dial("tcp", fmt.Sprintf("%s:%d", r.address.String(), r.port))
    			if err != nil {
    				log.Infof("Unable to connect to BMP router: %v", err)
    				if r.reconnectTime == 0 {
    					r.reconnectTime = r.reconnectTimeMin
    				} else if r.reconnectTime < r.reconnectTimeMax {
    					r.reconnectTime *= 2
    				}
    				r.reconnectTimer = time.NewTimer(time.Second * time.Duration(r.reconnectTime))
    				continue
    			}
    
    			r.reconnectTime = 0
    			r.con = c
    			r.serve()
    		}
    	}(r)
    }
    
    func recvMsg(c net.Conn) (msg []byte, err error) {
    	buffer := make([]byte, defaultBufferLen)
    	_, err = io.ReadFull(c, buffer[0:packet.MinLen])
    	if err != nil {
    		return nil, errors.Wrap(err, "Read failed")
    	}
    
    	l := convert.Uint32b(buffer[1:3])
    	if l > defaultBufferLen {
    		tmp := buffer
    		buffer = make([]byte, l)
    		copy(buffer, tmp)
    	}
    
    	toRead := l
    	_, err = io.ReadFull(c, buffer[packet.MinLen:toRead])
    	if err != nil {
    		return nil, errors.Wrap(err, "Read failed")
    	}
    
    	return buffer, nil
    }