WIFI-1110: vifS is not applying as wm is crashing due to garbage in /etc/wireless/config

This commit is contained in:
Mike Hansen
2020-12-01 10:36:28 -05:00
parent d79917d20f
commit 124b6054b5
2 changed files with 4563 additions and 4546 deletions

View File

@@ -193,40 +193,34 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
LOG.debug("Client {} connect for AP {}", clientCn, apId);
ovsdbDao.removeAllPasspointConfigs(ovsdbClient);
ovsdbDao.removeAllSsids(ovsdbClient); // always
ovsdbDao.removeAllInetConfigs(ovsdbClient);
ovsdbDao.removeWifiRrm(ovsdbClient);
ovsdbDao.removeAllStatsConfigs(ovsdbClient); // always
OpensyncAPConfig opensyncAPConfig = extIntegrationInterface.getApConfig(apId);
ovsdbDao.configureInterfaces(ovsdbClient);
if (opensyncAPConfig != null) {
// cleanup existing
ovsdbDao.removeAllStatsConfigs(ovsdbClient); // always
ovsdbDao.removeAllPasspointConfigs(ovsdbClient);
ovsdbDao.removeWifiRrm(ovsdbClient);
ovsdbDao.removeAllInetConfigs(ovsdbClient);
ovsdbDao.removeAllSsids(ovsdbClient); // always
// reconfigure
ovsdbDao.configureWifiRadios(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureInterfaces(ovsdbClient);
ovsdbDao.configureGreTunnels(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureSsids(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureGreTunnels(ovsdbClient, opensyncAPConfig);
ovsdbDao.createVlanNetworkInterfaces(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureSsids(ovsdbClient, opensyncAPConfig);
if (opensyncAPConfig.getHotspotConfig() != null) {
ovsdbDao.configureHotspots(ovsdbClient, opensyncAPConfig);
}
ovsdbDao.configureStatsFromProfile(ovsdbClient, opensyncAPConfig);
if (((ApNetworkConfiguration) opensyncAPConfig.getApProfile().getDetails()).getSyntheticClientEnabled()) {
ovsdbDao.enableNetworkProbeForSyntheticClient(ovsdbClient);
}
} else {
ovsdbDao.removeAllStatsConfigs(ovsdbClient); // always
ovsdbDao.removeAllPasspointConfigs(ovsdbClient);
ovsdbDao.removeWifiRrm(ovsdbClient);
ovsdbDao.removeAllInetConfigs(ovsdbClient);
ovsdbDao.removeAllSsids(ovsdbClient); // always
}
if (ovsdbDao.getDeviceStatsReportingInterval(ovsdbClient) != collectionIntervalSecDeviceStats) {
ovsdbDao.updateDeviceStatsReportingInterval(ovsdbClient, collectionIntervalSecDeviceStats);
}
} else {
LOG.info("No Configuration available for {}", apId);
}
LOG.debug("Client connect Done");
return connectNodeInfo;
@@ -270,17 +264,20 @@ public class TipWlanOvsdbClient implements OvsdbClientInterface {
LOG.warn("AP with id " + apId + " does not have a config to apply.");
return;
}
ovsdbDao.removeAllStatsConfigs(ovsdbClient); // always
ovsdbDao.removeAllPasspointConfigs(ovsdbClient);
ovsdbDao.removeWifiRrm(ovsdbClient);
ovsdbDao.removeAllInetConfigs(ovsdbClient);
ovsdbDao.removeAllSsids(ovsdbClient); // always
ovsdbDao.removeAllInetConfigs(ovsdbClient);
ovsdbDao.removeWifiRrm(ovsdbClient);
ovsdbDao.removeAllStatsConfigs(ovsdbClient); // always
ovsdbDao.configureWifiRadios(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureInterfaces(ovsdbClient);
ovsdbDao.configureGreTunnels(ovsdbClient, opensyncAPConfig);
ovsdbDao.createVlanNetworkInterfaces(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureSsids(ovsdbClient, opensyncAPConfig);
ovsdbDao.configureWifiRrm(ovsdbClient, opensyncAPConfig);
if (opensyncAPConfig.getHotspotConfig() != null) {
ovsdbDao.configureHotspots(ovsdbClient, opensyncAPConfig);
}

View File

@@ -613,8 +613,9 @@ public class OvsdbDao {
/**
* @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) {
long ret = -1;
@@ -658,9 +659,10 @@ public class OvsdbDao {
/**
* @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) {
try {
@@ -1770,14 +1772,15 @@ public class OvsdbDao {
public void removeAllInetConfigs(OvsdbClient ovsdbClient) {
try {
Collection<WifiInetConfigInfo> provisionedWifiInetConfigs = getProvisionedWifiInetConfigs(ovsdbClient).values();
Collection<WifiInetConfigInfo> provisionedWifiInetConfigs = getProvisionedWifiInetConfigs(ovsdbClient)
.values();
List<Operation> operations = new ArrayList<>();
List<Condition> conditions = new ArrayList<>();
for (WifiInetConfigInfo wifiInetConfigInfo : provisionedWifiInetConfigs) {
if (wifiInetConfigInfo.vlanId > 1 || wifiInetConfigInfo.ifType.equals("vif") || wifiInetConfigInfo.ifType.equals("gre")) {
if (wifiInetConfigInfo.vlanId > 1 || wifiInetConfigInfo.ifType.equals("vif")
|| wifiInetConfigInfo.ifType.equals("gre")) {
conditions = new ArrayList<>();
conditions.add(new Condition("if_name", Function.EQUALS, new Atom<>(wifiInetConfigInfo.ifName)));
operations.add(new Delete(wifiInetConfigDbTable, conditions));
@@ -1829,37 +1832,6 @@ public class OvsdbDao {
}
void removeInvalidInterfaceConfigurations(OvsdbClient ovsdbClient, List<String> invalidInterfaces) {
try {
List<Operation> operations = new ArrayList<>();
operations = new ArrayList<>();
for (String invalidInterface : invalidInterfaces) {
List<Condition> conditions = new ArrayList<>();
conditions.add(new Condition("if_name", Function.EQUALS, new Atom<>(invalidInterface)));
operations.add(new Delete(wifiInetConfigDbTable, conditions));
operations.add(new Delete(wifiVifConfigDbTable, conditions));
}
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
if (LOG.isDebugEnabled()) {
LOG.debug("Removed all existing vif interfaces configs from {}:", wifiInetConfigDbTable);
for (OperationResult res : result) {
LOG.debug("Op Result {}", res);
}
}
} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
LOG.error("Error removing invalid interfaces", e);
throw new RuntimeException(e);
}
}
public void removeAllPasspointConfigs(OvsdbClient ovsdbClient) {
removeAllHotspot20Config(ovsdbClient);
removeAllHotspot20OsuProviders(ovsdbClient);
@@ -2580,7 +2552,7 @@ public class OvsdbDao {
}
}
private void configureSingleSsid(OvsdbClient ovsdbClient, String vifInterfaceName, String ssid,
private Uuid configureSingleSsid(OvsdbClient ovsdbClient, String vifInterfaceName, String ssid,
boolean ssidBroadcast, Map<String, String> security, String radioFreqBand, int vlanId, boolean rrmEnabled,
boolean enable80211r, int mobilityDomain, boolean enable80211v, boolean enable80211k, String minHwMode,
boolean enabled, int keyRefresh, boolean uapsdEnabled, boolean apBridge,
@@ -2602,7 +2574,7 @@ public class OvsdbDao {
}
if (vlanId > 1) {
createVlanNetworkInterfaces(ovsdbClient, vlanId);
// createVlanNetworkInterfaces(ovsdbClient, vlanId);
updateColumns.put("vlan_id", new Atom<>(vlanId));
} else {
updateColumns.put("vlan_id", new Atom<>(1));
@@ -2694,10 +2666,8 @@ public class OvsdbDao {
updateBlockList(updateColumns, macBlockList);
Row row = new Row(updateColumns);
operations.add(new Insert(wifiVifConfigDbTable, row));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
@@ -2713,13 +2683,45 @@ public class OvsdbDao {
if (vifConfigUuid == null) {
throw new IllegalStateException("Wifi_VIF_Config entry was not created successfully");
}
updateColumns.clear();
operations.clear();
updateVifConfigsSetForRadio(ovsdbClient, ssid, radioFreqBand, operations, updateColumns, vifConfigUuid);
confirmVifConfigRow(ovsdbClient, vifConfigUuid);
LOG.info("configureSingleSsid:Provisioned SSID {} on interface {} / {}", ssid, vifInterfaceName,
radioFreqBand);
return vifConfigUuid;
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
LOG.error("Error in configureSingleSsid", e);
throw new RuntimeException(e);
}
}
private void confirmVifConfigRow(OvsdbClient ovsdbClient, Uuid vifConfigUuid) {
try {
List<Condition> conditions = new ArrayList<>();
conditions.add(new Condition("_uuid", Function.EQUALS, new Atom<>(vifConfigUuid)));
List<Operation> operations = new ArrayList<>();
operations.add(new Select(wifiVifConfigDbTable, conditions));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
if (res instanceof SelectResult) {
LOG.info("Select Result for confirmVifConfigRow with Uuid {} {}", vifConfigUuid,
((SelectResult) res).getRows());
}
}
} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
LOG.error("Unable to confirm creation of VifConfig row for Uuid {}", vifConfigUuid, e);
throw new RuntimeException(e);
}
}
private void configureInetVifInterface(OvsdbClient ovsdbClient, String vifInterfaceName, boolean enabled,
NetworkForwardMode networkForwardMode) {
Map<String, WifiInetConfigInfo> inetConfigs = getProvisionedWifiInetConfigs(ovsdbClient);
if (inetConfigs.containsKey(vifInterfaceName)) {
@@ -2729,12 +2731,6 @@ public class OvsdbDao {
configureInetInterface(ovsdbClient, vifInterfaceName, enabled, "vif", false,
(networkForwardMode == NetworkForwardMode.NAT));
}
} catch (OvsdbClientException | TimeoutException | ExecutionException | InterruptedException e) {
LOG.error("Error in configureSingleSsid", e);
throw new RuntimeException(e);
}
}
private void updateBlockList(Map<String, Value> updateColumns, List<MacAddress> macBlockList) {
@@ -2786,9 +2782,9 @@ public class OvsdbDao {
}
private void updateVifConfigsSetForRadio(OvsdbClient ovsdbClient, String ssid, String radioFreqBand,
List<Operation> operations, Map<String, Value> updateColumns, Uuid vifConfigUuid)
Uuid vifConfigUuid)
throws OvsdbClientException, InterruptedException, ExecutionException, TimeoutException {
List<Operation> operations = new ArrayList<>();
List<Condition> conditions = new ArrayList<>();
conditions.add(new Condition("freq_band", Function.EQUALS, new Atom<>(radioFreqBand)));
@@ -3000,54 +2996,8 @@ public class OvsdbDao {
String ssidSecurityMode = ssidConfig.getSecureMode().name();
String opensyncSecurityMode = "OPEN";
if (ssidSecurityMode.equals("wpaPSK") || ssidSecurityMode.equals("wpa2PSK")
|| ssidSecurityMode.equals("wpa2OnlyPSK")) {
opensyncSecurityMode = "WPA-PSK";
} else if (ssidSecurityMode.equals("wep")) {
opensyncSecurityMode = "WEP";
} else if (ssidSecurityMode.equals("wpaEAP") || ssidSecurityMode.equals("wpa2EAP")
|| ssidSecurityMode.equals("wpa2OnlyEAP")) {
opensyncSecurityMode = "WPA-EAP";
} else if (ssidSecurityMode.equals("wpaRadius") || ssidSecurityMode.equals("wpa2OnlyRadius")
|| ssidSecurityMode.equals("wpa2Radius")) {
opensyncSecurityMode = "WPA-EAP";
}
security.put("encryption", opensyncSecurityMode);
// key and mode is N/A for OPEN security
if (!opensyncSecurityMode.equals("OPEN")) {
if (ssidSecurityMode.equals("wpa2PSK")) {
security.put("key", ssidConfig.getKeyStr());
security.put("mode", "mixed");
} else if (ssidSecurityMode.equals("wpa2OnlyPSK")) {
security.put("key", ssidConfig.getKeyStr());
security.put("mode", "2");
} else if (ssidSecurityMode.equals("wpaPSK")) {
security.put("key", ssidConfig.getKeyStr());
security.put("mode", "1");
} else if (ssidSecurityMode.equals("wpa2OnlyEAP") || ssidSecurityMode.equals("wpa2OnlyRadius")) {
security.put("mode", "2");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
if (ssidConfig.getRadiusAccountingServiceName() != null) {
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
} else if (ssidSecurityMode.equals("wpa2EAP") || ssidSecurityMode.equals("wpa2Radius")) {
security.put("mode", "mixed");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
if (ssidConfig.getRadiusAccountingServiceName() != null) {
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
} else if (ssidSecurityMode.equals("wpaEAP") || ssidSecurityMode.equals("wpaRadius")) {
security.put("mode", "1");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
if (ssidConfig.getRadiusAccountingServiceName() != null) {
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
} else if (ssidSecurityMode.equals("wep")) {
security.put("key", ssidConfig.getKeyStr());
security.put("mode", "1");
}
}
opensyncSecurityMode = getOpensyncSecurityMode(ssidSecurityMode, opensyncSecurityMode);
populateSecurityMap(opensyncApConfig, ssidConfig, security, ssidSecurityMode, opensyncSecurityMode);
// TODO put into AP captive parameter
Map<String, String> captiveMap = new HashMap<>();
@@ -3085,19 +3035,24 @@ public class OvsdbDao {
} else {
// take the first available interface for this band
ifName = interfaces.get(0);
LOG.info("Configuring new Wifi_VIF_Config for ssid {} with if_name {}",
ssidConfig.getSsid(), ifName);
LOG.info("Configuring new Wifi_VIF_Config for ssid {} with if_name {}", ssidConfig.getSsid(),
ifName);
}
configureSingleSsid(ovsdbClient, ifName, ssidConfig.getSsid(), ssidBroadcast, security, freqBand,
ssidConfig.getVlanId() != null ? ssidConfig.getVlanId() : 1, rrmEnabled, enable80211r,
mobilityDomain, enable80211v, enable80211k, minHwMode, enabled, keyRefresh, uapsdEnabled,
apBridge, ssidConfig.getForwardMode(), gateway, inet, dns, ipAssignScheme, macBlockList,
rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit, rtsCtsThreshold,
fragThresholdBytes, dtimPeriod, captiveMap, walledGardenAllowlist, bonjourServiceMap
);
Uuid vifConfigUuid = configureSingleSsid(ovsdbClient, ifName, ssidConfig.getSsid(), ssidBroadcast,
security, freqBand, ssidConfig.getVlanId() != null ? ssidConfig.getVlanId() : 1, rrmEnabled,
enable80211r, mobilityDomain, enable80211v, enable80211k, minHwMode, enabled, keyRefresh,
uapsdEnabled, apBridge, ssidConfig.getForwardMode(), gateway, inet, dns, ipAssignScheme,
macBlockList, rateLimitEnable, ssidDlLimit, ssidUlLimit, clientDlLimit, clientUlLimit,
rtsCtsThreshold, fragThresholdBytes, dtimPeriod, captiveMap, walledGardenAllowlist,
bonjourServiceMap);
} catch (IllegalStateException e) {
updateVifConfigsSetForRadio(ovsdbClient, ssidConfig.getSsid(), freqBand, vifConfigUuid);
configureInetVifInterface(ovsdbClient, ifName, enabled, ssidConfig.getForwardMode());
} catch (IllegalStateException | OvsdbClientException | InterruptedException | ExecutionException
| TimeoutException e) {
// could not provision this SSID, but still can go on
LOG.warn("could not provision SSID {} on {}", ssidConfig.getSsid(), freqBand);
}
@@ -3108,6 +3063,61 @@ public class OvsdbDao {
}
private void populateSecurityMap(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig,
Map<String, String> security, String ssidSecurityMode, String opensyncSecurityMode) {
security.put("encryption", opensyncSecurityMode);
// key and mode is N/A for OPEN security
if (!opensyncSecurityMode.equals("OPEN")) {
if (ssidSecurityMode.equals("wpa2PSK")) {
security.put("key", ssidConfig.getKeyStr());
security.put("mode", "mixed");
} else if (ssidSecurityMode.equals("wpa2OnlyPSK")) {
security.put("key", ssidConfig.getKeyStr());
security.put("mode", "2");
} else if (ssidSecurityMode.equals("wpaPSK")) {
security.put("key", ssidConfig.getKeyStr());
security.put("mode", "1");
} else if (ssidSecurityMode.equals("wpa2OnlyEAP") || ssidSecurityMode.equals("wpa2OnlyRadius")) {
security.put("mode", "2");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
if (ssidConfig.getRadiusAccountingServiceName() != null) {
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
} else if (ssidSecurityMode.equals("wpa2EAP") || ssidSecurityMode.equals("wpa2Radius")) {
security.put("mode", "mixed");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
if (ssidConfig.getRadiusAccountingServiceName() != null) {
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
} else if (ssidSecurityMode.equals("wpaEAP") || ssidSecurityMode.equals("wpaRadius")) {
security.put("mode", "1");
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
if (ssidConfig.getRadiusAccountingServiceName() != null) {
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
} else if (ssidSecurityMode.equals("wep")) {
security.put("key", ssidConfig.getKeyStr());
security.put("mode", "1");
}
}
}
private String getOpensyncSecurityMode(String ssidSecurityMode, String opensyncSecurityMode) {
if (ssidSecurityMode.equals("wpaPSK") || ssidSecurityMode.equals("wpa2PSK")
|| ssidSecurityMode.equals("wpa2OnlyPSK")) {
opensyncSecurityMode = "WPA-PSK";
} else if (ssidSecurityMode.equals("wep")) {
opensyncSecurityMode = "WEP";
} else if (ssidSecurityMode.equals("wpaEAP") || ssidSecurityMode.equals("wpa2EAP")
|| ssidSecurityMode.equals("wpa2OnlyEAP")) {
opensyncSecurityMode = "WPA-EAP";
} else if (ssidSecurityMode.equals("wpaRadius") || ssidSecurityMode.equals("wpa2OnlyRadius")
|| ssidSecurityMode.equals("wpa2Radius")) {
opensyncSecurityMode = "WPA-EAP";
}
return opensyncSecurityMode;
}
public void configureHotspots(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) {
provisionHotspot2IconConfig(ovsdbClient, opensyncApConfig);
@@ -3187,6 +3197,19 @@ public class OvsdbDao {
}
public void createVlanNetworkInterfaces(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncApConfig) {
Set<Integer> vlans = new HashSet<>();
for (Profile ssidProfile : opensyncApConfig.getSsidProfile()) {
Integer vlanId = ((SsidConfiguration) ssidProfile.getDetails()).getVlanId();
if (vlanId != null && vlanId > 1) {
vlans.add(vlanId);
}
}
for (Integer vlanId : vlans) {
createVlanNetworkInterfaces(ovsdbClient, vlanId);
}
}
private void createVlanNetworkInterfaces(OvsdbClient ovsdbClient, int vlanId) {
try {
@@ -4956,19 +4979,16 @@ public class OvsdbDao {
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
if (LOG.isDebugEnabled()) {
LOG.debug("Removed rrm from {}:", wifiRrmConfigDbTable);
LOG.info("Removed rrm from {}:", wifiRrmConfigDbTable);
for (OperationResult res : result) {
LOG.debug("Op Result {}", res);
if (res instanceof UpdateResult) {
LOG.info("Delete Result {}", (UpdateResult) res);
}
}
LOG.info("Removed Wifi_RRM_Config");
} catch (ExecutionException e) {
LOG.error("Error in removeRrm", e);
} catch (OvsdbClientException | TimeoutException | InterruptedException e) {
} catch (ExecutionException | OvsdbClientException | TimeoutException | InterruptedException e) {
LOG.error("Error in removeRrm", e);
throw new RuntimeException(e);
}