#include #include #include #include #include #include #include #include "header.h" #include #define OVERHEAD 20 void send_packet(int transmit, struct packet * const foo); // 0 for good // -1 for bad md5sum // 1 for pipe done int read_packet(int recieve, struct packet* const foo); int ack_bad(int transmit, struct packet *, unsigned short signal_strength); int ack_good(int transmit, struct packet *, unsigned short signal_strength); void box_RX(int transmit, int recieve); void box_TX(int transmit, int recieve); unsigned char *buffer; FILE* test; struct packet foo; int main() { pid_t child; int TX[2]; int RX[2]; ssize_t rw_return; int pipe_return; foo.pack_id = 1; foo.payload = NULL; assert((pipe_return = pipe(TX)) == 0); assert((pipe_return = pipe(RX)) == 0); if((child = fork()) == -1) { return -1; } else if(child == 0) { unsigned char md5sum[16]; /* child RX side*/ /* close(TX[0]); close(RX[1]); */ box_RX(TX[1], RX[0]); } else { /* close(RX[0]); close(TX[1]); */ box_TX(RX[1], TX[0]); /* wait(NULL); */ /* parent TX side*/ } return 0; } void box_RX(int transmit, int recieve) { int read_return; struct packet got; while((read_return = read_packet(recieve, &got)) != 1) { if(read_return == -1) { printf("ack_bad\n"); ack_bad(transmit, &got, 0x3000); } else { printf("ack_good\n"); ack_good(transmit, &got, 0x8000); } } } void box_TX(int transmit, int recieve) { unsigned char* buffer; struct packet go; struct packet forth; unsigned short packet_count = 65534; buffer = malloc(128); go.payload = buffer; forth.payload = NULL; printf("Payload to send: "); while(fgets(buffer, 128, stdin) && buffer[0] != '\0') { go.pack_id = packet_count++; go.pack_size = strlen(go.payload)+20; send_packet(transmit, &go); read_packet(recieve, &forth); // TODO handle when rx sends bad assert(go.pack_id == forth.pack_id); assert(memcmp(go.md5sum, forth.md5sum, 16)); printf("Payload to send: "); } close(transmit); } void send_packet(int transmit, struct packet * const foo) { unsigned char* buffer = NULL; static unsigned char md[16]; int rw; /* Send id and size */ rw = write(transmit, foo, 4); assert(rw == 4); /* printf("Sent id %d\n", foo->pack_id); printf("Send size %d\n", foo->pack_size); */ /* Send payload */ rw = write(transmit, foo->payload, foo->pack_size- 20); assert(rw == foo->pack_size-20); /* printf("Sent String %s\n", foo->payload); */ /* Generate MD5 */ buffer = malloc(foo->pack_size - 16); memcpy(buffer, &foo->pack_id, sizeof(foo->pack_id)); memcpy(buffer+sizeof(foo->pack_id), &foo->pack_size, sizeof(foo->pack_size)); memcpy(buffer+sizeof(foo->pack_id)+sizeof(foo->pack_size), foo->payload, foo->pack_size-20); MD5(buffer, foo->pack_size-16, foo->md5sum); free(buffer); rw = write(transmit, foo->md5sum, 16); assert(rw == 16); } // add support for sending 0 instead of aborting with the assert int read_packet(int recieve, struct packet* const foo) { static unsigned char md[16]; unsigned char* buffer = NULL; int rw; if(foo->payload) free(foo->payload); rw = read(recieve, foo, 4); assert(rw == 4); foo->payload = malloc(foo->pack_size - 20); rw = read(recieve, foo->payload, foo->pack_size-20); assert(rw == foo->pack_size-20); /* printf("READ got %s\n", foo->payload); */ rw = read(recieve, md, 16); assert(rw == 16); buffer = malloc(foo->pack_size - 16); memcpy(buffer, &foo->pack_id, sizeof(foo->pack_id)); memcpy(buffer+sizeof(foo->pack_id), &foo->pack_size, sizeof(foo->pack_size)); memcpy(buffer+sizeof(foo->pack_id)+sizeof(foo->pack_size), foo->payload, foo->pack_size-20); MD5(buffer, foo->pack_size-16, foo->md5sum); free(buffer); rw = memcmp(md, foo->md5sum, 16); if(rw) return -1; return 0; } int ack_bad(int transmit, struct packet *blah, unsigned short signal_strength) { return ack_good(transmit, blah, signal_strength); } int ack_good(int transmit, struct packet *blah, unsigned short signal_strength) { if(blah->payload) free(blah->payload); assert(blah->payload = malloc(sizeof(signal_strength))); blah->pack_size = sizeof(signal_strength) + OVERHEAD; send_packet(transmit, blah); return 0; }