TW-208: ChannelInfoReport from Survey, RSSI metrics enable

This commit is contained in:
Mike Hansen
2020-03-25 16:00:13 -04:00
parent 78de332437
commit 03e627fb26
2 changed files with 1931 additions and 1888 deletions

View File

@@ -66,11 +66,13 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface {
public void listenForConnections() { public void listenForConnections() {
// This class is only used here, therefore changed it back to an inner class, // This class is only used here, therefore changed it back to an inner
// class,
// removed the package level class. // removed the package level class.
// All calling classes related to OVSDB are calling the MonitorCallback // All calling classes related to OVSDB are calling the MonitorCallback
// interface, so the implementation can remain // interface, so the implementation can remain
// hidden. This also gives handy access to the Autowired instances in the // hidden. This also gives handy access to the Autowired instances in
// the
// container class. // container class.
class ConnectusMonitorCallback implements MonitorCallback { class ConnectusMonitorCallback implements MonitorCallback {
@@ -86,29 +88,30 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface {
Set<String> tableNames = tableUpdates.getTableUpdates().keySet(); Set<String> tableNames = tableUpdates.getTableUpdates().keySet();
for (String name : tableNames) { for (String name : tableNames) {
LOG.debug("Receive update for table {}", name); LOG.trace("Receive update for table {}", name);
Map<UUID, RowUpdate> updates = tableUpdates.getTableUpdates().get(name).getRowUpdates(); Map<UUID, RowUpdate> updates = tableUpdates.getTableUpdates().get(name).getRowUpdates();
for (UUID id : updates.keySet()) { for (UUID id : updates.keySet()) {
LOG.debug("Receive row update for uuid {}", id); LOG.trace("Receive row update for uuid {}", id);
RowUpdate rowUpdate = updates.get(id); RowUpdate rowUpdate = updates.get(id);
Row newRow = rowUpdate.getNew(); Row newRow = rowUpdate.getNew();
if (newRow != null) {
Set<String> newRowColumns = newRow.getColumns().keySet(); Set<String> newRowColumns = newRow.getColumns().keySet();
Row oldRow = rowUpdate.getOld(); Row oldRow = rowUpdate.getOld();
for (String column : newRowColumns) { for (String column : newRowColumns) {
Value oldVal = null; Value oldVal = null;
if (oldRow != null && oldRow.getColumns().containsKey(column)) oldVal = oldRow.getColumns().get(column); if (oldRow != null && oldRow.getColumns().containsKey(column))
oldVal = oldRow.getColumns().get(column);
Value newVal = newRow.getColumns().get(column); Value newVal = newRow.getColumns().get(column);
LOG.debug("For column {} previous value {} is now {}", column, oldVal, newVal); }
} }
} }
@@ -116,18 +119,22 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface {
} }
// get session information for this client // get session information for this client
// OvsdbSession ovsdbSession = ovsdbSessionMapInterface.getSession(connectedClientId); // OvsdbSession ovsdbSession =
// ovsdbSessionMapInterface.getSession(connectedClientId);
// if (ovsdbSession == null) { // if (ovsdbSession == null) {
// throw new IllegalStateException("AP with id " + connectedClientId + " is not connected"); // throw new IllegalStateException("AP with id " +
// connectedClientId + " is not connected");
// } // }
// //
// OvsdbClient ovsdbClient = ovsdbSession.getOvsdbClient(); // OvsdbClient ovsdbClient = ovsdbSession.getOvsdbClient();
// OpensyncAPConfig opensyncAPConfig = extIntegrationInterface.getApConfig(connectedClientId); // OpensyncAPConfig opensyncAPConfig =
// extIntegrationInterface.getApConfig(connectedClientId);
// TODO: // TODO:
// example wifiVifStateDbTable get MAC ADDRESS via ovsdbClient from // example wifiVifStateDbTable get MAC ADDRESS via ovsdbClient
// Wifi_Associated_Clients given the associated UUID for the client // from
// Wifi_Associated_Clients given the associated UUID for the
// client
// TODO: // TODO:
// Changes from other Status (Wifi, Inet, etc.) tables? // Changes from other Status (Wifi, Inet, etc.) tables?
@@ -152,9 +159,12 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface {
ConnectNodeInfo connectNodeInfo = ovsdbDao.getConnectNodeInfo(ovsdbClient); ConnectNodeInfo connectNodeInfo = ovsdbDao.getConnectNodeInfo(ovsdbClient);
// successfully connected - register it in our connectedClients table // successfully connected - register it in our
// In Plume's environment clientCn is not unique that's why we are augmenting it // connectedClients table
// with the serialNumber and using it as a key (equivalent of KDC unique qrCode) // In Plume's environment clientCn is not unique that's why
// we are augmenting it
// with the serialNumber and using it as a key (equivalent
// of KDC unique qrCode)
String key = clientCn + "_" + connectNodeInfo.serialNumber; String key = clientCn + "_" + connectNodeInfo.serialNumber;
ConnectusOvsdbClient.this.ovsdbSessionMapInterface.newSession(key, ovsdbClient); ConnectusOvsdbClient.this.ovsdbSessionMapInterface.newSession(key, ovsdbClient);
extIntegrationInterface.apConnected(key, connectNodeInfo); extIntegrationInterface.apConnected(key, connectNodeInfo);
@@ -197,10 +207,13 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface {
String clientCn = SslUtil.extractCN(subjectDn); String clientCn = SslUtil.extractCN(subjectDn);
// disconnected - deregister ovsdbClient from our connectedClients table // disconnected - deregister ovsdbClient from our
// unfortunately we only know clientCn at this point, but in Plume's environment // connectedClients table
// unfortunately we only know clientCn at this point, but in
// Plume's environment
// they are not unique // they are not unique
// so we are doing a reverse lookup here, and then if we find the key we will // so we are doing a reverse lookup here, and then if we find
// the key we will
// remove the entry from the connectedClients. // remove the entry from the connectedClients.
String key = ConnectusOvsdbClient.this.ovsdbSessionMapInterface.lookupClientId(ovsdbClient); String key = ConnectusOvsdbClient.this.ovsdbSessionMapInterface.lookupClientId(ovsdbClient);
@@ -235,7 +248,8 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface {
ovsdbDao.configureStats(ovsdbClient); ovsdbDao.configureStats(ovsdbClient);
// Check if device stats is configured in Wifi_Stats_Config table, provision it // Check if device stats is configured in Wifi_Stats_Config table,
// provision it
// if needed // if needed
if (ovsdbDao.getDeviceStatsReportingInterval(ovsdbClient) != collectionIntervalSecDeviceStats) { if (ovsdbDao.getDeviceStatsReportingInterval(ovsdbClient) != collectionIntervalSecDeviceStats) {
ovsdbDao.updateDeviceStatsReportingInterval(ovsdbClient, collectionIntervalSecDeviceStats); ovsdbDao.updateDeviceStatsReportingInterval(ovsdbClient, collectionIntervalSecDeviceStats);

View File

@@ -105,8 +105,7 @@ public class OvsdbDao {
columns.add("if_name"); columns.add("if_name");
MonitorRequest monitorRequest = new MonitorRequest(); MonitorRequest monitorRequest = new MonitorRequest();
MonitorRequests monitorRequests = new MonitorRequests( MonitorRequests monitorRequests = new MonitorRequests(ImmutableMap.of(wifiRouteStateDbTable, monitorRequest));
ImmutableMap.of(wifiRouteStateDbTable, monitorRequest));
try { try {
ovsdbClient.monitor(ovsdbName, wifiRouteStateDbTableMonitorId, monitorRequests, monitorCallback); ovsdbClient.monitor(ovsdbName, wifiRouteStateDbTableMonitorId, monitorRequests, monitorCallback);
} catch (OvsdbClientException e) { } catch (OvsdbClientException e) {
@@ -128,8 +127,7 @@ public class OvsdbDao {
columns.add("port_state"); columns.add("port_state");
MonitorRequest monitorRequest = new MonitorRequest(); MonitorRequest monitorRequest = new MonitorRequest();
MonitorRequests monitorRequests = new MonitorRequests( MonitorRequests monitorRequests = new MonitorRequests(ImmutableMap.of(wifiMasterStateDbTable, monitorRequest));
ImmutableMap.of(wifiMasterStateDbTable, monitorRequest));
try { try {
ovsdbClient.monitor(ovsdbName, wifiMasterStateDbTableMonitorId, monitorRequests, monitorCallback); ovsdbClient.monitor(ovsdbName, wifiMasterStateDbTableMonitorId, monitorRequests, monitorCallback);
@@ -137,6 +135,7 @@ public class OvsdbDao {
LOG.error("Unable to add Monitor to table " + wifiMasterStateDbTable, e); LOG.error("Unable to add Monitor to table " + wifiMasterStateDbTable, e);
} }
} }
public void monitorVIFState(OvsdbClient ovsdbClient, MonitorCallback monitorCallback) { public void monitorVIFState(OvsdbClient ovsdbClient, MonitorCallback monitorCallback) {
List<String> columns = new ArrayList<>(); List<String> columns = new ArrayList<>();
columns.add("_uuid"); columns.add("_uuid");
@@ -162,8 +161,7 @@ public class OvsdbDao {
columns.add("vif_radio_idx"); columns.add("vif_radio_idx");
MonitorRequest monitorRequest = new MonitorRequest(); MonitorRequest monitorRequest = new MonitorRequest();
MonitorRequests monitorRequests = new MonitorRequests( MonitorRequests monitorRequests = new MonitorRequests(ImmutableMap.of(wifiVifStateDbTable, monitorRequest));
ImmutableMap.of(wifiVifStateDbTable, monitorRequest));
try { try {
ovsdbClient.monitor(ovsdbName, wifiVifStateDbTableMonitorId, monitorRequests, monitorCallback); ovsdbClient.monitor(ovsdbName, wifiVifStateDbTableMonitorId, monitorRequests, monitorCallback);
@@ -190,10 +188,8 @@ public class OvsdbDao {
columns.add("netmask"); columns.add("netmask");
columns.add("network"); columns.add("network");
MonitorRequest monitorRequest = new MonitorRequest(); MonitorRequest monitorRequest = new MonitorRequest();
MonitorRequests monitorRequests = new MonitorRequests( MonitorRequests monitorRequests = new MonitorRequests(ImmutableMap.of(wifiInetStateDbTable, monitorRequest));
ImmutableMap.of(wifiInetStateDbTable, monitorRequest));
try { try {
ovsdbClient.monitor(ovsdbName, wifiInetStateDbTableMonitorId, monitorRequests, monitorCallback); ovsdbClient.monitor(ovsdbName, wifiInetStateDbTableMonitorId, monitorRequests, monitorCallback);
@@ -204,7 +200,8 @@ public class OvsdbDao {
} }
// //
//Note: When talking to OVSDB always use future.get(X, TimeUnit.SECONDS); - to prevent DOS attacks with misbehaving clients // Note: When talking to OVSDB always use future.get(X, TimeUnit.SECONDS); -
// to prevent DOS attacks with misbehaving clients
// //
public void cancelMonitors(OvsdbClient ovsdbClient) { public void cancelMonitors(OvsdbClient ovsdbClient) {
try { try {
@@ -217,6 +214,7 @@ public class OvsdbDao {
LOG.debug("Could not cancel Monitor. {}", e.getLocalizedMessage()); LOG.debug("Could not cancel Monitor. {}", e.getLocalizedMessage());
} }
} }
public void monitorRadioConfigState(OvsdbClient ovsdbClient, MonitorCallback monitorCallback) { public void monitorRadioConfigState(OvsdbClient ovsdbClient, MonitorCallback monitorCallback) {
List<String> columns = new ArrayList<>(); List<String> columns = new ArrayList<>();
@@ -247,8 +245,6 @@ public class OvsdbDao {
monitorRequests.put(wifiRadioStateDbTable, monitorRequest); monitorRequests.put(wifiRadioStateDbTable, monitorRequest);
MonitorRequests requests = new MonitorRequests(monitorRequests); MonitorRequests requests = new MonitorRequests(monitorRequests);
try { try {
ovsdbClient.monitor(ovsdbName, wifiRadioStateDbTableMonitorId, requests, monitorCallback); ovsdbClient.monitor(ovsdbName, wifiRadioStateDbTableMonitorId, requests, monitorCallback);
} catch (OvsdbClientException e) { } catch (OvsdbClientException e) {
@@ -273,7 +269,6 @@ public class OvsdbDao {
columns.add("firmware_version"); columns.add("firmware_version");
columns.add("platform_version"); columns.add("platform_version");
operations.add(new Select(awlanNodeDbTable, conditions, columns)); operations.add(new Select(awlanNodeDbTable, conditions, columns));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations); CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS); OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
@@ -310,7 +305,6 @@ public class OvsdbDao {
fillInIpAddressAndMac(ovsdbClient, ret, "br-lan"); fillInIpAddressAndMac(ovsdbClient, ret, "br-lan");
} }
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) { } catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@@ -334,7 +328,6 @@ public class OvsdbDao {
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations); CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS); OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("Select from {}:", wifiInetStateDbTable); LOG.debug("Select from {}:", wifiInetStateDbTable);
@@ -350,14 +343,14 @@ public class OvsdbDao {
connectNodeInfo.macAddress = row.getStringColumn("hwaddr"); connectNodeInfo.macAddress = row.getStringColumn("hwaddr");
} }
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) { } catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
public ConnectNodeInfo updateConnectNodeInfoOnConnect(OvsdbClient ovsdbClient, String clientCn, ConnectNodeInfo incomingConnectNodeInfo) { public ConnectNodeInfo updateConnectNodeInfoOnConnect(OvsdbClient ovsdbClient, String clientCn,
ConnectNodeInfo incomingConnectNodeInfo) {
ConnectNodeInfo ret = incomingConnectNodeInfo.clone(); ConnectNodeInfo ret = incomingConnectNodeInfo.clone();
try { try {
@@ -374,7 +367,8 @@ public class OvsdbDao {
} }
// Configure the MQTT connection // Configure the MQTT connection
//ovsh u AWLAN_Node mqtt_settings:ins:'["map",[["broker","testportal.123wlan.com"],["topics","/ap/dev-ap-0300/opensync"],["qos","0"],["port","1883"],["remote_log","1"]]]' // ovsh u AWLAN_Node
// mqtt_settings:ins:'["map",[["broker","testportal.123wlan.com"],["topics","/ap/dev-ap-0300/opensync"],["qos","0"],["port","1883"],["remote_log","1"]]]'
Map<String, String> newMqttSettings = new HashMap<>(); Map<String, String> newMqttSettings = new HashMap<>();
newMqttSettings.put("broker", mqttBrokerAddress); newMqttSettings.put("broker", mqttBrokerAddress);
newMqttSettings.put("topics", "/ap/" + clientCn + "_" + ret.serialNumber + "/opensync"); newMqttSettings.put("topics", "/ap/" + clientCn + "_" + ret.serialNumber + "/opensync");
@@ -385,7 +379,8 @@ public class OvsdbDao {
if (ret.mqttSettings == null || !ret.mqttSettings.equals(newMqttSettings)) { if (ret.mqttSettings == null || !ret.mqttSettings.equals(newMqttSettings)) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String,String> mgttSettings = com.vmware.ovsdb.protocol.operation.notation.Map.of(newMqttSettings); com.vmware.ovsdb.protocol.operation.notation.Map<String, String> mgttSettings = com.vmware.ovsdb.protocol.operation.notation.Map
.of(newMqttSettings);
ret.mqttSettings = newMqttSettings; ret.mqttSettings = newMqttSettings;
updateColumns.put("mqtt_settings", mgttSettings); updateColumns.put("mqtt_settings", mgttSettings);
} }
@@ -413,10 +408,11 @@ public class OvsdbDao {
return ret; return ret;
} }
/** /**
* @param ovsdbClient * @param ovsdbClient
* @return value of reporting_interval column for the stats_type=device from the Wifi_Stats_Config table. If value is not provisioned then return -1. * @return value of reporting_interval column for the stats_type=device from
* the Wifi_Stats_Config table. If value is not provisioned then
* return -1.
*/ */
public long getDeviceStatsReportingInterval(OvsdbClient ovsdbClient) { public long getDeviceStatsReportingInterval(OvsdbClient ovsdbClient) {
long ret = -1; long ret = -1;
@@ -447,7 +443,8 @@ public class OvsdbDao {
if (result != null && result.length > 0 && !((SelectResult) result[0]).getRows().isEmpty()) { if (result != null && result.length > 0 && !((SelectResult) result[0]).getRows().isEmpty()) {
row = ((SelectResult) result[0]).getRows().iterator().next(); row = ((SelectResult) result[0]).getRows().iterator().next();
ret = row.getIntegerColumn("reporting_interval"); ret = row.getIntegerColumn("reporting_interval");
LOG.info("Stats collection for stats_type=device is already configured with reporting_interval = {}", ret); LOG.info("Stats collection for stats_type=device is already configured with reporting_interval = {}",
ret);
} }
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) { } catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
@@ -459,15 +456,20 @@ public class OvsdbDao {
/** /**
* @param ovsdbClient * @param ovsdbClient
* @param value of reporting_interval column for the stats_type=device from the Wifi_Stats_Config table. If value is not provisioned then return -1. * @param value
* of reporting_interval column for the stats_type=device from
* the Wifi_Stats_Config table. If value is not provisioned then
* return -1.
*/ */
public void updateDeviceStatsReportingInterval(OvsdbClient ovsdbClient, long newValue) { public void updateDeviceStatsReportingInterval(OvsdbClient ovsdbClient, long newValue) {
try { try {
List<Operation> operations = new ArrayList<>(); List<Operation> operations = new ArrayList<>();
Map<String, Value> updateColumns = new HashMap<>(); Map<String, Value> updateColumns = new HashMap<>();
//turn on stats collection over MQTT: (reporting_interval is in seconds?) // turn on stats collection over MQTT: (reporting_interval is in
//$ ovsh i Wifi_Stats_Config reporting_interval:=10 radio_type:="2.4G" stats_type:="device" // seconds?)
// $ ovsh i Wifi_Stats_Config reporting_interval:=10
// radio_type:="2.4G" stats_type:="device"
updateColumns.put("reporting_interval", new Atom<Integer>(10)); updateColumns.put("reporting_interval", new Atom<Integer>(10));
updateColumns.put("radio_type", new Atom<String>("2.4G")); updateColumns.put("radio_type", new Atom<String>("2.4G"));
@@ -493,7 +495,6 @@ public class OvsdbDao {
} }
public void performRedirect(OvsdbClient ovsdbClient, String clientCn) { public void performRedirect(OvsdbClient ovsdbClient, String clientCn) {
List<Operation> operations = new ArrayList<>(); List<Operation> operations = new ArrayList<>();
@@ -534,7 +535,8 @@ public class OvsdbDao {
serialNumber = getSingleValueFromSet(row, "serial_number"); serialNumber = getSingleValueFromSet(row, "serial_number");
model = getSingleValueFromSet(row, "model"); model = getSingleValueFromSet(row, "model");
LOG.info("Redirecting AP Node: clientCn {} serialNumber {} model {} firmwareVersion {} skuNumber {}", clientCn, serialNumber, model, firmwareVersion, skuNumber); LOG.info("Redirecting AP Node: clientCn {} serialNumber {} model {} firmwareVersion {} skuNumber {}",
clientCn, serialNumber, model, firmwareVersion, skuNumber);
// Update table AWLAN_Node - set manager_addr // Update table AWLAN_Node - set manager_addr
operations.clear(); operations.clear();
@@ -768,7 +770,6 @@ public class OvsdbDao {
wifiRadioConfigInfo.freqBand = row.getStringColumn("freq_band"); wifiRadioConfigInfo.freqBand = row.getStringColumn("freq_band");
wifiRadioConfigInfo.hwConfig = row.getMapColumn("hw_config"); wifiRadioConfigInfo.hwConfig = row.getMapColumn("hw_config");
ret.put(wifiRadioConfigInfo.ifName, wifiRadioConfigInfo); ret.put(wifiRadioConfigInfo.ifName, wifiRadioConfigInfo);
} }
@@ -938,7 +939,8 @@ public class OvsdbDao {
wifiStatsConfigInfo.threshold = row.getMapColumn("threshold"); wifiStatsConfigInfo.threshold = row.getMapColumn("threshold");
wifiStatsConfigInfo.uuid = row.getUuidColumn("_uuid"); wifiStatsConfigInfo.uuid = row.getUuidColumn("_uuid");
ret.put(wifiStatsConfigInfo.radioType + "_" + wifiStatsConfigInfo.statsType + "_" + wifiStatsConfigInfo.surveyType, wifiStatsConfigInfo); ret.put(wifiStatsConfigInfo.radioType + "_" + wifiStatsConfigInfo.statsType + "_"
+ wifiStatsConfigInfo.surveyType, wifiStatsConfigInfo);
} }
LOG.debug("Retrieved WifiStatsConfigs: {}", ret); LOG.debug("Retrieved WifiStatsConfigs: {}", ret);
@@ -952,7 +954,9 @@ public class OvsdbDao {
return ret; return ret;
} }
public void provisionSingleBridgePortInterface(OvsdbClient ovsdbClient, String interfaceName, String bridgeName, String interfaceType, Map<String, String> interfaceOptions, Map<String, InterfaceInfo> provisionedInterfaces, Map<String, PortInfo> provisionedPorts, public void provisionSingleBridgePortInterface(OvsdbClient ovsdbClient, String interfaceName, String bridgeName,
String interfaceType, Map<String, String> interfaceOptions,
Map<String, InterfaceInfo> provisionedInterfaces, Map<String, PortInfo> provisionedPorts,
Map<String, BridgeInfo> provisionedBridges) Map<String, BridgeInfo> provisionedBridges)
throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException { throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException {
@@ -962,7 +966,6 @@ public class OvsdbDao {
Map<String, Value> updateColumns = new HashMap<>(); Map<String, Value> updateColumns = new HashMap<>();
List<Condition> conditions = new ArrayList<>(); List<Condition> conditions = new ArrayList<>();
updateColumns.put("name", new Atom<>(interfaceName)); updateColumns.put("name", new Atom<>(interfaceName));
if (interfaceType != null) { if (interfaceType != null) {
updateColumns.put("type", new Atom<>(interfaceType)); updateColumns.put("type", new Atom<>(interfaceType));
@@ -975,11 +978,11 @@ public class OvsdbDao {
if (interfaceOptions != null) { if (interfaceOptions != null) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String,String> ifOptions = com.vmware.ovsdb.protocol.operation.notation.Map.of(interfaceOptions); com.vmware.ovsdb.protocol.operation.notation.Map<String, String> ifOptions = com.vmware.ovsdb.protocol.operation.notation.Map
.of(interfaceOptions);
updateColumns.put("options", ifOptions); updateColumns.put("options", ifOptions);
} }
Uuid interfaceUuid = null; Uuid interfaceUuid = null;
Row row = new Row(updateColumns); Row row = new Row(updateColumns);
@@ -1010,13 +1013,15 @@ public class OvsdbDao {
// need to create port // need to create port
updateColumns = new HashMap<>(); updateColumns = new HashMap<>();
//portUuid = new Uuid(new UUID(System.currentTimeMillis(), System.nanoTime())) ; // portUuid = new Uuid(new UUID(System.currentTimeMillis(),
// System.nanoTime())) ;
updateColumns.put("name", new Atom<String>(interfaceName)); updateColumns.put("name", new Atom<String>(interfaceName));
// updateColumns.put("_uuid", new Atom<Uuid>(portUuid)); // updateColumns.put("_uuid", new Atom<Uuid>(portUuid));
Set<Uuid> portInterfacesSet = new HashSet<>(); Set<Uuid> portInterfacesSet = new HashSet<>();
portInterfacesSet.add(interfaceUuid); portInterfacesSet.add(interfaceUuid);
com.vmware.ovsdb.protocol.operation.notation.Set portInterfaces = com.vmware.ovsdb.protocol.operation.notation.Set.of(portInterfacesSet); com.vmware.ovsdb.protocol.operation.notation.Set portInterfaces = com.vmware.ovsdb.protocol.operation.notation.Set
.of(portInterfacesSet);
updateColumns.put("interfaces", portInterfaces); updateColumns.put("interfaces", portInterfaces);
row = new Row(updateColumns); row = new Row(updateColumns);
@@ -1051,7 +1056,8 @@ public class OvsdbDao {
portInterfacesSet.addAll(existingPort.interfaceUuids); portInterfacesSet.addAll(existingPort.interfaceUuids);
} }
portInterfacesSet.add(interfaceUuid); portInterfacesSet.add(interfaceUuid);
com.vmware.ovsdb.protocol.operation.notation.Set portInterfaces = com.vmware.ovsdb.protocol.operation.notation.Set.of(portInterfacesSet); com.vmware.ovsdb.protocol.operation.notation.Set portInterfaces = com.vmware.ovsdb.protocol.operation.notation.Set
.of(portInterfacesSet);
updateColumns.put("interfaces", portInterfaces); updateColumns.put("interfaces", portInterfaces);
row = new Row(updateColumns); row = new Row(updateColumns);
@@ -1070,12 +1076,10 @@ public class OvsdbDao {
} }
if (portUuid == null) { if (portUuid == null) {
throw new IllegalStateException("Port entry was not created successfully"); throw new IllegalStateException("Port entry was not created successfully");
} }
operations = new ArrayList<>(); operations = new ArrayList<>();
// link the port to the bridge // link the port to the bridge
@@ -1087,21 +1091,22 @@ public class OvsdbDao {
conditions.add(new Condition("name", Function.EQUALS, new Atom<>(bridgeName))); conditions.add(new Condition("name", Function.EQUALS, new Atom<>(bridgeName)));
Set<Uuid> bridgePortsSet = new HashSet<>(); Set<Uuid> bridgePortsSet = new HashSet<>();
if (existingBridge.portUuids != null) { if (existingBridge.portUuids != null) {
bridgePortsSet.addAll(existingBridge.portUuids); bridgePortsSet.addAll(existingBridge.portUuids);
} }
bridgePortsSet.add(portUuid); bridgePortsSet.add(portUuid);
com.vmware.ovsdb.protocol.operation.notation.Set bridgePorts = com.vmware.ovsdb.protocol.operation.notation.Set.of(bridgePortsSet); com.vmware.ovsdb.protocol.operation.notation.Set bridgePorts = com.vmware.ovsdb.protocol.operation.notation.Set
.of(bridgePortsSet);
updateColumns.put("ports", bridgePorts); updateColumns.put("ports", bridgePorts);
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Update(bridgeDbTable, row)); operations.add(new Update(bridgeDbTable, row));
} else { } else {
LOG.warn("provisionedBridges does not have bridge {} - {} - port will be dangling", bridgeName, provisionedBridges.keySet()); LOG.warn("provisionedBridges does not have bridge {} - {} - port will be dangling", bridgeName,
provisionedBridges.keySet());
} }
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations); CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
@@ -1143,11 +1148,15 @@ public class OvsdbDao {
Map<String, String> patchW2hOptions = new HashMap<>(); Map<String, String> patchW2hOptions = new HashMap<>();
patchH2wOptions.put("peer", "patch-h2w"); patchH2wOptions.put("peer", "patch-h2w");
provisionSingleBridgePortInterface(ovsdbClient, patchH2w, brHome, "patch", patchH2wOptions, provisionedInterfaces, provisionedPorts, provisionedBridges); provisionSingleBridgePortInterface(ovsdbClient, patchH2w, brHome, "patch", patchH2wOptions,
provisionSingleBridgePortInterface(ovsdbClient, patchW2h, brWan, "patch", patchW2hOptions, provisionedInterfaces, provisionedPorts, provisionedBridges); provisionedInterfaces, provisionedPorts, provisionedBridges);
provisionSingleBridgePortInterface(ovsdbClient, patchW2h, brWan, "patch", patchW2hOptions,
provisionedInterfaces, provisionedPorts, provisionedBridges);
provisionSingleBridgePortInterface(ovsdbClient, homeApL50, brHome, null, null, provisionedInterfaces, provisionedPorts, provisionedBridges); provisionSingleBridgePortInterface(ovsdbClient, homeApL50, brHome, null, null, provisionedInterfaces,
provisionSingleBridgePortInterface(ovsdbClient, homeAp24, brHome, null, null, provisionedInterfaces, provisionedPorts, provisionedBridges); provisionedPorts, provisionedBridges);
provisionSingleBridgePortInterface(ovsdbClient, homeAp24, brHome, null, null, provisionedInterfaces,
provisionedPorts, provisionedBridges);
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) { } catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
LOG.error("Error in provisionBridgePortInterface", e); LOG.error("Error in provisionBridgePortInterface", e);
@@ -1199,12 +1208,12 @@ public class OvsdbDao {
} }
} }
// Now clean up references in the vif_configs columns // Now clean up references in the vif_configs columns
operations = new ArrayList<>(); operations = new ArrayList<>();
Map<String, Value> updateColumns = new HashMap<>(); Map<String, Value> updateColumns = new HashMap<>();
Set<Uuid> vifConfigsSet = new HashSet<>(); Set<Uuid> vifConfigsSet = new HashSet<>();
com.vmware.ovsdb.protocol.operation.notation.Set vifConfigs = com.vmware.ovsdb.protocol.operation.notation.Set.of(vifConfigsSet); com.vmware.ovsdb.protocol.operation.notation.Set vifConfigs = com.vmware.ovsdb.protocol.operation.notation.Set
.of(vifConfigsSet);
updateColumns.put("vif_configs", vifConfigs); updateColumns.put("vif_configs", vifConfigs);
Row row = new Row(updateColumns); Row row = new Row(updateColumns);
@@ -1267,8 +1276,8 @@ public class OvsdbDao {
} }
public void configureWifiRadios(OvsdbClient ovsdbClient, String configName, public void configureWifiRadios(OvsdbClient ovsdbClient, String configName,
Map<String, WifiRadioConfigInfo> provisionedWifiRadios, int channel, Map<String, String> hwConfig, String country ) Map<String, WifiRadioConfigInfo> provisionedWifiRadios, int channel, Map<String, String> hwConfig,
throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException { String country) throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException {
WifiRadioConfigInfo existingConfig = provisionedWifiRadios.get(configName); WifiRadioConfigInfo existingConfig = provisionedWifiRadios.get(configName);
@@ -1285,7 +1294,8 @@ public class OvsdbDao {
updateColumns.put("channel", new Atom<Integer>(channel)); updateColumns.put("channel", new Atom<Integer>(channel));
updateColumns.put("country", new Atom<>(country)); updateColumns.put("country", new Atom<>(country));
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String,String> hwConfigMap = com.vmware.ovsdb.protocol.operation.notation.Map.of(hwConfig); com.vmware.ovsdb.protocol.operation.notation.Map<String, String> hwConfigMap = com.vmware.ovsdb.protocol.operation.notation.Map
.of(hwConfig);
updateColumns.put("hw_config", hwConfigMap); updateColumns.put("hw_config", hwConfigMap);
Row row = new Row(updateColumns); Row row = new Row(updateColumns);
@@ -1301,15 +1311,19 @@ public class OvsdbDao {
} }
} }
public void configureSingleSsid(OvsdbClient ovsdbClient, String bridge, String ifName, String ssid, boolean ssidBroadcast, Map<String, String> security, Map<String,WifiRadioConfigInfo> provisionedWifiRadioConfigs, String radioIfName) { public void configureSingleSsid(OvsdbClient ovsdbClient, String bridge, String ifName, String ssid,
boolean ssidBroadcast, Map<String, String> security,
Map<String, WifiRadioConfigInfo> provisionedWifiRadioConfigs, String radioIfName) {
List<Operation> operations = new ArrayList<>(); List<Operation> operations = new ArrayList<>();
Map<String, Value> updateColumns = new HashMap<>(); Map<String, Value> updateColumns = new HashMap<>();
try { try {
/// usr/plume/tools/ovsh i Wifi_VIF_Config /// usr/plume/tools/ovsh i Wifi_VIF_Config
// bridge:=br-home btm:=1 enabled:=true ft_psk:=0 group_rekey:=86400 // bridge:=br-home btm:=1 enabled:=true ft_psk:=0 group_rekey:=86400
// if_name:=home-ap-24 mode:=ap rrm:=1 ssid:=ConnectUS-Plume ssid_broadcast:=enabled // if_name:=home-ap-24 mode:=ap rrm:=1 ssid:=ConnectUS-Plume
// uapsd_enable:=true vif_radio_idx:=2 security:='["map",[["encryption","WPA-PSK"],["key","12345678"],["mode","2"]]]' /// ssid_broadcast:=enabled
// uapsd_enable:=true vif_radio_idx:=2
/// security:='["map",[["encryption","WPA-PSK"],["key","12345678"],["mode","2"]]]'
updateColumns.put("bridge", new Atom<>(bridge)); updateColumns.put("bridge", new Atom<>(bridge));
updateColumns.put("btm", new Atom<>(1)); updateColumns.put("btm", new Atom<>(1));
@@ -1325,7 +1339,8 @@ public class OvsdbDao {
updateColumns.put("vif_radio_idx", new Atom<>(2)); updateColumns.put("vif_radio_idx", new Atom<>(2));
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String,String> securityMap = com.vmware.ovsdb.protocol.operation.notation.Map.of(security); com.vmware.ovsdb.protocol.operation.notation.Map<String, String> securityMap = com.vmware.ovsdb.protocol.operation.notation.Map
.of(security);
updateColumns.put("security", securityMap); updateColumns.put("security", securityMap);
Row row = new Row(updateColumns); Row row = new Row(updateColumns);
@@ -1349,7 +1364,9 @@ public class OvsdbDao {
} }
// update Wifi_Radio_Config here - add vifConfigUuid // update Wifi_Radio_Config here - add vifConfigUuid
///usr/plume/tools/ovsh u Wifi_Radio_Config vif_configs:='["set",[["uuid","98e42897-b567-4186-84a6-4a4e38a51e9d"],["uuid","4314920e-c4e6-42a6-93e3-261142ed9adf"]]]' --where if_name==wifi0 /// usr/plume/tools/ovsh u Wifi_Radio_Config
// vif_configs:='["set",[["uuid","98e42897-b567-4186-84a6-4a4e38a51e9d"],["uuid","4314920e-c4e6-42a6-93e3-261142ed9adf"]]]'
// --where if_name==wifi0
updateColumns.clear(); updateColumns.clear();
operations.clear(); operations.clear();
@@ -1360,7 +1377,8 @@ public class OvsdbDao {
Set<Uuid> vifConfigsSet = new HashSet<>(wifiRadioConfigInfo.vifConfigUuids); Set<Uuid> vifConfigsSet = new HashSet<>(wifiRadioConfigInfo.vifConfigUuids);
vifConfigsSet.add(vifConfigUuid); vifConfigsSet.add(vifConfigUuid);
com.vmware.ovsdb.protocol.operation.notation.Set vifConfigs = com.vmware.ovsdb.protocol.operation.notation.Set.of(vifConfigsSet); com.vmware.ovsdb.protocol.operation.notation.Set vifConfigs = com.vmware.ovsdb.protocol.operation.notation.Set
.of(vifConfigsSet);
updateColumns.put("vif_configs", vifConfigs); updateColumns.put("vif_configs", vifConfigs);
List<Condition> conditions = new ArrayList<>(); List<Condition> conditions = new ArrayList<>();
@@ -1411,7 +1429,8 @@ public class OvsdbDao {
if (!provisionedWifiVifConfigs.containsKey(ifName + "_" + ssid)) { if (!provisionedWifiVifConfigs.containsKey(ifName + "_" + ssid)) {
try { try {
configureSingleSsid(ovsdbClient, bridge, ifName, ssid, ssidBroadcast, security, provisionedWifiRadioConfigs, radioIfName); configureSingleSsid(ovsdbClient, bridge, ifName, ssid, ssidBroadcast, security,
provisionedWifiRadioConfigs, radioIfName);
} catch (IllegalStateException e) { } catch (IllegalStateException e) {
// could not provision this SSID, but still can go on // could not provision this SSID, but still can go on
LOG.warn("could not provision SSID {} on {}", ssid, radioIfName); LOG.warn("could not provision SSID {} on {}", ssid, radioIfName);
@@ -1422,12 +1441,15 @@ public class OvsdbDao {
} }
public void configureWifiInet(OvsdbClient ovsdbClient, Map<String, WifiInetConfigInfo> provisionedWifiInetConfigs, String ifName) { public void configureWifiInet(OvsdbClient ovsdbClient, Map<String, WifiInetConfigInfo> provisionedWifiInetConfigs,
String ifName) {
List<Operation> operations = new ArrayList<>(); List<Operation> operations = new ArrayList<>();
Map<String, Value> updateColumns = new HashMap<>(); Map<String, Value> updateColumns = new HashMap<>();
try { try {
///usr/plume/tools/ovsh i Wifi_Inet_Config NAT:=false enabled:=true if_name:=home-ap-24 if_type:=vif ip_assign_scheme:=none network:=true /// usr/plume/tools/ovsh i Wifi_Inet_Config NAT:=false enabled:=true
/// if_name:=home-ap-24 if_type:=vif ip_assign_scheme:=none
/// network:=true
updateColumns.put("NAT", new Atom<>(false)); updateColumns.put("NAT", new Atom<>(false));
updateColumns.put("enabled", new Atom<>(true)); updateColumns.put("enabled", new Atom<>(true));
@@ -1461,7 +1483,8 @@ public class OvsdbDao {
List<Condition> conditions = new ArrayList<>(); List<Condition> conditions = new ArrayList<>();
try { try {
///usr/plume/tools/ovsh u Wifi_Inet_Config -w if_name=="br-home" network:=true /// usr/plume/tools/ovsh u Wifi_Inet_Config -w if_name=="br-home"
/// network:=true
conditions.add(new Condition("if_name", Function.EQUALS, new Atom<>(ifName))); conditions.add(new Condition("if_name", Function.EQUALS, new Atom<>(ifName)));
updateColumns.put("network", new Atom<>(true)); updateColumns.put("network", new Atom<>(true));
@@ -1518,14 +1541,16 @@ public class OvsdbDao {
channelSet.add(1); channelSet.add(1);
channelSet.add(6); channelSet.add(6);
channelSet.add(11); channelSet.add(11);
com.vmware.ovsdb.protocol.operation.notation.Set channels = com.vmware.ovsdb.protocol.operation.notation.Set.of(channelSet); com.vmware.ovsdb.protocol.operation.notation.Set channels = com.vmware.ovsdb.protocol.operation.notation.Set
.of(channelSet);
Map<String, Integer> thresholdMap = new HashMap<>(); Map<String, Integer> thresholdMap = new HashMap<>();
thresholdMap.put("max_delay", 600); thresholdMap.put("max_delay", 600);
thresholdMap.put("util", 10); thresholdMap.put("util", 10);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
com.vmware.ovsdb.protocol.operation.notation.Map<String, Integer> thresholds = com.vmware.ovsdb.protocol.operation.notation.Map.of(thresholdMap); com.vmware.ovsdb.protocol.operation.notation.Map<String, Integer> thresholds = com.vmware.ovsdb.protocol.operation.notation.Map
.of(thresholdMap);
if (!provisionedWifiStatsConfigs.containsKey("2.4G_device_null")) { if (!provisionedWifiStatsConfigs.containsKey("2.4G_device_null")) {
// //
@@ -1538,7 +1563,6 @@ public class OvsdbDao {
// updateColumns.put("survey_type", new Atom<>("on-chan") ); // updateColumns.put("survey_type", new Atom<>("on-chan") );
// updateColumns.put("threshold", thresholds ); // updateColumns.put("threshold", thresholds );
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row)); operations.add(new Insert(wifiStatsConfigDbTable, row));
// //
@@ -1556,7 +1580,6 @@ public class OvsdbDao {
updateColumns.put("survey_type", new Atom<>("on-chan")); updateColumns.put("survey_type", new Atom<>("on-chan"));
// updateColumns.put("threshold", thresholds ); // updateColumns.put("threshold", thresholds );
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row)); operations.add(new Insert(wifiStatsConfigDbTable, row));
// //
@@ -1574,7 +1597,6 @@ public class OvsdbDao {
updateColumns.put("survey_type", new Atom<>("off-chan")); updateColumns.put("survey_type", new Atom<>("off-chan"));
updateColumns.put("threshold", thresholds); updateColumns.put("threshold", thresholds);
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row)); operations.add(new Insert(wifiStatsConfigDbTable, row));
// //
@@ -1592,7 +1614,6 @@ public class OvsdbDao {
updateColumns.put("survey_type", new Atom<>("off-chan")); updateColumns.put("survey_type", new Atom<>("off-chan"));
// updateColumns.put("threshold", thresholds ); // updateColumns.put("threshold", thresholds );
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row)); operations.add(new Insert(wifiStatsConfigDbTable, row));
// //
@@ -1610,7 +1631,6 @@ public class OvsdbDao {
updateColumns.put("survey_type", new Atom<>("on-chan")); updateColumns.put("survey_type", new Atom<>("on-chan"));
// updateColumns.put("threshold", thresholds ); // updateColumns.put("threshold", thresholds );
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row)); operations.add(new Insert(wifiStatsConfigDbTable, row));
// //
@@ -1628,7 +1648,6 @@ public class OvsdbDao {
// updateColumns.put("survey_type", new Atom<>("on-chan") ); // updateColumns.put("survey_type", new Atom<>("on-chan") );
// updateColumns.put("threshold", thresholds ); // updateColumns.put("threshold", thresholds );
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row)); operations.add(new Insert(wifiStatsConfigDbTable, row));
// //
@@ -1646,7 +1665,6 @@ public class OvsdbDao {
// updateColumns.put("survey_type", new Atom<>("on-chan") ); // updateColumns.put("survey_type", new Atom<>("on-chan") );
// updateColumns.put("threshold", thresholds ); // updateColumns.put("threshold", thresholds );
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row)); operations.add(new Insert(wifiStatsConfigDbTable, row));
// //
@@ -1664,7 +1682,6 @@ public class OvsdbDao {
updateColumns.put("survey_type", new Atom<>("on-chan")); updateColumns.put("survey_type", new Atom<>("on-chan"));
// updateColumns.put("threshold", thresholds ); // updateColumns.put("threshold", thresholds );
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row)); operations.add(new Insert(wifiStatsConfigDbTable, row));
// //
@@ -1682,7 +1699,6 @@ public class OvsdbDao {
// updateColumns.put("survey_type", new Atom<>("on-chan") ); // updateColumns.put("survey_type", new Atom<>("on-chan") );
// updateColumns.put("threshold", thresholds ); // updateColumns.put("threshold", thresholds );
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row)); operations.add(new Insert(wifiStatsConfigDbTable, row));
// //
@@ -1700,7 +1716,6 @@ public class OvsdbDao {
updateColumns.put("survey_type", new Atom<>("on-chan")); updateColumns.put("survey_type", new Atom<>("on-chan"));
// updateColumns.put("threshold", thresholds ); // updateColumns.put("threshold", thresholds );
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row)); operations.add(new Insert(wifiStatsConfigDbTable, row));
// //
@@ -1718,7 +1733,6 @@ public class OvsdbDao {
updateColumns.put("survey_type", new Atom<>("on-chan")); updateColumns.put("survey_type", new Atom<>("on-chan"));
// updateColumns.put("threshold", thresholds ); // updateColumns.put("threshold", thresholds );
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row)); operations.add(new Insert(wifiStatsConfigDbTable, row));
// //
@@ -1736,12 +1750,28 @@ public class OvsdbDao {
updateColumns.put("survey_type", new Atom<>("on-chan")); updateColumns.put("survey_type", new Atom<>("on-chan"));
// updateColumns.put("threshold", thresholds ); // updateColumns.put("threshold", thresholds );
row = new Row(updateColumns); row = new Row(updateColumns);
operations.add(new Insert(wifiStatsConfigDbTable, row)); operations.add(new Insert(wifiStatsConfigDbTable, row));
// //
} }
for (String band : new String[] { "2.4G", "5GL", "5G" }) {
updateColumns = new HashMap<>();
updateColumns.put("radio_type", new Atom<>(band));
updateColumns.put("reporting_interval", new Atom<>(120));
updateColumns.put("sampling_interval", new Atom<>(0));
updateColumns.put("stats_type", new Atom<>("rssi"));
updateColumns.put("survey_interval_ms", new Atom<>(0));
updateColumns.put("survey_type", new Atom<>("on-chan"));
row = new Row(updateColumns);
if (provisionedWifiStatsConfigs.containsKey(band + "_rssi_onChannel")) {
operations.add(new Update(wifiStatsConfigDbTable, row));
} else {
operations.add(new Insert(wifiStatsConfigDbTable, row));
}
}
if (!operations.isEmpty()) { if (!operations.isEmpty()) {
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations); CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS); OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
@@ -1788,5 +1818,4 @@ public class OvsdbDao {
return newRedirectorAddress; return newRedirectorAddress;
} }
} }