bool RemoteBlockReader::readTrailingEmptyPacket() {
    shared_ptr<PacketHeader> trailingHeader = readPacketHeader();

    if (!trailingHeader->isLastPacketInBlock() || trailingHeader->getDataLen() != 0) {
        return false;
    }

    return true;
}
Example #2
0
File: RTMP.cpp Project: aopui/gnash
void
RTMP::update()
{
    if (!connected()) {
        _handShaker->call();
        if (_handShaker->error()) {
            _error = true;
        }
        if (!_handShaker->success()) return;
        _connected = true;
    }
    
    const size_t reads = 10;

    for (size_t i = 0; i < reads; ++i) {

        /// No need to continue reading (though it should do no harm).
        if (error()) return;

        RTMPPacket p;

        // If we haven't finished reading a packet, retrieve it; otherwise
        // use an empty one.
        if (_incompletePacket.get()) {
            log_debug("Doing incomplete packet");
            p = *_incompletePacket;
            _incompletePacket.reset();
        }
        else {
            if (!readPacketHeader(p)) continue;
        }

        // Get the payload if possible.
        if (hasPayload(p) && !readPacketPayload(p)) {
            // If the payload is not completely readable, store it and
            // continue.
            _incompletePacket.reset(new RTMPPacket(p));
            continue;
        }
        
        // Store a copy of the packet for later additions and as a reference for
        // future sends.
        RTMPPacket& stored = storePacket(CHANNELS_IN, p.header.channel, p);
      
        // If the packet is complete, the stored packet no longer needs to
        // keep the data alive.
        if (isReady(p)) {
            clearPayload(stored);
            handlePacket(p);
            return;
        }
    }
}
void RemoteBlockReader::readNextPacket() {
    assert(position >= size);
    lastHeader = readPacketHeader();
    int dataSize = lastHeader->getDataLen();
    int64_t pendingAhead = 0;

    if (!lastHeader->sanityCheck(lastSeqNo)) {
        THROW(HdfsIOException, "RemoteBlockReader: Packet failed on sanity check for block %s from Datanode %s.",
              binfo.toString().c_str(), datanode.formatAddress().c_str());
    }

    assert(dataSize > 0 || lastHeader->getPacketLen() == sizeof(int32_t));

    if (dataSize > 0) {
        int chunks = (dataSize + chunkSize - 1) / chunkSize;
        int checksumLen = chunks * checksumSize;
        size = checksumLen + dataSize;
        assert(size == lastHeader->getPacketLen() - static_cast<int>(sizeof(int32_t)));
        buffer.resize(size);
        in->readFully(&buffer[0], size, readTimeout);
        lastSeqNo = lastHeader->getSeqno();

        if (lastHeader->getPacketLen() != static_cast<int>(sizeof(int32_t)) + dataSize + checksumLen) {
            THROW(HdfsIOException, "Invalid Packet, packetLen is %d, dataSize is %d, checksum size is %d",
                  lastHeader->getPacketLen(), dataSize, checksumLen);
        }

        if (verify) {
            verifyChecksum(chunks);
        }

        /*
         * skip checksum
         */
        position = checksumLen;
        /*
         * the first packet we get may start at the position before we required
         */
        pendingAhead = cursor - lastHeader->getOffsetInBlock();
        pendingAhead = pendingAhead > 0 ? pendingAhead : 0;
        position += pendingAhead;
    }

    /*
     * we reach the end of the range we required, send status to datanode
     * if datanode do not sending data anymore.
     */

    if (cursor + dataSize - pendingAhead >= endOffset && readTrailingEmptyPacket()) {
        sendStatus();
    }
}
void DataBus::PacketParser::processReceivedData(const QByteArray &data)
{
    // Add data to buffer
    m_buffer.append(data);

    // Execute state machine
    bool finished = false;

    while (finished == false)
    {
        switch (m_state)
        {
            case State_WaitForStartOfFrame:
            {
                finished = waitForStartOfFrame();
                break;
            }

            case State_ReadPacketHeader:
            {
                finished = readPacketHeader();
                break;
            }

            case State_ReadPacketPayload:
            {
                finished = readPacketPayload();
                break;
            }

            case State_WaitForEndOfFrame:
            {
                finished = waitForEndOfFrame();
                break;
            }

            default:
            {
                // Error, reinitialize the state machine
                m_state = State_WaitForStartOfFrame;
                finished = false;
                break;
            }
        }
    }
}
Example #5
0
/**
* Utility function for receiving messages from the ASIM.
*
* @param buf The output buffer the message will be written into
* @param bufSize The size of the output buffer
*
* @return An int containing the number of bytes actually read, -1 indicates
*           an error condition has occured.
*/
int Spa1Asim::recvFromAsim(unsigned char* buf, size_t bufSize, bool blocking)
{

#ifndef WIN32
   if (ioctl(i2cFd, I2C_SLAVE, i2cAddress) < 0)
   {
      printf("SPA-1 Manager: Error setting i2c address in recv\n");
   }
#endif

   short length = 0;
   int bytesRead = 0;

   bytesRead = readPacketHeader(buf, blocking);

   if (bytesRead == 0)
   {
      return 0;
   }

   if (bytesRead == -1)
   {
      return bytesRead;
   }

   memcpy(&length, &buf[1], 2);

   if ((unsigned short)(length + SPA1_HEADER_SIZE) > bufSize || length > MAX_PACKET_PAYLOAD)
   {
      return -1;
   }

   bytesRead += read(i2cFd, &buf[3], length);

   return bytesRead;
}
Example #6
0
/**
* Utility function for receiving messages from the ASIM in a blocking manner.
*
* @param buf The output buffer the message will be written into
* @param bufSize The size of the output buffer
*
* @return An int containing the number of bytes actually read, -1 indicates
*           an error condition has occured.
*/
int Spa1Asim::recvXtedsFromAsim()
{
#ifndef WIN32
   if (ioctl(i2cFd, I2C_SLAVE, i2cAddress) < 0)
   {
      printf("SPA-1 Manager: Error setting i2c address in recv\n");
   }
#endif

   short length = 0;
   int bytesRead = 0;
   unsigned char headerBuf[3];
   
	usleep(1000);
   readPacketHeader(headerBuf, true);

   memcpy(&length, &headerBuf[1], 2);

	debug_f(4, "Read xTEDS Header: 0x%02x w/ length: %i\n", headerBuf[0], length);

   xTEDS = new char[length + 1];
   memset(xTEDS, 0, length + 1);

	usleep(1000);

   if (length <= MAX_PACKET_PAYLOAD)
   {
      bytesRead = read(i2cFd, &xTEDS[3], length);
   }
   else
   {
      // loop and reassemble packets
      int index = 0;
      int numberPackets = length / MAX_PACKET_PAYLOAD;
      int lastPacketLength = length % MAX_PACKET_PAYLOAD;

      // read the rest of the first packet
      bytesRead = read(i2cFd, &xTEDS[index], MAX_PACKET_PAYLOAD);
		debug_f(4, "Read %i bytes of xTEDS\n", bytesRead);
      index += MAX_PACKET_PAYLOAD;

      // read all the other packets
      for (int packet = 1; packet < numberPackets; ++packet)
      {
			usleep(1000);
         readPacketHeader(headerBuf, true);
			debug_f(4, "Read xTEDS Header: 0x%02x 0x%02x 0x%02x\n", headerBuf[0], headerBuf[1], headerBuf[2]);
			usleep(1000);
         bytesRead += read (i2cFd, &xTEDS[index], MAX_PACKET_PAYLOAD);
			debug_f(4, "Read %i bytes of xTEDS\n", bytesRead);
         index += MAX_PACKET_PAYLOAD;
      }

      // read the last packet
      if (lastPacketLength > 0)
      {
			usleep(1000);
         readPacketHeader(headerBuf, true);
			debug_f(4, "Read xTEDS Header: 0x%02x 0x%02x 0x%02x\n", headerBuf[0], headerBuf[1], headerBuf[2]);
			usleep(1000);
         bytesRead += read (i2cFd, &xTEDS[index], lastPacketLength);
			debug_f(4, "Read %i bytes of xTEDS\n", bytesRead);
      }

   }

   return bytesRead;
}
Example #7
0
alt_u32 RS232_ISR(void* up_dev) {
	if(queue_lock == 1) return alt_ticks_per_second()/1000;
	alt_up_rs232_dev *serial_dev = ((struct alt_up_dev*)up_dev)->RS232_dev;
	unsigned char* cert;
	int i = 0;
	int len = 0;
	switch(*(com.stateMachine)) {
	case startInit:
		cert = sendStartInit();
		sendRS232(serial_dev, cert, 3);
		free(cert);
		cert = NULL;
		com.failReceive = 0;
		return alt_ticks_per_second()/20;
	case waitStart:
		i = 0;
		if((len = alt_up_rs232_get_used_space_in_read_FIFO(serial_dev)) >= 3) {
			do {
				while (alt_up_rs232_get_used_space_in_read_FIFO(serial_dev) == 0);
				alt_up_rs232_read_data(serial_dev, &com.data[i], &com.parity);
				i++;
			} while(i < 3);
			if(checkStartAck(com.data[0]) == 1) {
				setStates(sendStates);
			} else
				setStates(startInit);
		} else {
			com.failReceive++;
			if(com.failReceive > 10)
				setStates(startInit);
		}
		return alt_ticks_per_second()/20;
	case checkClient:
		i = 0;
		if((len = alt_up_rs232_get_used_space_in_read_FIFO(serial_dev)) >= 3) {
			do {
				while (alt_up_rs232_get_used_space_in_read_FIFO(serial_dev) == 0);
				alt_up_rs232_read_data(serial_dev, &com.data[i], &com.parity);
				i++;
			} while(i < 3);
			if(checkAck(com.data) == 1) {
				if(getBit(com.data[0], 1) == 1) {
					setStates(sendAck0);
					com.num_packets = ((int)(com.data[1] << 8))+(int)com.data[2];
					printf("num of packets will be receiving: %d\n", com.num_packets);
				} else
					setStates(sendStates);
			} else
				setStates(sendStates);
		} else {
			com.failReceive++;
			if(com.failReceive > 100) {
				reset(serial_dev);
			}
		}
		return alt_ticks_per_second()/20;
	case sendStates:
		cert = sendStats();
		sendRS232(serial_dev, cert, 3);
		free(cert);
		cert = NULL;
		com.failReceive = 0;
		return alt_ticks_per_second()/20;
	case sendAck0:
		cert = sendAck();
		sendRS232(serial_dev, cert, 3);
		if(cert[1] != 0)
			printf("sth is wrong");
		free(cert);
		cert = NULL;
		com.failReceive = 0;
		return alt_ticks_per_second()/20;
	case receiveData0:
		if((len = alt_up_rs232_get_used_space_in_read_FIFO(serial_dev)) > 2) {
			//read first 2 bytes for header information
			alt_up_rs232_read_data(serial_dev, &com.data[0], &com.parity);
			alt_up_rs232_read_data(serial_dev, &com.data[1], &com.parity);
			struct Packet* p = readPacketHeader(com.data[0], com.data[1]);
			i = 0;
			do {
				while (alt_up_rs232_get_used_space_in_read_FIFO(serial_dev) == 0);
				alt_up_rs232_read_data(serial_dev, &(p->data[i+HEADERSIZE]), &com.parity);
			//	printf("%c", p->data[i+HEADERSIZE]);
				i++;
			} while(p->data_size > i );
			//printf("\n");
			enqueue(com.receivePackets, (void*)p);
			com.index_packets++;
			setStates(sendAck0);
		} else {
			com.failReceive++;
			if(com.failReceive > 100) {
				reset(serial_dev);
			}
		}
		return alt_ticks_per_second()/20;
	case waitClient:
		i = 0;
		if((len = alt_up_rs232_get_used_space_in_read_FIFO(serial_dev)) >= 3) {
			do {
				while (alt_up_rs232_get_used_space_in_read_FIFO(serial_dev) == 0);
				alt_up_rs232_read_data(serial_dev, &com.data[i], &com.parity);
				i++;
			} while(i < 3);
			if(checkAck(com.data) == 1) {
				setStates(sendData0);
			} else {
				com.failReceive++;
				if(com.failReceive > 100)
					setStates(sendStates);
			}
		} else {
			com.failReceive++;
			if(com.failReceive > 100) {
				reset(serial_dev);
			}
		}
		return alt_ticks_per_second()/20;
	case sendData0:
		if(com.packetBuf == NULL) {
			if((com.packetBuf = (struct Packet*)dequeue(com.sendPackets))==NULL) {
				printf("Packet sending fail, queue is empty");
				setStates(sendStates);
				return alt_ticks_per_second()/50;
			}
		} setAck(com.packetBuf, com.host_ack);

		for(i = 0; i< com.packetBuf->data_size+HEADERSIZE; i++) {
			alt_up_rs232_write_data(serial_dev, com.packetBuf->data[i]);
		}
		setStates(waitAck0);
		com.failReceive = 0;
		return alt_ticks_per_second()/20;
	case waitAck0:
		i = 0;
		if((len = alt_up_rs232_get_used_space_in_read_FIFO(serial_dev)) >= 3) {
			do {
				while (alt_up_rs232_get_used_space_in_read_FIFO(serial_dev) == 0);
				alt_up_rs232_read_data(serial_dev, &com.data[i], &com.parity);
				i++;
			} while(i < 3);
			if(checkAck(com.data) == 1) {
				com.index_send_packets++;
				killPacket(&(com.packetBuf));
				if(com.index_send_packets < com.num_send_packets)
					setStates(sendData0);
				else {
					com.index_send_packets = com.num_send_packets = 0;
					setStates(sendStates);
					com.isRdySend = 0;
				}
			} else {
				setStates(sendData0);
			}
		} else {
			com.failReceive++;
			if(com.failReceive > 100) {
				reset(serial_dev);
			}
		}
		return alt_ticks_per_second()/20;
	default:
		break;
	}

	return alt_ticks_per_second()/20;
}