Ejemplo n.º 1
0
bool ARMDebug::dpRead(unsigned addr, bool APnDP, uint32_t &data)
{
    unsigned retries = 10;
    unsigned ack;

    do {
        wireWrite(packHeader(addr, APnDP, true), 8);
        wireReadTurnaround();
        ack = wireRead(3);

        switch (ack) {
        case 1:     // Success
            data = wireRead(32);
            if (wireRead(1) != evenParity(data)) {
                wireWriteTurnaround();
                wireWriteIdle();
                log(LOG_ERROR, "PARITY ERROR during read (addr=%x APnDP=%d data=%08x)",
                    addr, APnDP, data);
                return false;
            }
            wireWriteTurnaround();
            wireWriteIdle();
            log(LOG_TRACE_DP, "DP  Read  [%x:%x] %08x", addr, APnDP, data);
            return true;

        case 2:     // WAIT
            wireWriteTurnaround();
            wireWriteIdle();
            log(LOG_TRACE_DP, "DP  WAIT response, %d retries left", retries);
            retries--;
            break;

        case 4:     // FAULT
            wireWriteTurnaround();
            wireWriteIdle();
            log(LOG_ERROR, "FAULT response during read (addr=%x APnDP=%d)", addr, APnDP);
            if (!handleFault())
                log(LOG_ERROR, "Error during fault recovery!");
            return false;

        default:
            wireWriteTurnaround();
            wireWriteIdle();
            log(LOG_ERROR, "PROTOCOL ERROR response during read (ack=%x addr=%x APnDP=%d)", ack, addr, APnDP);
            return false;
        }
    } while (retries--);

    log(LOG_ERROR, "WAIT timeout during read (addr=%x APnDP=%d)", addr, APnDP);
    return false;
}
void Packet15UpdatePlayerScore::pack() const
{
	if (!packedData)
	{
		packedData = new char[getDataLength()];
	}

	packHeader();

	char* dataP = &packedData[OFFSET_DATA];

	dataP += util::pack(&playerID, 1, dataP);
	dataP += util::pack(&newScore, 1, dataP);

	packed = true;
}
Ejemplo n.º 3
0
Packet2Blob::Packet2Blob(char const* blob, uint16_t length)
	: Packet(mId), blob(NULL), blobLength(length)
{
	if (length > Packet::MAX_LOAD_SIZE)
	{
		throw InvalidSizeException("Blob to big", Packet::ptr());
	}

	dataLength = blobLength + Packet::MIN_SIZE;
	packedData = new char[dataLength];
	
	this->blob = packedData + OFFSET_DATA;

	packHeader();
	util::pack(blob, dataLength, this->blob);

	packed = true;
	unpacked = true;
}
void sendFileToReduce(char* fileName, char* content, struct in_addr ipJob, t_connection connection, int puertoNodo)
{
	t_header header;
	void* message;
	int contentLength = strlen(content) + 1;
	int messageLength = sizeof(t_header) + contentLength + sizeof(int) * 2 + strlen(fileName) + 1 + sizeof(struct in_addr);

	header.tipoMensaje = EnvioArchivoAReducir;
	header.tamanioMensaje = messageLength - sizeof(t_header);

	message = malloc(messageLength);

	packHeader(header, message);

	packFile(fileName, content, contentLength, message);

	int offset = messageLength - sizeof(struct in_addr);
	memcpy(message + offset, (struct in_addr*) &ipJob, sizeof(struct in_addr));

	int sock;

	if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
	{
			perror("socket");
			exit(1);
	}

	struct sockaddr_in addr;

	addr = connection.connectionAddr;
	addr.sin_port = puertoNodo;

	if(connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == -1)
		{
			perror("connect");
			exit(1);
		}

	sendAll(sock, message, messageLength);

	return;
}
void sendFileContent(char* fileName, char* content, struct in_addr ip, int puerto)
{
	t_header header;
	void* message;
	int contentLength = strlen(content) + 1;
	int messageLength = sizeof(t_header) + contentLength + sizeof(int) * 2 + strlen(fileName) + 1;

	header.tipoMensaje = EnvioArchivo;
	header.tamanioMensaje = messageLength - sizeof(t_header);

	message = malloc(messageLength);

	packHeader(header, message);

	packFile(fileName, content, contentLength, message);

	int sock;

		if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
		{
				perror("socket");
				exit(1);
		}

		struct sockaddr_in addr;

		addr.sin_addr = ip;
		addr.sin_family = AF_INET;
		addr.sin_port = puerto;
		memset(&(addr.sin_zero), '\0', 8);

		//Conecto al socket al FileSystem para notificar conexion del nodo
		if(connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == -1)
			{
				perror("connect");
				exit(1);
			}

	sendAll(sock, message, messageLength);

	return;
}
void sendBlock(t_bloque_datos block, struct in_addr ip, int puerto)
{
	int messageLength = tamanio_bloque + sizeof(int) + sizeof(t_header);
	void* message = malloc(messageLength);
	t_header header;

	header.tamanioMensaje = messageLength - sizeof(t_header);
	header.tipoMensaje = EnvioBloque;

	packHeader(header, message);
	packBlock(block, message);

	int sock;

	if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
	{
			perror("socket");
			exit(1);
	}

	struct sockaddr_in addr;

	addr.sin_addr = ip;
	addr.sin_family = AF_INET;
	addr.sin_port = puerto;
	memset(&(addr.sin_zero), '\0', 8);

	//Conecto al socket al FileSystem para notificar conexion del nodo
	if(connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == -1)
		{
			perror("connect");
			exit(1);
		}

	sendAll(sock, message, messageLength);


	return;
}