123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- /*
- * Linux 2.6.32 and later Kernel module for VMware MVP PVTCP Server
- *
- * Copyright (C) 2010-2013 VMware, Inc. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; see the file COPYING. If not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- #line 5
- /**
- * @file
- *
- * @brief Offload common definitions.
- * This file is meant to only be included via pvtcp.h.
- */
- #ifndef _PVTCP_OFF_H_
- #define _PVTCP_OFF_H_
- #define PVTCP_OFF_SOCK_COMMON_FIELDS \
- volatile unsigned int opFlags; /* Saves op codes as bit mask. */ \
- volatile unsigned int flags /* General purpose flags. */
- /* General purpose socket flags */
- enum PvtcpOffPvskFlags {
- PVTCP_OFF_PVSKF_IPV6_LOOP = 0, /* Used for IPV6 loopback morphing/reset. */
- PVTCP_OFF_PVSKF_SHUT_RD, /* Set to initiate socket recv shutdown. */
- PVTCP_OFF_PVSKF_SHUT_WR, /* Set to initiate socket send shutdown. */
- PVTCP_OFF_PVSKF_TCP_NODELAY, /* Caches the TCP_NODELAY socket option. */
- PVTCP_OFF_PVSKF_TCP_CORK, /* Caches the TCP_CORK socket option. */
- PVTCP_OFF_PVSKF_DISCONNECT, /* Set do indicate connect()/AF_UNSPEC. */
- PVTCP_OFF_PVSKF_INVALID = 32
- };
- /*
- * Include OS-dependent PvtcpSock structure and functions.
- */
- #if defined(__linux__)
- #include "pvtcp_off_linux.h"
- #else
- #error "Unsupported OS."
- #endif
- /*
- * Offload packet payload data structure.
- */
- typedef struct PvtcpOffBuf {
- CommOSList link; /* Link in socket queue. */
- unsigned short len;
- unsigned short off;
- char data[1];
- } PvtcpOffBuf;
- /**
- * @brief Returns net buffer given private data structure pointer and based
- * on the internal offset pointer
- * @param arg pointer to PvtcpOffBuf wrapper structure
- * @return address of buffer or NULL
- */
- static inline void *
- PvtcpOffBufFromInternalOff(PvtcpOffBuf *arg)
- {
- return arg ?
- &arg->data[arg->off] :
- NULL;
- }
- /**
- * @brief Returns net buffer given private data structure pointer
- * @param arg pointer to PvtcpOffBuf wrapper structure
- * @return address of buffer or NULL
- */
- static inline void *
- PvtcpOffBufFromInternal(PvtcpOffBuf *arg)
- {
- return arg ?
- &arg->data[0] :
- NULL;
- }
- /**
- * @brief Returns internal data structure given net buffer pointer
- * @param arg pointer to PvtcpOffBuf wrapper structure
- * @return address of internal data structure or NULL
- */
- static inline PvtcpOffBuf *
- PvtcpOffInternalFromBuf(void *arg)
- {
- return arg ?
- (PvtcpOffBuf *)((char *)arg - offsetof(PvtcpOffBuf, data)) :
- NULL;
- }
- /**
- * @brief Tests operation flag for AIO processing.
- * @param pvsk socket to test operation on.
- * @param op operation to test if set.
- * @return non-zero if operation set, zero otherwise.
- * @sideeffect socket processing by AIO threads affected according to operation.
- */
- static inline int
- PvskTestOpFlag(struct PvtcpSock *pvsk,
- int op)
- {
- return pvsk->opFlags & (1 << op);
- }
- /**
- * @brief Sets operation flag for AIO processing; acquires the state lock.
- * @param[in,out] pvsk socket to set operation on.
- * @param op operation to set.
- * @sideeffect socket processing by AIO threads affected according to operation.
- */
- static inline void
- PvskSetOpFlag(struct PvtcpSock *pvsk,
- int op)
- {
- unsigned int ops;
- SOCK_STATE_LOCK(pvsk);
- ops = pvsk->opFlags | (1 << op);
- pvsk->opFlags = ops;
- SOCK_STATE_UNLOCK(pvsk);
- }
- /**
- * @brief Resets operation flag for AIO processing; acquires the state lock.
- * @param[in,out] pvsk socket to reset operation on.
- * @param op operation to reset.
- * @sideeffect socket processing by AIO threads affected according to operation.
- */
- static inline void
- PvskResetOpFlag(struct PvtcpSock *pvsk,
- int op)
- {
- unsigned int ops;
- SOCK_STATE_LOCK(pvsk);
- ops = pvsk->opFlags & ~(1 << op);
- pvsk->opFlags = ops;
- SOCK_STATE_UNLOCK(pvsk);
- }
- /**
- * @brief Tests general purpose socket flags.
- * @param pvsk socket.
- * @param flag flag to test.
- * @return non-zero if flag set, zero otherwise.
- */
- static inline int
- PvskTestFlag(struct PvtcpSock *pvsk,
- int flag)
- {
- return (flag < PVTCP_OFF_PVSKF_INVALID) && (pvsk->flags & (1 << flag));
- }
- /**
- * @brief Sets general purpose socket flags; acquires the state lock.
- * @param[in,out] pvsk socket.
- * @param flag flag to set or clear.
- * @param onOff whether to set or clear the flag.
- */
- static inline void
- PvskSetFlag(struct PvtcpSock *pvsk,
- int flag,
- int onOff)
- {
- unsigned int flags;
- SOCK_STATE_LOCK(pvsk);
- if (flag < PVTCP_OFF_PVSKF_INVALID) {
- if (onOff) {
- flags = pvsk->flags | (1 << flag);
- } else {
- flags = pvsk->flags & ~(1 << flag);
- }
- pvsk->flags = flags;
- }
- SOCK_STATE_UNLOCK(pvsk);
- }
- int PvtcpOffSockInit(PvtcpSock *pvsk, CommChannel channel);
- #endif /* _PVTCP_OFF_H_ */
|