Ejemplo n.º 1
0
static int clip_mkip(struct atm_vcc *vcc,int timeout)
{
    struct clip_vcc *clip_vcc;
    struct sk_buff_head copy;
    struct sk_buff *skb;

    if (!vcc->push) return -EBADFD;
    clip_vcc = kmalloc(sizeof(struct clip_vcc),GFP_KERNEL);
    if (!clip_vcc) return -ENOMEM;
    DPRINTK("mkip clip_vcc %p vcc %p\n",clip_vcc,vcc);
    clip_vcc->vcc = vcc;
    vcc->user_back = clip_vcc;
    clip_vcc->entry = NULL;
    clip_vcc->xoff = 0;
    clip_vcc->encap = 1;
    clip_vcc->last_use = jiffies;
    clip_vcc->idle_timeout = timeout*HZ;
    clip_vcc->old_push = vcc->push;
    clip_vcc->old_pop = vcc->pop;
    clip_vcc->dev = NULL;
    clip_vcc->global_next = NULL;
    memset(&clip_vcc->resolve_timer, 0, sizeof(clip_vcc->resolve_timer));
    vcc->push = clip_push;
    vcc->pop = clip_pop;
    skb_queue_head_init(&copy);
    skb_migrate(&vcc->recvq,&copy);
    /* re-process everything received between connection setup and MKIP */
    while ((skb = skb_dequeue(&copy)))
    {
	if (!clip_devs)
	{
	    atm_return(vcc,skb->truesize);
	    kfree_skb(skb);
	}
	else
	{
	    unsigned int len = skb->len;

	    clip_push(vcc,skb);
	    PRIV(skb->dev)->stats.rx_packets--;
	    PRIV(skb->dev)->stats.rx_bytes -= len;
	}
    }
    return 0;
}
Ejemplo n.º 2
0
static int clip_mkip(struct atm_vcc *vcc, int timeout)
{
	struct clip_vcc *clip_vcc;
	struct sk_buff *skb;
	struct sk_buff_head *rq;
	unsigned long flags;

	if (!vcc->push)
		return -EBADFD;
	clip_vcc = kmalloc(sizeof(struct clip_vcc), GFP_KERNEL);
	if (!clip_vcc)
		return -ENOMEM;
	DPRINTK("mkip clip_vcc %p vcc %p\n", clip_vcc, vcc);
	clip_vcc->vcc = vcc;
	vcc->user_back = clip_vcc;
	set_bit(ATM_VF_IS_CLIP, &vcc->flags);
	clip_vcc->entry = NULL;
	clip_vcc->xoff = 0;
	clip_vcc->encap = 1;
	clip_vcc->last_use = jiffies;
	clip_vcc->idle_timeout = timeout * HZ;
	clip_vcc->old_push = vcc->push;
	clip_vcc->old_pop = vcc->pop;
	vcc->push = clip_push;
	vcc->pop = clip_pop;

	rq = &sk_atm(vcc)->sk_receive_queue;

	spin_lock_irqsave(&rq->lock, flags);
	if (skb_queue_empty(rq)) {
		skb = NULL;
	} else {
		/* NULL terminate the list.  */
		rq->prev->next = NULL;
		skb = rq->next;
	}
	rq->prev = rq->next = (struct sk_buff *)rq;
	rq->qlen = 0;
	spin_unlock_irqrestore(&rq->lock, flags);

	/* re-process everything received between connection setup and MKIP */
	while (skb) {
		struct sk_buff *next = skb->next;

		skb->next = skb->prev = NULL;
		if (!clip_devs) {
			atm_return(vcc, skb->truesize);
			kfree_skb(skb);
		} else {
			unsigned int len = skb->len;

			skb_get(skb);
			clip_push(vcc, skb);
			PRIV(skb->dev)->stats.rx_packets--;
			PRIV(skb->dev)->stats.rx_bytes -= len;
			kfree_skb(skb);
		}

		skb = next;
	}
	return 0;
}