}
leaf vpnid { type yang:uuid; }
leaf-list router-ids { type yang:uuid; }
+ leaf provider-network-type { type provider-types; }
}
}
}
}
+ typedef provider-types {
+ type enumeration {
+ enum FLAT;
+ enum VLAN;
+ enum VXLAN;
+ enum GRE;
+ }
+ }
+
container intext-ip-port-map {
config true;
list ip-port-mapping {
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.networks.Networks;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.networks.NetworksKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ExternalNetworks;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ProviderTypes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
return flowEntity;
}
- private FlowEntity buildSNATFlowEntity(BigInteger dpId, String internalIp, String externalIp, long vpnId) {
+ private FlowEntity buildSNATFlowEntity(BigInteger dpId, String internalIp, String externalIp, long vpnId, Uuid externalNetworkId) {
LOG.info("Building SNAT Flow entity for ip {} ", internalIp);
+ ProviderTypes provType = NatUtil.getProviderTypefromNetworkId(dataBroker, externalNetworkId);
+ if (provType == null){
+ LOG.error("NAT Service : Unable to get Network Provider Type for network {}", externalNetworkId);
+ return null;
+ }
+
List<MatchInfo> matches = new ArrayList<>();
matches.add(new MatchInfo(MatchFieldType.metadata, new BigInteger[] {
MetaDataUtil.getVpnIdMetadata(vpnId), MetaDataUtil.METADATA_MASK_VRFID }));
LOG.warn("No MAC address found for floating IP {}", externalIp);
}
- Uuid subnetId = NatUtil.getSubnetIdForFloatingIp(port, externalIpv4Address);
- if (subnetId != null) {
- long groupId = NatUtil.createGroupId(NatUtil.getGroupIdKey(subnetId.getValue()), idManager);
- actionsInfo.add(new ActionInfo(ActionType.group, new String[] {String.valueOf(groupId)}));
+ if (provType != ProviderTypes.GRE){
+ Uuid subnetId = NatUtil.getSubnetIdForFloatingIp(port, externalIpv4Address);
+ if (subnetId != null) {
+ long groupId = NatUtil.createGroupId(NatUtil.getGroupIdKey(subnetId.getValue()), idManager);
+ actionsInfo.add(new ActionInfo(ActionType.group, new String[] {String.valueOf(groupId)}));
+ } else {
+ LOG.warn("No neutron Subnet found for floating IP {}", externalIp);
+ }
} else {
- LOG.warn("No neutron Subnet found for floating IP {}", externalIp);
+ LOG.trace("NAT Service : External Network Provider Type is {}, resubmit to FIB", provType.toString());
+ actionsInfo.add(new ActionInfo(ActionType.nx_resubmit, new String[] { Integer.toString(NwConstants.L3_FIB_TABLE) }));
}
instructions.add(new InstructionInfo(InstructionType.apply_actions, actionsInfo));
NwConstants.COOKIE_DNAT_TABLE, matches, instructions);
return flowEntity;
+
}
private void createDNATTblEntry(BigInteger dpnId, String internalIp, String externalIp, long routerId, long vpnId, long associatedVpnId) {
mdsalManager.removeFlow(flowEntity);
}
- private void createSNATTblEntry(BigInteger dpnId, String internalIp, String externalIp, long vpnId, long routerId, long associatedVpnId) {
+ private void createSNATTblEntry(BigInteger dpnId, String internalIp, String externalIp, long vpnId, long routerId, long associatedVpnId, Uuid externalNetworkId) {
FlowEntity pFlowEntity = buildPreSNATFlowEntity(dpnId, internalIp, externalIp, vpnId , routerId, associatedVpnId);
mdsalManager.installFlow(pFlowEntity);
- FlowEntity flowEntity = buildSNATFlowEntity(dpnId, internalIp, externalIp, vpnId);
+ FlowEntity flowEntity = buildSNATFlowEntity(dpnId, internalIp, externalIp, vpnId, externalNetworkId);
mdsalManager.installFlow(flowEntity);
}
createDNATTblEntry(dpnId, mapping.getInternalIp(), mapping.getExternalIp(), routerId, vpnId, associatedVpnId);
- createSNATTblEntry(dpnId, mapping.getInternalIp(), mapping.getExternalIp(), vpnId, routerId, associatedVpnId);
+ createSNATTblEntry(dpnId, mapping.getInternalIp(), mapping.getExternalIp(), vpnId, routerId, associatedVpnId, extNwId);
floatingIPHandler.onAddFloatingIp(dpnId, routerName, extNwId, interfaceName, mapping.getExternalIp(), mapping
.getInternalIp());
//Create the DNAT and SNAT table entries
createDNATTblEntry(dpnId, internalIp, externalIp, routerId, vpnId, associatedVpnId);
- createSNATTblEntry(dpnId, internalIp, externalIp, vpnId, routerId, associatedVpnId);
+ createSNATTblEntry(dpnId, internalIp, externalIp, vpnId, routerId, associatedVpnId, externalNetworkId);
floatingIPHandler.onAddFloatingIp(dpnId, routerName, externalNetworkId, interfaceName, externalIp, internalIp);
}
pFlowEntity = buildPreSNATFlowEntity(dpnId, internalIp, externalIp, vpnId , routerId, associatedVpnId);
mdsalManager.installFlow(pFlowEntity);
- flowEntity = buildSNATFlowEntity(dpnId, internalIp, externalIp, vpnId);
+ flowEntity = buildSNATFlowEntity(dpnId, internalIp, externalIp, vpnId, externalNetworkId);
mdsalManager.installFlow(flowEntity);
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ExtRouters;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ExternalIpsCounter;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ExternalNetworks;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ProviderTypes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.FloatingIpInfo;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.IntextIpMap;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.IntextIpPortMap;
return null;
}
+ public static ProviderTypes getProviderTypefromNetworkId(DataBroker broker, Uuid networkId) {
+ InstanceIdentifier<Networks> id = buildNetworkIdentifier(networkId);
+ Optional<Networks> networkData = read(broker, LogicalDatastoreType.CONFIGURATION, id);
+ if ((networkData.isPresent()) && (networkData.get() != null)) {
+ return networkData.get().getProviderNetworkType();
+ }
+ return null;
+ }
+
public static List<Uuid> getRouterIdsfromNetworkId(DataBroker broker, Uuid networkId) {
InstanceIdentifier<Networks> id = buildNetworkIdentifier(networkId);
Optional<Networks> networkData = read(broker, LogicalDatastoreType.CONFIGURATION, id);
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.qos.ext.rev160613.QosNetworkExtension;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ProviderTypes;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
protected void add(InstanceIdentifier<Network> identifier, Network input) {
LOG.trace("Adding Network : key: {}, value={}", identifier, input);
if (!NeutronvpnUtils.isNetworkTypeSupported(input)) {
- //FIXME: This should be removed when support for GRE network types is added
- LOG.error("Neutronvpn doesn't support gre network provider type for this network {}.", input);
+ LOG.error("Neutronvpn doesn't support this network provider type for this network {} and uuid {}.", input.getName(), input.getUuid());
return;
}
NeutronvpnUtils.addToNetworkCache(input);
// Create ELAN interface and IETF interfaces for the physical network
elanService.createExternalElanNetwork(elanInstance);
if (NeutronvpnUtils.getIsExternal(input)) {
+ ProviderTypes providerNwType = NeutronvpnUtils.getProviderNetworkType(input);
+ if(providerNwType == null){
+ LOG.error("Neutron Service : Unable to get Network Provider Type for network {}", input.getUuid());
+ return;
+ }
+ LOG.trace("Neutron Service : External Network Provider Type is {}", providerNwType.getName());
nvpnNatManager.addExternalNetwork(input);
- nvpnManager.createL3InternalVpn(input.getUuid(), null, null, null, null, null, null, null);
+ if (providerNwType != ProviderTypes.GRE) {
+ nvpnManager.createL3InternalVpn(input.getUuid(), null, null, null, null, null, null, null);
+ }
}
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.networks.Networks;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.networks.NetworksBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.networks.NetworksKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ProviderTypes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router.ExternalGatewayInfo;
import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.router.external_gateway_info.ExternalFixedIps;
" already detected to be present");
return;
}
+ ProviderTypes provType = NeutronvpnUtils.getProviderNetworkType(net);
+ if (provType == null){
+ LOG.error("Unable to get Network Provider Type for network {}",net.getUuid());
+ return;
+ }
NetworksBuilder builder = null;
builder = new NetworksBuilder().setKey(new NetworksKey(extNetId)).setId(extNetId);
builder.setVpnid(NeutronvpnUtils.getVpnForNetwork(dataBroker, extNetId));
builder.setRouterIds(new ArrayList<Uuid>());
+ builder.setProviderNetworkType(provType);
Networks networkss = builder.build();
// Add Networks object to the ExternalNetworks list
Uuid routerId = update.getUuid();
Uuid extNetId = update.getExternalGatewayInfo().getExternalNetworkId();
- // Add this router to the ExtRouters list
- addExternalRouter(update, dataBroker);
+ try {
+ Network input = NeutronvpnUtils.getNeutronNetwork(dataBroker, extNetId);
+ ProviderTypes providerNwType = NeutronvpnUtils.getProviderNetworkType(input);
+ if(providerNwType == null){
+ LOG.error("Unable to get Network Provider Type for network {} and uuid {}", input.getName(), input.getUuid());
+ return;
+ }
+ // Add this router to the ExtRouters list
+ addExternalRouter(update, dataBroker);
- // Create and add Networks object for this External Network to the ExternalNetworks list
- InstanceIdentifier<Networks> netsIdentifier = InstanceIdentifier.builder(ExternalNetworks.class).
- child(Networks.class, new NetworksKey(extNetId)).build();
+ // Create and add Networks object for this External Network to the ExternalNetworks list
+ InstanceIdentifier<Networks> netsIdentifier = InstanceIdentifier.builder(ExternalNetworks.class).
+ child(Networks.class, new NetworksKey(extNetId)).build();
- try {
Optional<Networks> optionalNets = NeutronvpnUtils.read(dataBroker,
LogicalDatastoreType.CONFIGURATION,
netsIdentifier);
}
rtrList.add(routerId);
builder.setRouterIds(rtrList);
- builder.setVpnid(extNetId);
+ if (providerNwType != ProviderTypes.GRE) {
+ builder.setVpnid(extNetId);
+ }
Networks networkss = builder.build();
// Add Networks object to the ExternalNetworks list
InstanceIdentifier<Routers> routersIdentifier = NeutronvpnUtils.buildExtRoutersIdentifier(routerId);
try {
+ Network input = NeutronvpnUtils.getNeutronNetwork(dataBroker, extNetId);
+ ProviderTypes providerNwType = NeutronvpnUtils.getProviderNetworkType(input);
+ if(providerNwType == null){
+ LOG.error("Unable to get Network Provider Type for network {} and uuid{}", input.getName(), input.getUuid());
+ return;
+ }
Optional<Routers> optionalRouters = NeutronvpnUtils.read(broker,
LogicalDatastoreType.CONFIGURATION,
routersIdentifier);
MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION, routersIdentifier, builder.build());
LOG.trace("Wrote successfully Routers to CONFIG Datastore");
- handleExternalPorts(routers, routerId);
+ if (providerNwType != ProviderTypes.GRE) {
+ handleExternalPorts(routers, routerId);
+ }
} catch (Exception ex) {
LOG.error("Creation of extrouters failed for router " + routerId.getValue() +
" failed with " + ex.getMessage());
import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ProviderTypes;
import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronConstants;
import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces;
import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
registerSuppoprtedNetworkType(NetworkTypeFlat.class);
registerSuppoprtedNetworkType(NetworkTypeVlan.class);
registerSuppoprtedNetworkType(NetworkTypeVxlan.class);
+ registerSuppoprtedNetworkType(NetworkTypeGre.class);
}
private NeutronvpnUtils() {
return npe != null && supportedNetworkTypes.contains(npe.getNetworkType());
}
+ static ProviderTypes getProviderNetworkType(Network network) {
+ if (network == null) {
+ logger.error("Error in getting provider network type since network is null");
+ return null;
+ }
+ NetworkProviderExtension npe = network.getAugmentation(NetworkProviderExtension.class);
+ if (npe != null) {
+ Class<? extends NetworkTypeBase> networkTypeBase = npe.getNetworkType();
+ if (networkTypeBase != null) {
+ if(networkTypeBase.isAssignableFrom(NetworkTypeFlat.class)) {
+ return ProviderTypes.FLAT;
+ } else if (networkTypeBase.isAssignableFrom(NetworkTypeVlan.class)) {
+ return ProviderTypes.VLAN;
+ } else if (networkTypeBase.isAssignableFrom(NetworkTypeVxlan.class)) {
+ return ProviderTypes.VXLAN;
+ } else if (networkTypeBase.isAssignableFrom(NetworkTypeGre.class)) {
+ return ProviderTypes.GRE;
+ }
+ }
+ }
+ return null;
+ }
+
static boolean isNetworkOfType(Network network, Class<? extends NetworkTypeBase> type) {
NetworkProviderExtension npe = network.getAugmentation(NetworkProviderExtension.class);
return npe != null && type.isAssignableFrom(npe.getNetworkType());