11 void bap_frame_dump(struct BAP_Frame *bap_frame)
15 printf("%u. %2i/%-2i .%02i --",
21 for (i = 0; i < bap_frame->len; i++) {
25 printf("%02x", (unsigned char)(bap_frame->data[i]));
29 for (i = 0; i < bap_frame->len; i++) {
30 unsigned char c = bap_frame->data[i];
31 if (!isprint(c) || c == '\n' || c == '\r') {
47 struct BAP_Frame* bap_handle_can_frame(struct BAP_RXer *bap, struct can_frame *frame)
49 struct BAP_Frame *bap_frame = NULL;
50 unsigned short header;
53 //printf("Received BAP frame from CAN ID %03x\n", frame->can_id);
55 if (frame->can_dlc < 2) {
56 printf("Error: Frame too short\n");
59 if (frame->data[0] & 0x80) {
60 /* This is a multi-frame BAP message */
61 int mfchannel = (frame->data[0] >> 4) & 0x3;
63 if (!(frame->data[0] & 0x40)) {
66 unsigned short header;
69 if (frame->can_dlc < 4) {
70 printf("Error: Frame too short\n");
73 if (bap->mfchannel[mfchannel]) {
74 printf("bap_handle_can_frame: new start frame for open channel\n");
76 bap->mfchannel[mfchannel] = NULL;
78 bap_frame = calloc(1, sizeof(struct BAP_Frame));
80 printf("bap_handle_can_frame: Failed to allocate new frame\n");
84 header = (frame->data[2] << 8) | frame->data[3];
85 bap_frame->opcode = (header >> 12) & 0x7;
86 bap_frame->subnode = (header >> 6) & 0x3F;
87 bap_frame->function = (header >> 0) & 0x3F;
89 bap_frame->len = ((frame->data[0] & 0xF) << 8) | frame->data[1];
91 this_len = frame->can_dlc - 4;
93 if (this_len > bap_frame->len) {
94 printf("bap_handle_can_frame: this_len > len\n");
97 bap->mfchannel[mfchannel] = NULL;
102 memcpy(&bap_frame->data[0], &frame->data[frame->can_dlc - this_len], this_len);
103 bap_frame->len_done = this_len;
105 if (bap_frame->len_done == bap_frame->len) {
106 /* Frame is complete, remove from buffer */
107 bap->mfchannel[mfchannel] = NULL;
110 /* Frame is incomplete, don't emit it yet */
111 bap->mfchannel[mfchannel] = bap_frame;
115 /* Continuation frame */
117 bap_frame = bap->mfchannel[mfchannel];
120 printf("bap_handle_can_frame: continuation frame for unknown mf channel %d\n",
124 this_len = frame->can_dlc - 1;
126 if ((bap_frame->len_done + this_len) > bap_frame->len) {
127 printf("bap_handle_can_frame: len_done + this_len > len\n");
130 bap->mfchannel[mfchannel] = NULL;
135 memcpy(&bap_frame->data[bap_frame->len_done],
136 &frame->data[frame->can_dlc - this_len],
138 bap_frame->len_done += this_len;
140 if (bap_frame->len_done == bap_frame->len) {
141 /* Frame is complete, remove from buffer */
142 bap->mfchannel[mfchannel] = NULL;
145 /* Frame is incomplete, don't emit it yet */
150 /* Single-frame BAP message */
152 bap_frame = calloc(1, sizeof(struct BAP_Frame));
154 printf("bap_handle_can_frame: Failed to allocate new frame\n");
158 header = (frame->data[0] << 8) | frame->data[1];
159 bap_frame->opcode = (header >> 12) & 0x7;
160 bap_frame->subnode = (header >> 6) & 0x3F;
161 bap_frame->function = (header >> 0) & 0x3F;
163 this_len = frame->can_dlc - 2;
165 bap_frame->len = this_len;
167 memcpy(&bap_frame->data[0], &frame->data[frame->can_dlc - this_len], this_len);
168 bap_frame->len_done = this_len;
178 struct BAP_RXer* bap_alloc()
180 struct BAP_RXer *bap;
182 bap = calloc(1, sizeof(*bap));
193 void bap_free(struct BAP_RXer *bap)
201 void bap_frame_free(struct BAP_Frame *bap_frame)