summaryrefslogtreecommitdiffhomepage
path: root/server/peer.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/peer.go')
-rw-r--r--server/peer.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/server/peer.go b/server/peer.go
index 362482a7..8c62d105 100644
--- a/server/peer.go
+++ b/server/peer.go
@@ -17,6 +17,7 @@ package server
import (
"encoding/json"
+ "fmt"
log "github.com/Sirupsen/logrus"
"github.com/osrg/gobgp/api"
"github.com/osrg/gobgp/config"
@@ -101,6 +102,9 @@ func NewPeer(g config.Global, peer config.Neighbor, serverMsgCh chan *serverMsg,
LocalID: g.RouterId,
Address: peer.NeighborAddress,
}
+ if isGlobalRib {
+ p.peerInfo.ID = g.RouterId
+ }
rfList := p.configuredRFlist()
p.adjRib = table.NewAdjRib(rfList)
p.rib = table.NewTableManager(p.peerConfig.NeighborAddress.String(), rfList)
@@ -287,6 +291,67 @@ func (peer *Peer) sendMessages(msgs []*bgp.BGPMessage) {
func (peer *Peer) handleREST(restReq *api.RestRequest) {
result := &api.RestResponse{}
switch restReq.RequestType {
+ case api.REQ_GLOBAL_ADD, api.REQ_GLOBAL_DELETE:
+ rf := restReq.RouteFamily
+ prefixes := restReq.Data["prefix"].([]string)
+ var isWithdraw bool
+ if restReq.RequestType == api.REQ_GLOBAL_DELETE {
+ isWithdraw = true
+ }
+
+ pList := make([]table.Path, 0, len(prefixes))
+ for _, prefix := range prefixes {
+ var nlri bgp.AddrPrefixInterface
+ pattr := make([]bgp.PathAttributeInterface, 0)
+ pattr = append(pattr, bgp.NewPathAttributeOrigin(bgp.BGP_ORIGIN_ATTR_TYPE_IGP))
+ asparam := bgp.NewAs4PathParam(bgp.BGP_ASPATH_ATTR_TYPE_SEQ, []uint32{peer.peerInfo.AS})
+ pattr = append(pattr, bgp.NewPathAttributeAsPath([]bgp.AsPathParamInterface{asparam}))
+
+ if rf == bgp.RF_IPv4_UC {
+ ip, net, _ := net.ParseCIDR(prefix)
+ if ip.To4() == nil {
+ result.ResponseErr = fmt.Errorf("Invalid ipv4 prefix: %s", prefix)
+ restReq.ResponseCh <- result
+ close(restReq.ResponseCh)
+ return
+ }
+ ones, _ := net.Mask.Size()
+ nlri = &bgp.NLRInfo{
+ IPAddrPrefix: *bgp.NewIPAddrPrefix(uint8(ones), ip.String()),
+ }
+
+ pattr = append(pattr, bgp.NewPathAttributeNextHop("0.0.0.0"))
+
+ } else if rf == bgp.RF_IPv6_UC {
+ ip, net, _ := net.ParseCIDR(prefix)
+ if ip.To16() == nil {
+ result.ResponseErr = fmt.Errorf("Invalid ipv6 prefix: %s", prefix)
+ restReq.ResponseCh <- result
+ close(restReq.ResponseCh)
+ return
+ }
+ ones, _ := net.Mask.Size()
+ nlri = bgp.NewIPv6AddrPrefix(uint8(ones), ip.String())
+
+ pattr = append(pattr, bgp.NewPathAttributeMpReachNLRI("::", []bgp.AddrPrefixInterface{nlri}))
+
+ } else {
+ result.ResponseErr = fmt.Errorf("Unsupported address family: %s", rf)
+ restReq.ResponseCh <- result
+ close(restReq.ResponseCh)
+ return
+ }
+
+ p := table.CreatePath(peer.peerInfo, nlri, pattr, isWithdraw, time.Now())
+ pList = append(pList, p)
+ }
+
+ pm := &peerMsg{
+ msgType: PEER_MSG_PATH,
+ msgData: pList,
+ }
+ peer.peerMsgCh <- pm
+
case api.REQ_LOCAL_RIB, api.REQ_GLOBAL_RIB:
// just empty so we use ipv4 for any route family
j, _ := json.Marshal(table.NewIPv4Table(0))