29rpx::XvcConnection::XvcConnection(
int sd,
JtagDriver* drv, uint64_t maxVecLen)
31 maxVecLen_(maxVecLen),
34 socklen_t sz =
sizeof(peer_);
37 if ((sd_ = ::accept(sd, (
struct sockaddr*)&peer_, &sz)) < 0)
44 if (setsockopt(sd_, IPPROTO_TCP, TCP_NODELAY, &got,
sizeof(got)))
52ssize_t rpx::XvcConnection::readTo(
void* buf,
size_t count) {
56 struct timeval timeout;
65 nready = ::select(sd_ + 1, &rset, NULL, NULL, &timeout);
67 if (nready > 0 && FD_ISSET(sd_, &rset))
68 return ::read(sd_, buf, count);
102void rpx::XvcConnection::allocBufs() {
104 uint64_t overhead = 128;
107 tgtVecLen = drv_->query();
109 if (0 == tgtVecLen) {
111 tgtVecLen = maxVecLen_;
115 supVecLen_ = drv_->getMaxVectorSize();
117 if (supVecLen_ == 0) {
119 supVecLen_ = tgtVecLen;
120 }
else if (tgtVecLen < supVecLen_) {
121 supVecLen_ = tgtVecLen;
124 chunk_ = (2 * maxVecLen_ + overhead);
126 rxb_.resize(2 * chunk_);
127 txb_.resize(maxVecLen_ + overhead);
148void rpx::XvcConnection::run() {
150 uint32_t bits, bitsLeft, bitsSent;
157 while (!drv_->isDone()) {
159 got = readTo(rp_, chunk_);
168 if (0 == ::memcmp(rp_,
"ge", 2)) {
174 reinterpret_cast<char*
>(&txb_[0]), txb_.size(),
"xvcServer_v1.0:%" PRIu64
"\n", maxVecLen_);
177 }
else if (0 == ::memcmp(rp_,
"se", 2)) {
178 uint32_t requestedPeriod;
183 requestedPeriod = (rp_[10] << 24) | (rp_[9] << 16) | (rp_[8] << 8) | rp_[7];
185 newPeriod = drv_->setPeriodNs(requestedPeriod);
187 for (
unsigned u = 0; u <
sizeof(newPeriod); u++) {
188 txb_[u] = (uint8_t)newPeriod;
189 newPeriod = newPeriod >> 8;
195 }
else if (0 == ::memcmp(rp_,
"sh", 2)) {
199 for (got = 9; got >= 6; got--) {
200 bits = (bits << 8) | rp_[got];
202 bytes = (bits + 7) / 8;
204 if (bytes > maxVecLen_)
210 vecLen = bytes > supVecLen_ ? supVecLen_ : bytes;
216 for (off = 0, bitsLeft = bits; bitsLeft > 0; bitsLeft -= bitsSent, off += vecLen) {
217 bitsSent = 8 * vecLen;
218 if (bitsLeft < bitsSent) {
222 drv_->sendVectors(bitsSent, rp_ + off, rp_ + bytes + off, &txb_[0] + off);