@@ -261,14 +261,19 @@ static void rfcomm_sock_init(struct sock *sk, struct sock *parent)
261261
262262 if (parent ) {
263263 sk -> sk_type = parent -> sk_type ;
264- pi -> link_mode = rfcomm_pi (parent )-> link_mode ;
265264 pi -> dlc -> defer_setup = bt_sk (parent )-> defer_setup ;
265+
266+ pi -> sec_level = rfcomm_pi (parent )-> sec_level ;
267+ pi -> role_switch = rfcomm_pi (parent )-> role_switch ;
266268 } else {
267- pi -> link_mode = 0 ;
268269 pi -> dlc -> defer_setup = 0 ;
270+
271+ pi -> sec_level = BT_SECURITY_LOW ;
272+ pi -> role_switch = 0 ;
269273 }
270274
271- pi -> dlc -> link_mode = pi -> link_mode ;
275+ pi -> dlc -> sec_level = pi -> sec_level ;
276+ pi -> dlc -> role_switch = pi -> role_switch ;
272277}
273278
274279static struct proto rfcomm_proto = {
@@ -408,7 +413,8 @@ static int rfcomm_sock_connect(struct socket *sock, struct sockaddr *addr, int a
408413 bacpy (& bt_sk (sk )-> dst , & sa -> rc_bdaddr );
409414 rfcomm_pi (sk )-> channel = sa -> rc_channel ;
410415
411- d -> link_mode = rfcomm_pi (sk )-> link_mode ;
416+ d -> sec_level = rfcomm_pi (sk )-> sec_level ;
417+ d -> role_switch = rfcomm_pi (sk )-> role_switch ;
412418
413419 err = rfcomm_dlc_open (d , & bt_sk (sk )-> src , & sa -> rc_bdaddr , sa -> rc_channel );
414420 if (!err )
@@ -741,7 +747,14 @@ static int rfcomm_sock_setsockopt_old(struct socket *sock, int optname, char __u
741747 break ;
742748 }
743749
744- rfcomm_pi (sk )-> link_mode = opt ;
750+ if (opt & RFCOMM_LM_AUTH )
751+ rfcomm_pi (sk )-> sec_level = BT_SECURITY_LOW ;
752+ if (opt & RFCOMM_LM_ENCRYPT )
753+ rfcomm_pi (sk )-> sec_level = BT_SECURITY_MEDIUM ;
754+ if (opt & RFCOMM_LM_SECURE )
755+ rfcomm_pi (sk )-> sec_level = BT_SECURITY_HIGH ;
756+
757+ rfcomm_pi (sk )-> role_switch = (opt & RFCOMM_LM_MASTER );
745758 break ;
746759
747760 default :
@@ -756,7 +769,8 @@ static int rfcomm_sock_setsockopt_old(struct socket *sock, int optname, char __u
756769static int rfcomm_sock_setsockopt (struct socket * sock , int level , int optname , char __user * optval , int optlen )
757770{
758771 struct sock * sk = sock -> sk ;
759- int err = 0 ;
772+ struct bt_security sec ;
773+ int len , err = 0 ;
760774 u32 opt ;
761775
762776 BT_DBG ("sk %p" , sk );
@@ -767,6 +781,23 @@ static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, c
767781 lock_sock (sk );
768782
769783 switch (optname ) {
784+ case BT_SECURITY :
785+ sec .level = BT_SECURITY_LOW ;
786+
787+ len = min_t (unsigned int , sizeof (sec ), optlen );
788+ if (copy_from_user ((char * ) & sec , optval , len )) {
789+ err = - EFAULT ;
790+ break ;
791+ }
792+
793+ if (sec .level > BT_SECURITY_HIGH ) {
794+ err = - EINVAL ;
795+ break ;
796+ }
797+
798+ rfcomm_pi (sk )-> sec_level = sec .level ;
799+ break ;
800+
770801 case BT_DEFER_SETUP :
771802 if (sk -> sk_state != BT_BOUND && sk -> sk_state != BT_LISTEN ) {
772803 err = - EINVAL ;
@@ -796,6 +827,7 @@ static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, char __u
796827 struct sock * l2cap_sk ;
797828 struct rfcomm_conninfo cinfo ;
798829 int len , err = 0 ;
830+ u32 opt ;
799831
800832 BT_DBG ("sk %p" , sk );
801833
@@ -806,7 +838,26 @@ static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, char __u
806838
807839 switch (optname ) {
808840 case RFCOMM_LM :
809- if (put_user (rfcomm_pi (sk )-> link_mode , (u32 __user * ) optval ))
841+ switch (rfcomm_pi (sk )-> sec_level ) {
842+ case BT_SECURITY_LOW :
843+ opt = RFCOMM_LM_AUTH ;
844+ break ;
845+ case BT_SECURITY_MEDIUM :
846+ opt = RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT ;
847+ break ;
848+ case BT_SECURITY_HIGH :
849+ opt = RFCOMM_LM_AUTH | RFCOMM_LM_ENCRYPT |
850+ RFCOMM_LM_SECURE ;
851+ break ;
852+ default :
853+ opt = 0 ;
854+ break ;
855+ }
856+
857+ if (rfcomm_pi (sk )-> role_switch )
858+ opt |= RFCOMM_LM_MASTER ;
859+
860+ if (put_user (opt , (u32 __user * ) optval ))
810861 err = - EFAULT ;
811862 break ;
812863
@@ -840,6 +891,7 @@ static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, char __u
840891static int rfcomm_sock_getsockopt (struct socket * sock , int level , int optname , char __user * optval , int __user * optlen )
841892{
842893 struct sock * sk = sock -> sk ;
894+ struct bt_security sec ;
843895 int len , err = 0 ;
844896
845897 BT_DBG ("sk %p" , sk );
@@ -853,6 +905,15 @@ static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optname, c
853905 lock_sock (sk );
854906
855907 switch (optname ) {
908+ case BT_SECURITY :
909+ sec .level = rfcomm_pi (sk )-> sec_level ;
910+
911+ len = min_t (unsigned int , len , sizeof (sec ));
912+ if (copy_to_user (optval , (char * ) & sec , len ))
913+ err = - EFAULT ;
914+
915+ break ;
916+
856917 case BT_DEFER_SETUP :
857918 if (sk -> sk_state != BT_BOUND && sk -> sk_state != BT_LISTEN ) {
858919 err = - EINVAL ;
0 commit comments