diff options
| -rw-r--r-- | include/net/bluetooth/l2cap.h | 5 | ||||
| -rw-r--r-- | net/bluetooth/a2mp.c | 1 | ||||
| -rw-r--r-- | net/bluetooth/l2cap_core.c | 7 | ||||
| -rw-r--r-- | net/bluetooth/l2cap_sock.c | 10 |
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 | ||
| 800 | static inline void l2cap_chan_no_set_shutdown(struct l2cap_chan *chan) | ||
| 801 | { | ||
| 802 | } | ||
| 803 | |||
| 799 | static inline long l2cap_chan_no_get_sndtimeo(struct l2cap_chan *chan) | 804 | static 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 | ||
| 1139 | static 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 | |||
| 1139 | static long l2cap_sock_get_sndtimeo_cb(struct l2cap_chan *chan) | 1148 | static 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 | }; |
