aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/bluetooth/l2cap.h5
-rw-r--r--net/bluetooth/a2mp.c1
-rw-r--r--net/bluetooth/l2cap_core.c7
-rw-r--r--net/bluetooth/l2cap_sock.c10
4 files changed, 17 insertions, 6 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
index 9c6be72b6e4e..ae3a99bc31d0 100644
--- a/include/net/bluetooth/l2cap.h
+++ b/include/net/bluetooth/l2cap.h
@@ -555,6 +555,7 @@ struct l2cap_ops {
555 void (*ready) (struct l2cap_chan *chan); 555 void (*ready) (struct l2cap_chan *chan);
556 void (*defer) (struct l2cap_chan *chan); 556 void (*defer) (struct l2cap_chan *chan);
557 void (*resume) (struct l2cap_chan *chan); 557 void (*resume) (struct l2cap_chan *chan);
558 void (*set_shutdown) (struct l2cap_chan *chan);
558 long (*get_sndtimeo) (struct l2cap_chan *chan); 559 long (*get_sndtimeo) (struct l2cap_chan *chan);
559 struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan, 560 struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan,
560 unsigned long len, int nb); 561 unsigned long len, int nb);
@@ -796,6 +797,10 @@ static inline void l2cap_chan_no_defer(struct l2cap_chan *chan)
796{ 797{
797} 798}
798 799
800static inline void l2cap_chan_no_set_shutdown(struct l2cap_chan *chan)
801{
802}
803
799static inline long l2cap_chan_no_get_sndtimeo(struct l2cap_chan *chan) 804static inline long l2cap_chan_no_get_sndtimeo(struct l2cap_chan *chan)
800{ 805{
801 return 0; 806 return 0;
diff --git a/net/bluetooth/a2mp.c b/net/bluetooth/a2mp.c
index 1e9921024a1d..74c14779bed6 100644
--- a/net/bluetooth/a2mp.c
+++ b/net/bluetooth/a2mp.c
@@ -710,6 +710,7 @@ static struct l2cap_ops a2mp_chan_ops = {
710 .teardown = l2cap_chan_no_teardown, 710 .teardown = l2cap_chan_no_teardown,
711 .ready = l2cap_chan_no_ready, 711 .ready = l2cap_chan_no_ready,
712 .defer = l2cap_chan_no_defer, 712 .defer = l2cap_chan_no_defer,
713 .set_shutdown = l2cap_chan_no_set_shutdown,
713 .get_sndtimeo = l2cap_chan_no_get_sndtimeo, 714 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
714}; 715};
715 716
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index c6334fc86d1d..634781a60d3f 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -4241,7 +4241,6 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
4241 struct l2cap_disconn_rsp rsp; 4241 struct l2cap_disconn_rsp rsp;
4242 u16 dcid, scid; 4242 u16 dcid, scid;
4243 struct l2cap_chan *chan; 4243 struct l2cap_chan *chan;
4244 struct sock *sk;
4245 4244
4246 if (cmd_len != sizeof(*req)) 4245 if (cmd_len != sizeof(*req))
4247 return -EPROTO; 4246 return -EPROTO;
@@ -4261,15 +4260,11 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn,
4261 4260
4262 l2cap_chan_lock(chan); 4261 l2cap_chan_lock(chan);
4263 4262
4264 sk = chan->sk;
4265
4266 rsp.dcid = cpu_to_le16(chan->scid); 4263 rsp.dcid = cpu_to_le16(chan->scid);
4267 rsp.scid = cpu_to_le16(chan->dcid); 4264 rsp.scid = cpu_to_le16(chan->dcid);
4268 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp); 4265 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp);
4269 4266
4270 lock_sock(sk); 4267 chan->ops->set_shutdown(chan);
4271 sk->sk_shutdown = SHUTDOWN_MASK;
4272 release_sock(sk);
4273 4268
4274 l2cap_chan_hold(chan); 4269 l2cap_chan_hold(chan);
4275 l2cap_chan_del(chan, ECONNRESET); 4270 l2cap_chan_del(chan, ECONNRESET);
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index ffa78d3cd8ac..301f25b9b521 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -1136,6 +1136,15 @@ static void l2cap_sock_resume_cb(struct l2cap_chan *chan)
1136 sk->sk_state_change(sk); 1136 sk->sk_state_change(sk);
1137} 1137}
1138 1138
1139static void l2cap_sock_set_shutdown_cb(struct l2cap_chan *chan)
1140{
1141 struct sock *sk = chan->data;
1142
1143 lock_sock(sk);
1144 sk->sk_shutdown = SHUTDOWN_MASK;
1145 release_sock(sk);
1146}
1147
1139static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan) 1148static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan)
1140{ 1149{
1141 struct sock *sk = chan->data; 1150 struct sock *sk = chan->data;
@@ -1153,6 +1162,7 @@ static struct l2cap_ops l2cap_chan_ops = {
1153 .ready = l2cap_sock_ready_cb, 1162 .ready = l2cap_sock_ready_cb,
1154 .defer = l2cap_sock_defer_cb, 1163 .defer = l2cap_sock_defer_cb,
1155 .resume = l2cap_sock_resume_cb, 1164 .resume = l2cap_sock_resume_cb,
1165 .set_shutdown = l2cap_sock_set_shutdown_cb,
1156 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb, 1166 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
1157 .alloc_skb = l2cap_sock_alloc_skb_cb, 1167 .alloc_skb = l2cap_sock_alloc_skb_cb,
1158}; 1168};