|
@@ -7036,6 +7036,7 @@ const struct nla_policy wlan_hdd_wifi_config_policy[
|
|
|
[QCA_WLAN_VENDOR_ATTR_CONFIG_CONCURRENT_STA_PRIMARY] = {
|
|
|
.type = NLA_U8 },
|
|
|
[QCA_WLAN_VENDOR_ATTR_CONFIG_FT_OVER_DS] = {.type = NLA_U8 },
|
|
|
+ [QCA_WLAN_VENDOR_ATTR_CONFIG_ARP_NS_OFFLOAD] = {.type = NLA_U8 },
|
|
|
};
|
|
|
|
|
|
static const struct nla_policy
|
|
@@ -8975,6 +8976,103 @@ static int hdd_set_nss(struct hdd_adapter *adapter,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+#ifdef FEATURE_WLAN_DYNAMIC_ARP_NS_OFFLOAD
|
|
|
+#define DYNAMIC_ARP_NS_ENABLE 1
|
|
|
+#define DYNAMIC_ARP_NS_DISABLE 0
|
|
|
+
|
|
|
+/**
|
|
|
+ * hdd_set_arp_ns_offload() - enable/disable arp/ns offload feature
|
|
|
+ * @adapter: hdd adapter
|
|
|
+ * @attr: pointer to nla attr
|
|
|
+ *
|
|
|
+ * Return: 0 on success, negative errno on failure
|
|
|
+ */
|
|
|
+static int hdd_set_arp_ns_offload(struct hdd_adapter *adapter,
|
|
|
+ const struct nlattr *attr)
|
|
|
+{
|
|
|
+ uint8_t offload_state;
|
|
|
+ int errno;
|
|
|
+ QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
|
|
|
+ struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+
|
|
|
+ errno = wlan_hdd_validate_context(hdd_ctx);
|
|
|
+ if (errno)
|
|
|
+ return errno;
|
|
|
+
|
|
|
+ if (!ucfg_pmo_is_arp_offload_enabled(hdd_ctx->psoc) ||
|
|
|
+ !ucfg_pmo_is_ns_offloaded(hdd_ctx->psoc)) {
|
|
|
+ hdd_err_rl("ARP/NS Offload is disabled by ini");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!ucfg_pmo_is_active_mode_offloaded(hdd_ctx->psoc)) {
|
|
|
+ hdd_err_rl("active mode offload is disabled by ini");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (adapter->device_mode != QDF_STA_MODE &&
|
|
|
+ adapter->device_mode != QDF_P2P_CLIENT_MODE) {
|
|
|
+ hdd_err_rl("only support on sta/p2p-cli mode");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ vdev = hdd_objmgr_get_vdev_by_user(adapter, WLAN_OSIF_ID);
|
|
|
+ if (!vdev) {
|
|
|
+ hdd_err("vdev is NULL");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ offload_state = nla_get_u8(attr);
|
|
|
+
|
|
|
+ if (offload_state == DYNAMIC_ARP_NS_ENABLE)
|
|
|
+ qdf_status = ucfg_pmo_dynamic_arp_ns_offload_enable(vdev);
|
|
|
+ else if (offload_state == DYNAMIC_ARP_NS_DISABLE)
|
|
|
+ qdf_status = ucfg_pmo_dynamic_arp_ns_offload_disable(vdev);
|
|
|
+
|
|
|
+ if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
|
|
|
+ if (offload_state == DYNAMIC_ARP_NS_ENABLE)
|
|
|
+ ucfg_pmo_dynamic_arp_ns_offload_runtime_allow(vdev);
|
|
|
+ else
|
|
|
+ ucfg_pmo_dynamic_arp_ns_offload_runtime_prevent(vdev);
|
|
|
+ }
|
|
|
+
|
|
|
+ hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
|
|
|
+
|
|
|
+ if (QDF_IS_STATUS_ERROR(qdf_status)) {
|
|
|
+ if (qdf_status == QDF_STATUS_E_ALREADY) {
|
|
|
+ hdd_info_rl("already set arp/ns offload %d",
|
|
|
+ offload_state);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return qdf_status_to_os_return(qdf_status);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!hdd_is_vdev_in_conn_state(adapter)) {
|
|
|
+ hdd_info("set not in connect state, updated state %d",
|
|
|
+ offload_state);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (offload_state == DYNAMIC_ARP_NS_ENABLE) {
|
|
|
+ hdd_enable_arp_offload(adapter,
|
|
|
+ pmo_arp_ns_offload_dynamic_update);
|
|
|
+ hdd_enable_ns_offload(adapter,
|
|
|
+ pmo_arp_ns_offload_dynamic_update);
|
|
|
+ } else if (offload_state == DYNAMIC_ARP_NS_DISABLE) {
|
|
|
+ hdd_disable_arp_offload(adapter,
|
|
|
+ pmo_arp_ns_offload_dynamic_update);
|
|
|
+ hdd_disable_ns_offload(adapter,
|
|
|
+ pmo_arp_ns_offload_dynamic_update);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+#undef DYNAMIC_ARP_NS_ENABLE
|
|
|
+#undef DYNAMIC_ARP_NS_DISABLE
|
|
|
+#endif
|
|
|
+
|
|
|
/**
|
|
|
* typedef independent_setter_fn - independent attribute handler
|
|
|
* @adapter: The adapter being configured
|
|
@@ -9089,6 +9187,10 @@ static const struct independent_setters independent_setters[] = {
|
|
|
hdd_set_primary_interface},
|
|
|
{QCA_WLAN_VENDOR_ATTR_CONFIG_FT_OVER_DS,
|
|
|
hdd_set_ft_over_ds},
|
|
|
+#ifdef FEATURE_WLAN_DYNAMIC_ARP_NS_OFFLOAD
|
|
|
+ {QCA_WLAN_VENDOR_ATTR_CONFIG_ARP_NS_OFFLOAD,
|
|
|
+ hdd_set_arp_ns_offload},
|
|
|
+#endif
|
|
|
};
|
|
|
|
|
|
#ifdef WLAN_FEATURE_ELNA
|