]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - net/bluetooth/rfcomm/core.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[mv-sheeva.git] / net / bluetooth / rfcomm / core.c
index 7dca91bb8c576397e571994655efbe9d1832d7b6..fa642aa652bdba0d4b0b3f47c77dc9e55571c19f 100644 (file)
@@ -79,7 +79,10 @@ static void rfcomm_make_uih(struct sk_buff *skb, u8 addr);
 
 static void rfcomm_process_connect(struct rfcomm_session *s);
 
-static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst, int *err);
+static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src,
+                                                       bdaddr_t *dst,
+                                                       u8 sec_level,
+                                                       int *err);
 static struct rfcomm_session *rfcomm_session_get(bdaddr_t *src, bdaddr_t *dst);
 static void rfcomm_session_del(struct rfcomm_session *s);
 
@@ -113,11 +116,10 @@ static void rfcomm_session_del(struct rfcomm_session *s);
 #define __get_rpn_stop_bits(line) (((line) >> 2) & 0x1)
 #define __get_rpn_parity(line)    (((line) >> 3) & 0x7)
 
-static inline void rfcomm_schedule(uint event)
+static inline void rfcomm_schedule(void)
 {
        if (!rfcomm_thread)
                return;
-       //set_bit(event, &rfcomm_event);
        set_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event);
        wake_up_process(rfcomm_thread);
 }
@@ -179,13 +181,13 @@ static unsigned char rfcomm_crc_table[256] = {
 /* FCS on 2 bytes */
 static inline u8 __fcs(u8 *data)
 {
-       return (0xff - __crc(data));
+       return 0xff - __crc(data);
 }
 
 /* FCS on 3 bytes */
 static inline u8 __fcs2(u8 *data)
 {
-       return (0xff - rfcomm_crc_table[__crc(data) ^ data[2]]);
+       return 0xff - rfcomm_crc_table[__crc(data) ^ data[2]];
 }
 
 /* Check FCS */
@@ -203,13 +205,13 @@ static inline int __check_fcs(u8 *data, int type, u8 fcs)
 static void rfcomm_l2state_change(struct sock *sk)
 {
        BT_DBG("%p state %d", sk, sk->sk_state);
-       rfcomm_schedule(RFCOMM_SCHED_STATE);
+       rfcomm_schedule();
 }
 
 static void rfcomm_l2data_ready(struct sock *sk, int bytes)
 {
        BT_DBG("%p bytes %d", sk, bytes);
-       rfcomm_schedule(RFCOMM_SCHED_RX);
+       rfcomm_schedule();
 }
 
 static int rfcomm_l2sock_create(struct socket **sock)
@@ -255,7 +257,7 @@ static void rfcomm_session_timeout(unsigned long arg)
        BT_DBG("session %p state %ld", s, s->state);
 
        set_bit(RFCOMM_TIMED_OUT, &s->flags);
-       rfcomm_schedule(RFCOMM_SCHED_TIMEO);
+       rfcomm_schedule();
 }
 
 static void rfcomm_session_set_timer(struct rfcomm_session *s, long timeout)
@@ -283,7 +285,7 @@ static void rfcomm_dlc_timeout(unsigned long arg)
 
        set_bit(RFCOMM_TIMED_OUT, &d->flags);
        rfcomm_dlc_put(d);
-       rfcomm_schedule(RFCOMM_SCHED_TIMEO);
+       rfcomm_schedule();
 }
 
 static void rfcomm_dlc_set_timer(struct rfcomm_dlc *d, long timeout)
@@ -402,7 +404,7 @@ static int __rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst,
 
        s = rfcomm_session_get(src, dst);
        if (!s) {
-               s = rfcomm_session_create(src, dst, &err);
+               s = rfcomm_session_create(src, dst, d->sec_level, &err);
                if (!s)
                        return err;
        }
@@ -465,7 +467,7 @@ static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
        case BT_CONFIG:
                if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
                        set_bit(RFCOMM_AUTH_REJECT, &d->flags);
-                       rfcomm_schedule(RFCOMM_SCHED_AUTH);
+                       rfcomm_schedule();
                        break;
                }
                /* Fall through */
@@ -485,7 +487,7 @@ static int __rfcomm_dlc_close(struct rfcomm_dlc *d, int err)
        case BT_CONNECT2:
                if (test_and_clear_bit(RFCOMM_DEFER_SETUP, &d->flags)) {
                        set_bit(RFCOMM_AUTH_REJECT, &d->flags);
-                       rfcomm_schedule(RFCOMM_SCHED_AUTH);
+                       rfcomm_schedule();
                        break;
                }
                /* Fall through */
@@ -533,7 +535,7 @@ int rfcomm_dlc_send(struct rfcomm_dlc *d, struct sk_buff *skb)
        skb_queue_tail(&d->tx_queue, skb);
 
        if (!test_bit(RFCOMM_TX_THROTTLED, &d->flags))
-               rfcomm_schedule(RFCOMM_SCHED_TX);
+               rfcomm_schedule();
        return len;
 }
 
@@ -545,7 +547,7 @@ void __rfcomm_dlc_throttle(struct rfcomm_dlc *d)
                d->v24_sig |= RFCOMM_V24_FC;
                set_bit(RFCOMM_MSC_PENDING, &d->flags);
        }
-       rfcomm_schedule(RFCOMM_SCHED_TX);
+       rfcomm_schedule();
 }
 
 void __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
@@ -556,7 +558,7 @@ void __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
                d->v24_sig &= ~RFCOMM_V24_FC;
                set_bit(RFCOMM_MSC_PENDING, &d->flags);
        }
-       rfcomm_schedule(RFCOMM_SCHED_TX);
+       rfcomm_schedule();
 }
 
 /*
@@ -577,7 +579,7 @@ int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig)
        d->v24_sig = v24_sig;
 
        if (!test_and_set_bit(RFCOMM_MSC_PENDING, &d->flags))
-               rfcomm_schedule(RFCOMM_SCHED_TX);
+               rfcomm_schedule();
 
        return 0;
 }
@@ -680,7 +682,10 @@ static void rfcomm_session_close(struct rfcomm_session *s, int err)
        rfcomm_session_put(s);
 }
 
-static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst, int *err)
+static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src,
+                                                       bdaddr_t *dst,
+                                                       u8 sec_level,
+                                                       int *err)
 {
        struct rfcomm_session *s = NULL;
        struct sockaddr_l2 addr;
@@ -705,6 +710,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst
        sk = sock->sk;
        lock_sock(sk);
        l2cap_pi(sk)->imtu = l2cap_mtu;
+       l2cap_pi(sk)->sec_level = sec_level;
        if (l2cap_ertm)
                l2cap_pi(sk)->mode = L2CAP_MODE_ERTM;
        release_sock(sk);
@@ -816,7 +822,7 @@ static int rfcomm_queue_disc(struct rfcomm_dlc *d)
        cmd->fcs  = __fcs2((u8 *) cmd);
 
        skb_queue_tail(&d->tx_queue, skb);
-       rfcomm_schedule(RFCOMM_SCHED_TX);
+       rfcomm_schedule();
        return 0;
 }
 
@@ -1415,8 +1421,8 @@ static int rfcomm_recv_rpn(struct rfcomm_session *s, int cr, int len, struct sk_
                return 0;
 
        if (len == 1) {
-               /* This is a request, return default settings */
-               bit_rate  = RFCOMM_RPN_BR_115200;
+               /* This is a request, return default (according to ETSI TS 07.10) settings */
+               bit_rate  = RFCOMM_RPN_BR_9600;
                data_bits = RFCOMM_RPN_DATA_8;
                stop_bits = RFCOMM_RPN_STOP_1;
                parity    = RFCOMM_RPN_PARITY_NONE;
@@ -1431,9 +1437,9 @@ static int rfcomm_recv_rpn(struct rfcomm_session *s, int cr, int len, struct sk_
 
        if (rpn->param_mask & cpu_to_le16(RFCOMM_RPN_PM_BITRATE)) {
                bit_rate = rpn->bit_rate;
-               if (bit_rate != RFCOMM_RPN_BR_115200) {
+               if (bit_rate > RFCOMM_RPN_BR_230400) {
                        BT_DBG("RPN bit rate mismatch 0x%x", bit_rate);
-                       bit_rate = RFCOMM_RPN_BR_115200;
+                       bit_rate = RFCOMM_RPN_BR_9600;
                        rpn_mask ^= RFCOMM_RPN_PM_BITRATE;
                }
        }
@@ -1698,7 +1704,7 @@ static int rfcomm_recv_frame(struct rfcomm_session *s, struct sk_buff *skb)
                break;
 
        default:
-               BT_ERR("Unknown packet type 0x%02x\n", type);
+               BT_ERR("Unknown packet type 0x%02x", type);
                break;
        }
        kfree_skb(skb);
@@ -1884,7 +1890,7 @@ static inline void rfcomm_accept_connection(struct rfcomm_session *s)
                 * L2CAP MTU minus UIH header and FCS. */
                s->mtu = min(l2cap_pi(nsock->sk)->omtu, l2cap_pi(nsock->sk)->imtu) - 5;
 
-               rfcomm_schedule(RFCOMM_SCHED_RX);
+               rfcomm_schedule();
        } else
                sock_release(nsock);
 }
@@ -2093,7 +2099,7 @@ static void rfcomm_security_cfm(struct hci_conn *conn, u8 status, u8 encrypt)
 
        rfcomm_session_put(s);
 
-       rfcomm_schedule(RFCOMM_SCHED_AUTH);
+       rfcomm_schedule();
 }
 
 static struct hci_cb rfcomm_cb = {