cfg80211: Add support for QoS mapping
This allows QoS mapping from external networks to be implemented as defined in IEEE Std 802.11-2012, 10.24.9. APs can use this to advertise DSCP ranges and exceptions for mapping frames to a specific UP over Wi-Fi. The payload of the QoS Map Set element (IEEE Std 802.11-2012, 8.4.2.97) is sent to the driver through the new NL80211_ATTR_QOS_MAP attribute to configure the local behavior either on the AP (based on local configuration) or on a station (based on information received from the AP). Signed-off-by: Kyeyoon Park <kyeyoonp@qca.qualcomm.com> Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:

committed by
Johannes Berg

parent
567ffc3509
commit
fa9ffc7456
@@ -689,7 +689,8 @@ void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,
|
||||
EXPORT_SYMBOL(ieee80211_amsdu_to_8023s);
|
||||
|
||||
/* Given a data frame determine the 802.1p/1d tag to use. */
|
||||
unsigned int cfg80211_classify8021d(struct sk_buff *skb)
|
||||
unsigned int cfg80211_classify8021d(struct sk_buff *skb,
|
||||
struct cfg80211_qos_map *qos_map)
|
||||
{
|
||||
unsigned int dscp;
|
||||
unsigned char vlan_priority;
|
||||
@@ -720,6 +721,21 @@ unsigned int cfg80211_classify8021d(struct sk_buff *skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (qos_map) {
|
||||
unsigned int i, tmp_dscp = dscp >> 2;
|
||||
|
||||
for (i = 0; i < qos_map->num_des; i++) {
|
||||
if (tmp_dscp == qos_map->dscp_exception[i].dscp)
|
||||
return qos_map->dscp_exception[i].up;
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (tmp_dscp >= qos_map->up[i].low &&
|
||||
tmp_dscp <= qos_map->up[i].high)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return dscp >> 5;
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_classify8021d);
|
||||
@@ -863,6 +879,7 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
|
||||
|
||||
dev->ieee80211_ptr->use_4addr = false;
|
||||
dev->ieee80211_ptr->mesh_id_up_len = 0;
|
||||
rdev_set_qos_map(rdev, dev, NULL);
|
||||
|
||||
switch (otype) {
|
||||
case NL80211_IFTYPE_AP:
|
||||
|
Reference in New Issue
Block a user