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

Commit 5d8d66c6 authored by Subash Abhinov Kasiviswanathan's avatar Subash Abhinov Kasiviswanathan
Browse files

net: rmnet_data: Disable generic receive offload by default



Generic receive offload is enabled by default on a net_device
whenever it is registered. In case of rmnet_data, a physical
device could theoretically pass cloned frames and rmnet_data
would pass on these cloned frames to GRO framework. This
would cause memory corruption or crashes since GRO modifies
the skb shared info which is shared across clones.

While cloned frames are usually not sent to rmnet_data, this
configuration actually requires userspace intervention. If
userspace does not makes appropriate calls to kernel, we will
run into crashes. Handle this scenario by disabling GRO by
default. Userspace will need to explicitly enable GRO if
required to do so.

CRs-Fixed: 1097389
Change-Id: I40d5ce940f4722b128c0138c07232c33d0b74e14
Signed-off-by: default avatarSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>
parent 53c1534d
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
/* Copyright (c) 2013-2017, 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
@@ -497,6 +497,17 @@ static void rmnet_vnd_setup(struct net_device *dev)
	INIT_LIST_HEAD(&dev_conf->flow_head);
}

/* rmnet_vnd_setup() - net_device initialization helper function
 * @dev:      Virtual network device
 *
 * Called during device initialization. Disables GRO.
 */
static void rmnet_vnd_disable_offload(struct net_device *dev)
{
	dev->wanted_features &= ~NETIF_F_GRO;
	__netdev_update_features(dev);
}

/* Exposed API */

/* rmnet_vnd_exit() - Shutdown cleanup hook
@@ -607,6 +618,8 @@ int rmnet_vnd_create_dev(int id, struct net_device **new_device,
		LOGM("Registered device %s", dev->name);
	}

	rmnet_vnd_disable_offload(dev);

	return rc;
}