Example #1
0
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);
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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;
		}
	}
}
Example #5
0
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;
}
Example #6
0
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;
}