diff options
Diffstat (limited to 'storage/ndb/src/common/transporter/TransporterInternalDefinitions.hpp')
-rw-r--r-- | storage/ndb/src/common/transporter/TransporterInternalDefinitions.hpp | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/storage/ndb/src/common/transporter/TransporterInternalDefinitions.hpp b/storage/ndb/src/common/transporter/TransporterInternalDefinitions.hpp new file mode 100644 index 00000000000..624b495422f --- /dev/null +++ b/storage/ndb/src/common/transporter/TransporterInternalDefinitions.hpp @@ -0,0 +1,302 @@ +/* Copyright (C) 2003 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + 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; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef TransporterInternalDefinitions_H +#define TransporterInternalDefinitions_H + +#if defined DEBUG_TRANSPORTER || defined VM_TRACE +#include <NdbOut.hpp> +#endif + +#define NDB_TCP_TRANSPORTER + +#ifdef HAVE_NDB_SHM +#define NDB_SHM_TRANSPORTER +#endif + +#ifdef HAVE_NDB_SCI +#define NDB_SCI_TRANSPORTER +#endif + +#ifdef HAVE_NDB_OSE +#define NDB_OSE_TRANSPORTER +#endif + +#ifdef DEBUG_TRANSPORTER +#define DEBUG(x) ndbout << x << endl +#else +#define DEBUG(x) +#endif + +#if defined VM_TRACE || defined DEBUG_TRANSPORTER +#define WARNING(X) ndbout << X << endl; +#else +#define WARNING(X) +#endif + +// Calculate a checksum +inline +Uint32 +computeChecksum(const Uint32 * const startOfData, int nWords) { + Uint32 chksum = startOfData[0]; + for (int i=1; i < nWords; i++) + chksum ^= startOfData[i]; + return chksum; +} + +struct Protocol6 { + Uint32 word1; + Uint32 word2; + Uint32 word3; + +/** + * + * b = Byte order - 4 Bits (Note 1 significant bit) + * g = GSN - 16 Bits + * p = Prio - 2 Bits + * c = Checksum included - 1 Bit + * z = Compression - 1 Bit + * v = Version id - 4 Bits + * i = Signal id included - 1 Bit + * m = Message length - 16 Bits (0-65536) (In word -> 0-256k bytes) + * d = Signal data length - 5 Bits (0-31) + * t = trace - 6 Bits (0-63) + * r = Recievers block no - 16 Bits + * s = Senders block no - 16 Bits + * u = Unused - 7 Bits + * f = FragmentInfo1 - 1 Bit + * h = FragmentInfo2 - 1 bit + * n = No of segments - 2 Bits + + * Word 1 + * + * + * 1111111111222222222233 + * 01234567890123456789012345678901 + * bfizcppbmmmmmmmmmmmmmmmmbhdddddb + + ** + * Word 2 + * + * 1111111111222222222233 + * 01234567890123456789012345678901 + * ggggggggggggggggvvvvttttttnn + + ** + * Word 3 + * + * 1111111111222222222233 + * 01234567890123456789012345678901 + * rrrrrrrrrrrrrrrrssssssssssssssss + + ** + * Word 4 (Optional Signal Id) + */ + + /** + * 0 = Big endian (Sparc), 1 = Little endian (Intel) + */ + static Uint32 getByteOrder (const Uint32 & word1); + static Uint32 getCompressed (const Uint32 & word1); + static Uint32 getSignalIdIncluded(const Uint32 & word1); + static Uint32 getCheckSumIncluded(const Uint32 & word1); + static Uint32 getPrio (const Uint32 & word1); + static Uint32 getMessageLength (const Uint32 & word1); + + static void setByteOrder (Uint32 & word1, Uint32 byteOrder); + static void setCompressed (Uint32 & word1, Uint32 compressed); + static void setSignalIdIncluded(Uint32 & word1, Uint32 signalId); + static void setCheckSumIncluded(Uint32 & word1, Uint32 checkSum); + static void setPrio (Uint32 & word1, Uint32 prio); + static void setMessageLength (Uint32 & word1, Uint32 messageLen); + + static void createSignalHeader(SignalHeader * const dst, + const Uint32 & word1, + const Uint32 & word2, + const Uint32 & word3); + + static void createProtocol6Header(Uint32 & word1, + Uint32 & word2, + Uint32 & word3, + const SignalHeader * const src); +}; + +#define WORD1_BYTEORDER_MASK (0x81000081) +#define WORD1_SIGNALID_MASK (0x00000004) +#define WORD1_COMPRESSED_MASK (0x00000008) +#define WORD1_CHECKSUM_MASK (0x00000010) +#define WORD1_PRIO_MASK (0x00000060) +#define WORD1_MESSAGELEN_MASK (0x00FFFF00) +#define WORD1_SIGNAL_LEN_MASK (0x7C000000) +#define WORD1_FRAG_INF_MASK (0x00000002) +#define WORD1_FRAG_INF2_MASK (0x02000000) + +#define WORD1_FRAG_INF_SHIFT (1) +#define WORD1_SIGNALID_SHIFT (2) +#define WORD1_COMPRESSED_SHIFT (3) +#define WORD1_CHECKSUM_SHIFT (4) +#define WORD1_PRIO_SHIFT (5) +#define WORD1_MESSAGELEN_SHIFT (8) +#define WORD1_FRAG_INF2_SHIFT (25) +#define WORD1_SIGNAL_LEN_SHIFT (26) + +#define WORD2_VERID_GSN_MASK (0x000FFFFF) +#define WORD2_TRACE_MASK (0x03f00000) +#define WORD2_SEC_COUNT_MASK (0x0c000000) + +#define WORD2_TRACE_SHIFT (20) +#define WORD2_SEC_COUNT_SHIFT (26) + +#define WORD3_SENDER_MASK (0x0000FFFF) +#define WORD3_RECEIVER_MASK (0xFFFF0000) + +#define WORD3_RECEIVER_SHIFT (16) + +inline +Uint32 +Protocol6::getByteOrder(const Uint32 & word1){ + return word1 & 1; +} + +inline +Uint32 +Protocol6::getCompressed(const Uint32 & word1){ + return (word1 & WORD1_COMPRESSED_MASK) >> WORD1_COMPRESSED_SHIFT; +} + +inline +Uint32 +Protocol6::getSignalIdIncluded(const Uint32 & word1){ + return (word1 & WORD1_SIGNALID_MASK) >> WORD1_SIGNALID_SHIFT; +} + +inline +Uint32 +Protocol6::getCheckSumIncluded(const Uint32 & word1){ + return (word1 & WORD1_CHECKSUM_MASK) >> WORD1_CHECKSUM_SHIFT; +} + +inline +Uint32 +Protocol6::getMessageLength(const Uint32 & word1){ + return (word1 & WORD1_MESSAGELEN_MASK) >> WORD1_MESSAGELEN_SHIFT; +} + +inline +Uint32 +Protocol6::getPrio(const Uint32 & word1){ + return (word1 & WORD1_PRIO_MASK) >> WORD1_PRIO_SHIFT; +} + +inline +void +Protocol6::setByteOrder(Uint32 & word1, Uint32 byteOrder){ + Uint32 tmp = byteOrder; + tmp |= (tmp << 7); + tmp |= (tmp << 24); + word1 |= (tmp & WORD1_BYTEORDER_MASK); +} + +inline +void +Protocol6::setCompressed(Uint32 & word1, Uint32 compressed){ + word1 |= ((compressed << WORD1_COMPRESSED_SHIFT) & WORD1_COMPRESSED_MASK); +} + +inline +void +Protocol6::setSignalIdIncluded(Uint32 & word1, Uint32 signalId){ + word1 |= ((signalId << WORD1_SIGNALID_SHIFT) & WORD1_SIGNALID_MASK); +} + +inline +void +Protocol6::setCheckSumIncluded(Uint32 & word1, Uint32 checkSum){ + word1 |= ((checkSum << WORD1_CHECKSUM_SHIFT) & WORD1_CHECKSUM_MASK); +} + +inline +void +Protocol6::setMessageLength(Uint32 & word1, Uint32 messageLen){ + word1 |= ((messageLen << WORD1_MESSAGELEN_SHIFT) & WORD1_MESSAGELEN_MASK); +} + +inline +void +Protocol6::setPrio(Uint32 & word1, Uint32 prio){ + word1 |= ((prio << WORD1_PRIO_SHIFT) & WORD1_PRIO_MASK); +} + +inline +void +Protocol6::createSignalHeader(SignalHeader * const dst, + const Uint32 & word1, + const Uint32 & word2, + const Uint32 & word3){ + + Uint32 signal_len = (word1 & WORD1_SIGNAL_LEN_MASK)>> WORD1_SIGNAL_LEN_SHIFT; + Uint32 fragInfo1 = (word1 & WORD1_FRAG_INF_MASK) >> (WORD1_FRAG_INF_SHIFT-1); + Uint32 fragInfo2 = (word1 & WORD1_FRAG_INF2_MASK) >> (WORD1_FRAG_INF2_SHIFT); + Uint32 trace = (word2 & WORD2_TRACE_MASK) >> WORD2_TRACE_SHIFT; + Uint32 verid_gsn = (word2 & WORD2_VERID_GSN_MASK); + Uint32 secCount = (word2 & WORD2_SEC_COUNT_MASK) >> WORD2_SEC_COUNT_SHIFT; + + dst->theTrace = trace; + dst->m_noOfSections = secCount; + dst->m_fragmentInfo = fragInfo1 | fragInfo2; + + dst->theLength = signal_len; + dst->theVerId_signalNumber = verid_gsn; + + Uint32 sBlockNum = (word3 & WORD3_SENDER_MASK); + Uint32 rBlockNum = (word3 & WORD3_RECEIVER_MASK) >> WORD3_RECEIVER_SHIFT; + + dst->theSendersBlockRef = sBlockNum; + dst->theReceiversBlockNumber = rBlockNum; +} + +inline +void +Protocol6::createProtocol6Header(Uint32 & word1, + Uint32 & word2, + Uint32 & word3, + const SignalHeader * const src){ + const Uint32 signal_len = src->theLength; + const Uint32 fragInfo = src->m_fragmentInfo; + const Uint32 fragInfo1 = (fragInfo & 2); + const Uint32 fragInfo2 = (fragInfo & 1); + + const Uint32 trace = src->theTrace; + const Uint32 verid_gsn = src->theVerId_signalNumber; + const Uint32 secCount = src->m_noOfSections; + + word1 |= ((signal_len << WORD1_SIGNAL_LEN_SHIFT) & WORD1_SIGNAL_LEN_MASK); + word1 |= ((fragInfo1 << (WORD1_FRAG_INF_SHIFT-1)) & WORD1_FRAG_INF_MASK); + word1 |= ((fragInfo2 << WORD1_FRAG_INF2_SHIFT) & WORD1_FRAG_INF2_MASK); + + word2 |= ((trace << WORD2_TRACE_SHIFT) & WORD2_TRACE_MASK); + word2 |= (verid_gsn & WORD2_VERID_GSN_MASK); + word2 |= ((secCount << WORD2_SEC_COUNT_SHIFT) & WORD2_SEC_COUNT_MASK); + + Uint32 sBlockNum = src->theSendersBlockRef ; + Uint32 rBlockNum = src->theReceiversBlockNumber ; + + word3 |= (sBlockNum & WORD3_SENDER_MASK); + word3 |= ((rBlockNum << WORD3_RECEIVER_SHIFT) & WORD3_RECEIVER_MASK); +} + +// Define of TransporterInternalDefinitions_H +#endif |