do { /* Search for STX at start of pkt if STX is used */ if (layr->usestx) {
cfpkt_extr_head(pkt, &tmp8, 1); if (tmp8 != CFSERL_STX) { while (cfpkt_more(pkt)
&& tmp8 != CFSERL_STX) {
cfpkt_extr_head(pkt, &tmp8, 1);
} if (!cfpkt_more(pkt)) {
cfpkt_destroy(pkt);
layr->incomplete_frm = NULL;
spin_unlock(&layr->sync); return -EPROTO;
}
}
}
pkt_len = cfpkt_getlen(pkt);
/* * pkt_len is the accumulated length of the packet data * we have received so far. * Exit if frame doesn't hold length.
*/
if (pkt_len < 2) { if (layr->usestx)
cfpkt_add_head(pkt, &stx, 1);
layr->incomplete_frm = pkt;
spin_unlock(&layr->sync); return 0;
}
/* * Find length of frame. * expectlen is the length we need for a full frame.
*/
cfpkt_peek_head(pkt, &tmp, 2);
expectlen = le16_to_cpu(tmp) + 2; /* * Frame error handling
*/ if (expectlen < SERIAL_MINIUM_PACKET_SIZE
|| expectlen > SERIAL_MAX_FRAMESIZE) { if (!layr->usestx) { if (pkt != NULL)
cfpkt_destroy(pkt);
layr->incomplete_frm = NULL;
spin_unlock(&layr->sync); return -EPROTO;
} continue;
}
if (pkt_len < expectlen) { /* Too little received data */ if (layr->usestx)
cfpkt_add_head(pkt, &stx, 1);
layr->incomplete_frm = pkt;
spin_unlock(&layr->sync); return 0;
}
/* * Enough data for at least one frame. * Split the frame, if too long
*/ if (pkt_len > expectlen)
tail_pkt = cfpkt_split(pkt, expectlen); else
tail_pkt = NULL;
/* Send the first part of packet upwards.*/
spin_unlock(&layr->sync);
ret = layr->layer.up->receive(layr->layer.up, pkt);
spin_lock(&layr->sync); if (ret == -EILSEQ) { if (layr->usestx) { if (tail_pkt != NULL)
pkt = cfpkt_append(pkt, tail_pkt, 0); /* Start search for next STX if frame failed */ continue;
} else {
cfpkt_destroy(pkt);
pkt = NULL;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.