Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}