From 81a76d75775c08f370a705be37539e1d24eeaeff Mon Sep 17 00:00:00 2001 From: Mike Hansen Date: Fri, 13 Mar 2020 15:17:21 -0400 Subject: [PATCH] TW-43: OSGW for MQTT and OVSDB Adding Monitors for State tables. Signed-off-by: Mike Hansen --- .../opensync/ovsdb/ConnectusOvsdbClient.java | 35 ++++- .../wlan/opensync/ovsdb/dao/OvsdbDao.java | 139 +++++++++++++++++- 2 files changed, 169 insertions(+), 5 deletions(-) diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/ConnectusOvsdbClient.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/ConnectusOvsdbClient.java index b65c2b2..3c89adf 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/ConnectusOvsdbClient.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/ConnectusOvsdbClient.java @@ -20,6 +20,8 @@ import com.telecominfraproject.wlan.opensync.external.integration.models.Opensyn import com.telecominfraproject.wlan.opensync.ovsdb.dao.OvsdbDao; import com.telecominfraproject.wlan.opensync.util.SslUtil; import com.vmware.ovsdb.callback.ConnectionCallback; +import com.vmware.ovsdb.callback.MonitorCallback; +import com.vmware.ovsdb.protocol.methods.TableUpdates; import com.vmware.ovsdb.service.OvsdbClient; import com.vmware.ovsdb.service.OvsdbPassiveConnectionListener; @@ -58,6 +60,25 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { listenForConnections(); } + public class ConnectusMonitorCallback implements MonitorCallback { + + String clientCNKey; + + public ConnectusMonitorCallback(String key) { + + clientCNKey = key; + + } + + @Override + public void update(TableUpdates tableUpdates) { + LOG.info("Monitor for client key {} received table updates {}", clientCNKey, tableUpdates); + + } + + } + + public void listenForConnections() { ConnectionCallback connectionCallback = new ConnectionCallback() { @@ -79,13 +100,20 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { ConnectusOvsdbClient.this.ovsdbSessionMapInterface.newSession(key, ovsdbClient); extIntegrationInterface.apConnected(key, connectNodeInfo); + //push configuration to AP connectNodeInfo = processConnectRequest(ovsdbClient, clientCn, connectNodeInfo); - LOG.info("ovsdbClient connected from {} on port {} key {} ", remoteHost, localPort, key); - LOG.info("ovsdbClient connectedClients = {}", ConnectusOvsdbClient.this.ovsdbSessionMapInterface.getNumSessions()); + // monitor radio config state + ovsdbDao.monitorRadioConfigState(ovsdbClient, new ConnectusMonitorCallback(key)); + // monitor inet state + ovsdbDao.monitorInetState(ovsdbClient, new ConnectusMonitorCallback(key)); + // monitor vif state + ovsdbDao.monitorVIFState(ovsdbClient, new ConnectusMonitorCallback(key)); + + } catch (Exception e) { LOG.error("ovsdbClient error", e); //something is wrong with the SSL @@ -115,7 +143,8 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { extIntegrationInterface.apDisconnected(key); ConnectusOvsdbClient.this.ovsdbSessionMapInterface.removeSession(key); } - + // turn off monitor + ovsdbDao.cancelMonitors(ovsdbClient); ovsdbClient.shutdown(); LOG.info("ovsdbClient disconnected from {} on port {} clientCn {} key {} ", remoteHost, localPort, clientCn, key); diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java index 02febf7..cc62473 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java @@ -6,6 +6,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -26,7 +27,14 @@ import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiInetConfigInfo import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiRadioConfigInfo; import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiStatsConfigInfo; import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiVifConfigInfo; +import com.vmware.ovsdb.callback.MonitorCallback; import com.vmware.ovsdb.exception.OvsdbClientException; +import com.vmware.ovsdb.protocol.methods.MonitorRequest; +import com.vmware.ovsdb.protocol.methods.MonitorRequests; +import com.vmware.ovsdb.protocol.methods.MonitorSelect; +import com.vmware.ovsdb.protocol.methods.RowUpdate; +import com.vmware.ovsdb.protocol.methods.TableUpdate; +import com.vmware.ovsdb.protocol.methods.TableUpdates; import com.vmware.ovsdb.protocol.operation.Delete; import com.vmware.ovsdb.protocol.operation.Insert; import com.vmware.ovsdb.protocol.operation.Operation; @@ -69,16 +77,141 @@ public class OvsdbDao { public static final String interfaceDbTable = "Interface"; public static final String portDbTable = "Port"; public static final String bridgeDbTable = "Bridge"; + public static final String wifiRadioConfigDbTable = "Wifi_Radio_Config"; + public static final String wifiRadioStateDbTable = "Wifi_Radio_State"; + public static final String wifiVifConfigDbTable = "Wifi_VIF_Config"; + public static final String wifiVifStateDbTable = "Wifi_VIF_State"; + public static final String wifiInetConfigDbTable = "Wifi_Inet_Config"; public static final String wifiInetStateDbTable = "Wifi_Inet_State"; - - + + private static final String wifiRadioStateDbTableMonitorId = "Wifi_Radio_State_Monitor_Id"; + private static final String wifiInetStateDbTableMonitorId = "Wifi_Inet_State_Monitor_Id"; + private static final String wifiVifStateDbTableMonitorId = "Wifi_VIF_State_Monitor_Id"; + + public void monitorVIFState(OvsdbClient ovsdbClient, MonitorCallback monitorCallback) { + List columns = new ArrayList<>(); + columns.add("_uuid"); + columns.add("_version"); + columns.add("ap_bridge"); + columns.add("associated_clients"); + columns.add("bridge"); + columns.add("btm"); + columns.add("channel"); + columns.add("dynamic_beacon"); + columns.add("enabled"); + columns.add("group_rekey"); + columns.add("if_name"); + columns.add("mac"); + columns.add("min_hw_mode"); + columns.add("mode"); + columns.add("rrm"); + columns.add("security"); + columns.add("ssid"); + columns.add("ssid_broadcast"); + columns.add("uapsd_enable"); + columns.add("vif_config"); + columns.add("vif_radio_idx"); + + MonitorRequest monitorRequest = new MonitorRequest(columns, new MonitorSelect(true,true,true,true)); + + Map monitorRequests = new HashMap(); + monitorRequests.put(wifiVifStateDbTable, monitorRequest); + MonitorRequests requests = new MonitorRequests(monitorRequests) ; + + try { + ovsdbClient.monitor(ovsdbName, wifiVifStateDbTableMonitorId, requests, monitorCallback); + } catch (OvsdbClientException e) { + LOG.error("Unable to add Monitor to table " + wifiVifStateDbTable, e); + } + + } + + public void monitorInetState (OvsdbClient ovsdbClient, MonitorCallback monitorCallback) { + List columns = new ArrayList<>(); + columns.add("_uuid"); + columns.add("_version"); + columns.add("broadcast"); + columns.add("dhcpc"); + columns.add("enabled"); + columns.add("hwaddr"); + columns.add("if_name"); + columns.add("if_type"); + columns.add("if_uuid"); + columns.add("inet_addr"); + columns.add("ip_assign_scheme"); + columns.add("mtu"); + columns.add("netmask"); + columns.add("network"); + + + MonitorRequest monitorRequest = new MonitorRequest(columns, new MonitorSelect(true,true,true,true)); + + Map monitorRequests = new HashMap(); + monitorRequests.put(wifiInetStateDbTable, monitorRequest); + MonitorRequests requests = new MonitorRequests(monitorRequests) ; + + try { + ovsdbClient.monitor(ovsdbName, wifiInetStateDbTableMonitorId, requests, monitorCallback); + } catch (OvsdbClientException e) { + LOG.error("Unable to add Monitor to table " + wifiInetStateDbTable, e); + } + + } // //Note: When talking to OVSDB always use future.get(X, TimeUnit.SECONDS); - to prevent DOS attacks with misbehaving clients // + public void cancelMonitors (OvsdbClient ovsdbClient) { + try { + ovsdbClient.cancelMonitor(wifiRadioStateDbTableMonitorId); + ovsdbClient.cancelMonitor(wifiVifStateDbTableMonitorId); + ovsdbClient.cancelMonitor(wifiInetStateDbTableMonitorId); + } catch (Exception e) { + LOG.error("Caught Exception {}", e); + } + } + public void monitorRadioConfigState (OvsdbClient ovsdbClient, MonitorCallback monitorCallback) { + + List columns = new ArrayList<>(); + columns.add("_uuid"); + columns.add("_version"); + columns.add("allowed_channels"); + columns.add("bcn_int"); + columns.add("channel"); + columns.add("channel_mode"); + columns.add("channels"); + columns.add("country"); + columns.add("enabled"); + columns.add("freq_band"); + columns.add("ht_mode"); + columns.add("hw_config"); + columns.add("hw_mode"); + columns.add("hw_params"); + columns.add("if_name"); + columns.add("mac"); + columns.add("radio_config"); + columns.add("tx_chainmask"); + columns.add("tx_power"); + columns.add("vif_states"); + + MonitorRequest monitorRequest = new MonitorRequest(columns, new MonitorSelect(true,true,true,true)); + + Map monitorRequests = new HashMap(); + monitorRequests.put(wifiRadioStateDbTable, monitorRequest); + MonitorRequests requests = new MonitorRequests(monitorRequests) ; + + + + try { + ovsdbClient.monitor(ovsdbName, wifiRadioStateDbTableMonitorId, requests, monitorCallback); + } catch (OvsdbClientException e) { + LOG.error("Unable to add Monitor to table " + wifiRadioStateDbTable, e); + } + + } public ConnectNodeInfo getConnectNodeInfo(OvsdbClient ovsdbClient) { ConnectNodeInfo ret = new ConnectNodeInfo(); @@ -1610,4 +1743,6 @@ public class OvsdbDao { return newRedirectorAddress; } + + }