import org.opendaylight.vpnservice.mdsalutil.InstructionType;
import org.opendaylight.vpnservice.mdsalutil.MatchFieldType;
import org.opendaylight.vpnservice.mdsalutil.MatchInfo;
-import org.opendaylight.vpnservice.mdsalutil.MetaDataUtil;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.L3tunnel;
+import org.opendaylight.vpnservice.mdsalutil.NwConstants;
+
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstanceKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInstance1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.ReleaseIdInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.ReleaseIdInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.*;
import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.*;
import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.tunnelnexthops.*;
private final DataBroker broker;
private IMdsalApiManager mdsalManager;
private IInterfaceManager interfaceManager;
- private IdManager idManager;
+ private IdManagerService idManager;
private static final short LPORT_INGRESS_TABLE = 0;
private static final short LFIB_TABLE = 20;
private static final short FIB_TABLE = 21;
this.mdsalManager = mdsalManager;
}
- public void setIdManager(IdManager idManager) {
+ public void setIdManager(IdManagerService idManager) {
this.idManager = idManager;
}
protected void createNexthopPointerPool() {
CreateIdPoolInput createPool = new CreateIdPoolInputBuilder()
- .setPoolName("nextHopPointerPool")
- .setIdStart(1L)
- .setPoolSize(new BigInteger("65535"))
- .build();
+ .setPoolName("nextHopPointerPool")
+ .setLow(150000L)
+ .setHigh(175000L)
+ .build();
//TODO: Error handling
Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
LOG.trace("NextHopPointerPool result : {}", result);
-// try {
-// LOG.info("Result2: {}",result.get());
-// } catch (InterruptedException | ExecutionException e) {
-// // TODO Auto-generated catch block
-// LOG.error("Error in result.get");
-// }
-
}
}
}
- private long getDpnId(String ifName) {
- String[] fields = ifName.split(":");
- long dpn = Integer.parseInt(fields[1]);
+ private BigInteger getDpnId(String ofPortId) {
+ String[] fields = ofPortId.split(":");
+ BigInteger dpn = new BigInteger(fields[1]);
LOG.debug("DpnId: {}", dpn);
return dpn;
}
- protected int createNextHopPointer(String nexthopKey) {
- GetUniqueIdInput getIdInput = new GetUniqueIdInputBuilder()
- .setPoolName("nextHopPointerPool").setIdKey(nexthopKey)
- .build();
+ protected long createNextHopPointer(String nexthopKey) {
+ AllocateIdInput getIdInput = new AllocateIdInputBuilder()
+ .setPoolName("nextHopPointerPool").setIdKey(nexthopKey)
+ .build();
//TODO: Proper error handling once IdManager code is complete
try {
- Future<RpcResult<GetUniqueIdOutput>> result = idManager.getUniqueId(getIdInput);
- RpcResult<GetUniqueIdOutput> rpcResult = result.get();
- return rpcResult.getResult().getIdValue().intValue();
+ Future<RpcResult<AllocateIdOutput>> result = idManager.allocateId(getIdInput);
+ RpcResult<AllocateIdOutput> rpcResult = result.get();
+ return rpcResult.getResult().getIdValue();
} catch (NullPointerException | InterruptedException | ExecutionException e) {
LOG.trace("",e);
}
public void createLocalNextHop(String ifName, String vpnName, String ipAddress, String macAddress) {
String nhKey = new String("nexthop." + vpnName + ipAddress);
- int groupId = createNextHopPointer(nhKey);
+ long groupId = createNextHopPointer(nhKey);
long vpnId = getVpnId(vpnName);
- long dpnId = interfaceManager.getDpnForInterface(ifName);
+ BigInteger dpnId = interfaceManager.getDpnForInterface(ifName);
VpnNexthop nexthop = getVpnNexthop(vpnId, ipAddress, 0);
LOG.trace("nexthop: {}", nexthop);
if (nexthop == null) {
}
}
- public void createRemoteNextHop(String ifName, String ofPortId, String ipAddress) {
+ public void createRemoteNextHop(String ifName, String ipAddress) {
String nhKey = new String("nexthop." + ifName + ipAddress);
- int groupId = createNextHopPointer(nhKey);
+ long groupId = createNextHopPointer(nhKey);
- long dpnId = getDpnId(ofPortId);
+ BigInteger dpnId = interfaceManager.getDpnForInterface(ifName);
TunnelNexthop nexthop = getTunnelNexthop(dpnId, ipAddress);
if (nexthop == null) {
List<BucketInfo> listBucketInfo = new ArrayList<BucketInfo>();
GroupEntity groupEntity = MDSALUtil.buildGroupEntity(
dpnId, groupId, ipAddress, GroupTypes.GroupIndirect, listBucketInfo);
mdsalManager.installGroup(groupEntity);
- addRemoteFlow(dpnId, ifName);
+ //makeRemoteFlow(dpnId, ifName, NwConstants.ADD_FLOW);
//update MD-SAL DS
addTunnelNexthopToDS(dpnId, ipAddress, groupId);
}
}
- private void addRemoteFlow(long dpId, String ifName) {
-
- long portNo = interfaceManager.getPortForInterface(ifName);
- String flowRef = getTunnelInterfaceFlowRef(dpId, LPORT_INGRESS_TABLE, portNo);
-
- String flowName = ifName;
- BigInteger COOKIE_VM_INGRESS_TABLE = new BigInteger("8000001", 16);
-
- int priority = DEFAULT_FLOW_PRIORITY;
- short gotoTableId = LFIB_TABLE;
-
- List<InstructionInfo> mkInstructions = new ArrayList<InstructionInfo>();
- mkInstructions.add(new InstructionInfo(InstructionType.goto_table, new long[] { gotoTableId }));
-
- List<MatchInfo> matches = new ArrayList<MatchInfo>();
- matches.add(new MatchInfo(MatchFieldType.in_port, new long[] {
- dpId, portNo }));
+ private void makeRemoteFlow(BigInteger dpnId, String ifName, int addOrRemoveFlow) {
+ long portNo = 0;
+ String flowName = ifName;
+ String flowRef = getTunnelInterfaceFlowRef(dpnId, LPORT_INGRESS_TABLE, ifName);
+ List<MatchInfo> matches = new ArrayList<MatchInfo>();
+ List<InstructionInfo> mkInstructions = new ArrayList<InstructionInfo>();
+ if (NwConstants.ADD_FLOW == addOrRemoveFlow) {
+ portNo = interfaceManager.getPortForInterface(ifName);
+ matches.add(new MatchInfo(MatchFieldType.in_port, new BigInteger[] {
+ dpnId, BigInteger.valueOf(portNo) }));
+ mkInstructions.add(new InstructionInfo(InstructionType.goto_table, new long[] {LFIB_TABLE}));
+ }
- FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpId, LPORT_INGRESS_TABLE, flowRef,
- priority, flowName, 0, 0, COOKIE_VM_INGRESS_TABLE, matches, mkInstructions);
+ BigInteger COOKIE_VM_INGRESS_TABLE = new BigInteger("8000001", 16);
+ FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpnId, LPORT_INGRESS_TABLE, flowRef,
+ DEFAULT_FLOW_PRIORITY, flowName, 0, 0, COOKIE_VM_INGRESS_TABLE, matches, mkInstructions);
+ if (NwConstants.ADD_FLOW == addOrRemoveFlow) {
mdsalManager.installFlow(flowEntity);
+ } else {
+ mdsalManager.removeFlow(flowEntity);
+ }
}
- private String getTunnelInterfaceFlowRef(long dpId, short tableId, long portNo) {
- return new StringBuilder().append(dpId).append(tableId).append(portNo).toString();
+ private String getTunnelInterfaceFlowRef(BigInteger dpnId, short tableId, String ifName) {
+ return new StringBuilder().append(dpnId).append(tableId).append(ifName).toString();
}
protected void addVpnNexthopToDS(long vpnId, String ipPrefix, long egressPointer) {
- InstanceIdentifierBuilder<VpnNexthops> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
+ InstanceIdentifierBuilder<VpnNexthops> idBuilder = InstanceIdentifier.builder(
+ L3nexthop.class)
.child(VpnNexthops.class, new VpnNexthopsKey(vpnId));
// Add nexthop to vpn node
}
- private void addTunnelNexthopToDS(long dpnId, String ipPrefix, long egressPointer) {
+ private void addTunnelNexthopToDS(BigInteger dpnId, String ipPrefix, long egressPointer) {
InstanceIdentifierBuilder<TunnelNexthops> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
.child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId));
return null;
}
- private TunnelNexthop getTunnelNexthop(long dpnId, String ipAddress) {
+ private TunnelNexthop getTunnelNexthop(BigInteger dpnId, String ipAddress) {
InstanceIdentifierBuilder<TunnelNexthops> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
.child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId));
return null;
}
- public long getNextHopPointer(long dpnId, long vpnId, String prefixIp, String nextHopIp) {
+ public long getNextHopPointer(BigInteger dpnId, long vpnId, String prefixIp, String nextHopIp) {
String endpointIp = interfaceManager.getEndpointIpForDpn(dpnId);
if (nextHopIp.equals(endpointIp)) {
VpnNexthop vpnNextHop = getVpnNexthop(vpnId, prefixIp, 0);
}
}
- private void removeTunnelNexthopFromDS(long dpnId, String ipPrefix) {
+ private void removeTunnelNexthopFromDS(BigInteger dpnId, String ipPrefix) {
InstanceIdentifierBuilder<TunnelNexthop> idBuilder = InstanceIdentifier.builder(L3nexthop.class)
.child(TunnelNexthops.class, new TunnelNexthopsKey(dpnId))
}
- public void removeLocalNextHop(Long dpId, Long vpnId, String ipAddress) {
+ public void removeLocalNextHop(BigInteger dpnId, Long vpnId, String ipAddress) {
VpnNexthop nh = getVpnNexthop(vpnId, ipAddress, 0);
if (nh != null) {
// how to inform and remove dependent FIB entries??
// we need to do it before the group is removed
GroupEntity groupEntity = MDSALUtil.buildGroupEntity(
- dpId, nh.getEgressPointer(), ipAddress, GroupTypes.GroupIndirect, null);
+ dpnId, nh.getEgressPointer(), ipAddress, GroupTypes.GroupIndirect, null);
// remove Group ...
mdsalManager.removeGroup(groupEntity);
//update MD-SAL DS
}
- public void removeRemoteNextHop(long dpnId, String ipAddress) {
+ public void removeRemoteNextHop(BigInteger dpnId, String ifName, String ipAddress) {
TunnelNexthop nh = getTunnelNexthop(dpnId, ipAddress);
if (nh != null) {
dpnId, nh.getEgressPointer(), ipAddress, GroupTypes.GroupIndirect, null);
// remove Group ...
mdsalManager.removeGroup(groupEntity);
+ //makeRemoteFlow(dpnId, ifName, NwConstants.DEL_FLOW);
//update MD-SAL DS
removeTunnelNexthopFromDS(dpnId, ipAddress);
} else {
String endpointIp = interfaceManager.getEndpointIpForDpn(input.getDpnId());
LOG.trace("getEgressPointer: input {}, endpointIp {}", input, endpointIp);
- if (input.getNexthopIp().equals(endpointIp)) {
+ if (input.getNexthopIp() == null || input.getNexthopIp().equals(endpointIp)) {
VpnNexthop vpnNextHop = getVpnNexthop(input.getVpnId(), input.getIpPrefix(), 5);
output.setEgressPointer(vpnNextHop.getEgressPointer());
output.setLocalDestination(true);
}
- private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
+ <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
InstanceIdentifier<T> path) {
ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
private <T extends DataObject> void asyncWrite(LogicalDatastoreType datastoreType,
InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
WriteTransaction tx = broker.newWriteOnlyTransaction();
- tx.put(datastoreType, path, data, true);
+ tx.merge(datastoreType, path, data, true);
Futures.addCallback(tx.submit(), callback);
}
private <T extends DataObject> void syncWrite(LogicalDatastoreType datastoreType,
InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
WriteTransaction tx = broker.newWriteOnlyTransaction();
- tx.put(datastoreType, path, data, true);
+ tx.merge(datastoreType, path, data, true);
tx.submit();
}