static int sipc4_check_header(struct sipc4_rx_data *data, char *buf, int rest) { struct sipc_rx_hdr *hdr = data->rx_hdr; int head_size = sipc4_get_header_size(data->format); int done_len = 0; int len; if (!hdr->start) { len = sipc4_check_hdlc_start(data, buf); if (len < 0) return len; memcpy(&hdr->start, hdlc_start, sizeof(hdlc_start)); hdr->len = 0; switch (data->format) { case SIPC4_FMT: /*case SIPC4_RAW:*/ /*case SIPC4_RFS:*/ print_buf(buf, 0, NULL); break; } buf += len; rest -= len; done_len += len; } if (hdr->len < head_size) { len = sipc_min(rest, head_size - hdr->len); memcpy(hdr->hdr + hdr->len, buf, len); hdr->len += len; done_len += len; } return done_len; }
static int sipc4_check_header(struct sipc4_rx_data *data, char *buf, int rest) { struct sk_buff *skb = data->skb; int header_size = sipc4_get_header_size(data->format); int done_len = 0; int len = 0; if (!skb) { len = sipc4_check_hdlc_start(data, buf, rest); if (len < 0) return len; buf += len; rest -= len; done_len += len; skb = sipc4_alloc_skb(data, header_size); if (!skb) return -ENOMEM; data->skb = skb; } if (skb->len < header_size) { len = header_size - skb->len; len = rest < len ? rest : len; memcpy(skb_put(skb, len), buf, len); done_len += len; } return done_len; }