11 struct BAP_Frame* vag_bap_handle_can_frame(struct BAP_RXer *bap, struct can_frame *frame)
13 struct BAP_Frame *bap_frame = NULL;
14 unsigned short header;
17 //printf("Received BAP frame from CAN ID %03x\n", frame->can_id);
19 if (frame->can_dlc < 2) {
20 VAG_DEBUG("Error: Frame too short\n");
23 if (frame->data[0] & 0x80) {
24 /* This is a multi-frame BAP message */
25 int mfchannel = (frame->data[0] >> 4) & 0x3;
27 if (!(frame->data[0] & 0x40)) {
30 unsigned short header;
34 if (frame->can_dlc < 4) {
35 VAG_DEBUG("bap_handle_can_frame: Frame too short\n");
38 if (bap->mfchannel[mfchannel]) {
39 VAG_DEBUG("bap_handle_can_frame: new start frame for open channel\n");
41 bap->mfchannel[mfchannel] = NULL;
43 /* Frame looks okay, start parsing */
44 bap_frame = vag_bap_frame_alloc();
46 VAG_DEBUG("bap_handle_can_frame: Failed to allocate new frame\n");
50 bap_frame->is_multiframe = 1;
52 header = (frame->data[2] << 8) | frame->data[3];
53 bap_frame->opcode = (header >> 12) & 0x7;
54 bap_frame->node = (header >> 6) & 0x3F;
55 bap_frame->port = (header >> 0) & 0x3F;
57 bap_frame->len = ((frame->data[0] & 0xF) << 8) | frame->data[1];
59 this_len = frame->can_dlc - 4;
61 if (this_len > bap_frame->len) {
62 VAG_DEBUG("bap_handle_can_frame: this_len > len\n");
65 bap->mfchannel[mfchannel] = NULL;
70 memcpy(&bap_frame->data[0], &frame->data[frame->can_dlc - this_len], this_len);
71 bap->len_done[mfchannel] = this_len;
73 if (bap->len_done[mfchannel] == bap_frame->len) {
74 /* Frame is complete, remove from buffer */
75 bap->mfchannel[mfchannel] = NULL;
78 /* Frame is incomplete, don't emit it yet */
79 bap->mfchannel[mfchannel] = bap_frame;
83 /* Continuation frame */
85 bap_frame = bap->mfchannel[mfchannel];
88 VAG_DEBUG("bap_handle_can_frame: continuation frame for unknown mf channel %d\n",
92 this_len = frame->can_dlc - 1;
94 if ((bap->len_done[mfchannel] + this_len) > bap_frame->len) {
95 VAG_DEBUG("bap_handle_can_frame: len_done + this_len > len\n");
98 bap->mfchannel[mfchannel] = NULL;
103 memcpy(&bap_frame->data[bap->len_done[mfchannel]],
104 &frame->data[frame->can_dlc - this_len],
106 bap->len_done[mfchannel] += this_len;
108 if (bap->len_done[mfchannel] == bap_frame->len) {
109 /* Frame is complete, remove from buffer */
110 bap->mfchannel[mfchannel] = NULL;
113 /* Frame is incomplete, don't emit it yet */
118 /* Single-frame BAP message */
120 bap_frame = calloc(1, sizeof(struct BAP_Frame));
122 VAG_DEBUG("bap_handle_can_frame: Failed to allocate new frame\n");
126 bap_frame->is_multiframe = 0;
128 header = (frame->data[0] << 8) | frame->data[1];
129 bap_frame->opcode = (header >> 12) & 0x7;
130 bap_frame->node = (header >> 6) & 0x3F;
131 bap_frame->port = (header >> 0) & 0x3F;
133 this_len = frame->can_dlc - 2;
135 bap_frame->len = this_len;
137 memcpy(&bap_frame->data[0], &frame->data[frame->can_dlc - this_len], this_len);
147 struct BAP_RXer* vag_bap_rxer_alloc()
149 struct BAP_RXer *bap;
151 bap = calloc(1, sizeof(*bap));
162 void vag_bap_rxer_free(struct BAP_RXer *bap)
166 for (i = 0; i < 8; i++) {
167 if (bap->mfchannel[i]) {
168 vag_bap_frame_free(bap->mfchannel[i]);