* @param vppNodeId VPP node where the bridge domain should be created
* @return {@link ListenableFuture}
*/
- ListenableFuture<Void> createVxlanBridgeDomainOnVppNode(@Nonnull String bridgeDomainName, VxlanVni vni, @Nonnull NodeId vppNodeId);
+ ListenableFuture<Void> createVxlanBridgeDomainOnVppNode(@Nonnull String bridgeDomainName, @Nonnull VxlanVni vni, @Nonnull NodeId vppNodeId);
/**
* Creates a bridge domain on VPP node and it also adds tunnels of the bridge domain to VLAN
import org.opendaylight.groupbasedpolicy.renderer.vpp.event.NodeOperEvent;
import org.opendaylight.groupbasedpolicy.renderer.vpp.manager.VppNodeManager;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
public class VppNodeListener implements DataTreeChangeListener<Node>, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(VppNodeListener.class);
+ private static final TopologyId TOPOLOGY_NETCONF = new TopologyId("topology-netconf");
private final ListenerRegistration<VppNodeListener> listenerRegistration;
private final VppNodeManager nodeManager;
this.eventBus = Preconditions.checkNotNull(eventBus);
// Register listener
final DataTreeIdentifier<Node> networkTopologyPath = new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
- InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class).child(Node.class).build());
+ InstanceIdentifier.builder(NetworkTopology.class)
+ .child(Topology.class, new TopologyKey(TOPOLOGY_NETCONF))
+ .child(Node.class)
+ .build());
listenerRegistration =
Preconditions.checkNotNull(dataBroker.registerDataTreeChangeListener(networkTopologyPath, this));
LOG.info("Network-Topology VppNodelistener registered");
}
@Override
- public ListenableFuture<Void> createVxlanBridgeDomainOnVppNode(@Nonnull String bridgeDomainName, VxlanVni vni,
- @Nonnull NodeId vppNodeId) {
+ public ListenableFuture<Void> createVxlanBridgeDomainOnVppNode(@Nonnull String bridgeDomainName,
+ @Nonnull VxlanVni vni, @Nonnull NodeId vppNodeId) {
TopologyVbridgeAugment topoAug = new TopologyVbridgeAugmentBuilder().setTunnelType(TunnelTypeVxlan.class)
.setArpTermination(false)
.setFlood(true)
package org.opendaylight.groupbasedpolicy.renderer.vpp.policy;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
private static final Logger LOG = LoggerFactory.getLogger(ForwardingManager.class);
@VisibleForTesting
static long WAIT_FOR_BD_CREATION = 10; // seconds
+ private long lastVxlanVni = 1L;
+ private final Map<String, VxlanVni> vxlanVniByBridgeDomain = new HashMap<>();
private final InterfaceManager ifaceManager;
private final BridgeDomainManager bdManager;
private final DataBroker dataBroker;
createVlanBridgeDomains(bd, bdConfig.get().getVlan(), vppNodes);
}
} else {
- createVxlanBridgeDomains(bd, null, vppNodes);
+ VxlanVni vxlanVni = vxlanVniByBridgeDomain.get(bd);
+ if (vxlanVni == null) {
+ vxlanVni = new VxlanVni(lastVxlanVni++);
+ vxlanVniByBridgeDomain.put(bd, vxlanVni);
+ }
+ createVxlanBridgeDomains(bd, vxlanVni, vppNodes);
}
}
}