cregit-Linux how code gets into the kernel

Release 4.15 net/mac80211/wme.c

Directory: net/mac80211
/*
 * Copyright 2004, Instant802 Networks, Inc.
 * Copyright 2013-2014  Intel Mobile Communications GmbH
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/module.h>
#include <linux/if_arp.h>
#include <linux/types.h>
#include <net/ip.h>
#include <net/pkt_sched.h>

#include <net/mac80211.h>
#include "ieee80211_i.h"
#include "wme.h"

/* Default mapping in classifier to work with default
 * queue setup.
 */

const int ieee802_1d_to_ac[8] = {
	IEEE80211_AC_BE,
	IEEE80211_AC_BK,
	IEEE80211_AC_BK,
	IEEE80211_AC_BE,
	IEEE80211_AC_VI,
	IEEE80211_AC_VI,
	IEEE80211_AC_VO,
	IEEE80211_AC_VO
};


static int wme_downgrade_ac(struct sk_buff *skb) { switch (skb->priority) { case 6: case 7: skb->priority = 5; /* VO -> VI */ return 0; case 4: case 5: skb->priority = 3; /* VI -> BE */ return 0; case 0: case 3: skb->priority = 2; /* BE -> BK */ return 0; default: return -1; } }

Contributors

PersonTokensPropCommitsCommitProp
Jiri Benc72100.00%1100.00%
Total72100.00%1100.00%

/** * ieee80211_fix_reserved_tid - return the TID to use if this one is reserved * @tid: the assumed-reserved TID * * Returns: the alternative TID to use, or 0 on error */
static inline u8 ieee80211_fix_reserved_tid(u8 tid) { switch (tid) { case 0: return 3; case 1: return 2; case 2: return 1; case 3: return 0; case 4: return 5; case 5: return 4; case 6: return 7; case 7: return 6; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Liad Kaufman67100.00%1100.00%
Total67100.00%1100.00%


static u16 ieee80211_downgrade_queue(struct ieee80211_sub_if_data *sdata, struct sta_info *sta, struct sk_buff *skb) { struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; /* in case we are a client verify acm is not set for this ac */ while (sdata->wmm_acm & BIT(skb->priority)) { int ac = ieee802_1d_to_ac[skb->priority]; if (ifmgd->tx_tspec[ac].admitted_time && skb->priority == ifmgd->tx_tspec[ac].up) return ac; if (wme_downgrade_ac(skb)) { /* * This should not really happen. The AP has marked all * lower ACs to require admission control which is not * a reasonable configuration. Allow the frame to be * transmitted using AC_BK as a workaround. */ break; } } /* Check to see if this is a reserved TID */ if (sta && sta->reserved_tid == skb->priority) skb->priority = ieee80211_fix_reserved_tid(skb->priority); /* look up which queue to use for frames with this 1d tag */ return ieee802_1d_to_ac[skb->priority]; }

Contributors

PersonTokensPropCommitsCommitProp
Johannes Berg10379.23%250.00%
Liad Kaufman2418.46%125.00%
Yoni Divinsky32.31%125.00%
Total130100.00%4100.00%

/* Indicate which queue to use for this fully formed 802.11 frame */
u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, struct ieee80211_hdr *hdr) { struct ieee80211_local *local = sdata->local; u8 *p; if (local->hw.queues < IEEE80211_NUM_ACS) return 0; if (!ieee80211_is_data(hdr->frame_control)) { skb->priority = 7; return ieee802_1d_to_ac[skb->priority]; } if (!ieee80211_is_data_qos(hdr->frame_control)) { skb->priority = 0; return ieee802_1d_to_ac[skb->priority]; } p = ieee80211_get_qos_ctl(hdr); skb->priority = *p & IEEE80211_QOS_CTL_TAG1D_MASK; return ieee80211_downgrade_queue(sdata, NULL, skb); }

Contributors

PersonTokensPropCommitsCommitProp
Thomas Pedersen10987.90%125.00%
Yoni Divinsky129.68%125.00%
Johannes Berg32.42%250.00%
Total124100.00%4100.00%

/* Indicate which queue to use. */
u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb) { struct ieee80211_local *local = sdata->local; struct sta_info *sta = NULL; const u8 *ra = NULL; bool qos = false; struct mac80211_qos_map *qos_map; u16 ret; if (local->hw.queues < IEEE80211_NUM_ACS || skb->len < 6) { skb->priority = 0; /* required for correct WPA/11i MIC */ return 0; } rcu_read_lock(); switch (sdata->vif.type) { case NL80211_IFTYPE_AP_VLAN: sta = rcu_dereference(sdata->u.vlan.sta); if (sta) { qos = sta->sta.wme; break; } case NL80211_IFTYPE_AP: ra = skb->data; break; case NL80211_IFTYPE_WDS: ra = sdata->u.wds.remote_addr; break; #ifdef CONFIG_MAC80211_MESH case NL80211_IFTYPE_MESH_POINT: qos = true; break; #endif case NL80211_IFTYPE_STATION: /* might be a TDLS station */ sta = sta_info_get(sdata, skb->data); if (sta) qos = sta->sta.wme; ra = sdata->u.mgd.bssid; break; case NL80211_IFTYPE_ADHOC: ra = skb->data; break; case NL80211_IFTYPE_OCB: /* all stations are required to support WME */ qos = true; break; default: break; } if (!sta && ra && !is_multicast_ether_addr(ra)) { sta = sta_info_get(sdata, ra); if (sta) qos = sta->sta.wme; } if (!qos) { skb->priority = 0; /* required for correct WPA/11i MIC */ ret = IEEE80211_AC_BE; goto out; } if (skb->protocol == sdata->control_port_protocol) { skb->priority = 7; goto downgrade; } /* use the data classifier to determine what 802.1d tag the * data frame has */ qos_map = rcu_dereference(sdata->qos_map); skb->priority = cfg80211_classify8021d(skb, qos_map ? &qos_map->qos_map : NULL); downgrade: ret = ieee80211_downgrade_queue(sdata, sta, skb); out: rcu_read_unlock(); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Johannes Berg21863.01%942.86%
Jiri Benc4312.43%14.76%
Liad Kaufman246.94%14.76%
Kyeyoon Park236.65%29.52%
Felix Fietkau185.20%14.76%
Rostislav Lisovy92.60%14.76%
Harvey Harrison41.16%14.76%
Javier Cardona41.16%29.52%
David S. Miller10.29%14.76%
Yoni Divinsky10.29%14.76%
Yi Zhu10.29%14.76%
Total346100.00%21100.00%

/** * ieee80211_set_qos_hdr - Fill in the QoS header if there is one. * * @sdata: local subif * @skb: packet to be updated */
void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb) { struct ieee80211_hdr *hdr = (void *)skb->data; struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); u8 tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; u8 flags; u8 *p; if (!ieee80211_is_data_qos(hdr->frame_control)) return; p = ieee80211_get_qos_ctl(hdr); /* set up the first byte */ /* * preserve everything but the TID and ACK policy * (which we both write here) */ flags = *p & ~(IEEE80211_QOS_CTL_TID_MASK | IEEE80211_QOS_CTL_ACK_POLICY_MASK); if (is_multicast_ether_addr(hdr->addr1) || sdata->noack_map & BIT(tid)) { flags |= IEEE80211_QOS_CTL_ACK_POLICY_NOACK; info->flags |= IEEE80211_TX_CTL_NO_ACK; } *p = flags | tid; /* set up the second byte */ p++; if (ieee80211_vif_is_mesh(&sdata->vif)) { /* preserve RSPI and Mesh PS Level bit */ *p &= ((IEEE80211_QOS_CTL_RSPI | IEEE80211_QOS_CTL_MESH_PS_LEVEL) >> 8); /* Nulls don't have a mesh header (frame body) */ if (!ieee80211_is_qos_nullfunc(hdr->frame_control)) *p |= (IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT >> 8); } else { *p = 0; } }

Contributors

PersonTokensPropCommitsCommitProp
Marco Porsch4826.52%213.33%
Johannes Berg3619.89%533.33%
Jiri Benc3117.13%16.67%
Simon Wunderlich2714.92%16.67%
Javier Cardona147.73%16.67%
David S. Miller94.97%16.67%
Harvey Harrison63.31%16.67%
Thomas Pedersen63.31%16.67%
Ron Rindjunsky21.10%16.67%
Sujith Manoharan21.10%16.67%
Total181100.00%15100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Johannes Berg37037.72%1644.44%
Jiri Benc17617.94%12.78%
Liad Kaufman11611.82%12.78%
Thomas Pedersen11611.82%25.56%
Marco Porsch494.99%25.56%
Simon Wunderlich272.75%12.78%
Kyeyoon Park232.34%25.56%
Ron Rindjunsky191.94%12.78%
Felix Fietkau181.83%12.78%
Javier Cardona181.83%38.33%
Yoni Divinsky161.63%12.78%
David S. Miller111.12%12.78%
Harvey Harrison101.02%12.78%
Rostislav Lisovy90.92%12.78%
Sujith Manoharan20.20%12.78%
Yi Zhu10.10%12.78%
Total981100.00%36100.00%
Directory: net/mac80211
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.