|
@@ -2556,6 +2556,7 @@ static int ql_tso(struct sk_buff *skb, struct ob_mac_tso_iocb_req *mac_iocb_ptr)
|
|
|
|
|
|
if (skb_is_gso(skb)) {
|
|
|
int err;
|
|
|
+ __be16 l3_proto = vlan_get_protocol(skb);
|
|
|
|
|
|
err = skb_cow_head(skb, 0);
|
|
|
if (err < 0)
|
|
@@ -2572,7 +2573,7 @@ static int ql_tso(struct sk_buff *skb, struct ob_mac_tso_iocb_req *mac_iocb_ptr)
|
|
|
<< OB_MAC_TRANSPORT_HDR_SHIFT);
|
|
|
mac_iocb_ptr->mss = cpu_to_le16(skb_shinfo(skb)->gso_size);
|
|
|
mac_iocb_ptr->flags2 |= OB_MAC_TSO_IOCB_LSO;
|
|
|
- if (likely(skb->protocol == htons(ETH_P_IP))) {
|
|
|
+ if (likely(l3_proto == htons(ETH_P_IP))) {
|
|
|
struct iphdr *iph = ip_hdr(skb);
|
|
|
iph->check = 0;
|
|
|
mac_iocb_ptr->flags1 |= OB_MAC_TSO_IOCB_IP4;
|
|
@@ -2580,7 +2581,7 @@ static int ql_tso(struct sk_buff *skb, struct ob_mac_tso_iocb_req *mac_iocb_ptr)
|
|
|
iph->daddr, 0,
|
|
|
IPPROTO_TCP,
|
|
|
0);
|
|
|
- } else if (skb->protocol == htons(ETH_P_IPV6)) {
|
|
|
+ } else if (l3_proto == htons(ETH_P_IPV6)) {
|
|
|
mac_iocb_ptr->flags1 |= OB_MAC_TSO_IOCB_IP6;
|
|
|
tcp_hdr(skb)->check =
|
|
|
~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
|