diff options
| author | Maksim Yevmenkin <emax@FreeBSD.org> | 2005-07-28 17:43:20 +0000 |
|---|---|---|
| committer | Maksim Yevmenkin <emax@FreeBSD.org> | 2005-07-28 17:43:20 +0000 |
| commit | d6279c101ee31811babaddc398b21cd878fd039b (patch) | |
| tree | 3f50c681818d9eee82815ab1697a413cf12765fd /sys/netgraph | |
| parent | 75eb780790f6302d18df7fbe81561c86c5a821aa (diff) | |
Notes
Diffstat (limited to 'sys/netgraph')
| -rw-r--r-- | sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c | 50 | ||||
| -rw-r--r-- | sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c | 98 |
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; |
