diff options
| author | Ravinder Konka <rkonka@codeaurora.org> | 2015-10-26 13:15:33 +0530 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-22 11:05:51 -0700 |
| commit | b81ad4f065f12b99174fdafcd118b9dfa161d446 (patch) | |
| tree | 394dbdccf51b3da5602d0ba670dbf39e74bd3592 | |
| parent | 986546c1b529503289b9e2d145b164e2a97f65fb (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>
| -rw-r--r-- | include/uapi/linux/msm_rmnet.h | 3 | ||||
| -rw-r--r-- | net/rmnet_data/rmnet_data_vnd.c | 6 | ||||
| -rw-r--r-- | net/rmnet_data/rmnet_map_data.c | 10 |
3 files changed, 18 insertions, 1 deletions
diff --git a/include/uapi/linux/msm_rmnet.h b/include/uapi/linux/msm_rmnet.h index 936b4373d09f..4892602c2b94 100644 --- a/include/uapi/linux/msm_rmnet.h +++ b/include/uapi/linux/msm_rmnet.h @@ -59,7 +59,8 @@ enum rmnet_ioctl_extended_cmds_e { RMNET_IOCTL_SET_SLEEP_STATE = 0x0014, /* Set sleep state */ RMNET_IOCTL_SET_XLAT_DEV_INFO = 0x0015, /* xlat dev name */ RMNET_IOCTL_DEREGISTER_DEV = 0x0016, /* Dereg a net dev */ - RMNET_IOCTL_EXTENDED_MAX = 0x0017 + RMNET_IOCTL_GET_SG_SUPPORT = 0x0017, /* Query sg support*/ + RMNET_IOCTL_EXTENDED_MAX = 0x0018 }; /* Return values for the RMNET_IOCTL_GET_SUPPORTED_FEATURES IOCTL */ 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; |
