aboutsummaryrefslogtreecommitdiff
path: root/sys/netgraph
diff options
context:
space:
mode:
authorMaksim Yevmenkin <emax@FreeBSD.org>2005-07-28 17:43:20 +0000
committerMaksim Yevmenkin <emax@FreeBSD.org>2005-07-28 17:43:20 +0000
commitd6279c101ee31811babaddc398b21cd878fd039b (patch)
tree3f50c681818d9eee82815ab1697a413cf12765fd /sys/netgraph
parent75eb780790f6302d18df7fbe81561c86c5a821aa (diff)
Notes
Diffstat (limited to 'sys/netgraph')
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c50
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c98
2 files changed, 74 insertions, 74 deletions
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c
index 92b2bb52016ee..6afa9187ca181 100644
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c
@@ -84,7 +84,7 @@ static int ng_btsocket_hci_raw_filter(ng_btsocket_hci_raw_pcb_p,
struct mbuf *, int);
#define ng_btsocket_hci_raw_wakeup_input_task() \
- taskqueue_enqueue(taskqueue_swi_giant, &ng_btsocket_hci_raw_task)
+ taskqueue_enqueue(taskqueue_swi, &ng_btsocket_hci_raw_task)
/* Security filter */
struct ng_btsocket_hci_raw_sec_filter {
@@ -248,16 +248,13 @@ static int
ng_btsocket_hci_raw_node_rcvmsg(node_p node, item_p item, hook_p lasthook)
{
struct ng_mesg *msg = NGI_MSG(item); /* item still has message */
- int empty, error = 0;
-
- mtx_lock(&ng_btsocket_hci_raw_sockets_mtx);
- empty = LIST_EMPTY(&ng_btsocket_hci_raw_sockets);
- mtx_unlock(&ng_btsocket_hci_raw_sockets_mtx);
+ int error = 0;
- if (empty) {
- NG_FREE_ITEM(item);
- return (0);
- }
+ /*
+ * Check for empty sockets list creates LOR when both sender and
+ * receiver device are connected to the same host, so remove it
+ * for now
+ */
if (msg != NULL &&
msg->header.typecookie == NGM_HCI_COOKIE &&
@@ -298,16 +295,13 @@ static int
ng_btsocket_hci_raw_node_rcvdata(hook_p hook, item_p item)
{
struct mbuf *nam = NULL;
- int empty, error;
-
- mtx_lock(&ng_btsocket_hci_raw_sockets_mtx);
- empty = LIST_EMPTY(&ng_btsocket_hci_raw_sockets);
- mtx_unlock(&ng_btsocket_hci_raw_sockets_mtx);
+ int error;
- if (empty) {
- NG_FREE_ITEM(item);
- return (0);
- }
+ /*
+ * Check for empty sockets list creates LOR when both sender and
+ * receiver device are connected to the same host, so remove it
+ * for now
+ */
MGET(nam, M_DONTWAIT, MT_SONAME);
if (nam != NULL) {
@@ -552,7 +546,7 @@ next:
static void
ng_btsocket_hci_raw_msg_input(struct ng_mesg *msg)
{
- ng_btsocket_hci_raw_pcb_p pcb = NULL;
+ ng_btsocket_hci_raw_pcb_p pcb = NULL;
mtx_lock(&ng_btsocket_hci_raw_sockets_mtx);
@@ -962,7 +956,9 @@ ng_btsocket_hci_raw_bind(struct socket *so, struct sockaddr *nam,
if (sa->hci_node[0] == 0)
return (EINVAL);
+ mtx_lock(&pcb->pcb_mtx);
bcopy(sa, &pcb->addr, sizeof(pcb->addr));
+ mtx_unlock(&pcb->pcb_mtx);
return (0);
} /* ng_btsocket_hci_raw_bind */
@@ -991,11 +987,18 @@ ng_btsocket_hci_raw_connect(struct socket *so, struct sockaddr *nam,
return (EINVAL);
if (sa->hci_node[0] == 0)
return (EDESTADDRREQ);
- if (bcmp(sa, &pcb->addr, sizeof(pcb->addr)) != 0)
+
+ mtx_lock(&pcb->pcb_mtx);
+
+ if (bcmp(sa, &pcb->addr, sizeof(pcb->addr)) != 0) {
+ mtx_unlock(&pcb->pcb_mtx);
return (EADDRNOTAVAIL);
+ }
soisconnected(so);
+ mtx_unlock(&pcb->pcb_mtx);
+
return (0);
} /* ng_btsocket_hci_raw_connect */
@@ -1441,7 +1444,9 @@ ng_btsocket_hci_raw_disconnect(struct socket *so)
if (ng_btsocket_hci_raw_node == NULL)
return (EINVAL);
+ mtx_lock(&pcb->pcb_mtx);
soisdisconnected(so);
+ mtx_unlock(&pcb->pcb_mtx);
return (0);
} /* ng_btsocket_hci_raw_disconnect */
@@ -1559,7 +1564,10 @@ ng_btsocket_hci_raw_sockaddr(struct socket *so, struct sockaddr **nam)
bzero(&sa, sizeof(sa));
sa.hci_len = sizeof(sa);
sa.hci_family = AF_BLUETOOTH;
+
+ mtx_lock(&pcb->pcb_mtx);
strlcpy(sa.hci_node, pcb->addr.hci_node, sizeof(sa.hci_node));
+ mtx_unlock(&pcb->pcb_mtx);
*nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c
index 0eb319671cf0b..e25be09efe2fd 100644
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c
@@ -84,10 +84,10 @@ static int ng_btsocket_l2cap_raw_send_sync_ngmsg
(ng_btsocket_l2cap_raw_pcb_p, int, void *, int);
#define ng_btsocket_l2cap_raw_wakeup_input_task() \
- taskqueue_enqueue(taskqueue_swi_giant, &ng_btsocket_l2cap_raw_queue_task)
+ taskqueue_enqueue(taskqueue_swi, &ng_btsocket_l2cap_raw_queue_task)
#define ng_btsocket_l2cap_raw_wakeup_route_task() \
- taskqueue_enqueue(taskqueue_swi_giant, &ng_btsocket_l2cap_raw_rt_task)
+ taskqueue_enqueue(taskqueue_swi, &ng_btsocket_l2cap_raw_rt_task)
/* Netgraph type descriptor */
static struct ng_type typestruct = {
@@ -367,8 +367,6 @@ ng_btsocket_l2cap_raw_input(void *context, int pending)
sizeof(bdaddr_t)) == 0)
break;
- mtx_lock(&ng_btsocket_l2cap_raw_rt_mtx);
-
rt = (ng_btsocket_l2cap_rtentry_t *)
NG_HOOK_PRIVATE(hook);
if (rt == NULL) {
@@ -376,27 +374,28 @@ ng_btsocket_l2cap_raw_input(void *context, int pending)
sizeof(*rt),
M_NETGRAPH_BTSOCKET_L2CAP_RAW,
M_NOWAIT|M_ZERO);
- if (rt == NULL) {
- mtx_unlock(&ng_btsocket_l2cap_raw_rt_mtx);
+ if (rt == NULL)
break;
- }
+
+ NG_HOOK_SET_PRIVATE(hook, rt);
+
+ mtx_lock(&ng_btsocket_l2cap_raw_rt_mtx);
LIST_INSERT_HEAD(&ng_btsocket_l2cap_raw_rt,
rt, next);
-
- NG_HOOK_SET_PRIVATE(hook, rt);
- }
+ } else
+ mtx_lock(&ng_btsocket_l2cap_raw_rt_mtx);
bcopy(msg->data, &rt->src, sizeof(rt->src));
rt->hook = hook;
- mtx_unlock(&ng_btsocket_l2cap_raw_rt_mtx);
-
NG_BTSOCKET_L2CAP_RAW_INFO(
"%s: Updating hook \"%s\", src bdaddr=%x:%x:%x:%x:%x:%x\n",
__func__, NG_HOOK_NAME(hook),
rt->src.b[5], rt->src.b[4], rt->src.b[3],
rt->src.b[2], rt->src.b[1], rt->src.b[0]);
+
+ mtx_unlock(&ng_btsocket_l2cap_raw_rt_mtx);
} break;
case NGM_L2CAP_NODE_GET_FLAGS:
@@ -451,13 +450,12 @@ ng_btsocket_l2cap_raw_rtclean(void *context, int pending)
ng_btsocket_l2cap_raw_pcb_p pcb = NULL;
ng_btsocket_l2cap_rtentry_p rt = NULL;
- mtx_lock(&ng_btsocket_l2cap_raw_rt_mtx);
- mtx_lock(&ng_btsocket_l2cap_raw_sockets_mtx);
-
/*
* First disconnect all sockets that use "invalid" hook
*/
+ mtx_lock(&ng_btsocket_l2cap_raw_sockets_mtx);
+
LIST_FOREACH(pcb, &ng_btsocket_l2cap_raw_sockets, next) {
mtx_lock(&pcb->pcb_mtx);
@@ -473,10 +471,14 @@ ng_btsocket_l2cap_raw_rtclean(void *context, int pending)
mtx_unlock(&pcb->pcb_mtx);
}
+ mtx_unlock(&ng_btsocket_l2cap_raw_sockets_mtx);
+
/*
* Now cleanup routing table
*/
+ mtx_lock(&ng_btsocket_l2cap_raw_rt_mtx);
+
for (rt = LIST_FIRST(&ng_btsocket_l2cap_raw_rt); rt != NULL; ) {
ng_btsocket_l2cap_rtentry_p rt_next = LIST_NEXT(rt, next);
@@ -493,7 +495,6 @@ ng_btsocket_l2cap_raw_rtclean(void *context, int pending)
rt = rt_next;
}
- mtx_unlock(&ng_btsocket_l2cap_raw_sockets_mtx);
mtx_unlock(&ng_btsocket_l2cap_raw_rt_mtx);
} /* ng_btsocket_l2cap_raw_rtclean */
@@ -635,7 +636,6 @@ ng_btsocket_l2cap_raw_bind(struct socket *so, struct sockaddr *nam,
ng_btsocket_l2cap_raw_pcb_t *pcb = so2l2cap_raw_pcb(so);
struct sockaddr_l2cap *sa = (struct sockaddr_l2cap *) nam;
ng_btsocket_l2cap_rtentry_t *rt = NULL;
- int error;
if (pcb == NULL)
return (EINVAL);
@@ -649,40 +649,32 @@ ng_btsocket_l2cap_raw_bind(struct socket *so, struct sockaddr *nam,
if (sa->l2cap_len != sizeof(*sa))
return (EINVAL);
- mtx_lock(&ng_btsocket_l2cap_raw_rt_mtx);
- mtx_lock(&ng_btsocket_l2cap_raw_sockets_mtx);
- mtx_lock(&pcb->pcb_mtx);
+ if (bcmp(&sa->l2cap_bdaddr, NG_HCI_BDADDR_ANY,
+ sizeof(sa->l2cap_bdaddr)) != 0) {
+ mtx_lock(&ng_btsocket_l2cap_raw_rt_mtx);
- pcb->rt = NULL;
- bcopy(&sa->l2cap_bdaddr, &pcb->src, sizeof(pcb->src));
-
- if (bcmp(&pcb->src, NG_HCI_BDADDR_ANY, sizeof(pcb->src)) == 0) {
- mtx_unlock(&pcb->pcb_mtx);
- mtx_unlock(&ng_btsocket_l2cap_raw_sockets_mtx);
- mtx_unlock(&ng_btsocket_l2cap_raw_rt_mtx);
+ LIST_FOREACH(rt, &ng_btsocket_l2cap_raw_rt, next) {
+ if (rt->hook == NULL || NG_HOOK_NOT_VALID(rt->hook))
+ continue;
- return (0);
- }
-
- LIST_FOREACH(rt, &ng_btsocket_l2cap_raw_rt, next) {
- if (rt->hook == NULL || NG_HOOK_NOT_VALID(rt->hook))
- continue;
+ if (bcmp(&sa->l2cap_bdaddr, &rt->src,
+ sizeof(rt->src)) == 0)
+ break;
+ }
- if (bcmp(&pcb->src, &rt->src, sizeof(rt->src)) == 0)
- break;
- }
+ mtx_unlock(&ng_btsocket_l2cap_raw_rt_mtx);
- if (rt != NULL) {
- pcb->rt = rt;
- error = 0;
+ if (rt == NULL)
+ return (ENETDOWN);
} else
- error = ENETDOWN;
+ rt = NULL;
+ mtx_lock(&pcb->pcb_mtx);
+ bcopy(&sa->l2cap_bdaddr, &pcb->src, sizeof(pcb->src));
+ pcb->rt = rt;
mtx_unlock(&pcb->pcb_mtx);
- mtx_unlock(&ng_btsocket_l2cap_raw_sockets_mtx);
- mtx_unlock(&ng_btsocket_l2cap_raw_rt_mtx);
- return (error);
+ return (0);
} /* ng_btsocket_l2cap_raw_bind */
/*
@@ -712,16 +704,12 @@ ng_btsocket_l2cap_raw_connect(struct socket *so, struct sockaddr *nam,
if (bcmp(&sa->l2cap_bdaddr, NG_HCI_BDADDR_ANY, sizeof(bdaddr_t)) == 0)
return (EINVAL);
- mtx_lock(&ng_btsocket_l2cap_raw_rt_mtx);
- mtx_lock(&ng_btsocket_l2cap_raw_sockets_mtx);
mtx_lock(&pcb->pcb_mtx);
bcopy(&sa->l2cap_bdaddr, &pcb->dst, sizeof(pcb->dst));
if (bcmp(&pcb->src, &pcb->dst, sizeof(pcb->src)) == 0) {
mtx_unlock(&pcb->pcb_mtx);
- mtx_unlock(&ng_btsocket_l2cap_raw_sockets_mtx);
- mtx_unlock(&ng_btsocket_l2cap_raw_rt_mtx);
return (EADDRNOTAVAIL);
}
@@ -732,10 +720,7 @@ ng_btsocket_l2cap_raw_connect(struct socket *so, struct sockaddr *nam,
if (pcb->rt != NULL) {
soisconnected(so);
-
mtx_unlock(&pcb->pcb_mtx);
- mtx_unlock(&ng_btsocket_l2cap_raw_sockets_mtx);
- mtx_unlock(&ng_btsocket_l2cap_raw_rt_mtx);
return (0);
}
@@ -744,6 +729,8 @@ ng_btsocket_l2cap_raw_connect(struct socket *so, struct sockaddr *nam,
* Find the first hook that does not match specified destination address
*/
+ mtx_lock(&ng_btsocket_l2cap_raw_rt_mtx);
+
LIST_FOREACH(rt, &ng_btsocket_l2cap_raw_rt, next) {
if (rt->hook == NULL || NG_HOOK_NOT_VALID(rt->hook))
continue;
@@ -762,9 +749,8 @@ ng_btsocket_l2cap_raw_connect(struct socket *so, struct sockaddr *nam,
} else
error = ENETDOWN;
- mtx_unlock(&pcb->pcb_mtx);
- mtx_unlock(&ng_btsocket_l2cap_raw_sockets_mtx);
mtx_unlock(&ng_btsocket_l2cap_raw_rt_mtx);
+ mtx_unlock(&pcb->pcb_mtx);
return (error);
} /* ng_btsocket_l2cap_raw_connect */
@@ -1150,7 +1136,7 @@ ng_btsocket_l2cap_raw_disconnect(struct socket *so)
if (pcb == NULL)
return (EINVAL);
- if (ng_btsocket_l2cap_raw_node == NULL)
+ if (ng_btsocket_l2cap_raw_node == NULL)
return (EINVAL);
mtx_lock(&pcb->pcb_mtx);
@@ -1176,7 +1162,10 @@ ng_btsocket_l2cap_raw_peeraddr(struct socket *so, struct sockaddr **nam)
if (ng_btsocket_l2cap_raw_node == NULL)
return (EINVAL);
+ mtx_lock(&pcb->pcb_mtx);
bcopy(&pcb->dst, &sa.l2cap_bdaddr, sizeof(sa.l2cap_bdaddr));
+ mtx_unlock(&pcb->pcb_mtx);
+
sa.l2cap_psm = 0;
sa.l2cap_len = sizeof(sa);
sa.l2cap_family = AF_BLUETOOTH;
@@ -1215,7 +1204,10 @@ ng_btsocket_l2cap_raw_sockaddr(struct socket *so, struct sockaddr **nam)
if (ng_btsocket_l2cap_raw_node == NULL)
return (EINVAL);
+ mtx_lock(&pcb->pcb_mtx);
bcopy(&pcb->src, &sa.l2cap_bdaddr, sizeof(sa.l2cap_bdaddr));
+ mtx_unlock(&pcb->pcb_mtx);
+
sa.l2cap_psm = 0;
sa.l2cap_len = sizeof(sa);
sa.l2cap_family = AF_BLUETOOTH;