Skip to content

Commit

Permalink
atm: Introduce vcc_process_recv_queue
Browse files Browse the repository at this point in the history
This function moves the implementation found in the clip and br2684
modules to common code, correctly unlinks the skb from the queue
before pushing it and makes pppoatm use it.

Signed-off-by: Jorge Boncompte [DTI2] <jorge@dti2.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jorge Boncompte [DTI2] authored and David S. Miller committed Nov 22, 2011
1 parent 3b82936 commit 4e55f57
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 27 deletions.
20 changes: 5 additions & 15 deletions net/atm/br2684.c
Original file line number Diff line number Diff line change
Expand Up @@ -489,15 +489,11 @@ static void br2684_push(struct atm_vcc *atmvcc, struct sk_buff *skb)
*/
static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg)
{
struct sk_buff_head queue;
int err;
struct br2684_vcc *brvcc;
struct sk_buff *skb, *tmp;
struct sk_buff_head *rq;
struct br2684_dev *brdev;
struct net_device *net_dev;
struct atm_backend_br2684 be;
unsigned long flags;
int err;

if (copy_from_user(&be, arg, sizeof be))
return -EFAULT;
Expand Down Expand Up @@ -550,23 +546,17 @@ static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg)
atmvcc->push = br2684_push;
atmvcc->pop = br2684_pop;

__skb_queue_head_init(&queue);
rq = &sk_atm(atmvcc)->sk_receive_queue;

spin_lock_irqsave(&rq->lock, flags);
skb_queue_splice_init(rq, &queue);
spin_unlock_irqrestore(&rq->lock, flags);

skb_queue_walk_safe(&queue, skb, tmp)
br2684_push(atmvcc, skb);

/* initialize netdev carrier state */
if (atmvcc->dev->signal == ATM_PHY_SIG_LOST)
netif_carrier_off(net_dev);
else
netif_carrier_on(net_dev);

__module_get(THIS_MODULE);

/* re-process everything received between connection setup and
backend setup */
vcc_process_recv_queue(atmvcc);
return 0;

error:
Expand Down
13 changes: 1 addition & 12 deletions net/atm/clip.c
Original file line number Diff line number Diff line change
Expand Up @@ -455,10 +455,7 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,

static int clip_mkip(struct atm_vcc *vcc, int timeout)
{
struct sk_buff_head *rq, queue;
struct clip_vcc *clip_vcc;
struct sk_buff *skb, *tmp;
unsigned long flags;

if (!vcc->push)
return -EBADFD;
Expand All @@ -479,16 +476,8 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout)
vcc->push = clip_push;
vcc->pop = clip_pop;

__skb_queue_head_init(&queue);
rq = &sk_atm(vcc)->sk_receive_queue;

spin_lock_irqsave(&rq->lock, flags);
skb_queue_splice_init(rq, &queue);
spin_unlock_irqrestore(&rq->lock, flags);

/* re-process everything received between connection setup and MKIP */
skb_queue_walk_safe(&queue, skb, tmp)
clip_push(vcc, skb);
vcc_process_recv_queue(vcc);

return 0;
}
Expand Down
20 changes: 20 additions & 0 deletions net/atm/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,26 @@ void vcc_release_async(struct atm_vcc *vcc, int reply)
}
EXPORT_SYMBOL(vcc_release_async);

void vcc_process_recv_queue(struct atm_vcc *vcc)
{
struct sk_buff_head queue, *rq;
struct sk_buff *skb, *tmp;
unsigned long flags;

__skb_queue_head_init(&queue);
rq = &sk_atm(vcc)->sk_receive_queue;

spin_lock_irqsave(&rq->lock, flags);
skb_queue_splice_init(rq, &queue);
spin_unlock_irqrestore(&rq->lock, flags);

skb_queue_walk_safe(&queue, skb, tmp) {
__skb_unlink(skb, &queue);
vcc->push(vcc, skb);
}
}
EXPORT_SYMBOL(vcc_process_recv_queue);

void atm_dev_signal_change(struct atm_dev *dev, char signal)
{
pr_debug("%s signal=%d dev=%p number=%d dev->signal=%d\n",
Expand Down
1 change: 1 addition & 0 deletions net/atm/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ int vcc_setsockopt(struct socket *sock, int level, int optname,
char __user *optval, unsigned int optlen);
int vcc_getsockopt(struct socket *sock, int level, int optname,
char __user *optval, int __user *optlen);
void vcc_process_recv_queue(struct atm_vcc *vcc);

int atmpvc_init(void);
void atmpvc_exit(void);
Expand Down
4 changes: 4 additions & 0 deletions net/atm/pppoatm.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,10 @@ static int pppoatm_assign_vcc(struct atm_vcc *atmvcc, void __user *arg)
atmvcc->push = pppoatm_push;
atmvcc->pop = pppoatm_pop;
__module_get(THIS_MODULE);

/* re-process everything received between connection setup and
backend setup */
vcc_process_recv_queue(atmvcc);
return 0;
}

Expand Down

0 comments on commit 4e55f57

Please sign in to comment.