From: "K. Y. Srinivasan" <kys@microsoft.com>
To: davem@davemloft.net, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, devel@linuxdriverproject.org,
olaf@aepfle.de, apw@canonical.com, jasowang@redhat.com
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Subject: [PATCH 5/6] Drivers: net: hyperv: Enable send side checksum offload
Date: Thu, 6 Mar 2014 03:13:09 -0800 [thread overview]
Message-ID: <1394104390-23477-5-git-send-email-kys@microsoft.com> (raw)
In-Reply-To: <1394104390-23477-1-git-send-email-kys@microsoft.com>
Enable send side checksum offload.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
---
drivers/net/hyperv/netvsc_drv.c | 70 +++++++++++++++++++++++++++++++++++++-
1 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 98562fc..e8159a8 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -259,6 +259,36 @@ static int netvsc_get_slots(struct sk_buff *skb)
return slots + frag_slots;
}
+bool get_net_transport_info(struct sk_buff *skb, bool *is_v4,
+ bool *is_tcp, bool *is_udp, u32 *trans_off)
+{
+ *is_tcp = false;
+ *is_udp = false;
+
+ if ((eth_hdr(skb)->h_proto != htons(ETH_P_IP)) &&
+ (eth_hdr(skb)->h_proto != htons(ETH_P_IPV6))) {
+ return false;
+ }
+
+ *trans_off = skb_transport_offset(skb);
+
+ if ((eth_hdr(skb)->h_proto == htons(ETH_P_IP))) {
+ struct iphdr *iphdr = ip_hdr(skb);
+ *is_v4 = true;
+ if (iphdr->protocol == IPPROTO_TCP)
+ *is_tcp = true;
+ else if (iphdr->protocol == IPPROTO_UDP)
+ *is_udp = true;
+ } else {
+ *is_v4 = false;
+ if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
+ *is_tcp = true;
+ else if (ipv6_hdr(skb)->nexthdr == IPPROTO_UDP)
+ *is_udp = true;
+ }
+ return true;
+}
+
static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
{
struct net_device_context *net_device_ctx = netdev_priv(net);
@@ -270,6 +300,12 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
u32 rndis_msg_size;
bool isvlan;
struct rndis_per_packet_info *ppi;
+ struct ndis_tcp_ip_checksum_info *csum_info;
+ int hdr_offset;
+ bool is_v4;
+ bool is_tcp;
+ bool is_udp;
+
/*
* We will atmost need two pages to describe the rndis
@@ -338,6 +374,35 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
VLAN_PRIO_SHIFT;
}
+ if (!get_net_transport_info(skb, &is_v4, &is_tcp, &is_udp, &hdr_offset))
+ goto do_send;
+ /*
+ * Setup the sendside checksum offload only if this is not a
+ * GSO packet.
+ */
+ if (skb_is_gso(skb))
+ goto do_send;
+
+ rndis_msg_size += NDIS_CSUM_PPI_SIZE;
+ ppi = init_ppi_data(rndis_msg, NDIS_CSUM_PPI_SIZE,
+ TCPIP_CHKSUM_PKTINFO);
+
+ csum_info = (struct ndis_tcp_ip_checksum_info *)((ulong)ppi +
+ ppi->ppi_offset);
+
+ if (is_v4)
+ csum_info->transmit.is_ipv4 = 1;
+ else
+ csum_info->transmit.is_ipv6 = 1;
+
+ if (is_tcp) {
+ csum_info->transmit.tcp_checksum = 1;
+ csum_info->transmit.tcp_header_offset = hdr_offset;
+ } else if (is_udp) {
+ csum_info->transmit.udp_checksum = 1;
+ }
+
+do_send:
/* Start filling in the page buffers with the rndis hdr */
rndis_msg->msg_len += rndis_msg_size;
packet->page_buf_cnt = init_page_array(rndis_msg, rndis_msg_size,
@@ -593,8 +658,9 @@ static int netvsc_probe(struct hv_device *dev,
net->netdev_ops = &device_ops;
/* TODO: Add GSO and Checksum offload */
- net->hw_features = NETIF_F_RXCSUM | NETIF_F_SG;
- net->features = NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_SG | NETIF_F_RXCSUM;
+ net->hw_features = NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_IP_CSUM;
+ net->features = NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_SG | NETIF_F_RXCSUM |
+ NETIF_F_IP_CSUM;
SET_ETHTOOL_OPS(net, ðtool_ops);
SET_NETDEV_DEV(net, &dev->device);
--
1.7.4.1
WARNING: multiple messages have this Message-ID (diff)
From: "K. Y. Srinivasan" <kys@microsoft.com>
To: davem@davemloft.net, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, devel@linuxdriverproject.org,
olaf@aepfle.de, apw@canonical.com, jasowang@redhat.com
Subject: [PATCH 5/6] Drivers: net: hyperv: Enable send side checksum offload
Date: Thu, 6 Mar 2014 03:13:09 -0800 [thread overview]
Message-ID: <1394104390-23477-5-git-send-email-kys@microsoft.com> (raw)
In-Reply-To: <1394104390-23477-1-git-send-email-kys@microsoft.com>
Enable send side checksum offload.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
---
drivers/net/hyperv/netvsc_drv.c | 70 +++++++++++++++++++++++++++++++++++++-
1 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 98562fc..e8159a8 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -259,6 +259,36 @@ static int netvsc_get_slots(struct sk_buff *skb)
return slots + frag_slots;
}
+bool get_net_transport_info(struct sk_buff *skb, bool *is_v4,
+ bool *is_tcp, bool *is_udp, u32 *trans_off)
+{
+ *is_tcp = false;
+ *is_udp = false;
+
+ if ((eth_hdr(skb)->h_proto != htons(ETH_P_IP)) &&
+ (eth_hdr(skb)->h_proto != htons(ETH_P_IPV6))) {
+ return false;
+ }
+
+ *trans_off = skb_transport_offset(skb);
+
+ if ((eth_hdr(skb)->h_proto == htons(ETH_P_IP))) {
+ struct iphdr *iphdr = ip_hdr(skb);
+ *is_v4 = true;
+ if (iphdr->protocol == IPPROTO_TCP)
+ *is_tcp = true;
+ else if (iphdr->protocol == IPPROTO_UDP)
+ *is_udp = true;
+ } else {
+ *is_v4 = false;
+ if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
+ *is_tcp = true;
+ else if (ipv6_hdr(skb)->nexthdr == IPPROTO_UDP)
+ *is_udp = true;
+ }
+ return true;
+}
+
static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
{
struct net_device_context *net_device_ctx = netdev_priv(net);
@@ -270,6 +300,12 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
u32 rndis_msg_size;
bool isvlan;
struct rndis_per_packet_info *ppi;
+ struct ndis_tcp_ip_checksum_info *csum_info;
+ int hdr_offset;
+ bool is_v4;
+ bool is_tcp;
+ bool is_udp;
+
/*
* We will atmost need two pages to describe the rndis
@@ -338,6 +374,35 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
VLAN_PRIO_SHIFT;
}
+ if (!get_net_transport_info(skb, &is_v4, &is_tcp, &is_udp, &hdr_offset))
+ goto do_send;
+ /*
+ * Setup the sendside checksum offload only if this is not a
+ * GSO packet.
+ */
+ if (skb_is_gso(skb))
+ goto do_send;
+
+ rndis_msg_size += NDIS_CSUM_PPI_SIZE;
+ ppi = init_ppi_data(rndis_msg, NDIS_CSUM_PPI_SIZE,
+ TCPIP_CHKSUM_PKTINFO);
+
+ csum_info = (struct ndis_tcp_ip_checksum_info *)((ulong)ppi +
+ ppi->ppi_offset);
+
+ if (is_v4)
+ csum_info->transmit.is_ipv4 = 1;
+ else
+ csum_info->transmit.is_ipv6 = 1;
+
+ if (is_tcp) {
+ csum_info->transmit.tcp_checksum = 1;
+ csum_info->transmit.tcp_header_offset = hdr_offset;
+ } else if (is_udp) {
+ csum_info->transmit.udp_checksum = 1;
+ }
+
+do_send:
/* Start filling in the page buffers with the rndis hdr */
rndis_msg->msg_len += rndis_msg_size;
packet->page_buf_cnt = init_page_array(rndis_msg, rndis_msg_size,
@@ -593,8 +658,9 @@ static int netvsc_probe(struct hv_device *dev,
net->netdev_ops = &device_ops;
/* TODO: Add GSO and Checksum offload */
- net->hw_features = NETIF_F_RXCSUM | NETIF_F_SG;
- net->features = NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_SG | NETIF_F_RXCSUM;
+ net->hw_features = NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_IP_CSUM;
+ net->features = NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_SG | NETIF_F_RXCSUM |
+ NETIF_F_IP_CSUM;
SET_ETHTOOL_OPS(net, ðtool_ops);
SET_NETDEV_DEV(net, &dev->device);
--
1.7.4.1
next prev parent reply other threads:[~2014-03-06 10:26 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-06 11:12 [PATCH 0/6] Drivers: net: hyperv: Enable various offloads K. Y. Srinivasan
2014-03-06 11:12 ` K. Y. Srinivasan
2014-03-06 11:13 ` [PATCH 1/6] Drivers: net: hyperv: Enable scatter gather I/O K. Y. Srinivasan
2014-03-06 11:13 ` K. Y. Srinivasan
2014-03-06 11:13 ` [PATCH 2/6] Drivers: net: hyperv: Cleanup the send path K. Y. Srinivasan
2014-03-06 11:13 ` K. Y. Srinivasan
2014-03-06 19:30 ` David Miller
2014-03-06 19:30 ` David Miller
2014-03-06 11:13 ` [PATCH 3/6] Drivers: net: hyperv: Enable offloads on the host K. Y. Srinivasan
2014-03-06 11:13 ` K. Y. Srinivasan
2014-03-06 19:31 ` David Miller
2014-03-06 19:31 ` David Miller
2014-03-06 19:36 ` Dan Carpenter
2014-03-06 19:36 ` Dan Carpenter
2014-03-06 11:13 ` [PATCH 4/6] Drivers: net: hyperv: Enable receive side IP checksum offload K. Y. Srinivasan
2014-03-06 11:13 ` K. Y. Srinivasan
2014-03-06 19:31 ` David Miller
2014-03-06 19:31 ` David Miller
2014-03-06 11:13 ` K. Y. Srinivasan [this message]
2014-03-06 11:13 ` [PATCH 5/6] Drivers: net: hyperv: Enable send side " K. Y. Srinivasan
2014-03-06 19:33 ` David Miller
2014-03-06 19:33 ` David Miller
2014-03-06 20:29 ` KY Srinivasan
2014-03-06 20:48 ` David Miller
2014-03-06 20:48 ` David Miller
2014-03-06 21:00 ` KY Srinivasan
2014-03-09 18:53 ` Ben Hutchings
2014-03-09 18:53 ` Ben Hutchings
2014-03-06 11:13 ` [PATCH 6/6] Drivers: net: hyperv: Enable large send offload K. Y. Srinivasan
2014-03-06 11:13 ` K. Y. Srinivasan
2014-03-06 19:34 ` David Miller
2014-03-06 19:34 ` David Miller
2014-03-06 19:29 ` [PATCH 1/6] Drivers: net: hyperv: Enable scatter gather I/O David Miller
2014-03-06 19:29 ` David Miller
2014-03-06 23:28 ` [PATCH] checkpatch: net and drivers/net: Warn on missing blank line after variable declaration Joe Perches
2014-03-06 23:35 ` Andrew Morton
2014-03-06 23:42 ` Joe Perches
2014-03-06 23:55 ` Andrew Morton
2014-03-06 23:55 ` Andrew Morton
2014-03-07 0:11 ` [PATCH] checkpatch: Always warn on missing blank line after variable declaration block Joe Perches
2014-03-07 0:11 ` Joe Perches
2014-03-07 7:54 ` [PATCH] checkpatch: net and drivers/net: Warn on missing blank line after variable declaration Dan Carpenter
2014-03-07 7:54 ` Dan Carpenter
2014-03-07 9:30 ` Joe Perches
2014-03-07 9:30 ` Joe Perches
2014-03-10 16:02 ` Treewide frequency of various checkpatch messages Joe Perches
2014-03-10 16:02 ` Joe Perches
2014-03-10 16:50 ` Greg KH
2014-03-10 16:50 ` Greg KH
2014-03-10 18:48 ` Joe Perches
2014-03-10 19:33 ` Greg KH
2014-03-10 20:11 ` Joe Perches
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1394104390-23477-5-git-send-email-kys@microsoft.com \
--to=kys@microsoft.com \
--cc=apw@canonical.com \
--cc=davem@davemloft.net \
--cc=devel@linuxdriverproject.org \
--cc=jasowang@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=olaf@aepfle.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.