[ONOS-4243]Config support for RPD and flow spec
Change-Id: I459ac88caa3c57afe00f49938131a4163f1a9f5f
diff --git a/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpAppConfig.java b/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpAppConfig.java
index 079f80d..262e4f5 100644
--- a/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpAppConfig.java
+++ b/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpAppConfig.java
@@ -61,6 +61,12 @@
static final int MAX_SHORT_AS_NUMBER = 65535;
static final long MAX_LONG_AS_NUMBER = 4294967295L;
+ static final int MIN_SESSION_NUMBER = 1;
+ static final long MAX_SESSION_NUMBER = 21;
+
+ static final int MIN_HOLDTIME = 0;
+ static final long MAX_HOLDTIME = 65535;
+
@Override
public boolean isValid() {
boolean fields = false;
@@ -71,7 +77,8 @@
fields = hasOnlyFields(ROUTER_ID, LOCAL_AS, MAX_SESSION, LS_CAPABILITY,
HOLD_TIME, LARGE_AS_CAPABILITY, FLOW_SPEC_CAPABILITY, FLOW_SPEC_RPD_CAPABILITY, BGP_PEER) &&
isIpAddress(ROUTER_ID, MANDATORY) && isNumber(LOCAL_AS, MANDATORY) &&
- isNumber(MAX_SESSION, OPTIONAL, 20) && isNumber(HOLD_TIME, OPTIONAL, 180) &&
+ isNumber(MAX_SESSION, OPTIONAL, MIN_SESSION_NUMBER, MAX_SESSION_NUMBER)
+ && isNumber(HOLD_TIME, OPTIONAL, MIN_HOLDTIME, MAX_HOLDTIME) &&
isBoolean(LS_CAPABILITY, OPTIONAL) && isBoolean(LARGE_AS_CAPABILITY, OPTIONAL) &&
isString(FLOW_SPEC_CAPABILITY, OPTIONAL) && isBoolean(FLOW_SPEC_RPD_CAPABILITY, OPTIONAL);
@@ -171,6 +178,21 @@
}
/**
+ * Validates the hold time value.
+ *
+ * @return true if valid else false
+ */
+ public boolean validateHoldTime() {
+ if (holdTime() != 0) {
+ short holdTime = holdTime();
+ if ((holdTime == 1) || (holdTime == 2)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
* Validates the Bgp local and peer configuration.
*
* @return true if valid else false
@@ -192,6 +214,10 @@
if (!validateFlowSpec()) {
return false;
}
+
+ if (!validateHoldTime()) {
+ return false;
+ }
return true;
}
@@ -205,10 +231,6 @@
long localAs = 0;
localAs = localAs();
- if (bgpController.connectedPeerCount() != 0) {
- return false;
- }
-
if (largeAsCapability()) {
if (localAs == 0 || localAs >= MAX_LONG_AS_NUMBER) {
@@ -250,9 +272,7 @@
*/
public boolean validateRouterId() {
String routerId = routerId();
- if (bgpController.connectedPeerCount() != 0) {
- return false;
- }
+ // TODO: router ID validation
return true;
}
diff --git a/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpCfgProvider.java b/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpCfgProvider.java
index 268962c..359852d 100755
--- a/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpCfgProvider.java
+++ b/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpCfgProvider.java
@@ -167,25 +167,25 @@
/* Update the self configuration */
- if (bgpController.connectedPeerCount() == 0) {
- bgpConfig.setRouterId(config.routerId());
- bgpConfig.setAsNumber(config.localAs());
- bgpConfig.setLsCapability(config.lsCapability());
- bgpConfig.setHoldTime(config.holdTime());
- bgpConfig.setMaxSession(config.maxSession());
- bgpConfig.setLargeASCapability(config.largeAsCapability());
+ if (bgpController.connectedPeerCount() != 0) {
+ //TODO: If connections already exist, disconnect
+ bgpController.closeConnectedPeers();
+ }
+ bgpConfig.setRouterId(config.routerId());
+ bgpConfig.setAsNumber(config.localAs());
+ bgpConfig.setLsCapability(config.lsCapability());
+ bgpConfig.setHoldTime(config.holdTime());
+ bgpConfig.setMaxSession(config.maxSession());
+ bgpConfig.setLargeASCapability(config.largeAsCapability());
- if (config.flowSpecCapability().equals("IPV4")) {
- bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.IPV4);
- } else if (config.flowSpecCapability().equals("VPNV4")) {
- bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.VPNV4);
- } else if (config.flowSpecCapability().equals("IPV4_VPNV4")) {
- bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.IPV4_VPNV4);
- } else {
- bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.NONE);
- }
+ if (config.flowSpecCapability().equals("IPV4")) {
+ bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.IPV4);
+ } else if (config.flowSpecCapability().equals("VPNV4")) {
+ bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.VPNV4);
+ } else if (config.flowSpecCapability().equals("IPV4_VPNV4")) {
+ bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.IPV4_VPNV4);
} else {
- log.info(" Self configuration cannot be modified as there is existing connections ");
+ bgpConfig.setFlowSpecCapability(BgpCfg.FlowSpec.NONE);
}
bgpConfig.setFlowSpecRpdCapability(config.rpdCapability());
@@ -227,6 +227,11 @@
absPeerList.add(peer);
exists = false;
}
+
+ if (peer.connectPeer() != null) {
+ peer.connectPeer().disconnectPeer();
+ peer.setConnectPeer(null);
+ }
}
/* Remove the absent nodes. */