func TestBMP(t *testing.T) { aspath1 := []bgp.AsPathParamInterface{ bgp.NewAs4PathParam(2, []uint32{1000000}), bgp.NewAs4PathParam(1, []uint32{1000001, 1002}), bgp.NewAs4PathParam(2, []uint32{1003, 100004}), } mp_nlri := []bgp.AddrPrefixInterface{bgp.NewIPv6AddrPrefix(100, "fe80:1234:1234:5667:8967:af12:8912:1023")} p := []bgp.PathAttributeInterface{ bgp.NewPathAttributeOrigin(3), bgp.NewPathAttributeAsPath(aspath1), bgp.NewPathAttributeMpUnreachNLRI(mp_nlri), } w := []*bgp.IPAddrPrefix{} n := []*bgp.IPAddrPrefix{} msg := bgp.NewBGPUpdateMessage(w, p, n) pList := ProcessMessage(msg, peerR1(), time.Now()) CreateUpdateMsgFromPaths(pList) }
func createUpdateMsgFromPath(path *Path, msg *bgp.BGPMessage) *bgp.BGPMessage { rf := path.GetRouteFamily() if rf == bgp.RF_IPv4_UC { nlri := path.GetNlri().(*bgp.IPAddrPrefix) if path.IsWithdraw { if msg != nil { u := msg.Body.(*bgp.BGPUpdate) u.WithdrawnRoutes = append(u.WithdrawnRoutes, nlri) return nil } else { return bgp.NewBGPUpdateMessage([]*bgp.IPAddrPrefix{nlri}, nil, nil) } } else { if msg != nil { u := msg.Body.(*bgp.BGPUpdate) u.NLRI = append(u.NLRI, nlri) } else { pathAttrs := path.GetPathAttrs() return bgp.NewBGPUpdateMessage(nil, pathAttrs, []*bgp.IPAddrPrefix{nlri}) } } } else { if path.IsWithdraw { if msg != nil { u := msg.Body.(*bgp.BGPUpdate) for _, p := range u.PathAttributes { if p.GetType() == bgp.BGP_ATTR_TYPE_MP_UNREACH_NLRI { unreach := p.(*bgp.PathAttributeMpUnreachNLRI) unreach.Value = append(unreach.Value, path.GetNlri()) } } } else { var nlris []bgp.AddrPrefixInterface attr := path.getPathAttr(bgp.BGP_ATTR_TYPE_MP_REACH_NLRI) if attr == nil { // for bmp post-policy attr = path.getPathAttr(bgp.BGP_ATTR_TYPE_MP_UNREACH_NLRI) nlris = attr.(*bgp.PathAttributeMpUnreachNLRI).Value } else { nlris = []bgp.AddrPrefixInterface{path.GetNlri()} } clonedAttrs := path.GetPathAttrs() for i, a := range clonedAttrs { if a.GetType() == bgp.BGP_ATTR_TYPE_MP_UNREACH_NLRI || a.GetType() == bgp.BGP_ATTR_TYPE_MP_REACH_NLRI { clonedAttrs[i] = bgp.NewPathAttributeMpUnreachNLRI(nlris) break } } return bgp.NewBGPUpdateMessage(nil, clonedAttrs, nil) } } else { if msg != nil { u := msg.Body.(*bgp.BGPUpdate) for _, p := range u.PathAttributes { if p.GetType() == bgp.BGP_ATTR_TYPE_MP_REACH_NLRI { reach := p.(*bgp.PathAttributeMpReachNLRI) reach.Value = append(reach.Value, path.GetNlri()) } } } else { attrs := make([]bgp.PathAttributeInterface, 0, 8) for _, p := range path.GetPathAttrs() { if p.GetType() == bgp.BGP_ATTR_TYPE_MP_REACH_NLRI { attrs = append(attrs, bgp.NewPathAttributeMpReachNLRI(path.GetNexthop().String(), []bgp.AddrPrefixInterface{path.GetNlri()})) } else { attrs = append(attrs, p) } } // we don't need to clone here but we // might merge path to this message in // the future so let's clone anyway. return bgp.NewBGPUpdateMessage(nil, attrs, nil) } } } return nil }