Ejemplo n.º 1
0
static void
at86rf230_rx_read_frame_complete(void *context)
{
	struct at86rf230_state_change *ctx = context;
	struct at86rf230_local *lp = ctx->lp;
	const u8 *buf = ctx->buf;
	struct sk_buff *skb;
	u8 len, lqi;

	len = buf[1];
	if (!ieee802154_is_valid_psdu_len(len)) {
		dev_vdbg(&lp->spi->dev, "corrupted frame received\n");
		len = IEEE802154_MTU;
	}
	lqi = buf[2 + len];

	skb = dev_alloc_skb(IEEE802154_MTU);
	if (!skb) {
		dev_vdbg(&lp->spi->dev, "failed to allocate sk_buff\n");
		kfree(ctx);
		return;
	}

	skb_put_data(skb, buf + 2, len);
	ieee802154_rx_irqsafe(lp->hw, skb, lqi);
	kfree(ctx);
}
Ejemplo n.º 2
0
static void
at86rf230_rx_read_frame_complete(void *context)
{
    struct at86rf230_state_change *ctx = context;
    struct at86rf230_local *lp = ctx->lp;
    u8 rx_local_buf[AT86RF2XX_MAX_BUF];
    const u8 *buf = ctx->buf;
    struct sk_buff *skb;
    u8 len, lqi;

    len = buf[1];
    if (!ieee802154_is_valid_psdu_len(len)) {
        dev_vdbg(&lp->spi->dev, "corrupted frame received\n");
        len = IEEE802154_MTU;
    }
    lqi = buf[2 + len];

    memcpy(rx_local_buf, buf + 2, len);
    ctx->trx.len = 2;
    enable_irq(ctx->irq);

    skb = dev_alloc_skb(IEEE802154_MTU);
    if (!skb) {
        dev_vdbg(&lp->spi->dev, "failed to allocate sk_buff\n");
        return;
    }

    memcpy(skb_put(skb, len), rx_local_buf, len);
    ieee802154_rx_irqsafe(lp->hw, skb, lqi);
}
Ejemplo n.º 3
0
static void
at86rf230_rx(struct at86rf230_local *lp,
	     const u8 *data, const u8 len, const u8 lqi)
{
	struct sk_buff *skb;
	u8 rx_local_buf[AT86RF2XX_MAX_BUF];

	memcpy(rx_local_buf, data, len);
	enable_irq(lp->spi->irq);

	skb = dev_alloc_skb(IEEE802154_MTU);
	if (!skb) {
		dev_vdbg(&lp->spi->dev, "failed to allocate sk_buff\n");
		return;
	}

	memcpy(skb_put(skb, len), rx_local_buf, len);
	ieee802154_rx_irqsafe(lp->hw, skb, lqi);
}
Ejemplo n.º 4
0
static void atusb_in_good(struct urb *urb)
{
	struct usb_device *usb_dev = urb->dev;
	struct sk_buff *skb = urb->context;
	struct atusb *atusb = SKB_ATUSB(skb);
	uint8_t len, lqi;

	if (!urb->actual_length) {
		dev_dbg(&usb_dev->dev, "atusb_in: zero-sized URB ?\n");
		return;
	}

	len = *skb->data;

	if (urb->actual_length == 1) {
		atusb_tx_done(atusb, len);
		return;
	}

	if (len + 1 > urb->actual_length - 1) {
		dev_dbg(&usb_dev->dev, "atusb_in: frame len %d+1 > URB %u-1\n",
			len, urb->actual_length);
		return;
	}

	if (len < 2) {
		dev_dbg(&usb_dev->dev, "atusb_in: frame is too small\n");
		return;
	}

	lqi = skb->data[len + 1];
	dev_dbg(&usb_dev->dev, "atusb_in: rx len %d lqi 0x%02x\n", len, lqi);
	skb_pull(skb, 1);	/* remove PHR */
	skb_trim(skb, len - 2);	/* remove CRC */
	ieee802154_rx_irqsafe(atusb->wpan_dev, skb, lqi);
	urb->context = NULL;	/* skb is gone */
}