Files @ d6b9b2ac5869
Branch filter:

Location: vmkdrivers/BLD/build/HEADERS/vmkapi-current-all-public-bincomp/vmkernel64/release/net/vmkapi_net_csum.h - annotation

unknown
ESXi-5.5-U2
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
91e0d39c9812
/* **********************************************************
 * Copyright 2011 VMware, Inc.  All rights reserved.
 * **********************************************************/

/*
 * @VMKAPIMOD_LICENSE@
 */

/*
 ***********************************************************************
 * NetCksum                                                       */ /**
 * \addtogroup Network
 *@{
 * \defgroup NetCksum Network protocol checksum functions
 *@{
 *
 ***********************************************************************
 */
#ifndef _VMKAPI_NET_CKSUM_H_
#define _VMKAPI_NET_CKSUM_H_

/** \cond never */
#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H
#error This vmkapi file should never be included directly but only via vmkapi.h
#endif
/** \endcond never */

/*
 ***********************************************************************
 * vmk_NetCsumFold --                                             */ /**
 *
 * \brief Fold a partial 32-bit checksum into a single 16-bit value.
 *
 * \param[in]   sum      Partial checksum to fold.
 *
 * \retval      The folded checksum.
 *
 ***********************************************************************
 */
static inline vmk_uint16 vmk_NetCsumFold(vmk_uint32 sum)
{
   __asm__("addl %1, %0; adcl $0xffff, %0"
           : "=r" (sum)
           : "r" (sum << 16), "0" (sum & 0xffff0000));

   return (~sum) >> 16;
}

/*
 ***********************************************************************
 * vmk_NetCsumDataPartial --                                      */ /**
 *
 * \brief Checksum a block of data.
 *
 * \param[in]   data       Data to checksum
 * \param[in]   len        Length of the data to checksum.
 * \param[in]   initialSum Initial checksum to add.
 *
 * \retval      The resulting unfolded checksum.
 *
 ***********************************************************************
 */
vmk_uint32 vmk_NetCsumDataPartial(void       *data,
                                  vmk_uint64  len,
                                  vmk_uint32  initialSum);

/*
 ***********************************************************************
 * vmk_NetCsumDataFinal --                                        */ /**
 *
 * \brief Checksum a block of data and fold the result.
 *
 * \param[in]   data       Data to checksum
 * \param[in]   len        Length of the data to checksum.
 * \param[in]   initialSum Initial checksum to add.
 *
 * \retval      The resulting checksum.
 *
 ***********************************************************************
 */
static inline vmk_uint16 vmk_NetCsumDataFinal(void       *data,
                                              vmk_uint64  len,
                                              vmk_uint32  initialSum)
{
   return vmk_NetCsumFold(vmk_NetCsumDataPartial(data, len, initialSum));
}

/*
 ***********************************************************************
 * vmk_NetCsumIPv4Pseudo --                                       */ /**
 *
 * \brief Checksum an IPv4 pseudo-header and fold the result.
 *
 * \param[in]   saddr         Source address of the IPv4 packed.
 * \param[in]   daddr         Destination address of the IPv4 packed.
 * \param[in]   proto         Protocol number of the payload.
 * \param[in]   totalLength   Total length of the packet.
 * \param[in]   initialSum    Initial checksum to add.
 *
 * \note saddr, daddr, and proto are direct pointers to the IPv4
 *       header's content; they are expected to be in network byte
 *       order. On the other hand, totalLength is the total length of
 *       the header + payload. It is expected to by in host byte order.
 *
 * \retval      The resulting checksum.
 *
 ***********************************************************************
 */
vmk_uint16 vmk_NetCsumIPv4Pseudo(const vmk_uint32 *saddr,
                                 const vmk_uint32 *daddr,
                                 const vmk_uint8  *proto,
                                 vmk_uint16        totalLength,
                                 vmk_uint32        initialSum);

/*
 ***********************************************************************
 * vmk_NetCsumIPv6Pseudo --                                       */ /**
 *
 * \brief Checksum an IPv6 pseudo-header and fold the result.
 *
 * \param[in]   saddr         Source address of the IPv6 packed.
 * \param[in]   daddr         Destination address of the IPv6 packed.
 * \param[in]   totalLength   Length of the IPv6 packet.
 * \param[in]   proto         Protocol number of the payload.
 * \param[in]   initialSum    Initial checksum to add.
 *
 * \note saddr, daddr, and proto are direct pointers to the IPv6
 *       header's content; they are expected to be in network byte
 *       order. On the other hand, totalLength is the total length of
 *       the TCP header + payload. It is expected to by in host byte
 *       order.
 *
 * \note daddr will usually point to the IPv6 header's destination
 *       address, but when a routing header is present, the last element
 *       of the routing header must be used in the IPv6 pseudo header.
 *
 * \retval      The resulting checksum.
 *
 ***********************************************************************
 */
vmk_uint16 vmk_NetCsumIPv6Pseudo(const vmk_uint8  *saddr,
                                 const vmk_uint8  *daddr,
                                 const vmk_uint8  *proto,
                                 vmk_uint16        totalLength,
                                 vmk_uint32        initialSum);

#endif /* _VMKAPI_NET_CKSUM_H_ */
/** @} */
/** @} */