func (u *Rib) DecodeFromBytes(data []byte) error { if len(data) < 4 { return fmt.Errorf("Not all RibIpv4Unicast message bytes available") } u.SequenceNumber = binary.BigEndian.Uint32(data[:4]) data = data[4:] afi, safi := bgp.RouteFamilyToAfiSafi(u.RouteFamily) if afi == 0 && safi == 0 { afi = binary.BigEndian.Uint16(data[:2]) safi = data[2] data = data[3:] } prefix, err := bgp.NewPrefixFromRouteFamily(afi, safi) if err != nil { return err } err = prefix.DecodeFromBytes(data) if err != nil { return err } u.Prefix = prefix data = data[prefix.Len():] entryNum := binary.BigEndian.Uint16(data[:2]) data = data[2:] u.Entries = make([]*RibEntry, 0, entryNum) for i := 0; i < int(entryNum); i++ { e := &RibEntry{} data, err = e.DecodeFromBytes(data) if err != nil { return err } u.Entries = append(u.Entries, e) } return nil }
func getNLRI(family bgp.RouteFamily, buf []byte) (bgp.AddrPrefixInterface, error) { afi, safi := bgp.RouteFamilyToAfiSafi(bgp.RouteFamily(family)) nlri, err := bgp.NewPrefixFromRouteFamily(afi, safi) if err != nil { return nil, err } if err := nlri.DecodeFromBytes(buf); err != nil { return nil, err } return nlri, nil }
func NewEOR(family bgp.RouteFamily) *Path { afi, safi := bgp.RouteFamilyToAfiSafi(family) nlri, _ := bgp.NewPrefixFromRouteFamily(afi, safi) return &Path{ info: &originInfo{ nlri: nlri, eor: true, }, filtered: make(map[string]PolicyDirection), } }
func ApiStruct2Path(p *gobgpapi.Path) ([]*Path, error) { nlris := make([]bgp.AddrPrefixInterface, 0, 1) if len(p.Nlri) == 0 { return nil, fmt.Errorf("path doesn't have nlri") } afi, safi := bgp.RouteFamilyToAfiSafi(bgp.RouteFamily(p.Family)) nlri, err := bgp.NewPrefixFromRouteFamily(afi, safi) if err != nil { return nil, err } if err := nlri.DecodeFromBytes(p.Nlri); err != nil { return nil, err } nlris = append(nlris, nlri) pattr := make([]bgp.PathAttributeInterface, 0, len(p.Pattrs)) for _, attr := range p.Pattrs { p, err := bgp.GetPathAttribute(attr) if err != nil { return nil, err } err = p.DecodeFromBytes(attr) if err != nil { return nil, err } pattr = append(pattr, p) } paths := make([]*Path, 0, len(nlris)) for _, nlri := range nlris { paths = append(paths, &Path{ Nlri: nlri, PathAttrs: pattr, Age: p.Age, Best: p.Best, IsWithdraw: p.IsWithdraw, Validation: p.Validation, SourceId: p.SourceId, NeighborIp: p.NeighborIp, Filtered: p.Filtered, Stale: p.Stale, }) } return paths, nil }