Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1b3cfed authored by Ahmad Masri's avatar Ahmad Masri Committed by Maya Erez
Browse files

wil6210: accessing 802.3 addresses via utility functions



Rearrange the code by having functions to access 802.3 header
members, source and destination addresses.

Signed-off-by: default avatarAhmad Masri <amasri@codeaurora.org>
Signed-off-by: default avatarMaya Erez <merez@codeaurora.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Git-commit: 6d1ba32c8070bf9e4088b16d3af1eb2b6f05543c
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git


[merez@codeaurora.org: SPDX license conflict]
Change-Id: Ib5417ce5ba77e5f96cb3b4d5d9cd322e78f39806
Signed-off-by: default avatarMaya Erez <merez@codeaurora.org>
parent c04b29c0
Loading
Loading
Loading
Loading
+17 −19
Original line number Diff line number Diff line
@@ -398,7 +398,6 @@ static int wil_rx_get_cid_by_skb(struct wil6210_priv *wil, struct sk_buff *skb)
	 */
	int cid = wil_rxdesc_cid(d);
	unsigned int snaplen = wil_rx_snaplen();
	struct ethhdr *eth;
	struct ieee80211_hdr_3addr *hdr;
	int i;
	unsigned char *ta;
@@ -416,8 +415,7 @@ static int wil_rx_get_cid_by_skb(struct wil6210_priv *wil, struct sk_buff *skb)
					    skb->len);
			return -ENOENT;
		}
		eth = (void *)skb->data;
		ta = eth->h_source;
		ta = wil_skb_get_sa(skb);
	} else {
		if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) {
			wil_err_ratelimited(wil, "Short frame, len = %d\n",
@@ -754,11 +752,11 @@ void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev)
	unsigned int len = skb->len;
	int cid;
	int security;
	struct ethhdr *eth = (void *)skb->data;
	u8 *sa, *da = wil_skb_get_da(skb);
	/* here looking for DA, not A1, thus Rxdesc's 'mcast' indication
	 * is not suitable, need to look at data
	 */
	int mcast = is_multicast_ether_addr(eth->h_dest);
	int mcast = is_multicast_ether_addr(da);
	struct wil_net_stats *stats;
	struct sk_buff *xmit_skb = NULL;
	static const char * const gro_res_str[] = {
@@ -789,7 +787,8 @@ void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev)
	}

	if (wdev->iftype == NL80211_IFTYPE_STATION) {
		if (mcast && ether_addr_equal(eth->h_source, ndev->dev_addr)) {
		sa = wil_skb_get_sa(skb);
		if (mcast && ether_addr_equal(sa, ndev->dev_addr)) {
			/* mcast packet looped back to us */
			rc = GRO_DROP;
			dev_kfree_skb(skb);
@@ -802,8 +801,7 @@ void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev)
			 */
			xmit_skb = skb_copy(skb, GFP_ATOMIC);
		} else {
			int xmit_cid = wil_find_cid(wil, vif->mid,
						    eth->h_dest);
			int xmit_cid = wil_find_cid(wil, vif->mid, da);

			if (xmit_cid >= 0) {
				/* The destination station is associated to
@@ -1254,11 +1252,12 @@ static struct wil_ring *wil_find_tx_ucast(struct wil6210_priv *wil,
					  struct wil6210_vif *vif,
					  struct sk_buff *skb)
{
	int i;
	struct ethhdr *eth = (void *)skb->data;
	int cid = wil_find_cid(wil, vif->mid, eth->h_dest);
	int i, cid;
	const u8 *da = wil_skb_get_da(skb);
	int min_ring_id = wil_get_min_tx_ring_id(wil);

	cid = wil_find_cid(wil, vif->mid, da);

	if (cid < 0 || cid >= max_assoc_sta)
		return NULL;

@@ -1272,7 +1271,7 @@ static struct wil_ring *wil_find_tx_ucast(struct wil6210_priv *wil,
			struct wil_ring_tx_data *txdata = &wil->ring_tx_data[i];

			wil_dbg_txrx(wil, "find_tx_ucast: (%pM) -> [%d]\n",
				     eth->h_dest, i);
				     da, i);
			if (v->va && txdata->enabled) {
				return v;
			} else {
@@ -1363,10 +1362,10 @@ static struct wil_ring *wil_find_tx_bcast_1(struct wil6210_priv *wil,
static void wil_set_da_for_vring(struct wil6210_priv *wil,
				 struct sk_buff *skb, int vring_index)
{
	struct ethhdr *eth = (void *)skb->data;
	u8 *da = wil_skb_get_da(skb);
	int cid = wil->ring2cid_tid[vring_index][0];

	ether_addr_copy(eth->h_dest, wil->sta[cid].addr);
	ether_addr_copy(da, wil->sta[cid].addr);
}

static struct wil_ring *wil_find_tx_bcast_2(struct wil6210_priv *wil,
@@ -1377,8 +1376,7 @@ static struct wil_ring *wil_find_tx_bcast_2(struct wil6210_priv *wil,
	struct sk_buff *skb2;
	int i;
	u8 cid;
	struct ethhdr *eth = (void *)skb->data;
	char *src = eth->h_source;
	const u8 *src = wil_skb_get_sa(skb);
	struct wil_ring_tx_data *txdata, *txdata2;
	int min_ring_id = wil_get_min_tx_ring_id(wil);

@@ -2136,8 +2134,8 @@ netdev_tx_t wil_start_xmit(struct sk_buff *skb, struct net_device *ndev)
{
	struct wil6210_vif *vif = ndev_to_vif(ndev);
	struct wil6210_priv *wil = vif_to_wil(vif);
	struct ethhdr *eth = (void *)skb->data;
	bool bcast = is_multicast_ether_addr(eth->h_dest);
	const u8 *da = wil_skb_get_da(skb);
	bool bcast = is_multicast_ether_addr(da);
	struct wil_ring *ring;
	static bool pr_once_fw;
	int rc;
@@ -2184,7 +2182,7 @@ netdev_tx_t wil_start_xmit(struct sk_buff *skb, struct net_device *ndev)
		ring = wil_find_tx_ucast(wil, vif, skb);
	}
	if (unlikely(!ring)) {
		wil_dbg_txrx(wil, "No Tx RING found for %pM\n", eth->h_dest);
		wil_dbg_txrx(wil, "No Tx RING found for %pM\n", da);
		goto drop;
	}
	/* set up vring entry */
+16 −2
Original line number Diff line number Diff line
@@ -567,11 +567,25 @@ static inline int wil_ring_is_full(struct wil_ring *ring)
	return wil_ring_next_tail(ring) == ring->swhead;
}

static inline bool wil_need_txstat(struct sk_buff *skb)
static inline u8 *wil_skb_get_da(struct sk_buff *skb)
{
	struct ethhdr *eth = (void *)skb->data;

	return eth->h_dest;
}

static inline u8 *wil_skb_get_sa(struct sk_buff *skb)
{
	struct ethhdr *eth = (void *)skb->data;

	return is_unicast_ether_addr(eth->h_dest) && skb->sk &&
	return eth->h_source;
}

static inline bool wil_need_txstat(struct sk_buff *skb)
{
	const u8 *da = wil_skb_get_da(skb);

	return is_unicast_ether_addr(da) && skb->sk &&
	       (skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS);
}