diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2012-11-28 04:03:11 +0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2012-12-02 04:05:12 +0400 |
commit | c971f08cba56ed17fe22040ca5ff97fe5c3f0bd7 (patch) | |
tree | 1b445a3e1fc333b816d7dc0b9ad5e34ad9645945 | |
parent | 7ad3eadebcb1778c11bbf0fe059d0804173a8123 (diff) | |
download | linux-c971f08cba56ed17fe22040ca5ff97fe5c3f0bd7.tar.xz |
atm: add release_cb() callback to vcc
The immediate use case for this is that it will allow us to ensure that a
pppoatm queue is woken after it has to drop a packet due to the sock being
locked.
Note that 'release_cb' is called when the socket is *unlocked*. This is
not to be confused with vcc_release() — which probably ought to be called
vcc_close().
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Acked-by: Krzysztof Mazur <krzysiek@podlesie.net>
-rw-r--r-- | include/linux/atmdev.h | 1 | ||||
-rw-r--r-- | net/atm/common.c | 10 |
2 files changed, 11 insertions, 0 deletions
diff --git a/include/linux/atmdev.h b/include/linux/atmdev.h index 72db2af902a8..c1da539f5e28 100644 --- a/include/linux/atmdev.h +++ b/include/linux/atmdev.h @@ -99,6 +99,7 @@ struct atm_vcc { struct atm_dev *dev; /* device back pointer */ struct atm_qos qos; /* QOS */ struct atm_sap sap; /* SAP */ + void (*release_cb)(struct atm_vcc *vcc); /* release_sock callback */ void (*push)(struct atm_vcc *vcc,struct sk_buff *skb); void (*pop)(struct atm_vcc *vcc,struct sk_buff *skb); /* optional */ int (*push_oam)(struct atm_vcc *vcc,void *cell); diff --git a/net/atm/common.c b/net/atm/common.c index 24216642d696..806fc0a40051 100644 --- a/net/atm/common.c +++ b/net/atm/common.c @@ -126,10 +126,19 @@ static void vcc_write_space(struct sock *sk) rcu_read_unlock(); } +static void vcc_release_cb(struct sock *sk) +{ + struct atm_vcc *vcc = atm_sk(sk); + + if (vcc->release_cb) + vcc->release_cb(vcc); +} + static struct proto vcc_proto = { .name = "VCC", .owner = THIS_MODULE, .obj_size = sizeof(struct atm_vcc), + .release_cb = vcc_release_cb, }; int vcc_create(struct net *net, struct socket *sock, int protocol, int family) @@ -158,6 +167,7 @@ int vcc_create(struct net *net, struct socket *sock, int protocol, int family) vcc->pop = NULL; vcc->owner = NULL; vcc->push_oam = NULL; + vcc->release_cb = NULL; vcc->vpi = vcc->vci = 0; /* no VCI/VPI yet */ vcc->atm_options = vcc->aal_options = 0; sk->sk_destruct = vcc_sock_destruct; |