if (!nskb)
                        continue;
 
-               if (sock_queue_rcv_skb(sk, nskb))
+               if (chan->ops->recv(chan->data, nskb))
                        kfree_skb(nskb);
        }
        read_unlock(&conn->chan_lock);
                if (chan->conn_state & L2CAP_CONN_SAR_SDU)
                        goto drop;
 
-               return sock_queue_rcv_skb(chan->sk, skb);
+               return chan->ops->recv(chan->data, skb);
 
        case L2CAP_SDU_START:
                if (chan->conn_state & L2CAP_CONN_SAR_SDU)
                        return -ENOMEM;
                }
 
-               err = sock_queue_rcv_skb(chan->sk, _skb);
+               err = chan->ops->recv(chan->data, _skb);
                if (err < 0) {
                        kfree_skb(_skb);
                        chan->conn_state |= L2CAP_CONN_SAR_RETRY;
                        break;
                }
 
-               err = sock_queue_rcv_skb(chan->sk, skb);
+               err = chan->ops->recv(chan->data, skb);
                if (!err)
                        return 0;
 
 
                if (chan->partial_sdu_len == chan->sdu_len) {
                        _skb = skb_clone(chan->sdu, GFP_ATOMIC);
-                       err = sock_queue_rcv_skb(chan->sk, _skb);
+                       err = chan->ops->recv(chan->data, _skb);
                        if (err < 0)
                                kfree_skb(_skb);
                }
                if (chan->imtu < skb->len)
                        goto drop;
 
-               if (!sock_queue_rcv_skb(sk, skb))
+               if (!chan->ops->recv(chan->data, skb))
                        goto done;
                break;
 
        if (l2cap_pi(sk)->chan->imtu < skb->len)
                goto drop;
 
-       if (!sock_queue_rcv_skb(sk, skb))
+       if (!chan->ops->recv(chan->data, skb))
                goto done;
 
 drop:
        if (l2cap_pi(sk)->chan->imtu < skb->len)
                goto drop;
 
-       if (!sock_queue_rcv_skb(sk, skb))
+       if (!chan->ops->recv(chan->data, skb))
                goto done;
 
 drop:
 
        return l2cap_pi(sk)->chan;
 }
 
+static int l2cap_sock_recv_cb(void *data, struct sk_buff *skb)
+{
+       struct sock *sk = data;
+
+       return sock_queue_rcv_skb(sk, skb);
+}
+
 static struct l2cap_ops l2cap_chan_ops = {
        .name           = "L2CAP Socket Interface",
        .new_connection = l2cap_sock_new_connection_cb,
+       .recv           = l2cap_sock_recv_cb,
 };
 
 static void l2cap_sock_destruct(struct sock *sk)