summaryrefslogtreecommitdiff
path: root/net/rmnet_data
diff options
context:
space:
mode:
authorAshwanth Goli <ashwanth@codeaurora.org>2016-11-18 15:07:51 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2016-12-06 15:37:32 -0800
commit138818a6eb5ada892b2ff6af7f2d12e7df2a7435 (patch)
tree978cb6fe2bdd4a1a022c8d74cc466476ebd74d6a /net/rmnet_data
parent5142c18bae30439decd1c139999b54197e2aae91 (diff)
rmnet_data: queue QMAP control packets if start_xmit fails
rmnet_data does not free skb's when phy netdev fails to xmit a qmap control packet cauing memory leak. To avoid this we queue the packet back into device queue if start_xmit fails. Change-Id: Id7efdd10ac76c989c086cb5f934a4b666b7c5939 Signed-off-by: Ashwanth Goli <ashwanth@codeaurora.org>
Diffstat (limited to 'net/rmnet_data')
-rw-r--r--net/rmnet_data/rmnet_map_command.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/net/rmnet_data/rmnet_map_command.c b/net/rmnet_data/rmnet_map_command.c
index 055d5f402957..9dac2b27d4c3 100644
--- a/net/rmnet_data/rmnet_map_command.c
+++ b/net/rmnet_data/rmnet_map_command.c
@@ -121,6 +121,7 @@ static void rmnet_map_send_ack(struct sk_buff *skb,
{
struct rmnet_map_control_command_s *cmd;
int xmit_status;
+ int rc;
if (unlikely(!skb))
BUG();
@@ -149,6 +150,15 @@ static void rmnet_map_send_ack(struct sk_buff *skb,
netif_tx_unlock(skb->dev);
LOGD("MAP command ACK=%hhu sent with rc: %d", type & 0x03, xmit_status);
+
+ if (xmit_status != NETDEV_TX_OK) {
+ rc = dev_queue_xmit(skb);
+ if (rc != 0) {
+ LOGD("Failed to queue packet for transmission on [%s]",
+ skb->dev->name);
+ }
+ }
+
}
/**