delete malloc
This commit is contained in:
parent
a19da2cbd3
commit
4b4a162f72
@ -1,5 +1,4 @@
|
|||||||
#include "hdlc_frame.h"
|
#include "hdlc_frame.h"
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#define START_FLAG 0x7E
|
#define START_FLAG 0x7E
|
||||||
#define END_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 calculate_fcs(HDLCFrame* frame) {
|
||||||
uint16_t fcs = 0xFFFF;
|
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[0] = frame->address;
|
||||||
data_bytes[1] = frame->control;
|
data_bytes[1] = frame->control;
|
||||||
|
|
||||||
@ -29,41 +28,41 @@ uint16_t calculate_fcs(HDLCFrame* frame) {
|
|||||||
fcs &= 0xFFFF;
|
fcs &= 0xFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(data_bytes);
|
|
||||||
return fcs;
|
return fcs;
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
*frame_length = 4 + frame->data_length;
|
size_t index = 0;
|
||||||
*frame_data = malloc(*frame_length);
|
frame_data[index++] = START_FLAG;
|
||||||
(*frame_data)[0] = START_FLAG;
|
frame_data[index++] = frame->address;
|
||||||
(*frame_data)[1] = frame->address;
|
frame_data[index++] = frame->control;
|
||||||
(*frame_data)[2] = frame->control;
|
|
||||||
|
|
||||||
size_t index = 3;
|
|
||||||
for (size_t i = 0; i < frame->data_length; i++) {
|
for (size_t i = 0; i < frame->data_length; i++) {
|
||||||
uint8_t byte = frame->data[i];
|
uint8_t byte = frame->data[i];
|
||||||
if (byte == START_FLAG || byte == END_FLAG || byte == ESCAPE_FLAG) {
|
if (byte == START_FLAG || byte == END_FLAG || byte == ESCAPE_FLAG) {
|
||||||
(*frame_data)[index++] = ESCAPE_FLAG;
|
frame_data[index++] = ESCAPE_FLAG;
|
||||||
(*frame_data)[index++] = byte ^ ESCAPE_XOR;
|
frame_data[index++] = byte ^ ESCAPE_XOR;
|
||||||
} else {
|
} else {
|
||||||
(*frame_data)[index++] = byte;
|
frame_data[index++] = byte;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t fcs = calculate_fcs(frame);
|
uint16_t fcs = calculate_fcs(frame);
|
||||||
(*frame_data)[index++] = fcs & 0xFF;
|
frame_data[index++] = fcs & 0xFF;
|
||||||
(*frame_data)[index] = END_FLAG;
|
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* 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);
|
initialize_frame(frame, address, control, data, data_length);
|
||||||
return frame;
|
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* 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);
|
initialize_frame(frame, address, control, data, data_length);
|
||||||
frame->control |= (receive_sequence_number << 2) & 0xFC;
|
frame->control |= (receive_sequence_number << 2) & 0xFC;
|
||||||
frame->control |= (send_sequence_number << 1) & 0xFE;
|
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* 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);
|
initialize_frame(frame, address, control, data, data_length);
|
||||||
frame->control |= (sequence_number << 1) & 0xFE;
|
frame->control |= (sequence_number << 1) & 0xFE;
|
||||||
return frame;
|
return frame;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#define HDLC_FRAME_H
|
#define HDLC_FRAME_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#define MAX_FRAME_LENGTH 256
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t address;
|
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);
|
void initialize_frame(HDLCFrame* frame, uint8_t address, uint8_t control, uint8_t* data, size_t data_length);
|
||||||
uint16_t calculate_fcs(HDLCFrame* frame);
|
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_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_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);
|
HDLCFrame* create_i_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length, uint8_t sequence_number);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -17,30 +17,25 @@ int main() {
|
|||||||
size_t data_length = sizeof(data) / sizeof(data[0]);
|
size_t data_length = sizeof(data) / sizeof(data[0]);
|
||||||
|
|
||||||
HDLCFrame* u_frame = create_u_frame(address, control, data, data_length);
|
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;
|
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);
|
print_frame(u_frame_data, u_frame_length);
|
||||||
free(u_frame_data);
|
|
||||||
free(u_frame);
|
|
||||||
|
|
||||||
uint8_t receive_sequence_number = 0x01;
|
HDLCFrame* s_frame = create_s_frame(address, control, data, data_length, 0x01, 0x02);
|
||||||
uint8_t send_sequence_number = 0x02;
|
uint8_t s_frame_data[MAX_FRAME_LENGTH];
|
||||||
HDLCFrame* s_frame = create_s_frame(address, control, data, data_length, receive_sequence_number, send_sequence_number);
|
|
||||||
uint8_t* s_frame_data;
|
|
||||||
size_t s_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);
|
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, 0x03);
|
||||||
HDLCFrame* i_frame = create_i_frame(address, control, data, data_length, sequence_number);
|
uint8_t i_frame_data[MAX_FRAME_LENGTH];
|
||||||
uint8_t* i_frame_data;
|
|
||||||
size_t i_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);
|
print_frame(i_frame_data, i_frame_length);
|
||||||
free(i_frame_data);
|
|
||||||
|
free(u_frame);
|
||||||
|
free(s_frame);
|
||||||
free(i_frame);
|
free(i_frame);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user