#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"); }