Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Bluetooth: Store RFCOMM address information in its own socket structure

The address information of RFCOMM sockets should be stored in its
own socket structure. Trying to generalize them is not helpful since
different transports have different address types.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>

authored by

Marcel Holtmann and committed by
Johan Hedberg
94a86df0 eea96364

+17 -13
+2
include/net/bluetooth/rfcomm.h
··· 300 300 301 301 struct rfcomm_pinfo { 302 302 struct bt_sock bt; 303 + bdaddr_t src; 304 + bdaddr_t dst; 303 305 struct rfcomm_dlc *dlc; 304 306 u8 channel; 305 307 u8 sec_level;
+15 -13
net/bluetooth/rfcomm/sock.c
··· 87 87 parent->sk_data_ready(parent, 0); 88 88 } else { 89 89 if (d->state == BT_CONNECTED) 90 - rfcomm_session_getaddr(d->session, &bt_sk(sk)->src, NULL); 90 + rfcomm_session_getaddr(d->session, 91 + &rfcomm_pi(sk)->src, NULL); 91 92 sk->sk_state_change(sk); 92 93 } 93 94 ··· 111 110 112 111 sk_for_each(sk, &rfcomm_sk_list.head) { 113 112 if (rfcomm_pi(sk)->channel == channel && 114 - !bacmp(&bt_sk(sk)->src, src)) 113 + !bacmp(&rfcomm_pi(sk)->src, src)) 115 114 break; 116 115 } 117 116 ··· 133 132 134 133 if (rfcomm_pi(sk)->channel == channel) { 135 134 /* Exact match. */ 136 - if (!bacmp(&bt_sk(sk)->src, src)) 135 + if (!bacmp(&rfcomm_pi(sk)->src, src)) 137 136 break; 138 137 139 138 /* Closest match */ 140 - if (!bacmp(&bt_sk(sk)->src, BDADDR_ANY)) 139 + if (!bacmp(&rfcomm_pi(sk)->src, BDADDR_ANY)) 141 140 sk1 = sk; 142 141 } 143 142 } ··· 356 355 err = -EADDRINUSE; 357 356 } else { 358 357 /* Save source address */ 359 - bacpy(&bt_sk(sk)->src, &sa->rc_bdaddr); 358 + bacpy(&rfcomm_pi(sk)->src, &sa->rc_bdaddr); 360 359 rfcomm_pi(sk)->channel = sa->rc_channel; 361 360 sk->sk_state = BT_BOUND; 362 361 } ··· 394 393 } 395 394 396 395 sk->sk_state = BT_CONNECT; 397 - bacpy(&bt_sk(sk)->dst, &sa->rc_bdaddr); 396 + bacpy(&rfcomm_pi(sk)->dst, &sa->rc_bdaddr); 398 397 rfcomm_pi(sk)->channel = sa->rc_channel; 399 398 400 399 d->sec_level = rfcomm_pi(sk)->sec_level; 401 400 d->role_switch = rfcomm_pi(sk)->role_switch; 402 401 403 - err = rfcomm_dlc_open(d, &bt_sk(sk)->src, &sa->rc_bdaddr, sa->rc_channel); 402 + err = rfcomm_dlc_open(d, &rfcomm_pi(sk)->src, &sa->rc_bdaddr, 403 + sa->rc_channel); 404 404 if (!err) 405 405 err = bt_sock_wait_state(sk, BT_CONNECTED, 406 406 sock_sndtimeo(sk, flags & O_NONBLOCK)); ··· 431 429 } 432 430 433 431 if (!rfcomm_pi(sk)->channel) { 434 - bdaddr_t *src = &bt_sk(sk)->src; 432 + bdaddr_t *src = &rfcomm_pi(sk)->src; 435 433 u8 channel; 436 434 437 435 err = -EINVAL; ··· 532 530 sa->rc_family = AF_BLUETOOTH; 533 531 sa->rc_channel = rfcomm_pi(sk)->channel; 534 532 if (peer) 535 - bacpy(&sa->rc_bdaddr, &bt_sk(sk)->dst); 533 + bacpy(&sa->rc_bdaddr, &rfcomm_pi(sk)->dst); 536 534 else 537 - bacpy(&sa->rc_bdaddr, &bt_sk(sk)->src); 535 + bacpy(&sa->rc_bdaddr, &rfcomm_pi(sk)->src); 538 536 539 537 *len = sizeof(struct sockaddr_rc); 540 538 return 0; ··· 953 951 bt_sock_reclassify_lock(sk, BTPROTO_RFCOMM); 954 952 955 953 rfcomm_sock_init(sk, parent); 956 - bacpy(&bt_sk(sk)->src, &src); 957 - bacpy(&bt_sk(sk)->dst, &dst); 954 + bacpy(&rfcomm_pi(sk)->src, &src); 955 + bacpy(&rfcomm_pi(sk)->dst, &dst); 958 956 rfcomm_pi(sk)->channel = channel; 959 957 960 958 sk->sk_state = BT_CONFIG; ··· 981 979 982 980 sk_for_each(sk, &rfcomm_sk_list.head) { 983 981 seq_printf(f, "%pMR %pMR %d %d\n", 984 - &bt_sk(sk)->src, &bt_sk(sk)->dst, 982 + &rfcomm_pi(sk)->src, &rfcomm_pi(sk)->dst, 985 983 sk->sk_state, rfcomm_pi(sk)->channel); 986 984 } 987 985