Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/net/ipv6/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 3 kB image not shown  

Quelle  ip6_checksum.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
#include <net/ip.h>
#include <net/udp.h>
#include <net/udplite.h>
#include <asm/checksum.h>

#ifndef _HAVE_ARCH_IPV6_CSUM
__sum16 csum_ipv6_magic(const struct in6_addr *saddr,
   const struct in6_addr *daddr,
   __u32 len, __u8 proto, __wsum csum)
{

 int carry;
 __u32 ulen;
 __u32 uproto;
 __u32 sum = (__force u32)csum;

 sum += (__force u32)saddr->s6_addr32[0];
 carry = (sum < (__force u32)saddr->s6_addr32[0]);
 sum += carry;

 sum += (__force u32)saddr->s6_addr32[1];
 carry = (sum < (__force u32)saddr->s6_addr32[1]);
 sum += carry;

 sum += (__force u32)saddr->s6_addr32[2];
 carry = (sum < (__force u32)saddr->s6_addr32[2]);
 sum += carry;

 sum += (__force u32)saddr->s6_addr32[3];
 carry = (sum < (__force u32)saddr->s6_addr32[3]);
 sum += carry;

 sum += (__force u32)daddr->s6_addr32[0];
 carry = (sum < (__force u32)daddr->s6_addr32[0]);
 sum += carry;

 sum += (__force u32)daddr->s6_addr32[1];
 carry = (sum < (__force u32)daddr->s6_addr32[1]);
 sum += carry;

 sum += (__force u32)daddr->s6_addr32[2];
 carry = (sum < (__force u32)daddr->s6_addr32[2]);
 sum += carry;

 sum += (__force u32)daddr->s6_addr32[3];
 carry = (sum < (__force u32)daddr->s6_addr32[3]);
 sum += carry;

 ulen = (__force u32)htonl((__u32) len);
 sum += ulen;
 carry = (sum < ulen);
 sum += carry;

 uproto = (__force u32)htonl(proto);
 sum += uproto;
 carry = (sum < uproto);
 sum += carry;

 return csum_fold((__force __wsum)sum);
}
EXPORT_SYMBOL(csum_ipv6_magic);
#endif

int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto)
{
 int err;

 UDP_SKB_CB(skb)->partial_cov = 0;
 UDP_SKB_CB(skb)->cscov = skb->len;

 if (proto == IPPROTO_UDPLITE) {
  err = udplite_checksum_init(skb, uh);
  if (err)
   return err;

  if (UDP_SKB_CB(skb)->partial_cov) {
   skb->csum = ip6_compute_pseudo(skb, proto);
   return 0;
  }
 }

 /* To support RFC 6936 (allow zero checksum in UDP/IPV6 for tunnels)
 * we accept a checksum of zero here. When we find the socket
 * for the UDP packet we'll check if that socket allows zero checksum
 * for IPv6 (set by socket option).
 *
 * Note, we are only interested in != 0 or == 0, thus the
 * force to int.
 */

 err = (__force int)skb_checksum_init_zero_check(skb, proto, uh->check,
       ip6_compute_pseudo);
 if (err)
  return err;

 if (skb->ip_summed == CHECKSUM_COMPLETE && !skb->csum_valid) {
  /* If SW calculated the value, we know it's bad */
  if (skb->csum_complete_sw)
   return 1;

  /* HW says the value is bad. Let's validate that.
 * skb->csum is no longer the full packet checksum,
 * so don't treat is as such.
 */

  skb_checksum_complete_unset(skb);
 }

 return 0;
}
EXPORT_SYMBOL(udp6_csum_init);

/* Function to set UDP checksum for an IPv6 UDP packet. This is intended
 * for the simple case like when setting the checksum for a UDP tunnel.
 */

void udp6_set_csum(bool nocheck, struct sk_buff *skb,
     const struct in6_addr *saddr,
     const struct in6_addr *daddr, int len)
{
 struct udphdr *uh = udp_hdr(skb);

 if (nocheck)
  uh->check = 0;
 else if (skb_is_gso(skb))
  uh->check = ~udp_v6_check(len, saddr, daddr, 0);
 else if (skb->ip_summed == CHECKSUM_PARTIAL) {
  uh->check = 0;
  uh->check = udp_v6_check(len, saddr, daddr, lco_csum(skb));
  if (uh->check == 0)
   uh->check = CSUM_MANGLED_0;
 } else {
  skb->ip_summed = CHECKSUM_PARTIAL;
  skb->csum_start = skb_transport_header(skb) - skb->head;
  skb->csum_offset = offsetof(struct udphdr, check);
  uh->check = ~udp_v6_check(len, saddr, daddr, 0);
 }
}
EXPORT_SYMBOL(udp6_set_csum);

Messung V0.5
C=93 H=97 G=94

¤ Dauer der Verarbeitung: 0.1 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.