|
@@ -332,7 +332,9 @@ void __skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb, int len)
|
|
|
EXPORT_SYMBOL(__skb_free_datagram_locked);
|
|
|
|
|
|
int __sk_queue_drop_skb(struct sock *sk, struct sk_buff *skb,
|
|
|
- unsigned int flags)
|
|
|
+ unsigned int flags,
|
|
|
+ void (*destructor)(struct sock *sk,
|
|
|
+ struct sk_buff *skb))
|
|
|
{
|
|
|
int err = 0;
|
|
|
|
|
@@ -342,6 +344,8 @@ int __sk_queue_drop_skb(struct sock *sk, struct sk_buff *skb,
|
|
|
if (skb == skb_peek(&sk->sk_receive_queue)) {
|
|
|
__skb_unlink(skb, &sk->sk_receive_queue);
|
|
|
atomic_dec(&skb->users);
|
|
|
+ if (destructor)
|
|
|
+ destructor(sk, skb);
|
|
|
err = 0;
|
|
|
}
|
|
|
spin_unlock_bh(&sk->sk_receive_queue.lock);
|
|
@@ -375,7 +379,7 @@ EXPORT_SYMBOL(__sk_queue_drop_skb);
|
|
|
|
|
|
int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags)
|
|
|
{
|
|
|
- int err = __sk_queue_drop_skb(sk, skb, flags);
|
|
|
+ int err = __sk_queue_drop_skb(sk, skb, flags, NULL);
|
|
|
|
|
|
kfree_skb(skb);
|
|
|
sk_mem_reclaim_partial(sk);
|