Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
735fe7c5
Commit
735fe7c5
authored
Dec 16, 2002
by
Marcel Holtmann
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux.bkbits.net/linux-2.5
into hostme.bitkeeper.com:/ua/repos/l/linux-bt/bt-2.5
parents
4749dedc
76762efa
Changes
15
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
1066 additions
and
123 deletions
+1066
-123
drivers/bluetooth/Kconfig
drivers/bluetooth/Kconfig
+34
-10
drivers/bluetooth/Makefile
drivers/bluetooth/Makefile
+1
-0
drivers/bluetooth/btuart_cs.c
drivers/bluetooth/btuart_cs.c
+907
-0
include/net/bluetooth/hci.h
include/net/bluetooth/hci.h
+1
-0
include/net/bluetooth/l2cap.h
include/net/bluetooth/l2cap.h
+2
-0
net/bluetooth/Kconfig
net/bluetooth/Kconfig
+7
-7
net/bluetooth/bnep/Kconfig
net/bluetooth/bnep/Kconfig
+2
-2
net/bluetooth/bnep/core.c
net/bluetooth/bnep/core.c
+30
-28
net/bluetooth/hci_core.c
net/bluetooth/hci_core.c
+2
-2
net/bluetooth/l2cap.c
net/bluetooth/l2cap.c
+65
-62
net/bluetooth/rfcomm/Kconfig
net/bluetooth/rfcomm/Kconfig
+1
-1
net/bluetooth/rfcomm/core.c
net/bluetooth/rfcomm/core.c
+5
-2
net/bluetooth/rfcomm/sock.c
net/bluetooth/rfcomm/sock.c
+1
-1
net/bluetooth/rfcomm/tty.c
net/bluetooth/rfcomm/tty.c
+7
-7
net/bluetooth/sco.c
net/bluetooth/sco.c
+1
-1
No files found.
drivers/bluetooth/Kconfig
View file @
735fe7c5
menu "Bluetooth device drivers"
menu "Bluetooth device drivers"
depends on BT
!=n
depends on BT
config BT_HCIUSB
config BT_HCIUSB
tristate "HCI USB driver"
tristate "HCI USB driver"
...
@@ -52,11 +52,19 @@ config BT_HCIUART_BCSP
...
@@ -52,11 +52,19 @@ config BT_HCIUART_BCSP
help
help
BCSP (BlueCore Serial Protocol) is serial protocol for communication
BCSP (BlueCore Serial Protocol) is serial protocol for communication
between Bluetooth device and host. This protocol is required for non
between Bluetooth device and host. This protocol is required for non
USB Bluetooth devices based on CSR BlueCore chip, including PCMCIA and
USB Bluetooth devices based on CSR BlueCore chip, including PCMCIA and
CF cards.
CF cards.
Say Y here to compile support for HCI BCSP protocol.
Say Y here to compile support for HCI BCSP protocol.
config BT_HCIUART_BCSP_TXCRC
bool "Transmit CRC with every BCSP packet"
depends on BT_HCIUART_BCSP
help
If you say Y here, a 16-bit CRC checksum will be transmitted along with
every BCSP (BlueCore Serial Protocol) packet sent to the Bluetooth chip.
This increases reliability, but slightly reduces efficiency.
config BT_HCIDTL1
config BT_HCIDTL1
tristate "HCI DTL1 (PC Card) driver"
tristate "HCI DTL1 (PC Card) driver"
depends on PCMCIA && BT
depends on PCMCIA && BT
...
@@ -64,8 +72,8 @@ config BT_HCIDTL1
...
@@ -64,8 +72,8 @@ config BT_HCIDTL1
Bluetooth HCI DTL1 (PC Card) driver.
Bluetooth HCI DTL1 (PC Card) driver.
This driver provides support for Bluetooth PCMCIA devices with
This driver provides support for Bluetooth PCMCIA devices with
Nokia DTL1 interface:
Nokia DTL1 interface:
Nokia Bluetooth Card
Nokia Bluetooth Card
Socket Bluetooth CF Card
Socket Bluetooth CF Card
Say Y here to compile support for HCI DTL1 devices into the
Say Y here to compile support for HCI DTL1 devices into the
kernel or say M to compile it as module (dtl1_cs.o).
kernel or say M to compile it as module (dtl1_cs.o).
...
@@ -73,12 +81,12 @@ config BT_HCIDTL1
...
@@ -73,12 +81,12 @@ config BT_HCIDTL1
config BT_HCIBT3C
config BT_HCIBT3C
tristate "HCI BT3C (PC Card) driver"
tristate "HCI BT3C (PC Card) driver"
depends on PCMCIA && BT
depends on PCMCIA && BT
---help---
help
Bluetooth HCI BT3C (PC Card) driver.
Bluetooth HCI BT3C (PC Card) driver.
This driver provides support for Bluetooth PCMCIA devices with
This driver provides support for Bluetooth PCMCIA devices with
3Com BT3C interface:
3Com BT3C interface:
3Com Bluetooth Card (3CRWB6096)
3Com Bluetooth Card (3CRWB6096)
HP Bluetooth Card
HP Bluetooth Card
The HCI BT3C driver uses external firmware loader program provided in
The HCI BT3C driver uses external firmware loader program provided in
the BlueFW package. For more information, see <http://bluez.sf.net>.
the BlueFW package. For more information, see <http://bluez.sf.net>.
...
@@ -92,13 +100,29 @@ config BT_HCIBLUECARD
...
@@ -92,13 +100,29 @@ config BT_HCIBLUECARD
help
help
Bluetooth HCI BlueCard (PC Card) driver.
Bluetooth HCI BlueCard (PC Card) driver.
This driver provides support for Bluetooth PCMCIA devices with
This driver provides support for Bluetooth PCMCIA devices with
Anycom BlueCard interface:
Anycom BlueCard interface:
Anycom Bluetooth PC Card
Anycom Bluetooth PC Card
Anycom Bluetooth CF Card
Anycom Bluetooth CF Card
Say Y here to compile support for HCI BlueCard devices into the
Say Y here to compile support for HCI BlueCard devices into the
kernel or say M to compile it as module (bluecard_cs.o).
kernel or say M to compile it as module (bluecard_cs.o).
config BT_HCIBTUART
tristate "HCI UART (PC Card) device driver"
depends on PCMCIA && BT
help
Bluetooth HCI UART (PC Card) driver.
This driver provides support for Bluetooth PCMCIA devices with
an UART interface:
Xircom CreditCard Bluetooth Adapter
Xircom RealPort2 Bluetooth Adapter
Sphinx PICO Card
H-Soft blue+Card
Cyber-blue Compact Flash Card
Say Y here to compile support for HCI UART devices into the
kernel or say M to compile it as module (btuart_cs.o).
config BT_HCIVHCI
config BT_HCIVHCI
tristate "HCI VHCI (Virtual HCI device) driver"
tristate "HCI VHCI (Virtual HCI device) driver"
depends on BT
depends on BT
...
...
drivers/bluetooth/Makefile
View file @
735fe7c5
...
@@ -8,6 +8,7 @@ obj-$(CONFIG_BT_HCIUART) += hci_uart.o
...
@@ -8,6 +8,7 @@ obj-$(CONFIG_BT_HCIUART) += hci_uart.o
obj-$(CONFIG_BT_HCIDTL1)
+=
dtl1_cs.o
obj-$(CONFIG_BT_HCIDTL1)
+=
dtl1_cs.o
obj-$(CONFIG_BT_HCIBT3C)
+=
bt3c_cs.o
obj-$(CONFIG_BT_HCIBT3C)
+=
bt3c_cs.o
obj-$(CONFIG_BT_HCIBLUECARD)
+=
bluecard_cs.o
obj-$(CONFIG_BT_HCIBLUECARD)
+=
bluecard_cs.o
obj-$(CONFIG_BT_HCIBTUART)
+=
btuart_cs.o
hci_uart-y
:=
hci_ldisc.o
hci_uart-y
:=
hci_ldisc.o
hci_uart-$(CONFIG_BT_HCIUART_H4)
+=
hci_h4.o
hci_uart-$(CONFIG_BT_HCIUART_H4)
+=
hci_h4.o
...
...
drivers/bluetooth/btuart_cs.c
0 → 100644
View file @
735fe7c5
This diff is collapsed.
Click to expand it.
include/net/bluetooth/hci.h
View file @
735fe7c5
...
@@ -48,6 +48,7 @@
...
@@ -48,6 +48,7 @@
#define HCI_PCCARD 2
#define HCI_PCCARD 2
#define HCI_UART 3
#define HCI_UART 3
#define HCI_RS232 4
#define HCI_RS232 4
#define HCI_PCI 5
/* HCI device flags */
/* HCI device flags */
enum
{
enum
{
...
...
include/net/bluetooth/l2cap.h
View file @
735fe7c5
...
@@ -224,6 +224,8 @@ struct l2cap_pinfo {
...
@@ -224,6 +224,8 @@ struct l2cap_pinfo {
__u8
ident
;
__u8
ident
;
__u16
sport
;
struct
l2cap_conn
*
conn
;
struct
l2cap_conn
*
conn
;
struct
sock
*
next_c
;
struct
sock
*
next_c
;
struct
sock
*
prev_c
;
struct
sock
*
prev_c
;
...
...
net/bluetooth/Kconfig
View file @
735fe7c5
...
@@ -7,7 +7,7 @@ menu "Bluetooth support"
...
@@ -7,7 +7,7 @@ menu "Bluetooth support"
config BT
config BT
tristate "Bluetooth subsystem support"
tristate "Bluetooth subsystem support"
---help---
help
Bluetooth is low-cost, low-power, short-range wireless technology.
Bluetooth is low-cost, low-power, short-range wireless technology.
It was designed as a replacement for cables and other short-range
It was designed as a replacement for cables and other short-range
technologies like IrDA. Bluetooth operates in personal area range
technologies like IrDA. Bluetooth operates in personal area range
...
@@ -15,12 +15,12 @@ config BT
...
@@ -15,12 +15,12 @@ config BT
Bluetooth can be found at <http://www.bluetooth.com/>.
Bluetooth can be found at <http://www.bluetooth.com/>.
Linux Bluetooth subsystem consist of several layers:
Linux Bluetooth subsystem consist of several layers:
Bluetooth Core (HCI device and connection manager, scheduler)
Bluetooth Core (HCI device and connection manager, scheduler)
HCI Device drivers (interface to the hardware)
HCI Device drivers (interface to the hardware)
L2CAP Module (L2CAP protocol)
L2CAP Module (L2CAP protocol)
SCO Module (SCO links)
SCO Module (SCO links)
RFCOMM Module (RFCOMM protocol)
RFCOMM Module (RFCOMM protocol)
BNEP Module (BNEP protocol)
BNEP Module (BNEP protocol)
Say Y here to enable Linux Bluetooth support and to build Bluetooth Core
Say Y here to enable Linux Bluetooth support and to build Bluetooth Core
layer.
layer.
...
...
net/bluetooth/bnep/Kconfig
View file @
735fe7c5
config BT_BNEP
config BT_BNEP
tristate "BNEP protocol support"
tristate "BNEP protocol support"
depends on BT_L2CAP
depends on BT
&& BT
_L2CAP
---help---
help
BNEP (Bluetooth Network Encapsulation Protocol) is Ethernet
BNEP (Bluetooth Network Encapsulation Protocol) is Ethernet
emulation layer on top of Bluetooth. BNEP is required for Bluetooth
emulation layer on top of Bluetooth. BNEP is required for Bluetooth
PAN (Personal Area Network).
PAN (Personal Area Network).
...
...
net/bluetooth/bnep/core.c
View file @
735fe7c5
...
@@ -128,18 +128,17 @@ static int bnep_send_rsp(struct bnep_session *s, u8 ctrl, u16 resp)
...
@@ -128,18 +128,17 @@ static int bnep_send_rsp(struct bnep_session *s, u8 ctrl, u16 resp)
return
bnep_send
(
s
,
&
rsp
,
sizeof
(
rsp
));
return
bnep_send
(
s
,
&
rsp
,
sizeof
(
rsp
));
}
}
static
int
bnep_ctrl_set_netfilter
(
struct
bnep_session
*
s
,
struct
sk_buff
*
skb
)
static
int
bnep_ctrl_set_netfilter
(
struct
bnep_session
*
s
,
u16
*
data
,
int
len
)
{
{
u16
*
data
;
int
n
;
int
n
;
data
=
(
void
*
)
skb
->
data
;
if
(
len
<
2
)
if
(
!
skb_pull
(
skb
,
2
))
return
-
EILSEQ
;
return
-
EILSEQ
;
n
=
ntohs
(
get_unaligned
(
data
));
n
=
ntohs
(
get_unaligned
(
data
));
data
++
;
len
-=
2
;
data
=
(
void
*
)
skb
->
data
;
if
(
len
<
n
)
if
(
!
skb_pull
(
skb
,
n
))
return
-
EILSEQ
;
return
-
EILSEQ
;
BT_DBG
(
"filter len %d"
,
n
);
BT_DBG
(
"filter len %d"
,
n
);
...
@@ -170,18 +169,17 @@ static int bnep_ctrl_set_netfilter(struct bnep_session *s, struct sk_buff *skb)
...
@@ -170,18 +169,17 @@ static int bnep_ctrl_set_netfilter(struct bnep_session *s, struct sk_buff *skb)
return
0
;
return
0
;
}
}
static
int
bnep_ctrl_set_mcfilter
(
struct
bnep_session
*
s
,
struct
sk_buff
*
skb
)
static
int
bnep_ctrl_set_mcfilter
(
struct
bnep_session
*
s
,
u8
*
data
,
int
len
)
{
{
u8
*
data
;
int
n
;
int
n
;
data
=
(
void
*
)
skb
->
data
;
if
(
len
<
2
)
if
(
!
skb_pull
(
skb
,
2
))
return
-
EILSEQ
;
return
-
EILSEQ
;
n
=
ntohs
(
get_unaligned
((
u16
*
)
data
));
data
=
(
void
*
)
skb
->
data
;
n
=
ntohs
(
get_unaligned
((
u16
*
)
data
));
if
(
!
skb_pull
(
skb
,
n
))
data
+=
2
;
len
-=
2
;
if
(
len
<
n
)
return
-
EILSEQ
;
return
-
EILSEQ
;
BT_DBG
(
"filter len %d"
,
n
);
BT_DBG
(
"filter len %d"
,
n
);
...
@@ -225,12 +223,13 @@ static int bnep_ctrl_set_mcfilter(struct bnep_session *s, struct sk_buff *skb)
...
@@ -225,12 +223,13 @@ static int bnep_ctrl_set_mcfilter(struct bnep_session *s, struct sk_buff *skb)
return
0
;
return
0
;
}
}
static
int
bnep_rx_control
(
struct
bnep_session
*
s
,
struct
sk_buff
*
skb
)
static
int
bnep_rx_control
(
struct
bnep_session
*
s
,
void
*
data
,
int
len
)
{
{
u8
cmd
=
*
(
u8
*
)
data
;
int
err
=
0
;
int
err
=
0
;
u8
cmd
=
*
(
u8
*
)
skb
->
data
;
skb_pull
(
skb
,
1
)
;
data
++
;
len
--
;
switch
(
cmd
)
{
switch
(
cmd
)
{
case
BNEP_CMD_NOT_UNDERSTOOD
:
case
BNEP_CMD_NOT_UNDERSTOOD
:
case
BNEP_SETUP_CONN_REQ
:
case
BNEP_SETUP_CONN_REQ
:
...
@@ -239,13 +238,13 @@ static int bnep_rx_control(struct bnep_session *s, struct sk_buff *skb)
...
@@ -239,13 +238,13 @@ static int bnep_rx_control(struct bnep_session *s, struct sk_buff *skb)
case
BNEP_FILTER_MULTI_ADDR_RSP
:
case
BNEP_FILTER_MULTI_ADDR_RSP
:
/* Ignore these for now */
/* Ignore these for now */
break
;
break
;
case
BNEP_FILTER_NET_TYPE_SET
:
case
BNEP_FILTER_NET_TYPE_SET
:
err
=
bnep_ctrl_set_netfilter
(
s
,
skb
);
err
=
bnep_ctrl_set_netfilter
(
s
,
data
,
len
);
break
;
break
;
case
BNEP_FILTER_MULTI_ADDR_SET
:
case
BNEP_FILTER_MULTI_ADDR_SET
:
err
=
bnep_ctrl_set_mcfilter
(
s
,
skb
);
err
=
bnep_ctrl_set_mcfilter
(
s
,
data
,
len
);
break
;
break
;
default:
{
default:
{
...
@@ -274,16 +273,19 @@ static int bnep_rx_extension(struct bnep_session *s, struct sk_buff *skb)
...
@@ -274,16 +273,19 @@ static int bnep_rx_extension(struct bnep_session *s, struct sk_buff *skb)
}
}
BT_DBG
(
"type 0x%x len %d"
,
h
->
type
,
h
->
len
);
BT_DBG
(
"type 0x%x len %d"
,
h
->
type
,
h
->
len
);
switch
(
h
->
type
&
BNEP_TYPE_MASK
)
{
switch
(
h
->
type
&
BNEP_TYPE_MASK
)
{
case
BNEP_EXT_CONTROL
:
case
BNEP_EXT_CONTROL
:
err
=
bnep_rx_control
(
s
,
skb
);
bnep_rx_control
(
s
,
skb
->
data
,
skb
->
len
);
break
;
break
;
default:
default:
/* Unknown extension */
/* Unknown extension, skip it. */
if
(
!
skb_pull
(
skb
,
h
->
len
))
break
;
err
=
-
EILSEQ
;
}
if
(
!
skb_pull
(
skb
,
h
->
len
))
{
err
=
-
EILSEQ
;
break
;
break
;
}
}
}
while
(
!
err
&&
(
h
->
type
&
BNEP_EXT_HEADER
));
}
while
(
!
err
&&
(
h
->
type
&
BNEP_EXT_HEADER
));
...
@@ -315,7 +317,7 @@ static inline int bnep_rx_frame(struct bnep_session *s, struct sk_buff *skb)
...
@@ -315,7 +317,7 @@ static inline int bnep_rx_frame(struct bnep_session *s, struct sk_buff *skb)
goto
badframe
;
goto
badframe
;
if
((
type
&
BNEP_TYPE_MASK
)
==
BNEP_CONTROL
)
{
if
((
type
&
BNEP_TYPE_MASK
)
==
BNEP_CONTROL
)
{
bnep_rx_control
(
s
,
skb
);
bnep_rx_control
(
s
,
skb
->
data
,
skb
->
len
);
kfree_skb
(
skb
);
kfree_skb
(
skb
);
return
0
;
return
0
;
}
}
...
...
net/bluetooth/hci_core.c
View file @
735fe7c5
...
@@ -718,7 +718,7 @@ int hci_get_dev_list(unsigned long arg)
...
@@ -718,7 +718,7 @@ int hci_get_dev_list(unsigned long arg)
if
(
!
dev_num
)
if
(
!
dev_num
)
return
-
EINVAL
;
return
-
EINVAL
;
size
=
dev_num
*
sizeof
(
struct
hci_dev_req
)
+
sizeof
(
__u16
);
size
=
dev_num
*
sizeof
(
*
dr
)
+
sizeof
(
*
dl
);
if
(
verify_area
(
VERIFY_WRITE
,
(
void
*
)
arg
,
size
))
if
(
verify_area
(
VERIFY_WRITE
,
(
void
*
)
arg
,
size
))
return
-
EFAULT
;
return
-
EFAULT
;
...
@@ -739,7 +739,7 @@ int hci_get_dev_list(unsigned long arg)
...
@@ -739,7 +739,7 @@ int hci_get_dev_list(unsigned long arg)
read_unlock_bh
(
&
hci_dev_list_lock
);
read_unlock_bh
(
&
hci_dev_list_lock
);
dl
->
dev_num
=
n
;
dl
->
dev_num
=
n
;
size
=
n
*
sizeof
(
struct
hci_dev_req
)
+
sizeof
(
__u16
);
size
=
n
*
sizeof
(
*
dr
)
+
sizeof
(
*
dl
);
copy_to_user
((
void
*
)
arg
,
dl
,
size
);
copy_to_user
((
void
*
)
arg
,
dl
,
size
);
kfree
(
dl
);
kfree
(
dl
);
...
...
net/bluetooth/l2cap.c
View file @
735fe7c5
...
@@ -186,69 +186,12 @@ static inline void l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, stru
...
@@ -186,69 +186,12 @@ static inline void l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, stru
write_unlock
(
&
l
->
lock
);
write_unlock
(
&
l
->
lock
);
}
}
int
l2cap_connect
(
struct
sock
*
sk
)
{
bdaddr_t
*
src
=
&
bt_sk
(
sk
)
->
src
;
bdaddr_t
*
dst
=
&
bt_sk
(
sk
)
->
dst
;
struct
l2cap_conn
*
conn
;
struct
hci_conn
*
hcon
;
struct
hci_dev
*
hdev
;
int
err
=
0
;
BT_DBG
(
"%s -> %s psm 0x%2.2x"
,
batostr
(
src
),
batostr
(
dst
),
l2cap_pi
(
sk
)
->
psm
);
if
(
!
(
hdev
=
hci_get_route
(
dst
,
src
)))
return
-
EHOSTUNREACH
;
hci_dev_lock_bh
(
hdev
);
err
=
-
ENOMEM
;
hcon
=
hci_connect
(
hdev
,
ACL_LINK
,
dst
);
if
(
!
hcon
)
goto
done
;
conn
=
l2cap_conn_add
(
hcon
,
0
);
if
(
!
conn
)
{
hci_conn_put
(
hcon
);
goto
done
;
}
err
=
0
;
/* Update source addr of the socket */
bacpy
(
src
,
conn
->
src
);
l2cap_chan_add
(
conn
,
sk
,
NULL
);
sk
->
state
=
BT_CONNECT
;
l2cap_sock_set_timer
(
sk
,
sk
->
sndtimeo
);
if
(
hcon
->
state
==
BT_CONNECTED
)
{
if
(
sk
->
type
==
SOCK_SEQPACKET
)
{
struct
l2cap_conn_req
req
;
req
.
scid
=
__cpu_to_le16
(
l2cap_pi
(
sk
)
->
scid
);
req
.
psm
=
l2cap_pi
(
sk
)
->
psm
;
l2cap_send_req
(
conn
,
L2CAP_CONN_REQ
,
sizeof
(
req
),
&
req
);
}
else
{
l2cap_sock_clear_timer
(
sk
);
sk
->
state
=
BT_CONNECTED
;
}
}
done:
hci_dev_unlock_bh
(
hdev
);
hci_dev_put
(
hdev
);
return
err
;
}
/* ---- Socket interface ---- */
/* ---- Socket interface ---- */
static
struct
sock
*
__l2cap_get_sock_by_addr
(
u16
psm
,
bdaddr_t
*
src
)
static
struct
sock
*
__l2cap_get_sock_by_addr
(
u16
psm
,
bdaddr_t
*
src
)
{
{
struct
sock
*
sk
;
struct
sock
*
sk
;
for
(
sk
=
l2cap_sk_list
.
head
;
sk
;
sk
=
sk
->
next
)
{
for
(
sk
=
l2cap_sk_list
.
head
;
sk
;
sk
=
sk
->
next
)
{
if
(
l2cap_pi
(
sk
)
->
psm
==
psm
&&
if
(
l2cap_pi
(
sk
)
->
sport
==
psm
&&
!
bacmp
(
&
bt_sk
(
sk
)
->
src
,
src
))
!
bacmp
(
&
bt_sk
(
sk
)
->
src
,
src
))
break
;
break
;
}
}
return
sk
;
return
sk
;
...
@@ -437,7 +380,10 @@ static int l2cap_sock_create(struct socket *sock, int protocol)
...
@@ -437,7 +380,10 @@ static int l2cap_sock_create(struct socket *sock, int protocol)
if
(
sock
->
type
!=
SOCK_SEQPACKET
&&
sock
->
type
!=
SOCK_DGRAM
&&
sock
->
type
!=
SOCK_RAW
)
if
(
sock
->
type
!=
SOCK_SEQPACKET
&&
sock
->
type
!=
SOCK_DGRAM
&&
sock
->
type
!=
SOCK_RAW
)
return
-
ESOCKTNOSUPPORT
;
return
-
ESOCKTNOSUPPORT
;
if
(
sock
->
type
==
SOCK_RAW
&&
!
capable
(
CAP_NET_RAW
))
return
-
EPERM
;
sock
->
ops
=
&
l2cap_sock_ops
;
sock
->
ops
=
&
l2cap_sock_ops
;
sk
=
l2cap_sock_alloc
(
sock
,
protocol
,
GFP_KERNEL
);
sk
=
l2cap_sock_alloc
(
sock
,
protocol
,
GFP_KERNEL
);
...
@@ -472,7 +418,8 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_
...
@@ -472,7 +418,8 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_
}
else
{
}
else
{
/* Save source address */
/* Save source address */
bacpy
(
&
bt_sk
(
sk
)
->
src
,
&
la
->
l2_bdaddr
);
bacpy
(
&
bt_sk
(
sk
)
->
src
,
&
la
->
l2_bdaddr
);
l2cap_pi
(
sk
)
->
psm
=
la
->
l2_psm
;
l2cap_pi
(
sk
)
->
psm
=
la
->
l2_psm
;
l2cap_pi
(
sk
)
->
sport
=
la
->
l2_psm
;
sk
->
state
=
BT_BOUND
;
sk
->
state
=
BT_BOUND
;
}
}
write_unlock_bh
(
&
l2cap_sk_list
.
lock
);
write_unlock_bh
(
&
l2cap_sk_list
.
lock
);
...
@@ -482,6 +429,62 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_
...
@@ -482,6 +429,62 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_
return
err
;
return
err
;
}
}
static
int
l2cap_do_connect
(
struct
sock
*
sk
)
{
bdaddr_t
*
src
=
&
bt_sk
(
sk
)
->
src
;
bdaddr_t
*
dst
=
&
bt_sk
(
sk
)
->
dst
;
struct
l2cap_conn
*
conn
;
struct
hci_conn
*
hcon
;
struct
hci_dev
*
hdev
;
int
err
=
0
;
BT_DBG
(
"%s -> %s psm 0x%2.2x"
,
batostr
(
src
),
batostr
(
dst
),
l2cap_pi
(
sk
)
->
psm
);
if
(
!
(
hdev
=
hci_get_route
(
dst
,
src
)))
return
-
EHOSTUNREACH
;
hci_dev_lock_bh
(
hdev
);
err
=
-
ENOMEM
;
hcon
=
hci_connect
(
hdev
,
ACL_LINK
,
dst
);
if
(
!
hcon
)
goto
done
;
conn
=
l2cap_conn_add
(
hcon
,
0
);
if
(
!
conn
)
{
hci_conn_put
(
hcon
);
goto
done
;
}
err
=
0
;
/* Update source addr of the socket */
bacpy
(
src
,
conn
->
src
);
l2cap_chan_add
(
conn
,
sk
,
NULL
);
sk
->
state
=
BT_CONNECT
;
l2cap_sock_set_timer
(
sk
,
sk
->
sndtimeo
);
if
(
hcon
->
state
==
BT_CONNECTED
)
{
if
(
sk
->
type
==
SOCK_SEQPACKET
)
{
struct
l2cap_conn_req
req
;
req
.
scid
=
__cpu_to_le16
(
l2cap_pi
(
sk
)
->
scid
);
req
.
psm
=
l2cap_pi
(
sk
)
->
psm
;
l2cap_send_req
(
conn
,
L2CAP_CONN_REQ
,
sizeof
(
req
),
&
req
);
}
else
{
l2cap_sock_clear_timer
(
sk
);
sk
->
state
=
BT_CONNECTED
;
}
}
done:
hci_dev_unlock_bh
(
hdev
);
hci_dev_put
(
hdev
);
return
err
;
}
static
int
l2cap_sock_connect
(
struct
socket
*
sock
,
struct
sockaddr
*
addr
,
int
alen
,
int
flags
)
static
int
l2cap_sock_connect
(
struct
socket
*
sock
,
struct
sockaddr
*
addr
,
int
alen
,
int
flags
)
{
{
struct
sockaddr_l2
*
la
=
(
struct
sockaddr_l2
*
)
addr
;
struct
sockaddr_l2
*
la
=
(
struct
sockaddr_l2
*
)
addr
;
...
@@ -527,7 +530,7 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al
...
@@ -527,7 +530,7 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al
bacpy
(
&
bt_sk
(
sk
)
->
dst
,
&
la
->
l2_bdaddr
);
bacpy
(
&
bt_sk
(
sk
)
->
dst
,
&
la
->
l2_bdaddr
);
l2cap_pi
(
sk
)
->
psm
=
la
->
l2_psm
;
l2cap_pi
(
sk
)
->
psm
=
la
->
l2_psm
;
if
((
err
=
l2cap_connect
(
sk
)))
if
((
err
=
l2cap_
do_
connect
(
sk
)))
goto
done
;
goto
done
;
wait:
wait:
...
@@ -2074,7 +2077,7 @@ static int __init l2cap_proc_init(void)
...
@@ -2074,7 +2077,7 @@ static int __init l2cap_proc_init(void)
static
void
__init
l2cap_proc_cleanup
(
void
)
static
void
__init
l2cap_proc_cleanup
(
void
)
{
{
return
0
;
return
;
}
}
#endif
/* CONFIG_PROC_FS */
#endif
/* CONFIG_PROC_FS */
...
...
net/bluetooth/rfcomm/Kconfig
View file @
735fe7c5
config BT_RFCOMM
config BT_RFCOMM
tristate "RFCOMM protocol support"
tristate "RFCOMM protocol support"
depends on BT_L2CAP
depends on BT
&& BT
_L2CAP
help
help
RFCOMM provides connection oriented stream transport. RFCOMM
RFCOMM provides connection oriented stream transport. RFCOMM
support is required for Dialup Networking, OBEX and other Bluetooth
support is required for Dialup Networking, OBEX and other Bluetooth
...
...
net/bluetooth/rfcomm/core.c
View file @
735fe7c5
...
@@ -1312,6 +1312,9 @@ static int rfcomm_recv_mcc(struct rfcomm_session *s, struct sk_buff *skb)
...
@@ -1312,6 +1312,9 @@ static int rfcomm_recv_mcc(struct rfcomm_session *s, struct sk_buff *skb)
rfcomm_send_test
(
s
,
0
,
skb
->
data
,
skb
->
len
);
rfcomm_send_test
(
s
,
0
,
skb
->
data
,
skb
->
len
);
break
;
break
;
case
RFCOMM_NSC
:
break
;
default:
default:
BT_ERR
(
"Unknown control type 0x%02x"
,
type
);
BT_ERR
(
"Unknown control type 0x%02x"
,
type
);
rfcomm_send_nsc
(
s
,
cr
,
type
);
rfcomm_send_nsc
(
s
,
cr
,
type
);
...
@@ -1442,7 +1445,7 @@ static inline int rfcomm_process_tx(struct rfcomm_dlc *d)
...
@@ -1442,7 +1445,7 @@ static inline int rfcomm_process_tx(struct rfcomm_dlc *d)
/* Send pending MSC */
/* Send pending MSC */
if
(
test_and_clear_bit
(
RFCOMM_MSC_PENDING
,
&
d
->
flags
))
if
(
test_and_clear_bit
(
RFCOMM_MSC_PENDING
,
&
d
->
flags
))
rfcomm_send_msc
(
d
->
session
,
d
->
dlci
,
1
,
d
->
v24_sig
);
rfcomm_send_msc
(
d
->
session
,
1
,
d
->
dlci
,
d
->
v24_sig
);
if
(
d
->
credits
)
{
if
(
d
->
credits
)
{
/* CFC enabled.
/* CFC enabled.
...
@@ -1831,7 +1834,7 @@ static int __init rfcomm_proc_init(void)
...
@@ -1831,7 +1834,7 @@ static int __init rfcomm_proc_init(void)
static
void
__init
rfcomm_proc_cleanup
(
void
)
static
void
__init
rfcomm_proc_cleanup
(
void
)
{
{
return
0
;
return
;
}
}
#endif
/* CONFIG_PROC_FS */
#endif
/* CONFIG_PROC_FS */
...
...
net/bluetooth/rfcomm/sock.c
View file @
735fe7c5
...
@@ -851,7 +851,7 @@ static int __init rfcomm_sock_proc_init(void)
...
@@ -851,7 +851,7 @@ static int __init rfcomm_sock_proc_init(void)
static
void
__init
rfcomm_sock_proc_cleanup
(
void
)
static
void
__init
rfcomm_sock_proc_cleanup
(
void
)
{
{
return
0
;
return
;
}
}
#endif
/* CONFIG_PROC_FS */
#endif
/* CONFIG_PROC_FS */
...
...
net/bluetooth/rfcomm/tty.c
View file @
735fe7c5
...
@@ -442,7 +442,7 @@ static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb)
...
@@ -442,7 +442,7 @@ static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb)
struct
tty_struct
*
tty
;
struct
tty_struct
*
tty
;
if
(
!
dev
||
!
(
tty
=
dev
->
tty
))
{
if
(
!
dev
||
!
(
tty
=
dev
->
tty
))
{
kfree
(
skb
);
kfree
_skb
(
skb
);
return
;
return
;
}
}
...
@@ -669,12 +669,12 @@ static int rfcomm_tty_set_modem_status(uint cmd, struct rfcomm_dlc *dlc, uint st
...
@@ -669,12 +669,12 @@ static int rfcomm_tty_set_modem_status(uint cmd, struct rfcomm_dlc *dlc, uint st
else
else
rfcomm_dlc_get_modem_status
(
dlc
,
&
v24_sig
);
rfcomm_dlc_get_modem_status
(
dlc
,
&
v24_sig
);
mask
=
(
status
&
TIOCM_DSR
)
?
RFCOMM_V24_RTC
:
0
|
mask
=
(
(
status
&
TIOCM_DSR
)
?
RFCOMM_V24_RTC
:
0
)
|
(
status
&
TIOCM_DTR
)
?
RFCOMM_V24_RTC
:
0
|
(
(
status
&
TIOCM_DTR
)
?
RFCOMM_V24_RTC
:
0
)
|
(
status
&
TIOCM_RTS
)
?
RFCOMM_V24_RTR
:
0
|
(
(
status
&
TIOCM_RTS
)
?
RFCOMM_V24_RTR
:
0
)
|
(
status
&
TIOCM_CTS
)
?
RFCOMM_V24_RTR
:
0
|
(
(
status
&
TIOCM_CTS
)
?
RFCOMM_V24_RTR
:
0
)
|
(
status
&
TIOCM_RI
)
?
RFCOMM_V24_IC
:
0
|
(
(
status
&
TIOCM_RI
)
?
RFCOMM_V24_IC
:
0
)
|
(
status
&
TIOCM_CD
)
?
RFCOMM_V24_DV
:
0
;
(
(
status
&
TIOCM_CD
)
?
RFCOMM_V24_DV
:
0
)
;
if
(
cmd
==
TIOCMBIC
)
if
(
cmd
==
TIOCMBIC
)
v24_sig
&=
~
mask
;
v24_sig
&=
~
mask
;
...
...
net/bluetooth/sco.c
View file @
735fe7c5
...
@@ -962,7 +962,7 @@ static int __init sco_proc_init(void)
...
@@ -962,7 +962,7 @@ static int __init sco_proc_init(void)
static
void
__init
sco_proc_cleanup
(
void
)
static
void
__init
sco_proc_cleanup
(
void
)
{
{
return
0
;
return
;
}
}
#endif
/* CONFIG_PROC_FS */
#endif
/* CONFIG_PROC_FS */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment