1
0
Fork 0

Replaces all HDR_SET macros with bitfield struct operations

This commit is contained in:
Shawn Nock 2019-07-17 15:25:37 -04:00
parent 249b882fae
commit 7e78ce0593
1 changed files with 24 additions and 61 deletions

View File

@ -109,20 +109,6 @@ typedef struct __attribute__((packed)) {
uint8_t checksum : 8; uint8_t checksum : 8;
} h5_hdr_t; } h5_hdr_t;
#define H5_HDR_SEQ(hdr) ((hdr)[0] & 0x07)
#define H5_HDR_ACK(hdr) (((hdr)[0] >> 3) & 0x07)
#define H5_HDR_CRC(hdr) (((hdr)[0] >> 6) & 0x01)
#define H5_HDR_RELIABLE(hdr) (((hdr)[0] >> 7) & 0x01)
#define H5_HDR_PKT_TYPE(hdr) ((hdr)[1] & 0x0f)
#define H5_HDR_LEN(hdr) ((((hdr)[1] >> 4) & 0x0f) + ((hdr)[2] << 4))
#define H5_SET_SEQ(hdr, seq) ((hdr)[0] |= (seq))
#define H5_SET_ACK(hdr, ack) ((hdr)[0] |= (ack) << 3)
#define H5_SET_RELIABLE(hdr) ((hdr)[0] |= 1 << 7)
#define H5_SET_TYPE(hdr, type) ((hdr)[1] |= type)
#define H5_SET_LEN(hdr, len) (((hdr)[1] |= ((len) & 0x0f) << 4), \
((hdr)[2] |= (len) >> 4))
typedef enum { typedef enum {
UNINIT, UNINIT,
INIT, INIT,
@ -274,40 +260,38 @@ static u8_t h5_slip_byte(u8_t byte)
} }
} }
void h5_hdr_update_checksum(h5_hdr_t *hdr) {
uint8_t *u8_hdr = (uint8_t *)hdr;
u8_hdr[3] = ~((u8_hdr[0] + u8_hdr[1] + u8_hdr[2]) & 0xff);
}
void h5_send(const u8_t *payload, u8_t type, int len) void h5_send(const u8_t *payload, u8_t type, int len)
{ {
u8_t hdr[4]; h5_hdr_t hdr = {0};
int i;
//hexdump("To Host <= ", payload, len);
memset(hdr, 0, sizeof(hdr));
/* Set ACK for outgoing packet and stop delayed work */ /* Set ACK for outgoing packet and stop delayed work */
H5_SET_ACK(hdr, h5.tx_ack); hdr.ack = h5.tx_ack;
k_delayed_work_cancel(&ack_work); k_delayed_work_cancel(&ack_work);
if (reliable_packet(type)) { if (reliable_packet(type)) {
H5_SET_RELIABLE(hdr); hdr.is_reliable = true;
H5_SET_SEQ(hdr, h5.tx_seq); hdr.seq = h5.tx_seq;
h5.tx_seq = (h5.tx_seq + 1) % 8; h5.tx_seq = (h5.tx_seq + 1) % 8;
} }
H5_SET_TYPE(hdr, type); hdr.packet_type = type;
H5_SET_LEN(hdr, len); hdr.len = len;
/* Calculate CRC */ h5_hdr_update_checksum(&hdr);
hdr[3] = ~((hdr[0] + hdr[1] + hdr[2]) & 0xff);
//h5_print_header(hdr, "TX: <");
uart_poll_out(hci_uart_dev, SLIP_DELIMITER); uart_poll_out(hci_uart_dev, SLIP_DELIMITER);
for (i = 0; i < 4; i++) { uint8_t *u8_hdr = (uint8_t *)&hdr;
h5_slip_byte(hdr[i]); for (int i = 0; i < 4; i++) {
h5_slip_byte(u8_hdr[i]);
} }
for (i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
h5_slip_byte(payload[i]); h5_slip_byte(payload[i]);
} }
@ -423,29 +407,6 @@ void bt_uart_isr(struct device *unused)
} }
} }
int pull_header(struct net_buf *buf, u8_t *hdr) {
// Packet too short to contain an h5 header
if (buf->len < 4) {
return -1;
}
for (u8_t i = 0; i < 4; i++) {
int byte = unslip_next_byte(buf);
if (byte < 0) {
// Packet too short due to escaped bytes
return -1;
}
hdr[i] = byte;
}
// Checksum
if (((hdr[3] + hdr[0] + hdr[1] + hdr[2]) & 0xff) != 0xff) {
LOG_WRN("Invalid Header Checksum\n");
}
return 0;
}
bool h5_hdr_checksum_good(h5_hdr_t *hdr) { bool h5_hdr_checksum_good(h5_hdr_t *hdr) {
uint8_t *u8_hdr = (uint8_t *)hdr; uint8_t *u8_hdr = (uint8_t *)hdr;
return ((u8_hdr[3] + u8_hdr[0] + u8_hdr[1] + u8_hdr[2]) & 0xff) == 0xff; return ((u8_hdr[3] + u8_hdr[0] + u8_hdr[1] + u8_hdr[2]) & 0xff) == 0xff;
@ -466,6 +427,9 @@ int pull_header1(struct net_buf *buf, h5_hdr_t *hdr) {
} }
u8_hdr[i] = byte; u8_hdr[i] = byte;
} }
if (!h5_hdr_checksum_good(hdr)) {
return -2;
}
return 0; return 0;
} }
@ -475,7 +439,6 @@ static void unproc_thread(void) {
while (true) { while (true) {
buf = net_buf_get(&h5.unprocessed_queue, K_FOREVER); buf = net_buf_get(&h5.unprocessed_queue, K_FOREVER);
//u8_t hdr[4];
h5_hdr_t hdr = {0}; h5_hdr_t hdr = {0};
if (pull_header1(buf, &hdr) < 0) { if (pull_header1(buf, &hdr) < 0) {
// Header is invalid // Header is invalid