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 3d04474..c2eb780 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 @@ -22,6 +22,7 @@ import com.telecominfraproject.wlan.core.model.equipment.RadioType; import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration; import com.telecominfraproject.wlan.equipment.models.ElementRadioConfiguration; import com.telecominfraproject.wlan.equipment.models.RadioConfiguration; +import com.telecominfraproject.wlan.equipment.models.RadioMode; import com.telecominfraproject.wlan.equipment.models.StateSetting; import com.telecominfraproject.wlan.opensync.external.integration.models.ConnectNodeInfo; import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig; @@ -645,6 +646,7 @@ public class OvsdbDao { columns.add("uapsd_enable"); columns.add("vif_radio_idx"); columns.add("security"); + columns.add("vlan_id"); try { LOG.debug("Retrieving WifiVifConfig:"); @@ -675,6 +677,10 @@ public class OvsdbDao { wifiVifConfigInfo.vifRadioIdx = row.getIntegerColumn("vif_radio_idx").intValue(); wifiVifConfigInfo.security = row.getMapColumn("security"); + if (row.getColumns().get("vlan_id") != null && row.getColumns().get("vlan_id").getClass() + .equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) { + wifiVifConfigInfo.vlanId = (row.getIntegerColumn("vlan_id").intValue()); + } ret.put(wifiVifConfigInfo.ifName + '_' + wifiVifConfigInfo.ssid, wifiVifConfigInfo); } @@ -701,6 +707,7 @@ public class OvsdbDao { columns.add("if_type"); columns.add("ip_assign_scheme"); columns.add("network"); + columns.add("vlan_id"); try { LOG.debug("Retrieving WifiInetConfig:"); @@ -725,7 +732,10 @@ public class OvsdbDao { wifiInetConfigInfo.ifType = row.getStringColumn("if_type"); wifiInetConfigInfo.ipAssignScheme = row.getStringColumn("ip_assign_scheme"); wifiInetConfigInfo.network = row.getBooleanColumn("network"); - + if (row.getColumns().get("vlan_id") != null && row.getColumns().get("vlan_id").getClass() + .equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) { + wifiInetConfigInfo.vlanId = (row.getIntegerColumn("vlan_id").intValue()); + } ret.put(wifiInetConfigInfo.ifName, wifiInetConfigInfo); } @@ -1676,7 +1686,7 @@ public class OvsdbDao { public void configureSingleSsid(OvsdbClient ovsdbClient, String bridge, String ifName, String ssid, boolean ssidBroadcast, Map security, Map provisionedWifiRadioConfigs, String radioIfName, int vlanId, - int vifRadioIdx, boolean rrmEnabled, boolean enabled) { + int vifRadioIdx, boolean rrmEnabled, String minHwMode, boolean enabled) { List operations = new ArrayList<>(); Map updateColumns = new HashMap<>(); @@ -1694,8 +1704,9 @@ public class OvsdbDao { updateColumns.put("ssid_broadcast", new Atom<>(ssidBroadcast ? "enabled" : "disabled")); updateColumns.put("uapsd_enable", new Atom<>(true)); updateColumns.put("vif_radio_idx", new Atom(vifRadioIdx)); + updateColumns.put("min_hw_mode", new Atom<>(minHwMode)); - updateColumns.put("vlan_id", new Atom<>(vlanId)); + updateColumns.put("vlan_id", new Atom(vlanId)); @SuppressWarnings("unchecked") com.vmware.ovsdb.protocol.operation.notation.Map securityMap = com.vmware.ovsdb.protocol.operation.notation.Map @@ -1756,6 +1767,11 @@ public class OvsdbDao { LOG.debug("Op Result {}", res); } } + Map inetConfigs = getProvisionedWifiInetConfigs(ovsdbClient); + if (inetConfigs.containsKey(ifName)) + updateWifiInetConfig(ovsdbClient, vlanId, ifName, enabled); + else + insertWifiInetConfigForVif(ovsdbClient, vlanId, ifName, enabled); LOG.info("Provisioned SSID {} on interface {} / {}", ssid, ifName, radioIfName); @@ -1790,6 +1806,16 @@ public class OvsdbDao { String ssidSecurityMode = ssidConfig.getSecureMode().name(); String opensyncSecurityMode = "OPEN"; + RadioMode radioMode = ((ApElementConfiguration) opensyncApConfig.getCustomerEquipment().getDetails()) + .getAdvancedRadioMap().get(radioType).getRadioMode(); + + String minHwMode = "11n"; // min_hw_mode is 11ac, wifi 5, we can also take ++ (11ax) but 2.4GHz only + // Wifi4 -- + if (!radioType.equals(RadioType.is2dot4GHz)) + minHwMode = "11ac"; + if (!radioType.equals(RadioType.is2dot4GHz) && radioMode.equals(RadioMode.modeX)) + minHwMode = "11x"; + if (ssidSecurityMode.equalsIgnoreCase("wpaPSK") || ssidSecurityMode.equalsIgnoreCase("wpa2PSK")) opensyncSecurityMode = "WPA-PSK"; else if (ssidSecurityMode.equalsIgnoreCase("wep")) @@ -1828,7 +1854,8 @@ public class OvsdbDao { try { configureSingleSsid(ovsdbClient, bridge, ifName, ssidConfig.getSsid(), ssidBroadcast, security, provisionedWifiRadioConfigs, radioIfName, ssidConfig.getVlanId(), vifRadioIdx, - rrmEnabled, enabled); + rrmEnabled, minHwMode, enabled); + } catch (IllegalStateException e) { // could not provision this SSID, but still can go on LOG.warn("could not provision SSID {} on {}", ssidConfig.getSsid(), radioIfName); @@ -1840,6 +1867,82 @@ public class OvsdbDao { } + private void insertWifiInetConfigForVif(OvsdbClient ovsdbClient, int vlanId, String ifName, boolean enabled) { + + List operations = new ArrayList<>(); + Map updateColumns = new HashMap<>(); + + 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 + + updateColumns.put("NAT", new Atom<>(false)); + updateColumns.put("enabled", new Atom(enabled)); + updateColumns.put("if_name", new Atom(ifName)); + updateColumns.put("if_type", new Atom<>("vif")); + updateColumns.put("ip_assign_scheme", new Atom<>("none")); + updateColumns.put("network", new Atom<>(true)); + updateColumns.put("vlan_id", new Atom(vlanId)); + + Row row = new Row(updateColumns); + operations.add(new Insert(wifiInetConfigDbTable, row)); + + CompletableFuture fResult = ovsdbClient.transact(ovsdbName, operations); + OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS); + + LOG.debug("Provisioned WifiInetConfig {}", ifName); + + for (OperationResult res : result) { + LOG.debug("Op Result {}", res); + } + + } catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) { + LOG.error("Error in configureWifiInet", e); + throw new RuntimeException(e); + } + + } + + private void updateWifiInetConfig(OvsdbClient ovsdbClient, int vlanId, String ifName, boolean enabled + ) { + + List operations = new ArrayList<>(); + Map updateColumns = new HashMap<>(); + List conditions = new ArrayList<>(); + conditions.add(new Condition("if_name", Function.EQUALS, new Atom<>(ifName))); + + 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 + + updateColumns.put("NAT", new Atom<>(false)); + updateColumns.put("enabled", new Atom(enabled)); + updateColumns.put("if_type", new Atom<>("vif")); + updateColumns.put("ip_assign_scheme", new Atom<>("none")); + updateColumns.put("network", new Atom<>(true)); + updateColumns.put("vlan_id", new Atom(vlanId)); + + Row row = new Row(updateColumns); + operations.add(new Update(wifiInetConfigDbTable, conditions, row)); + + CompletableFuture fResult = ovsdbClient.transact(ovsdbName, operations); + OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS); + + LOG.debug("Provisioned WifiInetConfig {}", ifName); + + for (OperationResult res : result) { + LOG.debug("Op Result {}", res); + } + + } catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) { + LOG.error("Error in configureWifiInet", e); + throw new RuntimeException(e); + } + + } + public void configureWifiInet(OvsdbClient ovsdbClient, Map provisionedWifiInetConfigs, String ifName) { List operations = new ArrayList<>(); diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/models/WifiInetConfigInfo.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/models/WifiInetConfigInfo.java index ab44be4..078df48 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/models/WifiInetConfigInfo.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/models/WifiInetConfigInfo.java @@ -12,6 +12,7 @@ public class WifiInetConfigInfo implements Cloneable{ public boolean network; public Uuid uuid; + public int vlanId; @Override public WifiInetConfigInfo clone() { @@ -26,8 +27,8 @@ public class WifiInetConfigInfo implements Cloneable{ @Override public String toString() { return String.format( - "WifiInetConfigInfo [nat=%s, enabled=%s, ifName=%s, ifType=%s, ipAssignScheme=%s, network=%s, uuid=%s]", - nat, enabled, ifName, ifType, ipAssignScheme, network, uuid); + "WifiInetConfigInfo [nat=%s, enabled=%s, ifName=%s, ifType=%s, ipAssignScheme=%s, network=%s, uuid=%s, vlanId=%s]", + nat, enabled, ifName, ifType, ipAssignScheme, network, uuid, vlanId); } } \ No newline at end of file diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/models/WifiVifConfigInfo.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/models/WifiVifConfigInfo.java index c3ebb43..36d4474 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/models/WifiVifConfigInfo.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/models/WifiVifConfigInfo.java @@ -22,6 +22,7 @@ public class WifiVifConfigInfo implements Cloneable{ public Map security; public Uuid uuid; + public int vlanId; @Override public WifiVifConfigInfo clone() { @@ -40,9 +41,9 @@ public class WifiVifConfigInfo implements Cloneable{ @Override public String toString() { return String.format( - "WifiVifConfigInfo [bridge=%s, btm=%s, enabled=%s, ftPsk=%s, groupRekey=%s, ifName=%s, mode=%s, rrm=%s, ssid=%s, ssidBroadcast=%s, uapsdEnable=%s, vifRadioIdx=%s, security=%s, uuid=%s]", + "WifiVifConfigInfo [bridge=%s, btm=%s, enabled=%s, ftPsk=%s, groupRekey=%s, ifName=%s, mode=%s, rrm=%s, ssid=%s, ssidBroadcast=%s, uapsdEnable=%s, vifRadioIdx=%s, security=%s, uuid=%s, vlanId=%s]", bridge, btm, enabled, ftPsk, groupRekey, ifName, mode, rrm, ssid, ssidBroadcast, uapsdEnable, - vifRadioIdx, security, uuid); + vifRadioIdx, security, uuid,vlanId); } } \ No newline at end of file