diff --git a/hdlc/hdlc_frame.c b/hdlc/hdlc_frame.c index 40efe30..f73e0db 100644 --- a/hdlc/hdlc_frame.c +++ b/hdlc/hdlc_frame.c @@ -1,5 +1,4 @@ #include "hdlc_frame.h" -#include #define START_FLAG 0x7E #define END_FLAG 0x7E @@ -15,7 +14,7 @@ void initialize_frame(HDLCFrame* frame, uint8_t address, uint8_t control, uint8_ uint16_t calculate_fcs(HDLCFrame* frame) { uint16_t fcs = 0xFFFF; - uint8_t* data_bytes = malloc(frame->data_length + 2); + uint8_t data_bytes[MAX_FRAME_LENGTH]; data_bytes[0] = frame->address; data_bytes[1] = frame->control; @@ -29,41 +28,41 @@ uint16_t calculate_fcs(HDLCFrame* frame) { fcs &= 0xFFFF; } - free(data_bytes); return fcs; } -void create_frame(HDLCFrame* frame, uint8_t** frame_data, size_t* frame_length) { - *frame_length = 4 + frame->data_length; - *frame_data = malloc(*frame_length); - (*frame_data)[0] = START_FLAG; - (*frame_data)[1] = frame->address; - (*frame_data)[2] = frame->control; +void create_frame(HDLCFrame* frame, uint8_t* frame_data, size_t* frame_length) { + size_t index = 0; + frame_data[index++] = START_FLAG; + frame_data[index++] = frame->address; + frame_data[index++] = frame->control; - size_t index = 3; for (size_t i = 0; i < frame->data_length; i++) { uint8_t byte = frame->data[i]; if (byte == START_FLAG || byte == END_FLAG || byte == ESCAPE_FLAG) { - (*frame_data)[index++] = ESCAPE_FLAG; - (*frame_data)[index++] = byte ^ ESCAPE_XOR; + frame_data[index++] = ESCAPE_FLAG; + frame_data[index++] = byte ^ ESCAPE_XOR; } else { - (*frame_data)[index++] = byte; + frame_data[index++] = byte; } } uint16_t fcs = calculate_fcs(frame); - (*frame_data)[index++] = fcs & 0xFF; - (*frame_data)[index] = END_FLAG; + frame_data[index++] = fcs & 0xFF; + frame_data[index++] = (fcs >> 8) & 0xFF; + frame_data[index] = END_FLAG; + + *frame_length = index + 1; } HDLCFrame* create_u_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length) { - HDLCFrame* frame = malloc(sizeof(HDLCFrame)); + HDLCFrame* frame = (HDLCFrame*)malloc(sizeof(HDLCFrame)); initialize_frame(frame, address, control, data, data_length); return frame; } HDLCFrame* create_s_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length, uint8_t receive_sequence_number, uint8_t send_sequence_number) { - HDLCFrame* frame = malloc(sizeof(HDLCFrame)); + HDLCFrame* frame = (HDLCFrame*)malloc(sizeof(HDLCFrame)); initialize_frame(frame, address, control, data, data_length); frame->control |= (receive_sequence_number << 2) & 0xFC; frame->control |= (send_sequence_number << 1) & 0xFE; @@ -71,7 +70,7 @@ HDLCFrame* create_s_frame(uint8_t address, uint8_t control, uint8_t* data, size_ } HDLCFrame* create_i_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length, uint8_t sequence_number) { - HDLCFrame* frame = malloc(sizeof(HDLCFrame)); + HDLCFrame* frame = (HDLCFrame*)malloc(sizeof(HDLCFrame)); initialize_frame(frame, address, control, data, data_length); frame->control |= (sequence_number << 1) & 0xFE; return frame; diff --git a/hdlc/hdlc_frame.h b/hdlc/hdlc_frame.h index ceae96e..09792a6 100644 --- a/hdlc/hdlc_frame.h +++ b/hdlc/hdlc_frame.h @@ -2,6 +2,7 @@ #define HDLC_FRAME_H #include +#define MAX_FRAME_LENGTH 256 typedef struct { uint8_t address; @@ -12,10 +13,11 @@ typedef struct { void initialize_frame(HDLCFrame* frame, uint8_t address, uint8_t control, uint8_t* data, size_t data_length); uint16_t calculate_fcs(HDLCFrame* frame); -void create_frame(HDLCFrame* frame, uint8_t** frame_data, size_t* frame_length); +void create_frame(HDLCFrame* frame, uint8_t* frame_data, size_t* frame_length); HDLCFrame* create_u_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length); HDLCFrame* create_s_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length, uint8_t receive_sequence_number, uint8_t send_sequence_number); HDLCFrame* create_i_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length, uint8_t sequence_number); + #endif \ No newline at end of file diff --git a/hdlc/test_hdlc_frame.c b/hdlc/test_hdlc_frame.c index 34ab052..2c8a748 100644 --- a/hdlc/test_hdlc_frame.c +++ b/hdlc/test_hdlc_frame.c @@ -17,30 +17,25 @@ int main() { size_t data_length = sizeof(data) / sizeof(data[0]); HDLCFrame* u_frame = create_u_frame(address, control, data, data_length); - uint8_t* u_frame_data; + uint8_t u_frame_data[MAX_FRAME_LENGTH]; size_t u_frame_length; - create_frame(u_frame, &u_frame_data, &u_frame_length); + create_frame(u_frame, u_frame_data, &u_frame_length); print_frame(u_frame_data, u_frame_length); - free(u_frame_data); - free(u_frame); - uint8_t receive_sequence_number = 0x01; - uint8_t send_sequence_number = 0x02; - HDLCFrame* s_frame = create_s_frame(address, control, data, data_length, receive_sequence_number, send_sequence_number); - uint8_t* s_frame_data; + HDLCFrame* s_frame = create_s_frame(address, control, data, data_length, 0x01, 0x02); + uint8_t s_frame_data[MAX_FRAME_LENGTH]; size_t s_frame_length; - create_frame(s_frame, &s_frame_data, &s_frame_length); + create_frame(s_frame, s_frame_data, &s_frame_length); print_frame(s_frame_data, s_frame_length); - free(s_frame_data); - free(s_frame); - uint8_t sequence_number = 0x03; - HDLCFrame* i_frame = create_i_frame(address, control, data, data_length, sequence_number); - uint8_t* i_frame_data; + HDLCFrame* i_frame = create_i_frame(address, control, data, data_length, 0x03); + uint8_t i_frame_data[MAX_FRAME_LENGTH]; size_t i_frame_length; - create_frame(i_frame, &i_frame_data, &i_frame_length); + create_frame(i_frame, i_frame_data, &i_frame_length); print_frame(i_frame_data, i_frame_length); - free(i_frame_data); + + free(u_frame); + free(s_frame); free(i_frame); return 0;