UDPFileTransferClient-Server / pdu.c
pdu.c
Raw
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdbool.h>

#include "pdu.h"
#include "checksum.h"


uint8_t *createPDU(uint32_t sequenceNumber, uint8_t flag, uint8_t *payload, int dataLen) {
    uint16_t cksum = 0;
    static uint8_t pduBuffer[MAX_BUFFER] = {0};
    memset(pduBuffer, 0, MAX_BUFFER);
    uint32_t seq = htonl(sequenceNumber);

    memcpy(pduBuffer, &seq, sizeof(sequenceNumber));

    // leave the checksum field zeroed out
    memcpy(&pduBuffer[6], &flag, sizeof(flag));

    memcpy(&pduBuffer[7], payload, dataLen);

    //printAllBytes(pduBuffer, dataLen+HEADER_LEN);

    // Now calculate checksum
    cksum = in_cksum((unsigned short *) pduBuffer, dataLen + HEADER_LEN);
    memcpy(&pduBuffer[4], &cksum, sizeof(uint16_t));
    
    return pduBuffer;
}


void outputPDU(uint8_t *aPDU, int pduLength) {
    uint32_t sequenceNumber = 0;
    uint8_t flag = 0;
    uint8_t payload[MAX_BUFFER] = {0};

    memcpy(&sequenceNumber, &aPDU[0], sizeof(sequenceNumber));
    memcpy(&flag, &aPDU[6], sizeof(flag));
    memcpy(payload, &aPDU[7], pduLength - HEADER_LEN);

    printf("PDU - seq: %d, flag: %d, payload: %s\n", ntohl(sequenceNumber), flag, payload);
}


bool validChecksum(uint8_t *packet, int recvLen) {
	if (in_cksum((unsigned short *) packet, recvLen) != 0) {
		//printf("Uh oh the checksum was wrong\n");
		return false;
	} else {
		//printf("The checksum was right!\n");
		return true;
	}
}

uint32_t getOffsetSeqNumber(uint8_t *packet) {
	uint32_t rr = 0;
	memcpy(&rr, &packet[HEADER_LEN], sizeof(uint32_t));
	rr = ntohl(rr);
	return rr;
}

uint32_t getSeqNumber(uint8_t *packet) {
	uint32_t seq = 0;
	memcpy(&seq, packet, sizeof(uint32_t));
	seq = ntohl(seq);
	return seq;
}

void printAllBytes(uint8_t *packet, int recvLen) {
    int i = 0;
    for(; i < (recvLen); i++) {
        printf("Byte at %d is: %d\n", i, packet[i]);
    }
    printf("\n");
}