qcacld-3.0: Support Multicast Domain Name Server Offload

The purpose of the multicast Domain Name System (mDNS) is to resolve
host names to IP addresses within small networks that do not include
a local name server.

It utilizes essentially the same programming interfaces, packet formats
and operating semantics as the unicast DNS, and the advantage is zero
configuration service while no need for central or global server.
Based on mDNS, the DNS-SD (Service Discovery) allows clients to discover
a named list of services by type in a specified domain using standard
DNS queries.

Here, we provide the ability to advertise the available services by
responding to mDNS queries.

Change-Id: Id2a0468d49237c21062cfd1988e34903658cdad9
CRs-Fixed: 3008549
This commit is contained in:
Aditya Kodukula
2021-06-09 21:08:48 -07:00
committed by Madan Koyyalamudi
parent 44c7aa1208
commit e5d87bf5d6
9 changed files with 433 additions and 7 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -83,6 +83,40 @@ struct thermal_throttle_info {
uint32_t pdev_id;
};
#ifdef WLAN_FEATURE_MDNS_OFFLOAD
#define MDNS_FQDN_TYPE_GENERAL (0)
/* Maximum length of FQDN string including the NULL byte */
#define MAX_FQDN_LEN (64)
/* This length depends on the WMI Message and TLV Header size.
* ((WMI_SVC_MSG_MAX_SIZE - WMI_TLV_HDR_SIZE)
*/
#define MAX_MDNS_RESP_LEN (512)
/**
* struct mdns_config_info - Multicast DNS configuration information
* @vdev_id: vdev id
* @enable: false - disable mdns
* true - enable mdns
* @fqdn_type: FQDN type
* @fqdn_data: Fully Qualified Domain Name of the local network
* @fqdn_len: FQDN length
* @resource_record_count: Number Resource Records present in the answer payload
* @answer_payload_len: Length of the answer payload sent by mdnsResponder in userspace
* @answer_payload_data: Binary blob used to frame mdns response for mdns queries
*/
struct mdns_config_info {
uint32_t vdev_id;
bool enable;
uint32_t fqdn_type;
uint32_t fqdn_len;
uint8_t fqdn_data[MAX_FQDN_LEN];
uint32_t resource_record_count;
uint32_t answer_payload_len;
uint8_t answer_payload_data[MAX_MDNS_RESP_LEN];
};
#endif
/**
* struct wlan_fwol_tx_ops - structure of tx func pointers
* @set_elna_bypass: set eLNA bypass
@@ -90,6 +124,7 @@ struct thermal_throttle_info {
* @reg_evt_handler: register event handler
* @unreg_evt_handler: unregister event handler
* @send_dscp_up_map_to_fw: send dscp-to-up map values to FW
* @set_mdns_config: set mdns config info
*/
struct wlan_fwol_tx_ops {
#ifdef WLAN_FEATURE_ELNA
@@ -107,6 +142,10 @@ struct wlan_fwol_tx_ops {
struct wlan_objmgr_psoc *psoc,
uint32_t *dscp_to_up_map);
#endif
#ifdef WLAN_FEATURE_MDNS_OFFLOAD
QDF_STATUS (*set_mdns_config)(struct wlan_objmgr_psoc *psoc,
struct mdns_config_info *mdns_info);
#endif
};
/**

View File

@@ -657,6 +657,18 @@ QDF_STATUS ucfg_fwol_send_dscp_up_map_to_fw(
}
#endif
#ifdef WLAN_FEATURE_MDNS_OFFLOAD
/**
* ucfg_fwol_set_mdns_config() - set mdns config
* @psoc: pointer to psoc object
* @mdns_info: mdns config info pointer
*
* Return: QDF_STATUS_SUCCESS on success
*/
QDF_STATUS ucfg_fwol_set_mdns_config(struct wlan_objmgr_psoc *psoc,
struct mdns_config_info *mdns_info);
#endif /* WLAN_FEATURE_MDNS_OFFLOAD */
/**
* ucfg_fwol_configure_global_params - API to configure global params
* @psoc: pointer to psoc object

View File

@@ -1043,6 +1043,35 @@ QDF_STATUS ucfg_fwol_send_dscp_up_map_to_fw(struct wlan_objmgr_vdev *vdev,
}
#endif /* WLAN_SEND_DSCP_UP_MAP_TO_FW */
#ifdef WLAN_FEATURE_MDNS_OFFLOAD
QDF_STATUS ucfg_fwol_set_mdns_config(struct wlan_objmgr_psoc *psoc,
struct mdns_config_info *mdns_info)
{
QDF_STATUS status;
struct wlan_fwol_psoc_obj *fwol_obj;
struct wlan_fwol_tx_ops *tx_ops;
if (!psoc) {
fwol_err("NULL pointer for psoc");
return QDF_STATUS_E_INVAL;
}
fwol_obj = fwol_get_psoc_obj(psoc);
if (!fwol_obj) {
fwol_err("Failed to get FWOL Obj");
return QDF_STATUS_E_INVAL;
}
tx_ops = &fwol_obj->tx_ops;
if (tx_ops->set_mdns_config)
status = tx_ops->set_mdns_config(psoc, mdns_info);
else
status = QDF_STATUS_E_IO;
return status;
}
#endif /* WLAN_FEATURE_MDNS_OFFLOAD */
QDF_STATUS ucfg_fwol_configure_global_params(struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_pdev *pdev)
{