void xfrm6_local_error(struct sk_buff *skb, u32 mtu) { struct flowi6 fl6; const struct ipv6hdr *hdr; struct sock *sk = skb->sk; hdr = skb->encapsulation ? inner_ipv6_hdr(skb) : ipv6_hdr(skb); fl6.fl6_dport = inet_sk(sk)->inet_dport; fl6.daddr = hdr->daddr; ipv6_local_error(sk, EMSGSIZE, &fl6, mtu); }
/** * nfp_net_tx_csum() - Set TX CSUM offload flags in TX descriptor * @nn: NFP Net device * @r_vec: per-ring structure * @txbuf: Pointer to driver soft TX descriptor * @txd: Pointer to TX descriptor * @skb: Pointer to SKB * * This function sets the TX checksum flags in the TX descriptor based * on the configuration and the protocol of the packet to be transmitted. */ static void nfp_net_tx_csum(struct nfp_net *nn, struct nfp_net_r_vector *r_vec, struct nfp_net_tx_buf *txbuf, struct nfp_net_tx_desc *txd, struct sk_buff *skb) { struct ipv6hdr *ipv6h; struct iphdr *iph; u8 l4_hdr; if (!(nn->ctrl & NFP_NET_CFG_CTRL_TXCSUM)) return; if (skb->ip_summed != CHECKSUM_PARTIAL) return; txd->flags |= PCIE_DESC_TX_CSUM; if (skb->encapsulation) txd->flags |= PCIE_DESC_TX_ENCAP; iph = skb->encapsulation ? inner_ip_hdr(skb) : ip_hdr(skb); ipv6h = skb->encapsulation ? inner_ipv6_hdr(skb) : ipv6_hdr(skb); if (iph->version == 4) { txd->flags |= PCIE_DESC_TX_IP4_CSUM; l4_hdr = iph->protocol; } else if (ipv6h->version == 6) { l4_hdr = ipv6h->nexthdr; } else { nn_warn_ratelimit(nn, "partial checksum but ipv=%x!\n", iph->version); return; } switch (l4_hdr) { case IPPROTO_TCP: txd->flags |= PCIE_DESC_TX_TCP_CSUM; break; case IPPROTO_UDP: txd->flags |= PCIE_DESC_TX_UDP_CSUM; break; default: nn_warn_ratelimit(nn, "partial checksum but l4 proto=%x!\n", l4_hdr); return; } u64_stats_update_begin(&r_vec->tx_sync); if (skb->encapsulation) r_vec->hw_csum_tx_inner += txbuf->pkt_cnt; else r_vec->hw_csum_tx += txbuf->pkt_cnt; u64_stats_update_end(&r_vec->tx_sync); }