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

Commit 02d4cb29 authored by Conner Huff's avatar Conner Huff
Browse files

rmnet: fix tx rmnet stats to work with UL aggregation



allows UL stats within rmnet to count packets which
are being aggregated.

Includes API changes to both tx and rx stats functions
to instead take skb lengths as arguments instead of
skb pointers to safeguard against cases where we might
have already freed the skb

CRs-Fixed: 2261938
Change-Id: I08d646f1641a5fe10bdcdf647c472d64f3f2551c
Signed-off-by: default avatarConner Huff <chuff@codeaurora.org>
parent cecc0b27
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -82,7 +82,7 @@ rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port)

	skb_reset_transport_header(skb);
	skb_reset_network_header(skb);
	rmnet_vnd_rx_fixup(skb, skb->dev);
	rmnet_vnd_rx_fixup(skb->dev, skb->len);

	skb->pkt_type = PACKET_HOST;
	skb_set_mac_header(skb, 0);
@@ -314,6 +314,7 @@ void rmnet_egress_handler(struct sk_buff *skb)
	struct rmnet_priv *priv;
	u8 mux_id;
	int err;
	u32 skb_len;

	sk_pacing_shift_update(skb->sk, 8);

@@ -326,13 +327,16 @@ void rmnet_egress_handler(struct sk_buff *skb)
	if (!port)
		goto drop;

	skb_len = skb->len;
	err = rmnet_map_egress_handler(skb, port, mux_id, orig_dev);
	if (err == -ENOMEM)
		goto drop;
	else if (err == -EINPROGRESS)
	else if (err == -EINPROGRESS) {
		rmnet_vnd_tx_fixup(orig_dev, skb_len);
		return;
	}

	rmnet_vnd_tx_fixup(skb, orig_dev);
	rmnet_vnd_tx_fixup(orig_dev, skb_len);

	dev_queue_xmit(skb);
	return;
+4 −4
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@

/* RX/TX Fixup */

void rmnet_vnd_rx_fixup(struct sk_buff *skb, struct net_device *dev)
void rmnet_vnd_rx_fixup(struct net_device *dev, u32 skb_len)
{
	struct rmnet_priv *priv = netdev_priv(dev);
	struct rmnet_pcpu_stats *pcpu_ptr;
@@ -38,11 +38,11 @@ void rmnet_vnd_rx_fixup(struct sk_buff *skb, struct net_device *dev)

	u64_stats_update_begin(&pcpu_ptr->syncp);
	pcpu_ptr->stats.rx_pkts++;
	pcpu_ptr->stats.rx_bytes += skb->len;
	pcpu_ptr->stats.rx_bytes += skb_len;
	u64_stats_update_end(&pcpu_ptr->syncp);
}

void rmnet_vnd_tx_fixup(struct sk_buff *skb, struct net_device *dev)
void rmnet_vnd_tx_fixup(struct net_device *dev, u32 skb_len)
{
	struct rmnet_priv *priv = netdev_priv(dev);
	struct rmnet_pcpu_stats *pcpu_ptr;
@@ -51,7 +51,7 @@ void rmnet_vnd_tx_fixup(struct sk_buff *skb, struct net_device *dev)

	u64_stats_update_begin(&pcpu_ptr->syncp);
	pcpu_ptr->stats.tx_pkts++;
	pcpu_ptr->stats.tx_bytes += skb->len;
	pcpu_ptr->stats.tx_bytes += skb_len;
	u64_stats_update_end(&pcpu_ptr->syncp);
}

+3 −3
Original line number Diff line number Diff line
/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -23,8 +23,8 @@ int rmnet_vnd_newlink(u8 id, struct net_device *rmnet_dev,
		      struct rmnet_endpoint *ep);
int rmnet_vnd_dellink(u8 id, struct rmnet_port *port,
		      struct rmnet_endpoint *ep);
void rmnet_vnd_rx_fixup(struct sk_buff *skb, struct net_device *dev);
void rmnet_vnd_tx_fixup(struct sk_buff *skb, struct net_device *dev);
void rmnet_vnd_rx_fixup(struct net_device *dev, u32 skb_len);
void rmnet_vnd_tx_fixup(struct net_device *dev, u32 skb_len);
u8 rmnet_vnd_get_mux(struct net_device *rmnet_dev);
void rmnet_vnd_setup(struct net_device *dev);
#endif /* _RMNET_VND_H_ */