- recordBuilder.getLocatorRecord().add(
- new LocatorRecordBuilder().setLocalLocator(locatorObject.getRecord().isLocalLocator())
- .setRlocProbed(locatorObject.getRecord().isRlocProbed()).setWeight(locatorObject.getRecord().getWeight())
- .setPriority(locatorObject.getRecord().getPriority()).setMulticastWeight(locatorObject.getRecord().getMulticastWeight())
- .setMulticastPriority(locatorObject.getRecord().getMulticastPriority()).setRouted(true)
- .setLispAddressContainer(locatorObject.getRecord().getLispAddressContainer()).build());
- recordBuilder.setAction(locatorObject.getAction());
- recordBuilder.setAuthoritative(locatorObject.isAuthoritative());
- recordBuilder.setRecordTtl(locatorObject.getTtl());
+ for (LocatorRecord record : locatorObject.getRecords()) {
+ LispAddressContainer container = record.getLispAddressContainer();
+
+ // For non-ELP RLOCs, or when ELP policy is default, just add the locator and be done
+ if ((!(container.getAddress() instanceof LcafTrafficEngineeringAddress)) || elpPolicy.equalsIgnoreCase("default")) {
+ recordBuilder.getLocatorRecord().add(
+ new LocatorRecordBuilder().setLocalLocator(record.isLocalLocator()).setRlocProbed(record.isRlocProbed())
+ .setWeight(record.getWeight()).setPriority(record.getPriority()).setMulticastWeight(record.getMulticastWeight())
+ .setMulticastPriority(record.getMulticastPriority()).setRouted(true)
+ .setLispAddressContainer(container).build());
+ continue;
+ }
+
+ LispAddressContainer nextHop = getNextELPHop((LcafTrafficEngineeringAddress) container.getAddress(), itrRlocs);
+ if (nextHop != null) {
+ java.lang.Short priority = record.getPriority();
+ if (elpPolicy.equalsIgnoreCase("both")) {
+ recordBuilder.getLocatorRecord().add(
+ new LocatorRecordBuilder().setLocalLocator(record.isLocalLocator()).setRlocProbed(record.isRlocProbed())
+ .setWeight(record.getWeight()).setPriority(record.getPriority()).setMulticastWeight(record.getMulticastWeight())
+ .setMulticastPriority(record.getMulticastPriority()).setRouted(true)
+ .setLispAddressContainer(container).build());
+ // Make the priority of the added simple locator lower so that ELP is used by default if
+ // the xTR understands ELP. Exclude 255, since that means don't use for unicast forwarding
+ // XXX Complex cases like several ELPs with different priorities are not handled
+ if (priority != 254 || priority !=255) {
+ priority++;
+ }
+ }
+ // Build and add the simple RLOC
+ recordBuilder.getLocatorRecord().add(
+ new LocatorRecordBuilder().setLocalLocator(record.isLocalLocator()).setRlocProbed(record.isRlocProbed())
+ .setWeight(record.getWeight()).setPriority(priority).setMulticastWeight(record.getMulticastWeight())
+ .setMulticastPriority(record.getMulticastPriority()).setRouted(true)
+ .setLispAddressContainer(nextHop).build());
+ }
+ }