Add aaa-12 add config code for huawei device and add l2tpv3 yang files
RCA: SOL: 修改人:maxiaonan 检视人:
This commit is contained in:
parent
03422647f7
commit
3c956f398e
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* Project: driver-layer-aggregator
|
||||||
|
*
|
||||||
|
* File Created at 2019/9/11
|
||||||
|
*
|
||||||
|
* Copyright 2016 CMCC Corporation Limited.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is the confidential and proprietary information of
|
||||||
|
* ZYHY Company. ("Confidential Information"). You shall not
|
||||||
|
* disclose such Confidential Information and shall use it only in
|
||||||
|
* accordance with the terms of the license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cmcc.cmhi.huawei.impl;
|
||||||
|
|
||||||
|
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
|
||||||
|
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author MaXiaonan
|
||||||
|
* @Type ChangeNode.class
|
||||||
|
* @Desc
|
||||||
|
* @date 2019/9/11 17:40
|
||||||
|
*/
|
||||||
|
public class ChangeNode extends ChangeType {
|
||||||
|
private Node node;
|
||||||
|
private TerminationPoint tp;
|
||||||
|
/**
|
||||||
|
* Getter method for property <tt>node</tt>.
|
||||||
|
*
|
||||||
|
* @return property value of node
|
||||||
|
*/
|
||||||
|
|
||||||
|
public Node getNode() {
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter method for property <tt>node</tt>.
|
||||||
|
*
|
||||||
|
* @param node value to be assigned to property node
|
||||||
|
*/
|
||||||
|
public void setNode(Node node) {
|
||||||
|
this.node = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter method for property <tt>tp</tt>.
|
||||||
|
*
|
||||||
|
* @return property value of tp
|
||||||
|
*/
|
||||||
|
|
||||||
|
public TerminationPoint getTp() {
|
||||||
|
return tp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter method for property <tt>tp</tt>.
|
||||||
|
*
|
||||||
|
* @param tp value to be assigned to property tp
|
||||||
|
*/
|
||||||
|
public void setTp(TerminationPoint tp) {
|
||||||
|
this.tp = tp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Revision history
|
||||||
|
* -------------------------------------------------------------------------
|
||||||
|
* <p>
|
||||||
|
* Date Author Note
|
||||||
|
* -------------------------------------------------------------------------
|
||||||
|
* 2019/9/11 MaXiaonan creat
|
||||||
|
*/
|
|
@ -18,6 +18,7 @@ public class HuaweiDriverProvider {
|
||||||
|
|
||||||
private final DataBroker dataBroker;
|
private final DataBroker dataBroker;
|
||||||
private final MountPointService mountService;
|
private final MountPointService mountService;
|
||||||
|
private HuaweiNetconfConfig netconfConfig = null;
|
||||||
private HuaweiDriverRegister register = null;
|
private HuaweiDriverRegister register = null;
|
||||||
private HuaweiNetconfSpeaker netconfSpeaker = null;
|
private HuaweiNetconfSpeaker netconfSpeaker = null;
|
||||||
|
|
||||||
|
@ -26,6 +27,7 @@ public class HuaweiDriverProvider {
|
||||||
this.mountService = mountService;
|
this.mountService = mountService;
|
||||||
this.register = new HuaweiDriverRegister(this.dataBroker);
|
this.register = new HuaweiDriverRegister(this.dataBroker);
|
||||||
this.netconfSpeaker = new HuaweiNetconfSpeaker(this.dataBroker, this.mountService);
|
this.netconfSpeaker = new HuaweiNetconfSpeaker(this.dataBroker, this.mountService);
|
||||||
|
this.netconfConfig = new HuaweiNetconfConfig(this.dataBroker,this.mountService);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,285 @@
|
||||||
|
/*
|
||||||
|
* Project: driver-layer-aggregator
|
||||||
|
*
|
||||||
|
* File Created at 2019/9/9
|
||||||
|
*
|
||||||
|
* Copyright 2016 CMCC Corporation Limited.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is the confidential and proprietary information of
|
||||||
|
* ZYHY Company. ("Confidential Information"). You shall not
|
||||||
|
* disclose such Confidential Information and shall use it only in
|
||||||
|
* accordance with the terms of the license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cmcc.cmhi.huawei.impl;
|
||||||
|
|
||||||
|
import com.google.common.base.Optional;
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
import com.google.common.util.concurrent.*;
|
||||||
|
import org.opendaylight.controller.md.sal.binding.api.*;
|
||||||
|
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
|
||||||
|
import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException;
|
||||||
|
import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
|
||||||
|
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
|
||||||
|
import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.l2tpv3.rev181123.L2tpv3;
|
||||||
|
import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.l2tpv3.rev181123.l2tpv3.GlobalAttribute;
|
||||||
|
import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.l2tpv3.rev181123.l2tpv3.GlobalAttributeBuilder;
|
||||||
|
import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.l2tpv3.rev181123.l2tpv3.L2tpv3PWInstances;
|
||||||
|
import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.l2tpv3.rev181123.l2tpv3.L2tpv3PWInstancesBuilder;
|
||||||
|
import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.l2tpv3.rev181123.l2tpv3.l2tpv3pwinstances.L2tpv3PWInstance;
|
||||||
|
import org.opendaylight.yang.gen.v1.http.www.huawei.com.netconf.vrp.huawei.l2tpv3.rev181123.l2tpv3.l2tpv3pwinstances.L2tpv3PWInstanceBuilder;
|
||||||
|
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf;
|
||||||
|
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.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
|
||||||
|
import org.opendaylight.yangtools.concepts.ListenerRegistration;
|
||||||
|
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
|
||||||
|
import org.opendaylight.yangtools.yang.common.RpcResult;
|
||||||
|
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
import static org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType.DELETE;
|
||||||
|
import static org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType.WRITE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author MaXiaonan
|
||||||
|
* @Type HuaweiNetconfConfig.class
|
||||||
|
* @Desc
|
||||||
|
* @date 2019/9/9 17:34
|
||||||
|
*/
|
||||||
|
public class HuaweiNetconfConfig implements DataTreeChangeListener<Node>,
|
||||||
|
AutoCloseable {
|
||||||
|
private final DataBroker dataBroker;
|
||||||
|
private final MountPointService mountService;
|
||||||
|
private final ListenerRegistration<HuaweiNetconfConfig> configListener;
|
||||||
|
|
||||||
|
private Logger LOG = LoggerFactory.getLogger(HuaweiNetconfConfig.class);
|
||||||
|
private RpcResult<Void> SUCCESS = RpcResultBuilder.<Void>success().build();
|
||||||
|
private RpcResult<Void> FAILED = RpcResultBuilder.<Void>failed().build();
|
||||||
|
|
||||||
|
public static final InstanceIdentifier<Topology> NETCONF_TOPO_IID =
|
||||||
|
InstanceIdentifier
|
||||||
|
.create(NetworkTopology.class)
|
||||||
|
.child(Topology.class,
|
||||||
|
new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName())));
|
||||||
|
|
||||||
|
public HuaweiNetconfConfig(DataBroker dataBroker, MountPointService mountService){
|
||||||
|
this.dataBroker = dataBroker;
|
||||||
|
this.mountService = mountService;
|
||||||
|
InstanceIdentifier<Node> tpPath = InstanceIdentifier.create(Node.class);
|
||||||
|
final DataTreeIdentifier<Node> dataTreeIdentifier = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, tpPath);
|
||||||
|
configListener = dataBroker.registerDataTreeChangeListener(dataTreeIdentifier, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
configListener.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<Node>> changes) {
|
||||||
|
for (DataTreeModification<Node> change : changes) {
|
||||||
|
DataObjectModification<Node> rootNode = change.getRootNode();
|
||||||
|
if(isNodeExist(rootNode)){
|
||||||
|
if (rootNode.getModificationType() == WRITE) {
|
||||||
|
Node oldEntry = rootNode.getDataBefore();
|
||||||
|
Node newEntry = rootNode.getDataAfter();
|
||||||
|
LOG.info("onDataTreeChanged - Config with path {} was added or replaced: "
|
||||||
|
+ "old Node: {}, new Node: {}", change.getRootPath().getRootIdentifier(),
|
||||||
|
oldEntry, newEntry);
|
||||||
|
ArrayList<ChangeNode> changeTypes = checkWriteType(oldEntry, newEntry);
|
||||||
|
changeTypes.forEach(this::writeConfigToDevice);
|
||||||
|
} else if (rootNode.getModificationType() == DELETE) {
|
||||||
|
LOG.info("onDataTreeChanged - Config with path {} was deleted: old Node: {}",
|
||||||
|
change.getRootPath().getRootIdentifier(), rootNode.getDataBefore());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeConfigToDevice(ChangeNode changeNode) {
|
||||||
|
//write l2tpv3
|
||||||
|
//TODO before write ,check the service is enable first
|
||||||
|
final Optional<MountPoint> hwNodeOptional = mountService.getMountPoint(NETCONF_TOPO_IID
|
||||||
|
.child(Node.class, changeNode.getNode().getKey()));
|
||||||
|
Preconditions.checkArgument(hwNodeOptional.isPresent(),
|
||||||
|
"Unable to locate mountpoint: %s, not mounted yet or not configured",
|
||||||
|
changeNode.getNode().getKey().getNodeId());
|
||||||
|
final MountPoint hwNode = hwNodeOptional.get();
|
||||||
|
InstanceIdentifier<GlobalAttribute> iid =
|
||||||
|
InstanceIdentifier.create(L2tpv3.class).child(GlobalAttribute.class);
|
||||||
|
|
||||||
|
// Get the DataBroker for the mounted node
|
||||||
|
final DataBroker hwNodeBroker = hwNode.getService(DataBroker.class).get();
|
||||||
|
boolean enable = checkGlobalEnable(hwNodeBroker,iid,changeNode);
|
||||||
|
if(!enable){
|
||||||
|
writeGlobalEnableToDevice(iid,hwNodeBroker);
|
||||||
|
}
|
||||||
|
writeL2tpV3Information(changeNode,hwNodeBroker);
|
||||||
|
mergeTPInformation(changeNode,hwNodeBroker);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeL2tpV3Information(ChangeNode changeNode, DataBroker hwNodeBroker) {
|
||||||
|
InstanceIdentifier<L2tpv3PWInstances> iid =
|
||||||
|
InstanceIdentifier.create(L2tpv3.class).child(L2tpv3PWInstances.class);
|
||||||
|
L2tpv3PWInstanceBuilder builder = new L2tpv3PWInstanceBuilder();
|
||||||
|
L2tpv3PWInstancesBuilder l2tpv3InstancesBuilder = new L2tpv3PWInstancesBuilder();
|
||||||
|
List<L2tpv3PWInstance> l2tpv3InstanceList = new ArrayList<>();
|
||||||
|
l2tpv3InstancesBuilder.setL2tpv3PWInstance(l2tpv3InstanceList);
|
||||||
|
final WriteTransaction writeTransaction = hwNodeBroker.newWriteOnlyTransaction();
|
||||||
|
writeTransaction.put(LogicalDatastoreType.OPERATIONAL, iid,l2tpv3InstancesBuilder.build());
|
||||||
|
final CheckedFuture<Void, TransactionCommitFailedException> submit = writeTransaction.submit();
|
||||||
|
Futures.addCallback(submit, new FutureCallback<Void>() {
|
||||||
|
@Override
|
||||||
|
public void onFailure(Throwable throwable) {
|
||||||
|
if (throwable instanceof OptimisticLockFailedException) {
|
||||||
|
LOG.warn("Write L2tpv3PW information 捕获 乐观锁异常,本次获取忽略!");
|
||||||
|
} else {
|
||||||
|
LOG.error("Write L2tpv3PW information failed." + throwable.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Void avoid) {
|
||||||
|
LOG.info("Write L2tpv3PW information success.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void mergeTPInformation(ChangeNode changeNode, DataBroker hwNodeBroker) {
|
||||||
|
InstanceIdentifier<Node> NODE_IID = NETCONF_TOPO_IID
|
||||||
|
.child(Node.class, changeNode.getNode().getKey());
|
||||||
|
TerminationPoint tp = changeNode.getTp();
|
||||||
|
InstanceIdentifier<TerminationPoint> tpIID =NODE_IID
|
||||||
|
.child(TerminationPoint.class);
|
||||||
|
final WriteTransaction writeTransaction = hwNodeBroker.newWriteOnlyTransaction();
|
||||||
|
writeTransaction.put(LogicalDatastoreType.OPERATIONAL, tpIID,tp);
|
||||||
|
final CheckedFuture<Void, TransactionCommitFailedException> submit = writeTransaction.submit();
|
||||||
|
Futures.addCallback(submit, new FutureCallback<Void>() {
|
||||||
|
@Override
|
||||||
|
public void onFailure(Throwable throwable) {
|
||||||
|
if (throwable instanceof OptimisticLockFailedException) {
|
||||||
|
LOG.warn("Write config information 捕获 乐观锁异常,本次获取忽略!");
|
||||||
|
} else {
|
||||||
|
LOG.error("Write config information failed." + throwable.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Void avoid) {
|
||||||
|
LOG.info("Write config information success.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeGlobalEnableToDevice(InstanceIdentifier<GlobalAttribute> iid, DataBroker hwNodeBroker) {
|
||||||
|
ListeningExecutorService pool = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5));
|
||||||
|
|
||||||
|
GlobalAttributeBuilder builder =new GlobalAttributeBuilder();
|
||||||
|
final WriteTransaction writeTransaction = hwNodeBroker.newWriteOnlyTransaction();
|
||||||
|
writeTransaction.put(LogicalDatastoreType.OPERATIONAL,iid,builder.setGlobalEnable(true).build());
|
||||||
|
ListenableFuture<Void> submit = writeTransaction.submit();
|
||||||
|
|
||||||
|
FutureCallback<Void> futureCallback = new FutureCallback<Void>() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Void result) {
|
||||||
|
LOG.info("Write enable information success.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Throwable throwable) {
|
||||||
|
if (throwable instanceof OptimisticLockFailedException) {
|
||||||
|
LOG.warn("Write enable information 捕获 乐观锁异常,本次获取忽略!");
|
||||||
|
} else {
|
||||||
|
LOG.error("Write enable information failed." + throwable.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Futures.addCallback(submit, futureCallback, pool);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkGlobalEnable(DataBroker hwNodeBroker, InstanceIdentifier<GlobalAttribute> iid, ChangeNode changeNode) {
|
||||||
|
Optional<GlobalAttribute> globalInfos;
|
||||||
|
// Start a new read only transaction that we will use to read data
|
||||||
|
// from the device
|
||||||
|
final ReadOnlyTransaction hwNodeReadTx = hwNodeBroker.newReadOnlyTransaction();
|
||||||
|
LOG.info("开始向华为设备读取GlobalAttribute 信息!");
|
||||||
|
try {
|
||||||
|
// Read from a transaction is asynchronous, but a simple
|
||||||
|
// get/checkedGet makes the call synchronous
|
||||||
|
globalInfos = hwNodeReadTx.read(LogicalDatastoreType.OPERATIONAL, iid).checkedGet();
|
||||||
|
} catch (ReadFailedException e) {
|
||||||
|
throw new IllegalStateException("Unexpected error reading data from " + changeNode, e);
|
||||||
|
}
|
||||||
|
boolean enable = false;
|
||||||
|
if(globalInfos.isPresent()){
|
||||||
|
enable = globalInfos.get().isGlobalEnable();
|
||||||
|
}
|
||||||
|
return enable;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isNodeExist(DataObjectModification<Node> rootNode) {
|
||||||
|
InstanceIdentifier<Node> nodeIid = NETCONF_TOPO_IID
|
||||||
|
.child(Node.class, rootNode.getDataAfter().getKey());
|
||||||
|
return Objects.isNull(mountService.getMountPoint(nodeIid));
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<ChangeNode> checkWriteType(Node oldEntry, Node newEntry) {
|
||||||
|
ArrayList<ChangeNode> changeTypes = new ArrayList<>();
|
||||||
|
List<TerminationPoint> oldTPs;
|
||||||
|
if (Objects.isNull(oldEntry)) {
|
||||||
|
oldTPs = new ArrayList<>();
|
||||||
|
} else {
|
||||||
|
oldTPs = oldEntry.getTerminationPoint();
|
||||||
|
}
|
||||||
|
List<TerminationPoint> newTPs ;
|
||||||
|
if (Objects.isNull(newEntry)) {
|
||||||
|
|
||||||
|
newTPs = new ArrayList<>();
|
||||||
|
}else {
|
||||||
|
newTPs = newEntry.getTerminationPoint();
|
||||||
|
}
|
||||||
|
while (oldTPs.iterator().hasNext()) {
|
||||||
|
TerminationPoint devices = oldTPs.iterator().next();
|
||||||
|
if (newTPs.contains(devices)) {
|
||||||
|
oldTPs.remove(devices);
|
||||||
|
newTPs.remove(devices);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (TerminationPoint newTp : newTPs) {
|
||||||
|
ChangeNode changeNode = new ChangeNode();
|
||||||
|
changeNode.setTp(newTp);
|
||||||
|
changeNode.setType(ChangeType.Type.ADD);
|
||||||
|
changeTypes.add(changeNode);
|
||||||
|
}
|
||||||
|
for (TerminationPoint tp : oldTPs) {
|
||||||
|
ChangeNode changeNode = new ChangeNode();
|
||||||
|
changeNode.setTp(tp);
|
||||||
|
changeNode.setType(ChangeType.Type.DELETE);
|
||||||
|
changeTypes.add(changeNode);
|
||||||
|
}
|
||||||
|
return changeTypes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Revision history
|
||||||
|
* -------------------------------------------------------------------------
|
||||||
|
* <p>
|
||||||
|
* Date Author Note
|
||||||
|
* -------------------------------------------------------------------------
|
||||||
|
* 2019/9/9 MaXiaonan creat
|
||||||
|
*/
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2013-2018 Huawei Technologies Co., Ltd. All rights reserved.
|
||||||
|
*/
|
||||||
|
submodule huawei-l2tpv3-action {
|
||||||
|
belongs-to huawei-l2tpv3 {
|
||||||
|
prefix l2tpv3;
|
||||||
|
}
|
||||||
|
import huawei-extension {
|
||||||
|
prefix ext;
|
||||||
|
}
|
||||||
|
include huawei-l2tpv3-type;
|
||||||
|
|
||||||
|
organization
|
||||||
|
"Huawei Technologies Co., Ltd.";
|
||||||
|
contact
|
||||||
|
"Huawei Industrial Base
|
||||||
|
Bantian, Longgang
|
||||||
|
Shenzhen 518129
|
||||||
|
People's Republic of China
|
||||||
|
Website: http://www.huawei.com
|
||||||
|
Email: support@huawei.com";
|
||||||
|
description
|
||||||
|
"Description FOR submodule";
|
||||||
|
revision 2018-11-23 {
|
||||||
|
description
|
||||||
|
"The modifications in the schema file are synchronized to the YANG file.";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
revision 2018-06-11 {
|
||||||
|
description
|
||||||
|
"The modifications in the schema file are synchronized to the YANG file.";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
revision 2017-12-23 {
|
||||||
|
description
|
||||||
|
"The modifications in the schema file are synchronized to the YANG file.";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
revision 2017-03-23 {
|
||||||
|
description
|
||||||
|
"Functions supported by the schema are added to the YANG file.";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
revision 2013-01-01 {
|
||||||
|
description
|
||||||
|
"Init revision";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
rpc resetStats {
|
||||||
|
description
|
||||||
|
"Reset the statistic result.";
|
||||||
|
ext:node-ref "/l2tpv3/l2tpv3PWInstances/l2tpv3PWInstance";
|
||||||
|
input {
|
||||||
|
leaf pwName {
|
||||||
|
type string {
|
||||||
|
length "1..19";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Name of a Tunnel.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,154 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2013-2018 Huawei Technologies Co., Ltd. All rights reserved.
|
||||||
|
*/
|
||||||
|
submodule huawei-l2tpv3-type {
|
||||||
|
belongs-to huawei-l2tpv3 {
|
||||||
|
prefix l2tpv3;
|
||||||
|
}
|
||||||
|
|
||||||
|
organization
|
||||||
|
"Huawei Technologies Co., Ltd.";
|
||||||
|
contact
|
||||||
|
"Huawei Industrial Base
|
||||||
|
Bantian, Longgang
|
||||||
|
Shenzhen 518129
|
||||||
|
People's Republic of China
|
||||||
|
Website: http://www.huawei.com
|
||||||
|
Email: support@huawei.com";
|
||||||
|
description
|
||||||
|
"Description FOR submodule";
|
||||||
|
revision 2018-11-23 {
|
||||||
|
description
|
||||||
|
"The modifications in the schema file are synchronized to the YANG file.";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
revision 2018-06-11 {
|
||||||
|
description
|
||||||
|
"The modifications in the schema file are synchronized to the YANG file.";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
revision 2017-12-23 {
|
||||||
|
description
|
||||||
|
"The modifications in the schema file are synchronized to the YANG file.";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
revision 2017-03-23 {
|
||||||
|
description
|
||||||
|
"Functions supported by the schema are added to the YANG file.";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
revision 2013-01-01 {
|
||||||
|
description
|
||||||
|
"Init revision";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
typedef cookieAuthMode {
|
||||||
|
type enumeration {
|
||||||
|
enum "authNone" {
|
||||||
|
description
|
||||||
|
"Current auth mode is none";
|
||||||
|
}
|
||||||
|
enum "authPlain" {
|
||||||
|
description
|
||||||
|
"Current auth mode is plain";
|
||||||
|
}
|
||||||
|
enum "authCipher" {
|
||||||
|
description
|
||||||
|
"Current auth mode is cipher";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Cookie Auth Mode";
|
||||||
|
}
|
||||||
|
typedef l2tpv3PwRoleType {
|
||||||
|
type enumeration {
|
||||||
|
enum "primary" {
|
||||||
|
description
|
||||||
|
"Primary Tunnel";
|
||||||
|
}
|
||||||
|
enum "injected" {
|
||||||
|
description
|
||||||
|
"Injected Tunnel";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"PW Role Type";
|
||||||
|
}
|
||||||
|
typedef l2tpv3InstanceType {
|
||||||
|
type enumeration {
|
||||||
|
enum "normal" {
|
||||||
|
description
|
||||||
|
"Normal Mode";
|
||||||
|
}
|
||||||
|
enum "localConnect" {
|
||||||
|
description
|
||||||
|
"Local Connect mode";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Instance Type";
|
||||||
|
}
|
||||||
|
typedef l2tpv3DiffservMode {
|
||||||
|
type enumeration {
|
||||||
|
enum "pipe" {
|
||||||
|
description
|
||||||
|
"";
|
||||||
|
}
|
||||||
|
enum "uniform" {
|
||||||
|
description
|
||||||
|
"";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Diff Service Mode";
|
||||||
|
}
|
||||||
|
typedef l2tpv3State {
|
||||||
|
type enumeration {
|
||||||
|
enum "down" {
|
||||||
|
description
|
||||||
|
"down";
|
||||||
|
}
|
||||||
|
enum "up" {
|
||||||
|
description
|
||||||
|
"up";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"L2TPv3 State";
|
||||||
|
}
|
||||||
|
typedef cookieLength {
|
||||||
|
type enumeration {
|
||||||
|
enum "4" {
|
||||||
|
description
|
||||||
|
"4 Bytes";
|
||||||
|
}
|
||||||
|
enum "8" {
|
||||||
|
description
|
||||||
|
"8 Bytes";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Cookie Length";
|
||||||
|
}
|
||||||
|
typedef L2tpv3ipv6Address {
|
||||||
|
type string {
|
||||||
|
length "0..255";
|
||||||
|
pattern '\s*((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}(:|((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))(%.+)?\s*';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPV6 address in standard notation";
|
||||||
|
}
|
||||||
|
typedef L2tpv3OnlyIpv6 {
|
||||||
|
type string {
|
||||||
|
length "0..255";
|
||||||
|
pattern '(([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}))|(:((:[0-9A-Fa-f]{1,4}){1,6}|:))|([0-9A-Fa-f]{1,4}:((:[0-9A-Fa-f]{1,4}){1,5}|:))|(([0-9A-Fa-f]{1,4}:){2}((:[0-9A-Fa-f]{1,4}){1,4}|:))|(([0-9A-Fa-f]{1,4}:){3}((:[0-9A-Fa-f]{1,4}){1,3}|:))|(([0-9A-Fa-f]{1,4}:){4}((:[0-9A-Fa-f]{1,4}){1,2}|:))|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4})?)|(([0-9A-Fa-f]{1,4}:){6}:)';
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"An IPV6 address in standard notation without IPV4 address";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,352 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2013-2018 Huawei Technologies Co., Ltd. All rights reserved.
|
||||||
|
*/
|
||||||
|
module huawei-l2tpv3 {
|
||||||
|
namespace "http://www.huawei.com/netconf/vrp/huawei-l2tpv3";
|
||||||
|
prefix l2tpv3;
|
||||||
|
import huawei-ifm {
|
||||||
|
prefix ifm;
|
||||||
|
}
|
||||||
|
import huawei-pub-type {
|
||||||
|
prefix pub-type;
|
||||||
|
}
|
||||||
|
import ietf-inet-types {
|
||||||
|
prefix inet;
|
||||||
|
}
|
||||||
|
import huawei-extension {
|
||||||
|
prefix ext;
|
||||||
|
}
|
||||||
|
include huawei-l2tpv3-action;
|
||||||
|
include huawei-l2tpv3-type;
|
||||||
|
|
||||||
|
organization
|
||||||
|
"Huawei Technologies Co., Ltd.";
|
||||||
|
contact
|
||||||
|
"Huawei Industrial Base
|
||||||
|
Bantian, Longgang
|
||||||
|
Shenzhen 518129
|
||||||
|
People's Republic of China
|
||||||
|
Website: http://www.huawei.com
|
||||||
|
Email: support@huawei.com";
|
||||||
|
description
|
||||||
|
"L2TPV3";
|
||||||
|
revision 2018-11-23 {
|
||||||
|
description
|
||||||
|
"The modifications in the schema file are synchronized to the YANG file.";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
revision 2018-06-11 {
|
||||||
|
description
|
||||||
|
"The modifications in the schema file are synchronized to the YANG file.";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
revision 2017-12-23 {
|
||||||
|
description
|
||||||
|
"The modifications in the schema file are synchronized to the YANG file.";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
revision 2017-03-23 {
|
||||||
|
description
|
||||||
|
"Functions supported by the schema are added to the YANG file.";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
revision 2013-01-01 {
|
||||||
|
description
|
||||||
|
"Init revision";
|
||||||
|
reference
|
||||||
|
"Huawei private.";
|
||||||
|
}
|
||||||
|
container l2tpv3 {
|
||||||
|
description
|
||||||
|
"L2TPV3";
|
||||||
|
container globalAttribute {
|
||||||
|
description
|
||||||
|
"The global attribute of L2TPV3.";
|
||||||
|
ext:entry-from "system";
|
||||||
|
leaf globalEnable {
|
||||||
|
type boolean;
|
||||||
|
default "false";
|
||||||
|
description
|
||||||
|
"To enable L2TPV3. By default, L2TPV3 is disabled.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
container l2tpv3PWInstances {
|
||||||
|
description
|
||||||
|
"All L2TPV3 Tunnels. ";
|
||||||
|
list l2tpv3PWInstance {
|
||||||
|
when "../../globalAttribute/globalEnable='true'";
|
||||||
|
key "pwName";
|
||||||
|
description
|
||||||
|
"All L2TPV3 Tunnels. ";
|
||||||
|
leaf pwName {
|
||||||
|
type string {
|
||||||
|
length "1..19";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Name of a Tunnel.";
|
||||||
|
}
|
||||||
|
leaf sourceIfName {
|
||||||
|
type leafref {
|
||||||
|
path "/ifm:ifm/ifm:interfaces/ifm:interface/ifm:ifName";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Config The Source Interface Name Of Tunnel ";
|
||||||
|
ext:allowDelete "true";
|
||||||
|
}
|
||||||
|
leaf sourceIP {
|
||||||
|
when "../sourceIfName";
|
||||||
|
type inet:ip-address-no-zone;
|
||||||
|
description
|
||||||
|
"Source IP Address Of Tunnel,must be the same with the ip of loopback interface. ";
|
||||||
|
}
|
||||||
|
leaf destIP {
|
||||||
|
type inet:ip-address-no-zone;
|
||||||
|
description
|
||||||
|
"Config The Destination IP Address of Tunnel";
|
||||||
|
ext:allowDelete "true";
|
||||||
|
}
|
||||||
|
leaf localSessionId {
|
||||||
|
type uint32 {
|
||||||
|
range "1..4294967295";
|
||||||
|
}
|
||||||
|
default "4294967295";
|
||||||
|
description
|
||||||
|
"Config The Local Session ID";
|
||||||
|
ext:allowDelete "true";
|
||||||
|
}
|
||||||
|
leaf remoteSessionId {
|
||||||
|
type uint32 {
|
||||||
|
range "1..4294967295";
|
||||||
|
}
|
||||||
|
default "4294967295";
|
||||||
|
description
|
||||||
|
"Config The Remote Session ID";
|
||||||
|
ext:allowDelete "true";
|
||||||
|
}
|
||||||
|
leaf localCookieAutoMode {
|
||||||
|
type cookieAuthMode;
|
||||||
|
must "(../localCookieAutoMode='authNone' and not(../localSecondaryCookieAutoMode='authCipher' or ../localSecondaryCookieAutoMode='authPlain')) or not(../localCookieAutoMode='authNone')";
|
||||||
|
default "authNone";
|
||||||
|
description
|
||||||
|
"Config the mode of the authentication of the local cookie field";
|
||||||
|
ext:allowDelete "true";
|
||||||
|
}
|
||||||
|
leaf localSecondaryCookieAutoMode {
|
||||||
|
type cookieAuthMode;
|
||||||
|
must "((../localSecondaryCookieAutoMode='authCipher' or ../localSecondaryCookieAutoMode='authPlain') and not(../localCookieAutoMode='authNone')) or not(../localSecondaryCookieAutoMode='authCipher' or ../localSecondaryCookieAutoMode='authPlain')";
|
||||||
|
default "authNone";
|
||||||
|
description
|
||||||
|
"Config the mode of the authentication of the local secondary cookie field";
|
||||||
|
ext:allowDelete "true";
|
||||||
|
}
|
||||||
|
leaf remoteCookieAutoMode {
|
||||||
|
type cookieAuthMode;
|
||||||
|
default "authNone";
|
||||||
|
description
|
||||||
|
"Config the mode of the authentication of the remote cookie field";
|
||||||
|
ext:allowDelete "true";
|
||||||
|
}
|
||||||
|
leaf localCookieLength {
|
||||||
|
when "../localCookieAutoMode='authPlain'";
|
||||||
|
type cookieLength;
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Config the length of the local cookie field";
|
||||||
|
}
|
||||||
|
leaf localSecondaryCookieLength {
|
||||||
|
when "../localSecondaryCookieAutoMode='authPlain'";
|
||||||
|
type cookieLength;
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Config the length of the local secondary cookie field";
|
||||||
|
}
|
||||||
|
leaf remoteCookieLength {
|
||||||
|
when "../remoteCookieAutoMode='authPlain'";
|
||||||
|
type cookieLength;
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Config the length of the remote cookie field";
|
||||||
|
}
|
||||||
|
leaf localHighCookie {
|
||||||
|
when "../localCookieLength='8'";
|
||||||
|
type pub-type:hexBinary;
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Config the value of the upper 4 bytes of the local cookie field";
|
||||||
|
}
|
||||||
|
leaf localSecondaryHighCookie {
|
||||||
|
when "../localSecondaryCookieLength='8'";
|
||||||
|
type pub-type:hexBinary;
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Config the value of the upper 4 bytes of the local secondary cookie field";
|
||||||
|
}
|
||||||
|
leaf localLowCookie {
|
||||||
|
when "../localCookieAutoMode='authPlain'";
|
||||||
|
type pub-type:hexBinary;
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Config the value of the lower 4 bytes of the local cookie field";
|
||||||
|
|
||||||
|
}
|
||||||
|
leaf localSecondaryLowCookie {
|
||||||
|
when "../localSecondaryCookieAutoMode='authPlain'";
|
||||||
|
type pub-type:hexBinary;
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Config the value of the lower 4 bytes of the local secondary cookie field";
|
||||||
|
}
|
||||||
|
leaf remoteHighCookie {
|
||||||
|
when "../remoteCookieLength='8'";
|
||||||
|
type pub-type:hexBinary;
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Config the value of the upper 4 bytes of the remote cookie field";
|
||||||
|
}
|
||||||
|
leaf remoteLowCookie {
|
||||||
|
when "../remoteCookieAutoMode='authPlain'";
|
||||||
|
type pub-type:hexBinary;
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Config the value of the lower 4 bytes of the remote cookie field";
|
||||||
|
}
|
||||||
|
leaf localCookieCipher {
|
||||||
|
when "../localCookieAutoMode='authCipher'";
|
||||||
|
type pub-type:password {
|
||||||
|
length "1..108";
|
||||||
|
}
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Config the value of the local cookie field";
|
||||||
|
}
|
||||||
|
leaf localSecondaryCookieCipher {
|
||||||
|
when "../localSecondaryCookieAutoMode='authCipher'";
|
||||||
|
type pub-type:password {
|
||||||
|
length "1..108";
|
||||||
|
}
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Config the value of the local secondary cookie field";
|
||||||
|
}
|
||||||
|
leaf remoteCookieCipher {
|
||||||
|
when "../remoteCookieAutoMode='authCipher'";
|
||||||
|
type pub-type:password {
|
||||||
|
length "1..108";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Config the value of the remote cookie field";
|
||||||
|
}
|
||||||
|
leaf sendPacket {
|
||||||
|
type uint64;
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"Send Packets";
|
||||||
|
}
|
||||||
|
leaf sendByte {
|
||||||
|
type uint64;
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"Send Bytes";
|
||||||
|
}
|
||||||
|
leaf rcvPacket {
|
||||||
|
type uint64;
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"Receive Packets";
|
||||||
|
}
|
||||||
|
leaf receiveByte {
|
||||||
|
type uint64;
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"Receive Bytes";
|
||||||
|
}
|
||||||
|
leaf recvDropPacket {
|
||||||
|
type uint64;
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"Total Number Of dropped packets";
|
||||||
|
}
|
||||||
|
leaf cookieMisDropPacket {
|
||||||
|
type uint64;
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"Receive Cookie Mismatch Packets Number";
|
||||||
|
}
|
||||||
|
leaf state {
|
||||||
|
type l2tpv3State;
|
||||||
|
config false;
|
||||||
|
description
|
||||||
|
"Tunnel State";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
container l2tpv3Instances {
|
||||||
|
description
|
||||||
|
"All L2TPV3 instances. ";
|
||||||
|
list l2tpv3Instance {
|
||||||
|
when "/l2tpv3/globalAttribute/globalEnable='true'";
|
||||||
|
key "instanceName instanceType";
|
||||||
|
description
|
||||||
|
"All L2TPV3 instances. ";
|
||||||
|
leaf instanceName {
|
||||||
|
type string {
|
||||||
|
length "1..31";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"A L2TPV3 instance.";
|
||||||
|
}
|
||||||
|
leaf instanceType {
|
||||||
|
type l2tpv3InstanceType;
|
||||||
|
description
|
||||||
|
"Type of a L2TPV3 instance. ";
|
||||||
|
}
|
||||||
|
leaf ifName {
|
||||||
|
type leafref {
|
||||||
|
path "/ifm:ifm/ifm:interfaces/ifm:interface/ifm:ifName";
|
||||||
|
}
|
||||||
|
mandatory true;
|
||||||
|
description
|
||||||
|
"Name of a sub-interface.";
|
||||||
|
}
|
||||||
|
leaf outIfName {
|
||||||
|
when "not(../instanceType='normal')";
|
||||||
|
type leafref {
|
||||||
|
path "/ifm:ifm/ifm:interfaces/ifm:interface/ifm:ifName";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Name of a sub-interface.";
|
||||||
|
ext:allowDelete "true";
|
||||||
|
}
|
||||||
|
container l2tpv3PWs {
|
||||||
|
must "not(../instanceType='normal') or (../instanceType='normal' and count(l2tpv3PW)<=2) and ((../instanceType='normal' and count(l2tpv3PW)>=0))";
|
||||||
|
description
|
||||||
|
"L2TPV3 Tunnel information.";
|
||||||
|
list l2tpv3PW {
|
||||||
|
when "not(../../instanceType='localConnect')";
|
||||||
|
key "pwName";
|
||||||
|
max-elements 2;
|
||||||
|
description
|
||||||
|
"L2TPV3 Tunnel information.";
|
||||||
|
leaf pwName {
|
||||||
|
type leafref {
|
||||||
|
path "../../../../../l2tpv3PWInstances/l2tpv3PWInstance/pwName";
|
||||||
|
}
|
||||||
|
description
|
||||||
|
"Name of a Tunnel.";
|
||||||
|
}
|
||||||
|
leaf pwRole {
|
||||||
|
type l2tpv3PwRoleType;
|
||||||
|
default "primary";
|
||||||
|
description
|
||||||
|
"Whether the tunnel is a primary or injected tunnel.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue