diff --git a/trab.c b/trab.c index a9451d790761b58126a77c2e802df084ffab7b44..3213043d3a9d7a753fba9ecc97cd6dd884a86c56 100644 --- a/trab.c +++ b/trab.c @@ -170,18 +170,19 @@ int ConexaoRawSocket(char *device) { } //vertical impar -void paridade(pacote *package) { - byte tmp; +void paridade(t_pacote *pacote) { //coloca paridade no campo paridade + char paridade, r[2]; int i; - //package->paridade = ~(package->tamanho ^ package->sequencia ^ package->tipo ^ (int) package->dados); - package->paridade = package->tamanho; - package->paridade ^= package->sequencia; - package->paridade ^= package->tipo; - for (i=0;i<package->tamanho;i++) { - tmp.byte = *package->dados; - package->paridade ^= tmp.low; - package->paridade ^= tmp.high; - } + r[0] = '\0'; + r[1] = '\0'; + r[0] = (((char)pacote->tamanho) << 2 | ((char) (pacote->sequencia >> 4) & 0x03)); + r[1] = (char) pacote->sequencia << 4 | pacote->tipo & 0x0f; + + paridade = r[0] ^ r[1]; + + for(i = 0; i < pacote->tamanho; i++) + paridade = pacote->dados[i] ^ paridade; + pacote->paridade = paridade; } void faz_ham(char o, char *c1, char *c2) { //faz hamming em c1 e retorna em c1 e c2 @@ -342,18 +343,19 @@ void monta_pacote(pacote *package, int tamanho, int tipo, char * dados) { } int checa_paridade(pacote *package) { - byte tmp; - nibble paridade; + char paridade, r[2]; int i; - paridade.val = package->tamanho; - paridade.val ^= package->sequencia; - paridade.val ^= package->tipo; - for (i=0;i<package->tamanho;i++) { - tmp.byte = *package->dados; - paridade.val ^= tmp.low; - paridade.val ^= tmp.high; - } - return (paridade.val ^ package->paridade); + r[0] = '\0'; + r[1] = '\0'; + r[0] = (((char)pacote->tamanho) << 2 | ((char) (pacote->sequencia >> 4) & 0x03)); + r[1] = (char) pacote->sequencia << 4 | pacote->tipo & 0x0f; + + paridade = r[0] ^ r[1]; + + for(i = 0; i < pacote->tamanho; i++) + paridade = pacote->dados[i] ^ paridade; + return (paridade ^ package->paridade); +} int manda_pacote(pacote *package) { int i,status;