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; }
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; }