static void test_remove_from_queue() { Queue *queue = (Queue *)malloc(sizeof(Queue)); initializeQueue(queue); Thread *thread1 = malloc(sizeof(Thread)); Thread *thread2 = malloc(sizeof(Thread)); Thread *thread3 = malloc(sizeof(Thread)); insertIntoQueue(queue, thread1); insertIntoQueue(queue, thread2); insertIntoQueue(queue, thread3); assert(sizeOfQueue(queue) == 3); removeFromQueue(queue, thread3); printQueue(queue); assert(sizeOfQueue(queue) == 2); }
void sendRead(rel_t *s){ if (s && s->inputEOF == 0) { int size = s->recvWindows; if(size > s->cwndSize){ size = s->cwndSize; } size = (size > 9) ? 9 : size; while (sizeOfQueue(s->senderBuff) < size) { packetQueue* tempPack = new_packet(); int dataIn = conn_input(s->c, tempPack->packet->data, 1000); if (dataIn == 0) { break; } if(dataIn > 0){ tempPack->packet->cksum = 0; tempPack->packet->len = htons((16 + dataIn)); tempPack->packet->seqno = htonl(s->seqOut); s->seqOut++; tempPack->packet->rwnd = htonl(s->recvWindows - sizeOfQueue(s->receiverBuff)); tempPack->packet->ackno = htonl(s->seqIn); tempPack->packet->cksum = cksum(tempPack->packet, (16 + dataIn)); addToQueue(&(s->senderBuff), tempPack); conn_sendpkt(s->c, tempPack->packet, (16 + dataIn)); } else{ s->inputEOF = 1; s->seqLast = s->seqOut; dataIn = 0; tempPack->packet->cksum = 0; tempPack->packet->len = htons((16 + dataIn)); tempPack->packet->seqno = htonl(s->seqOut); s->seqOut++; tempPack->packet->rwnd = htonl(s->recvWindows - sizeOfQueue(s->receiverBuff)); tempPack->packet->ackno = htonl(s->seqIn); tempPack->packet->cksum = cksum(tempPack->packet, (16 + dataIn)); addToQueue(&(s->senderBuff), tempPack); conn_sendpkt(s->c, tempPack->packet, (16 + dataIn)); } } return; } rel_destroy (s); return; }
void ack(rel_t *r, uint32_t ackno) { struct ack_packet* tempAck = (struct ack_packet*) malloc(sizeof(struct ack_packet)); memset(tempAck, 0, sizeof(struct ack_packet)); tempAck->ackno = htonl(ackno); tempAck->rwnd = htonl(r->recvWindows - sizeOfQueue(r->receiverBuff)); //fprintf(stderr, "ack rwnd: %d\n", r->recvWindows - sizeOfQueue(r->receiverBuff)); tempAck->len = htons(sizeof(struct ack_packet)); tempAck->cksum = cksum((void *)tempAck, sizeof(struct ack_packet)); conn_sendpkt(r->c, (packet_t *)tempAck, sizeof(struct ack_packet)); free(tempAck); return; }
void retransmit(rel_t *rel) { packetQueue* current = rel->senderBuff; while(current){ if(!(current->packet)){ break; } conn_sendpkt(rel->c, current->packet, ntohs(current->packet->len)); current = current->next; } current = rel->senderBuff; if (sizeOfQueue(current)> 0) { if(current){ rel->ssthresh = rel->ssthresh / 2; rel->cwndSize = 3; } } }
void rel_recvpkt (rel_t *r, packet_t *pkt, size_t n) { if (ntohs(pkt->len) < 12 || ntohs(pkt->len) > 1016) { fprintf(stderr, "Wrong length pkt\n"); return; } if ( (((int) n) > ntohs(pkt->len)) || (((int) n) < ntohs(pkt->len)) ) { fprintf(stderr, "size mismatch\n"); return; } if (ntohl(pkt->ackno) < 1 || ntohl(pkt->ackno) > r->seqOut) { fprintf(stderr, "Wrong ackno\n"); return; } if ((int) n < 12 || (int) n > 1016) { fprintf(stderr, "Wrong length input\n"); return; } uint16_t oldCheck = pkt->cksum; int len = ntohs(pkt->len); numBitsReceivedBetweenTimers = numBitsReceivedBetweenTimers + len; pkt->cksum = 0; pkt->cksum = 0; pkt->cksum = 0; pkt->cksum = 0; uint16_t realCheck = cksum(pkt, len); if (realCheck != oldCheck) { fprintf(stderr, "wrong checksum for packet: length %d, ackno %d, seqno %d\n", len, ntohl(pkt->ackno), ntohl(pkt->seqno)); return; } if(len == 12){ processAck2 (r, pkt); } else if(len >= 16 && len <= 1016 && ntohl(pkt->seqno) >= r->seqIn && sizeOfQueue(r->receiverBuff) < r->recvWindows){ processData(r, pkt, len); } else{ ack(r, r->seqIn); } return; }
void recvRead (rel_t *s){ if (s->inputEOF != 1) { s->seqLast = s->seqOut; packetQueue *eofpacket = new_packet(); memset(eofpacket, 0, sizeof(packetQueue)); eofpacket->packet->len = htons(16); eofpacket->packet->seqno = htonl(s->seqOut); s->seqOut = s->seqOut + 1; eofpacket->packet->rwnd = htonl(s->recvWindows - sizeOfQueue(s->receiverBuff)); eofpacket->packet->ackno = htonl(s->seqIn); uint16_t checksum = cksum(eofpacket->packet, 16); eofpacket->packet->cksum = checksum; conn_sendpkt(s->c, eofpacket->packet, 16); addToQueue(&(s->senderBuff), eofpacket); s->inputEOF = 1; return; } return; }