summaryrefslogtreecommitdiff
path: root/net/rmnet_data
diff options
context:
space:
mode:
authorRavinder Konka <rkonka@codeaurora.org>2015-10-26 13:15:33 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-22 11:05:51 -0700
commitb81ad4f065f12b99174fdafcd118b9dfa161d446 (patch)
tree394dbdccf51b3da5602d0ba670dbf39e74bd3592 /net/rmnet_data
parent986546c1b529503289b9e2d145b164e2a97f65fb (diff)
rmnet_data : Changes to support Scatter Gather and GSO.
This patch enables hardware device features such as NETIF_F_SG NETIF_F_GSO NETIF_F_GSO_UDP_TUNNEL NETIF_F_GSO_UDP_TUNNEL_CSUM. This patch also ensures to skip padding(to align length to word boundaries) for outgoing non linear skbs. This patch also adds a new ioctl interface RMNET_IOCTL_GET_SG_SUPPORT to query the physical network devices for Scatter Gather support. Change-Id: I9788d75c249ab2dac5b598dad131c0692ed84e4d Acked-by: Abhishek Chauhan <abchauha@qti.qualcomm.com> Signed-off-by: Ravinder Konka <rkonka@codeaurora.org>
Diffstat (limited to 'net/rmnet_data')
-rw-r--r--net/rmnet_data/rmnet_data_vnd.c6
-rw-r--r--net/rmnet_data/rmnet_map_data.c10
2 files changed, 16 insertions, 0 deletions
diff --git a/net/rmnet_data/rmnet_data_vnd.c b/net/rmnet_data/rmnet_data_vnd.c
index 6d8f1160fe48..8571a8344fbc 100644
--- a/net/rmnet_data/rmnet_data_vnd.c
+++ b/net/rmnet_data/rmnet_data_vnd.c
@@ -615,6 +615,12 @@ int rmnet_vnd_create_dev(int id, struct net_device **new_device,
NETIF_F_IPV6_UDP_CSUM;
/* Configuring GRO on rmnet_data interfaces */
dev->hw_features |= NETIF_F_GRO;
+ /* Configuring Scatter-Gather on rmnet_data interfaces */
+ dev->hw_features |= NETIF_F_SG;
+ /* Configuring GSO on rmnet_data interfaces */
+ dev->hw_features |= NETIF_F_GSO;
+ dev->hw_features |= NETIF_F_GSO_UDP_TUNNEL;
+ dev->hw_features |= NETIF_F_GSO_UDP_TUNNEL_CSUM;
}
rc = register_netdevice(dev);
diff --git a/net/rmnet_data/rmnet_map_data.c b/net/rmnet_data/rmnet_map_data.c
index ae61d5ed160a..a51fa15e5ba9 100644
--- a/net/rmnet_data/rmnet_map_data.c
+++ b/net/rmnet_data/rmnet_map_data.c
@@ -99,6 +99,15 @@ struct rmnet_map_header_s *rmnet_map_add_map_header(struct sk_buff *skb,
padding = ALIGN(map_datalen, 4) - map_datalen;
+ if (padding == 0)
+ goto done;
+
+ if ((skb->dev->features & NETIF_F_GSO) &&
+ skb_is_nonlinear(skb) && unlikely((padding != 0))) {
+ LOGE("pad:%d required for non linear skb", padding);
+ BUG();
+ }
+
if (skb_tailroom(skb) < padding)
return 0;
@@ -106,6 +115,7 @@ struct rmnet_map_header_s *rmnet_map_add_map_header(struct sk_buff *skb,
LOGD("pad: %d", padding);
memset(padbytes, 0, padding);
+done:
map_header->pkt_len = htons(map_datalen + padding);
map_header->pad_len = padding&0x3F;