diff --git a/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationCloud.java b/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationCloud.java index a16443d..122ab66 100644 --- a/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationCloud.java +++ b/opensync-ext-cloud/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/OpensyncExternalIntegrationCloud.java @@ -33,6 +33,7 @@ import com.telecominfraproject.wlan.core.model.equipment.EquipmentType; import com.telecominfraproject.wlan.core.model.equipment.MacAddress; import com.telecominfraproject.wlan.core.model.equipment.RadioType; import com.telecominfraproject.wlan.core.model.equipment.SecurityType; +import com.telecominfraproject.wlan.customer.models.Customer; import com.telecominfraproject.wlan.customer.service.CustomerServiceInterface; import com.telecominfraproject.wlan.equipment.EquipmentServiceInterface; import com.telecominfraproject.wlan.equipment.models.ApElementConfiguration; @@ -245,6 +246,15 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra ce = equipmentServiceInterface.update(ce); } + Customer customer = customerServiceInterface.getOrNull(ce.getCustomerId()); + if (customer == null) { + customer = new Customer(); + customer.setId(autoProvisionedCustomerId); + customerServiceInterface.create(customer); + ce.setCustomerId(customer.getId()); + equipmentServiceInterface.update(ce); + } + updateApStatus(ce, connectNodeInfo); // register equipment routing record @@ -541,10 +551,10 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra LOG.debug("Config content : Equipment {}", ret.getCustomerEquipment().toPrettyString()); LOG.debug("Config content : APProfile {}", ret.getApProfile().toPrettyString()); - - ret.getSsidProfile().stream().forEach(ssid -> LOG.debug("Config content : SSIDProfile {}", ssid.toPrettyString())); - LOG.debug("Config content : Location {}", ret.getEquipmentLocation().toPrettyString()); + ret.getSsidProfile().stream() + .forEach(ssid -> LOG.debug("Config content : SSIDProfile {}", ssid.toPrettyString())); + LOG.debug("Config content : Location {}", ret.getEquipmentLocation().toPrettyString()); return ret; } @@ -868,7 +878,7 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra // we'll report each device as having a single (very long) // session cMetrics.setSessionId(smr.getClientMac()); - + // populate Rx stats if (cl.getStats().hasRxBytes()) { cMetrics.setRxBytes(cl.getStats().getRxBytes()); @@ -1437,7 +1447,7 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra if (radioStateTables == null || radioStateTables.isEmpty() || apId == null) return; - + // add to RadioStates States Map OpensyncNode osNode = null; synchronized (opensyncNodeMap) { @@ -1447,6 +1457,7 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra for (OpensyncAPRadioState radioState : radioStateTables) { if (radioState.isEnabled()) osNode.updateRadioState(radioState); + LOG.debug("RadioState {}", radioState.toPrettyString()); } opensyncNodeMap.put(apId, osNode); } else { @@ -1454,6 +1465,8 @@ public class OpensyncExternalIntegrationCloud implements OpensyncExternalIntegra for (OpensyncAPRadioState radioState : radioStateTables) { if (radioState.isEnabled()) osNode.updateRadioState(radioState); + LOG.debug("RadioState {}", radioState.toPrettyString()); + } opensyncNodeMap.put(apId, osNode); diff --git a/opensync-ext-interface/pom.xml b/opensync-ext-interface/pom.xml index c44aded..8b5b5c4 100644 --- a/opensync-ext-interface/pom.xml +++ b/opensync-ext-interface/pom.xml @@ -22,6 +22,11 @@ tip-wlan-opensync-protobuf ${tip-wlan-cloud.release.version} + + customer-models + com.telecominfraproject.wlan + ${tip-wlan-cloud.release.version} + equipment-models com.telecominfraproject.wlan diff --git a/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/models/OpensyncAPRadioState.java b/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/models/OpensyncAPRadioState.java index d8a33f0..ccfdf43 100644 --- a/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/models/OpensyncAPRadioState.java +++ b/opensync-ext-interface/src/main/java/com/telecominfraproject/wlan/opensync/external/integration/models/OpensyncAPRadioState.java @@ -3,9 +3,8 @@ */ package com.telecominfraproject.wlan.opensync.external.integration.models; -import java.util.List; import java.util.Map; -import java.util.UUID; +import java.util.Set; import com.telecominfraproject.wlan.core.model.json.BaseJsonModel; import com.vmware.ovsdb.protocol.operation.notation.Uuid; @@ -25,7 +24,7 @@ public class OpensyncAPRadioState extends BaseJsonModel { public String mac; public int bcnInt; public int thermalTxChainmask; - public int[] allowedChannels; + public Set allowedChannels; public int thermalShutdown; public int channelSync; public int hwType; @@ -104,11 +103,11 @@ public class OpensyncAPRadioState extends BaseJsonModel { this.thermalTxChainmask = thermalTxChainmask; } - public int[] getAllowedChannels() { + public Set getAllowedChannels() { return allowedChannels; } - public void setAllowedChannels(int[] allowedChannels) { + public void setAllowedChannels(Set allowedChannels) { this.allowedChannels = allowedChannels; } diff --git a/opensync-gateway-cloud-process/src/main/resources/launchers/OpenSyncProcess (local, KDC certs) cloud.launch b/opensync-gateway-cloud-process/src/main/resources/launchers/OpenSyncProcess (local, KDC certs) cloud.launch index 2029a41..46bce75 100644 --- a/opensync-gateway-cloud-process/src/main/resources/launchers/OpenSyncProcess (local, KDC certs) cloud.launch +++ b/opensync-gateway-cloud-process/src/main/resources/launchers/OpenSyncProcess (local, KDC certs) cloud.launch @@ -20,5 +20,5 @@ - + 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 1ae5186..2a1e758 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 @@ -256,7 +256,7 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { CompletableFuture rsCf = ovsdbClient .monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiRadioStateDbTable + "_" + key, new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiRadioStateDbTable, - new MonitorRequest(new MonitorSelect(true, true, false, true)))), + new MonitorRequest(new MonitorSelect(true, true, true, true)))), new MonitorCallback() { @Override @@ -273,7 +273,7 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { CompletableFuture isCf = ovsdbClient .monitor(OvsdbDao.ovsdbName, OvsdbDao.wifiInetStateDbTable + "_" + key, new MonitorRequests(ImmutableMap.of(OvsdbDao.wifiInetStateDbTable, - new MonitorRequest(new MonitorSelect(true, true, false, true)))), + new MonitorRequest(new MonitorSelect(true, true, true, true)))), new MonitorCallback() { @Override @@ -383,7 +383,7 @@ public class ConnectusOvsdbClient implements ConnectusOvsdbClientInterface { CompletableFuture awCf = ovsdbClient .monitor(OvsdbDao.ovsdbName, OvsdbDao.awlanNodeDbTable + "_" + key, new MonitorRequests(ImmutableMap.of(OvsdbDao.awlanNodeDbTable, - new MonitorRequest(new MonitorSelect(true, false, false, true)))), + new MonitorRequest(new MonitorSelect(true, true, true, true)))), new MonitorCallback() { @Override 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 d9175d8..1eb8bf8 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 @@ -424,6 +424,13 @@ public class OvsdbDao { } + public Set getSet(Row row, String columnName) { + + Set set = (row != null) ? row.getSetColumn(columnName) : null; + + return set; + } + public T getSingleValueFromSet(Row row, String columnName) { Set set = (row != null) ? row.getSetColumn(columnName) : null; @@ -588,7 +595,7 @@ public class OvsdbDao { columns.add("_uuid"); columns.add("if_name"); - + columns.add("bcn_int"); columns.add("channel"); columns.add("channel_mode"); columns.add("country"); @@ -598,6 +605,7 @@ public class OvsdbDao { columns.add("vif_configs"); columns.add("freq_band"); columns.add("hw_config"); + columns.add("hw_type"); try { LOG.debug("Retrieving WifiRadioConfig:"); @@ -615,6 +623,10 @@ public class OvsdbDao { WifiRadioConfigInfo wifiRadioConfigInfo = new WifiRadioConfigInfo(); wifiRadioConfigInfo.uuid = row.getUuidColumn("_uuid"); wifiRadioConfigInfo.ifName = row.getStringColumn("if_name"); + Long beaconTmp = getSingleValueFromSet(row, "bcn_int"); + if (beaconTmp == null) + beaconTmp = 0L; + wifiRadioConfigInfo.beaconInterval = beaconTmp.intValue(); Long channelTmp = getSingleValueFromSet(row, "channel"); if (channelTmp == null) { channelTmp = -1L; @@ -629,7 +641,7 @@ public class OvsdbDao { wifiRadioConfigInfo.vifConfigUuids = row.getSetColumn("vif_configs"); wifiRadioConfigInfo.freqBand = row.getStringColumn("freq_band"); wifiRadioConfigInfo.hwConfig = row.getMapColumn("hw_config"); - + wifiRadioConfigInfo.hwType = row.getStringColumn("hw_type"); ret.put(wifiRadioConfigInfo.ifName, wifiRadioConfigInfo); } @@ -650,12 +662,14 @@ public class OvsdbDao { List conditions = new ArrayList<>(); List columns = new ArrayList<>(); columns.add("bridge"); + columns.add("ap_bridge"); columns.add("_uuid"); columns.add("btm"); columns.add("enabled"); columns.add("ft_psk"); columns.add("group_rekey"); columns.add("if_name"); + columns.add("min_hw_mode"); columns.add("mode"); columns.add("rrm"); columns.add("ssid"); @@ -680,18 +694,23 @@ public class OvsdbDao { WifiVifConfigInfo wifiVifConfigInfo = new WifiVifConfigInfo(); wifiVifConfigInfo.bridge = row.getStringColumn("bridge"); + wifiVifConfigInfo.apBridge = row.getBooleanColumn("ap_bridge"); wifiVifConfigInfo.uuid = row.getUuidColumn("_uuid"); wifiVifConfigInfo.btm = row.getIntegerColumn("btm").intValue(); wifiVifConfigInfo.enabled = row.getBooleanColumn("enabled"); wifiVifConfigInfo.ftPsk = row.getIntegerColumn("ft_psk").intValue(); wifiVifConfigInfo.groupRekey = row.getIntegerColumn("group_rekey").intValue(); + wifiVifConfigInfo.minHwMode = row.getStringColumn("min_hw_mode"); wifiVifConfigInfo.ifName = row.getStringColumn("if_name"); wifiVifConfigInfo.mode = row.getStringColumn("mode"); wifiVifConfigInfo.rrm = row.getIntegerColumn("rrm").intValue(); wifiVifConfigInfo.ssid = row.getStringColumn("ssid"); wifiVifConfigInfo.ssidBroadcast = row.getStringColumn("ssid_broadcast"); wifiVifConfigInfo.uapsdEnable = row.getBooleanColumn("uapsd_enable"); -// wifiVifConfigInfo.vifRadioIdx = row.getIntegerColumn("vif_radio_idx").intValue(); + Long radioIdxTmp = getSingleValueFromSet(row, "vif_radio_idx"); + if (radioIdxTmp == null) + radioIdxTmp = 0L; + wifiVifConfigInfo.vifRadioIdx = radioIdxTmp.intValue(); wifiVifConfigInfo.security = row.getMapColumn("security"); if (row.getColumns().get("vlan_id") != null && row.getColumns().get("vlan_id").getClass() @@ -719,11 +738,15 @@ public class OvsdbDao { List columns = new ArrayList<>(); columns.add("NAT"); columns.add("_uuid"); + columns.add("broadcast"); columns.add("enabled"); columns.add("if_name"); columns.add("if_type"); columns.add("ip_assign_scheme"); columns.add("network"); + columns.add("inet_addr"); + columns.add("mtu"); + columns.add("netmask"); columns.add("vlan_id"); try { @@ -744,11 +767,27 @@ public class OvsdbDao { wifiInetConfigInfo.nat = natTmp != null ? natTmp : false; wifiInetConfigInfo.uuid = row.getUuidColumn("_uuid"); + if (row.getColumns().get("broadcast") != null && row.getColumns().get("broadcast").getClass() + .equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) { + wifiInetConfigInfo.broadcast = row.getStringColumn("broadcast"); + } wifiInetConfigInfo.enabled = row.getBooleanColumn("enabled"); wifiInetConfigInfo.ifName = row.getStringColumn("if_name"); wifiInetConfigInfo.ifType = row.getStringColumn("if_type"); wifiInetConfigInfo.ipAssignScheme = row.getStringColumn("ip_assign_scheme"); wifiInetConfigInfo.network = row.getBooleanColumn("network"); + if (row.getColumns().get("inet_addr") != null && row.getColumns().get("inet_addr").getClass() + .equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) { + wifiInetConfigInfo.inetAddr = (row.getStringColumn("inet_addr")); + } + if (row.getColumns().get("mtu") != null && row.getColumns().get("mtu").getClass() + .equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) { + wifiInetConfigInfo.mtu = (row.getIntegerColumn("mtu").intValue()); + } + if (row.getColumns().get("netmask") != null && row.getColumns().get("netmask").getClass() + .equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) { + wifiInetConfigInfo.netmask = (row.getStringColumn("netmask")); + } 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()); @@ -833,7 +872,6 @@ public class OvsdbDao { Map provisionedBridges) throws OvsdbClientException, TimeoutException, ExecutionException, InterruptedException { - LOG.debug("InterfaceName {} BridgeName {} InterfaceType {}", interfaceName, bridgeName, interfaceType); if (!provisionedInterfaces.containsKey(interfaceName)) { // Create this interface and link it to the port and the bridge @@ -1167,8 +1205,9 @@ public class OvsdbDao { configName = radioName2pt4GHz; break; case is5GHz: - // 802.11h dfs (Dynamic Frequency Selection) aka military and weather radar avoidance protocol - // Must not be disabled (by law) + // 802.11h dfs (Dynamic Frequency Selection) aka military and weather radar + // avoidance protocol + // Must not be disabled (by law) // NA for 2.4GHz hwConfig.put("dfs_enable", "1"); hwConfig.put("dfs_ignorecac", "0"); @@ -1176,8 +1215,9 @@ public class OvsdbDao { configName = radioName5GHzU; break; case is5GHzL: - // 802.11h dfs (Dynamic Frequency Selection) aka military and weather radar avoidance protocol - // Must not be disabled (by law) + // 802.11h dfs (Dynamic Frequency Selection) aka military and weather radar + // avoidance protocol + // Must not be disabled (by law) // NA for 2.4GHz hwConfig.put("dfs_enable", "1"); hwConfig.put("dfs_ignorecac", "0"); @@ -1185,8 +1225,9 @@ public class OvsdbDao { configName = radioName5GHzL; break; case is5GHzU: - // 802.11h dfs (Dynamic Frequency Selection) aka military and weather radar avoidance protocol - // Must not be disabled (by law) + // 802.11h dfs (Dynamic Frequency Selection) aka military and weather radar + // avoidance protocol + // Must not be disabled (by law) // NA for 2.4GHz hwConfig.put("dfs_enable", "1"); hwConfig.put("dfs_ignorecac", "0"); @@ -1290,6 +1331,16 @@ public class OvsdbDao { .equals(com.vmware.ovsdb.protocol.operation.notation.Atom.class)) { tableState.setVersion(row.getUuidColumn("_uuid")); } + if (map.get("allowed_channels") != null) { + + Set allowedChannels = getSet(row, "allowed_channels"); + + Set allowed = new HashSet(); + for (Long channel : allowedChannels) { + allowed.add(channel.intValue()); + } + tableState.setAllowedChannels(allowed); + } ret.add(tableState); } @@ -1749,7 +1800,6 @@ public class OvsdbDao { LOG.debug("Provisioned SSID {} on {}", ssid, ifName); Uuid vifConfigUuid = null; - String vifIfName = null; for (OperationResult res : result) { LOG.debug("Op Result {}", res); if (res instanceof InsertResult) { @@ -1796,17 +1846,16 @@ public class OvsdbDao { } } Map inetConfigs = getProvisionedWifiInetConfigs(ovsdbClient); - if (inetConfigs.containsKey(ifName)) + if (inetConfigs.containsKey(ifName)) { updateWifiInetConfig(ovsdbClient, vlanId, ifName, enabled, (networkForwardMode == NetworkForwardMode.NAT), "vif", gateway, inet, dns, ipAssignScheme, vifConfigUuid); - else - // do nothing for now + } else { LOG.debug("No corresponding WifiInetConfig for this Interface"); - // TODO: should wait for the default config to take place - insertWifiInetConfigForVif(ovsdbClient, vlanId, ifName, enabled, - (networkForwardMode == NetworkForwardMode.NAT), "vif", gateway, inet, dns, ipAssignScheme, - vifConfigUuid); + insertWifiInetConfigForVif(ovsdbClient, vlanId, ifName, enabled, + (networkForwardMode == NetworkForwardMode.NAT), "vif", gateway, inet, dns, ipAssignScheme, + vifConfigUuid); + } LOG.info("Provisioned SSID {} on interface {} / {}", ssid, ifName, radioIfName); 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 078df48..e8d81de 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 @@ -13,6 +13,10 @@ public class WifiInetConfigInfo implements Cloneable{ public Uuid uuid; public int vlanId; + public String broadcast; + public String inetAddr; + public int mtu; + public String netmask; @Override public WifiInetConfigInfo clone() { @@ -27,8 +31,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, vlanId=%s]", - nat, enabled, ifName, ifType, ipAssignScheme, network, uuid, vlanId); + "WifiInetConfigInfo [nat=%s, broadcast=%s, enabled=%s, ifName=%s, ifType=%s, ipAssignScheme=%s, network=%s, uuid=%s, inetAddr=%s, mtu=%s, netmask=%s, vlanId=%s]", + nat, broadcast, enabled, ifName, ifType, ipAssignScheme, network, uuid,inetAddr, mtu, netmask, vlanId); } } \ No newline at end of file diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/models/WifiRadioConfigInfo.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/models/WifiRadioConfigInfo.java index 365dbae..ebc7129 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/models/WifiRadioConfigInfo.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/models/WifiRadioConfigInfo.java @@ -24,6 +24,8 @@ public class WifiRadioConfigInfo implements Cloneable { public String ifName; public Uuid uuid; + public String hwType; + @Override public WifiRadioConfigInfo clone() { try { @@ -44,8 +46,8 @@ public class WifiRadioConfigInfo implements Cloneable { @Override public String toString() { return String.format( - "WifiRadioConfigInfo [vifConfigUuids=%s, freqBand=%s, channel=%s, txPower=%s, channelMode=%s, enabled=%s, htMode=%s, hwConfig=%s, country=%s, bcn_int=%s, ifName=%s, uuid=%s]", - vifConfigUuids, freqBand, channel, txPower, channelMode, enabled, htMode, hwConfig, country, + "WifiRadioConfigInfo [vifConfigUuids=%s, freqBand=%s, channel=%s, txPower=%s, channelMode=%s, enabled=%s, htMode=%s, hwConfig=%s, hwType=%s, country=%s, bcn_int=%s, ifName=%s, uuid=%s]", + vifConfigUuids, freqBand, channel, txPower, channelMode, enabled, htMode, hwConfig, hwType,country, beaconInterval, ifName, uuid); } 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 36d4474..daf123e 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 @@ -23,6 +23,8 @@ public class WifiVifConfigInfo implements Cloneable{ public Uuid uuid; public int vlanId; + public Boolean apBridge; + public String minHwMode; @Override public WifiVifConfigInfo clone() { @@ -41,8 +43,8 @@ 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, vlanId=%s]", - bridge, btm, enabled, ftPsk, groupRekey, ifName, mode, rrm, ssid, ssidBroadcast, uapsdEnable, + "WifiVifConfigInfo [bridge=%s, ap_bridge=%s, btm=%s, enabled=%s, ftPsk=%s, groupRekey=%s, ifName=%s, minHwMode=%s, mode=%s, rrm=%s, ssid=%s, ssidBroadcast=%s, uapsdEnable=%s, vifRadioIdx=%s, security=%s, uuid=%s, vlanId=%s]", + bridge, apBridge, btm, enabled, ftPsk, groupRekey, ifName, minHwMode, mode, rrm, ssid, ssidBroadcast, uapsdEnable, vifRadioIdx, security, uuid,vlanId); }