@Override public void parseAttribute(final ByteBuf buffer, final AttributesBuilder builder, final PeerSpecificParserConstraint constraint) throws BGPDocumentedException { try { final MpReachNlri mpReachNlri = this.reg.parseMpReach(buffer, constraint); final Attributes1 a = new Attributes1Builder().setMpReachNlri(mpReachNlri).build(); builder.addAugmentation(Attributes1.class, a); } catch (final BGPParsingException e) { throw new BGPDocumentedException("Could not parse MP_REACH_NLRI", BGPError.OPT_ATTR_ERROR, e); } }
@Nonnull @Override public final Update buildUpdate(final Collection<MapEntryNode> advertised, final Collection<MapEntryNode> withdrawn, final Attributes attr) { final UpdateBuilder ub = new UpdateBuilder(); final AttributesBuilder ab = new AttributesBuilder(attr); final CNextHop hop = ab.getCNextHop(); LOG.debug("cnextHop before={}", hop); // do not preserve next hop in attributes if we are using MpReach ab.setCNextHop(null); if (!advertised.isEmpty()) { final MpReachNlri mb = buildReach(advertised, hop); ab.addAugmentation(Attributes1.class, new Attributes1Builder().setMpReachNlri(mb).build()); LOG.debug("mpreach nexthop={}", mb); } if (!withdrawn.isEmpty()) { final MpUnreachNlri mb = buildUnreach(withdrawn); ab.addAugmentation(Attributes2.class, new Attributes2Builder().setMpUnreachNlri(mb).build()); LOG.debug("mpunrach mb={}", mb); } ub.setAttributes(ab.build()); LOG.debug("update {}", ub.build()); return ub.build(); }
private static Attributes createAttributes(final List<String> extCom, final boolean multiPathSupport, final Ipv4Prefix addressPrefix) { final AttributesBuilder attBuilder = new AttributesBuilder(); attBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build()); attBuilder.setAsPath(new AsPathBuilder().setSegments(Collections.emptyList()).build()); attBuilder.setMultiExitDisc(new MultiExitDiscBuilder().setMed((long) 0).build()); attBuilder.setLocalPref(new LocalPrefBuilder().setPref(100L).build()); attBuilder.setExtendedCommunities(createExtComm(extCom)); attBuilder.setUnrecognizedAttributes(Collections.emptyList()); final Ipv4PrefixesBuilder prefixes = new Ipv4PrefixesBuilder().setPrefix(addressPrefix); if (multiPathSupport) { prefixes.setPathId(new PathId(5L)); } attBuilder.addAugmentation(Attributes1.class, new Attributes1Builder().setMpReachNlri( new MpReachNlriBuilder().setCNextHop(NEXT_HOP).setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class) .setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( new DestinationIpv4CaseBuilder().setDestinationIpv4(new DestinationIpv4Builder() .setIpv4Prefixes(Collections.singletonList(prefixes.build())).build()).build()).build()).build()).build()); return attBuilder.build(); }