Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +6 −4 Original line number Original line Diff line number Diff line Loading @@ -651,30 +651,32 @@ static void rmnet_map_gso_stamp(struct sk_buff *skb, struct rmnet_map_coal_metadata *coal_meta) struct rmnet_map_coal_metadata *coal_meta) { { struct skb_shared_info *shinfo = skb_shinfo(skb); struct skb_shared_info *shinfo = skb_shinfo(skb); struct iphdr *iph = ip_hdr(skb); unsigned char *data = skb->data; __sum16 pseudo; __sum16 pseudo; u16 pkt_len = skb->len - coal_meta->ip_len; u16 pkt_len = skb->len - coal_meta->ip_len; bool ipv4 = coal_meta->ip_proto == 4; bool ipv4 = coal_meta->ip_proto == 4; if (ipv4) { if (ipv4) { struct iphdr *iph = (struct iphdr *)data; pseudo = ~csum_tcpudp_magic(iph->saddr, iph->daddr, pseudo = ~csum_tcpudp_magic(iph->saddr, iph->daddr, pkt_len, coal_meta->trans_proto, pkt_len, coal_meta->trans_proto, 0); 0); } else { } else { struct ipv6hdr *ip6h = ipv6_hdr(skb); struct ipv6hdr *ip6h = (struct ipv6hdr *)data; pseudo = ~csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, pseudo = ~csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, pkt_len, coal_meta->trans_proto, 0); pkt_len, coal_meta->trans_proto, 0); } } if (coal_meta->trans_proto == IPPROTO_TCP) { if (coal_meta->trans_proto == IPPROTO_TCP) { struct tcphdr *tp = tcp_hdr(skb); struct tcphdr *tp = (struct tcphdr *)(data + coal_meta->ip_len); tp->check = pseudo; tp->check = pseudo; shinfo->gso_type = (ipv4) ? SKB_GSO_TCPV4 : SKB_GSO_TCPV6; shinfo->gso_type = (ipv4) ? SKB_GSO_TCPV4 : SKB_GSO_TCPV6; skb->csum_offset = offsetof(struct tcphdr, check); skb->csum_offset = offsetof(struct tcphdr, check); } else { } else { struct udphdr *up = udp_hdr(skb); struct udphdr *up = (struct udphdr *)(data + coal_meta->ip_len); up->check = pseudo; up->check = pseudo; shinfo->gso_type = SKB_GSO_UDP_L4; shinfo->gso_type = SKB_GSO_UDP_L4; Loading Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +6 −4 Original line number Original line Diff line number Diff line Loading @@ -651,30 +651,32 @@ static void rmnet_map_gso_stamp(struct sk_buff *skb, struct rmnet_map_coal_metadata *coal_meta) struct rmnet_map_coal_metadata *coal_meta) { { struct skb_shared_info *shinfo = skb_shinfo(skb); struct skb_shared_info *shinfo = skb_shinfo(skb); struct iphdr *iph = ip_hdr(skb); unsigned char *data = skb->data; __sum16 pseudo; __sum16 pseudo; u16 pkt_len = skb->len - coal_meta->ip_len; u16 pkt_len = skb->len - coal_meta->ip_len; bool ipv4 = coal_meta->ip_proto == 4; bool ipv4 = coal_meta->ip_proto == 4; if (ipv4) { if (ipv4) { struct iphdr *iph = (struct iphdr *)data; pseudo = ~csum_tcpudp_magic(iph->saddr, iph->daddr, pseudo = ~csum_tcpudp_magic(iph->saddr, iph->daddr, pkt_len, coal_meta->trans_proto, pkt_len, coal_meta->trans_proto, 0); 0); } else { } else { struct ipv6hdr *ip6h = ipv6_hdr(skb); struct ipv6hdr *ip6h = (struct ipv6hdr *)data; pseudo = ~csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, pseudo = ~csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr, pkt_len, coal_meta->trans_proto, 0); pkt_len, coal_meta->trans_proto, 0); } } if (coal_meta->trans_proto == IPPROTO_TCP) { if (coal_meta->trans_proto == IPPROTO_TCP) { struct tcphdr *tp = tcp_hdr(skb); struct tcphdr *tp = (struct tcphdr *)(data + coal_meta->ip_len); tp->check = pseudo; tp->check = pseudo; shinfo->gso_type = (ipv4) ? SKB_GSO_TCPV4 : SKB_GSO_TCPV6; shinfo->gso_type = (ipv4) ? SKB_GSO_TCPV4 : SKB_GSO_TCPV6; skb->csum_offset = offsetof(struct tcphdr, check); skb->csum_offset = offsetof(struct tcphdr, check); } else { } else { struct udphdr *up = udp_hdr(skb); struct udphdr *up = (struct udphdr *)(data + coal_meta->ip_len); up->check = pseudo; up->check = pseudo; shinfo->gso_type = SKB_GSO_UDP_L4; shinfo->gso_type = SKB_GSO_UDP_L4; Loading