diff options
| author | Gleb Smirnoff <glebius@FreeBSD.org> | 2023-11-30 16:30:55 +0000 |
|---|---|---|
| committer | Gleb Smirnoff <glebius@FreeBSD.org> | 2023-11-30 16:31:10 +0000 |
| commit | 0fac350c54d0a72f5341e15021efcde63eb58a4b (patch) | |
| tree | 6b4229e6fe419e850c04226390fbe5396569aba6 /sys/netgraph | |
| parent | cfb1e92912b4cf75360b7fbe86197cc29bc212c1 (diff) | |
Diffstat (limited to 'sys/netgraph')
| -rw-r--r-- | sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h | 3 | ||||
| -rw-r--r-- | sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h | 9 | ||||
| -rw-r--r-- | sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h | 4 | ||||
| -rw-r--r-- | sys/netgraph/bluetooth/include/ng_btsocket_sco.h | 4 | ||||
| -rw-r--r-- | sys/netgraph/bluetooth/socket/ng_btsocket.c | 8 | ||||
| -rw-r--r-- | sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c | 29 | ||||
| -rw-r--r-- | sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c | 75 | ||||
| -rw-r--r-- | sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c | 47 | ||||
| -rw-r--r-- | sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c | 61 | ||||
| -rw-r--r-- | sys/netgraph/bluetooth/socket/ng_btsocket_sco.c | 62 | ||||
| -rw-r--r-- | sys/netgraph/ng_ksocket.c | 28 | ||||
| -rw-r--r-- | sys/netgraph/ng_socket.c | 23 |
12 files changed, 124 insertions, 229 deletions
diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h b/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h index 05c109df1570..b55c95b29ee3 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h @@ -78,11 +78,10 @@ int ng_btsocket_hci_raw_control (struct socket *, u_long, void *, int ng_btsocket_hci_raw_ctloutput (struct socket *, struct sockopt *); void ng_btsocket_hci_raw_detach (struct socket *); int ng_btsocket_hci_raw_disconnect (struct socket *); -int ng_btsocket_hci_raw_peeraddr (struct socket *, struct sockaddr **); int ng_btsocket_hci_raw_send (struct socket *, int, struct mbuf *, struct sockaddr *, struct mbuf *, struct thread *); -int ng_btsocket_hci_raw_sockaddr (struct socket *, struct sockaddr **); +int ng_btsocket_hci_raw_sockaddr (struct socket *, struct sockaddr *); #endif /* _KERNEL */ diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h b/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h index b512112f8b7d..7181e369119d 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h @@ -105,11 +105,11 @@ int ng_btsocket_l2cap_raw_control (struct socket *, u_long, void *, struct ifnet *, struct thread *); void ng_btsocket_l2cap_raw_detach (struct socket *); int ng_btsocket_l2cap_raw_disconnect (struct socket *); -int ng_btsocket_l2cap_raw_peeraddr (struct socket *, struct sockaddr **); +int ng_btsocket_l2cap_raw_peeraddr (struct socket *, struct sockaddr *); int ng_btsocket_l2cap_raw_send (struct socket *, int, struct mbuf *, struct sockaddr *, struct mbuf *, struct thread *); -int ng_btsocket_l2cap_raw_sockaddr (struct socket *, struct sockaddr **); +int ng_btsocket_l2cap_raw_sockaddr (struct socket *, struct sockaddr *); #endif /* _KERNEL */ @@ -191,7 +191,6 @@ typedef struct ng_btsocket_l2cap_pcb * ng_btsocket_l2cap_pcb_p; void ng_btsocket_l2cap_abort (struct socket *); void ng_btsocket_l2cap_close (struct socket *); -int ng_btsocket_l2cap_accept (struct socket *, struct sockaddr *); int ng_btsocket_l2cap_attach (struct socket *, int, struct thread *); int ng_btsocket_l2cap_bind (struct socket *, struct sockaddr *, struct thread *); @@ -203,11 +202,11 @@ int ng_btsocket_l2cap_ctloutput (struct socket *, struct sockopt *); void ng_btsocket_l2cap_detach (struct socket *); int ng_btsocket_l2cap_disconnect (struct socket *); int ng_btsocket_l2cap_listen (struct socket *, int, struct thread *); -int ng_btsocket_l2cap_peeraddr (struct socket *, struct sockaddr **); +int ng_btsocket_l2cap_peeraddr (struct socket *, struct sockaddr *); int ng_btsocket_l2cap_send (struct socket *, int, struct mbuf *, struct sockaddr *, struct mbuf *, struct thread *); -int ng_btsocket_l2cap_sockaddr (struct socket *, struct sockaddr **); +int ng_btsocket_l2cap_sockaddr (struct socket *, struct sockaddr *); #endif /* _KERNEL */ diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h b/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h index d40b694ece14..a5448ed943a2 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h @@ -328,11 +328,11 @@ int ng_btsocket_rfcomm_ctloutput (struct socket *, struct sockopt *); void ng_btsocket_rfcomm_detach (struct socket *); int ng_btsocket_rfcomm_disconnect (struct socket *); int ng_btsocket_rfcomm_listen (struct socket *, int, struct thread *); -int ng_btsocket_rfcomm_peeraddr (struct socket *, struct sockaddr **); +int ng_btsocket_rfcomm_peeraddr (struct socket *, struct sockaddr *); int ng_btsocket_rfcomm_send (struct socket *, int, struct mbuf *, struct sockaddr *, struct mbuf *, struct thread *); -int ng_btsocket_rfcomm_sockaddr (struct socket *, struct sockaddr **); +int ng_btsocket_rfcomm_sockaddr (struct socket *, struct sockaddr *); #endif /* _KERNEL */ diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_sco.h b/sys/netgraph/bluetooth/include/ng_btsocket_sco.h index 282980cce881..4b131dab4223 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_sco.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_sco.h @@ -118,11 +118,11 @@ int ng_btsocket_sco_ctloutput (struct socket *, struct sockopt *); void ng_btsocket_sco_detach (struct socket *); int ng_btsocket_sco_disconnect (struct socket *); int ng_btsocket_sco_listen (struct socket *, int, struct thread *); -int ng_btsocket_sco_peeraddr (struct socket *, struct sockaddr **); +int ng_btsocket_sco_peeraddr (struct socket *, struct sockaddr *); int ng_btsocket_sco_send (struct socket *, int, struct mbuf *, struct sockaddr *, struct mbuf *, struct thread *); -int ng_btsocket_sco_sockaddr (struct socket *, struct sockaddr **); +int ng_btsocket_sco_sockaddr (struct socket *, struct sockaddr *); #endif /* _KERNEL */ diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket.c b/sys/netgraph/bluetooth/socket/ng_btsocket.c index 03fa322e7775..a90256595911 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket.c @@ -79,7 +79,7 @@ static struct protosw ng_btsocket_hci_raw_protosw = { .pr_control = ng_btsocket_hci_raw_control, .pr_detach = ng_btsocket_hci_raw_detach, .pr_disconnect = ng_btsocket_hci_raw_disconnect, - .pr_peeraddr = ng_btsocket_hci_raw_peeraddr, + .pr_peeraddr = ng_btsocket_hci_raw_sockaddr, .pr_send = ng_btsocket_hci_raw_send, .pr_sockaddr = ng_btsocket_hci_raw_sockaddr, .pr_close = ng_btsocket_hci_raw_close, @@ -110,7 +110,7 @@ static struct protosw ng_btsocket_l2cap_protosw = { .pr_flags = PR_ATOMIC|PR_CONNREQUIRED, .pr_ctloutput = ng_btsocket_l2cap_ctloutput, .pr_abort = ng_btsocket_l2cap_abort, - .pr_accept = ng_btsocket_l2cap_accept, + .pr_accept = ng_btsocket_l2cap_peeraddr, .pr_attach = ng_btsocket_l2cap_attach, .pr_bind = ng_btsocket_l2cap_bind, .pr_connect = ng_btsocket_l2cap_connect, @@ -131,7 +131,7 @@ static struct protosw ng_btsocket_rfcomm_protosw = { .pr_flags = PR_CONNREQUIRED, .pr_ctloutput = ng_btsocket_rfcomm_ctloutput, .pr_abort = ng_btsocket_rfcomm_abort, - .pr_accept = ng_btsocket_rfcomm_accept, + .pr_accept = ng_btsocket_rfcomm_peeraddr, .pr_attach = ng_btsocket_rfcomm_attach, .pr_bind = ng_btsocket_rfcomm_bind, .pr_connect = ng_btsocket_rfcomm_connect, @@ -152,7 +152,7 @@ static struct protosw ng_btsocket_sco_protosw = { .pr_flags = PR_ATOMIC|PR_CONNREQUIRED, .pr_ctloutput = ng_btsocket_sco_ctloutput, .pr_abort = ng_btsocket_sco_abort, - .pr_accept = ng_btsocket_sco_accept, + .pr_accept = ng_btsocket_sco_peeraddr, .pr_attach = ng_btsocket_sco_attach, .pr_bind = ng_btsocket_sco_bind, .pr_connect = ng_btsocket_sco_connect, diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c index 935991696929..5d015b2eac6e 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c @@ -1557,16 +1557,6 @@ ng_btsocket_hci_raw_disconnect(struct socket *so) } /* ng_btsocket_hci_raw_disconnect */ /* - * Get socket peer's address - */ - -int -ng_btsocket_hci_raw_peeraddr(struct socket *so, struct sockaddr **nam) -{ - return (ng_btsocket_hci_raw_sockaddr(so, nam)); -} /* ng_btsocket_hci_raw_peeraddr */ - -/* * Send data */ @@ -1656,25 +1646,24 @@ drop: */ int -ng_btsocket_hci_raw_sockaddr(struct socket *so, struct sockaddr **nam) +ng_btsocket_hci_raw_sockaddr(struct socket *so, struct sockaddr *sa) { ng_btsocket_hci_raw_pcb_p pcb = so2hci_raw_pcb(so); - struct sockaddr_hci sa; + struct sockaddr_hci *hci = (struct sockaddr_hci *)sa; if (pcb == NULL) return (EINVAL); if (ng_btsocket_hci_raw_node == NULL) return (EINVAL); - bzero(&sa, sizeof(sa)); - sa.hci_len = sizeof(sa); - sa.hci_family = AF_BLUETOOTH; + *hci = (struct sockaddr_hci ){ + .hci_len = sizeof(struct sockaddr_hci), + .hci_family = AF_BLUETOOTH, + }; mtx_lock(&pcb->pcb_mtx); - strlcpy(sa.hci_node, pcb->addr.hci_node, sizeof(sa.hci_node)); + strlcpy(hci->hci_node, pcb->addr.hci_node, sizeof(hci->hci_node)); mtx_unlock(&pcb->pcb_mtx); - *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT); - - return ((*nam == NULL)? ENOMEM : 0); -} /* ng_btsocket_hci_raw_sockaddr */ + return (0); +} diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c index d221cc34d36a..ae5405529667 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c @@ -2509,69 +2509,44 @@ out: return (error); } /* ng_btsocket_listen */ -static int -ng_btsocket_l2cap_peeraddr1(struct socket *so, struct sockaddr_l2cap *sa) +/* + * Return peer address for getpeername(2) or for accept(2). For the latter + * case no extra work to do here, socket must be connected and ready. + */ +int +ng_btsocket_l2cap_peeraddr(struct socket *so, struct sockaddr *sa) { ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so); + struct sockaddr_l2cap *l2cap = (struct sockaddr_l2cap *)sa; if (pcb == NULL) return (EINVAL); if (ng_btsocket_l2cap_node == NULL) return (EINVAL); - *sa = (struct sockaddr_l2cap ){ + *l2cap = (struct sockaddr_l2cap ){ .l2cap_len = sizeof(struct sockaddr_l2cap), .l2cap_family = AF_BLUETOOTH, .l2cap_psm = htole16(pcb->psm), }; - bcopy(&pcb->dst, &sa->l2cap_bdaddr, sizeof(sa->l2cap_bdaddr)); + bcopy(&pcb->dst, &l2cap->l2cap_bdaddr, sizeof(l2cap->l2cap_bdaddr)); switch(pcb->idtype){ case NG_L2CAP_L2CA_IDTYPE_ATT: - sa->l2cap_cid = NG_L2CAP_ATT_CID; + l2cap->l2cap_cid = NG_L2CAP_ATT_CID; break; case NG_L2CAP_L2CA_IDTYPE_SMP: - sa->l2cap_cid = NG_L2CAP_SMP_CID; + l2cap->l2cap_cid = NG_L2CAP_SMP_CID; break; default: - sa->l2cap_cid = 0; + l2cap->l2cap_cid = 0; break; } - sa->l2cap_bdaddr_type = pcb->dsttype; + l2cap->l2cap_bdaddr_type = pcb->dsttype; return (0); } /* - * Get peer address - */ -int -ng_btsocket_l2cap_peeraddr(struct socket *so, struct sockaddr **nam) -{ - struct sockaddr_l2cap sa; - int error; - - error = ng_btsocket_l2cap_peeraddr1(so, &sa); - if (error != 0) - return (error); - *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT); - - return ((*nam == NULL)? ENOMEM : 0); -} - -/* - * Accept connection on socket. Nothing to do here, socket must be connected - * and ready, so just return peer address and be done with it. - */ -int -ng_btsocket_l2cap_accept(struct socket *so, struct sockaddr *sa) -{ - if (ng_btsocket_l2cap_node == NULL) - return (EINVAL); - - return (ng_btsocket_l2cap_peeraddr1(so, (struct sockaddr_l2cap *)sa)); -} - -/* * Send data to socket */ @@ -2702,29 +2677,27 @@ ng_btsocket_l2cap_send2(ng_btsocket_l2cap_pcb_p pcb) /* * Get socket address */ - int -ng_btsocket_l2cap_sockaddr(struct socket *so, struct sockaddr **nam) +ng_btsocket_l2cap_sockaddr(struct socket *so, struct sockaddr *sa) { ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so); - struct sockaddr_l2cap sa; + struct sockaddr_l2cap *l2cap = (struct sockaddr_l2cap *)sa; if (pcb == NULL) return (EINVAL); if (ng_btsocket_l2cap_node == NULL) return (EINVAL); - bcopy(&pcb->src, &sa.l2cap_bdaddr, sizeof(sa.l2cap_bdaddr)); - sa.l2cap_psm = htole16(pcb->psm); - sa.l2cap_len = sizeof(sa); - sa.l2cap_family = AF_BLUETOOTH; - sa.l2cap_cid = 0; - sa.l2cap_bdaddr_type = pcb->srctype; - - *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT); + *l2cap = (struct sockaddr_l2cap ){ + .l2cap_len = sizeof(struct sockaddr_l2cap), + .l2cap_family = AF_BLUETOOTH, + .l2cap_psm = htole16(pcb->psm), + .l2cap_bdaddr_type = pcb->srctype, + }; + bcopy(&pcb->src, &l2cap->l2cap_bdaddr, sizeof(l2cap->l2cap_bdaddr)); - return ((*nam == NULL)? ENOMEM : 0); -} /* ng_btsocket_l2cap_sockaddr */ + return (0); +} /***************************************************************************** ***************************************************************************** diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c index 6ddefe4be156..c95b0c486eb1 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c @@ -1204,30 +1204,28 @@ ng_btsocket_l2cap_raw_disconnect(struct socket *so) */ int -ng_btsocket_l2cap_raw_peeraddr(struct socket *so, struct sockaddr **nam) +ng_btsocket_l2cap_raw_peeraddr(struct socket *so, struct sockaddr *sa) { ng_btsocket_l2cap_raw_pcb_p pcb = so2l2cap_raw_pcb(so); - struct sockaddr_l2cap sa; + struct sockaddr_l2cap *l2cap = (struct sockaddr_l2cap *)sa; if (pcb == NULL) return (EINVAL); if (ng_btsocket_l2cap_raw_node == NULL) return (EINVAL); + *l2cap = (struct sockaddr_l2cap ){ + .l2cap_len = sizeof(struct sockaddr_l2cap), + .l2cap_family = AF_BLUETOOTH, + .l2cap_bdaddr_type = BDADDR_BREDR, + }; + mtx_lock(&pcb->pcb_mtx); - bcopy(&pcb->dst, &sa.l2cap_bdaddr, sizeof(sa.l2cap_bdaddr)); + bcopy(&pcb->dst, &l2cap->l2cap_bdaddr, sizeof(l2cap->l2cap_bdaddr)); mtx_unlock(&pcb->pcb_mtx); - sa.l2cap_psm = 0; - sa.l2cap_len = sizeof(sa); - sa.l2cap_family = AF_BLUETOOTH; - sa.l2cap_cid = 0; - sa.l2cap_bdaddr_type = BDADDR_BREDR; - - *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT); - - return ((*nam == NULL)? ENOMEM : 0); -} /* ng_btsocket_l2cap_raw_peeraddr */ + return (0); +} /* * Send data to socket @@ -1248,29 +1246,28 @@ ng_btsocket_l2cap_raw_send(struct socket *so, int flags, struct mbuf *m, */ int -ng_btsocket_l2cap_raw_sockaddr(struct socket *so, struct sockaddr **nam) +ng_btsocket_l2cap_raw_sockaddr(struct socket *so, struct sockaddr *sa) { ng_btsocket_l2cap_raw_pcb_p pcb = so2l2cap_raw_pcb(so); - struct sockaddr_l2cap sa; + struct sockaddr_l2cap *l2cap = (struct sockaddr_l2cap *)sa; if (pcb == NULL) return (EINVAL); if (ng_btsocket_l2cap_raw_node == NULL) return (EINVAL); + *l2cap = (struct sockaddr_l2cap ){ + .l2cap_len = sizeof(struct sockaddr_l2cap), + .l2cap_family = AF_BLUETOOTH, + .l2cap_bdaddr_type = BDADDR_BREDR, + }; + mtx_lock(&pcb->pcb_mtx); - bcopy(&pcb->src, &sa.l2cap_bdaddr, sizeof(sa.l2cap_bdaddr)); + bcopy(&pcb->src, &l2cap->l2cap_bdaddr, sizeof(l2cap->l2cap_bdaddr)); mtx_unlock(&pcb->pcb_mtx); - sa.l2cap_psm = 0; - sa.l2cap_len = sizeof(sa); - sa.l2cap_family = AF_BLUETOOTH; - sa.l2cap_cid = 0; - sa.l2cap_bdaddr_type = BDADDR_BREDR; - *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT); - - return ((*nam == NULL)? ENOMEM : 0); -} /* ng_btsocket_l2cap_raw_sockaddr */ + return (0); +} /* * Get next token diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c index af542f3c258b..4780227a66f1 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c @@ -914,53 +914,30 @@ out: return (error); } /* ng_btsocket_listen */ -static int -ng_btsocket_rfcomm_peeraddr1(struct socket *so, struct sockaddr_rfcomm *sa) +/* + * Return peer address for getpeername(2) or for accept(2). For the latter + * case no extra work to do here, socket must be connected and ready. + */ +int +ng_btsocket_rfcomm_peeraddr(struct socket *so, struct sockaddr *sa) { ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so); + struct sockaddr_rfcomm *rfcomm = (struct sockaddr_rfcomm *)sa; if (pcb == NULL) return (EINVAL); - *sa = (struct sockaddr_rfcomm ){ + *rfcomm = (struct sockaddr_rfcomm ){ .rfcomm_len = sizeof(struct sockaddr_rfcomm), .rfcomm_family = AF_BLUETOOTH, .rfcomm_channel = pcb->channel, }; - bcopy(&pcb->dst, &sa->rfcomm_bdaddr, sizeof(sa->rfcomm_bdaddr)); + bcopy(&pcb->dst, &rfcomm->rfcomm_bdaddr, sizeof(rfcomm->rfcomm_bdaddr)); return (0); } /* - * Get peer address - */ -int -ng_btsocket_rfcomm_peeraddr(struct socket *so, struct sockaddr **nam) -{ - struct sockaddr_rfcomm sa; - int error; - - error = ng_btsocket_rfcomm_peeraddr1(so, &sa); - if (error != 0) - return (error); - *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT); - - return ((*nam == NULL)? ENOMEM : 0); -} - -/* - * Accept connection on socket. Nothing to do here, socket must be connected - * and ready, so just return peer address and be done with it. - */ -int -ng_btsocket_rfcomm_accept(struct socket *so, struct sockaddr *sa) -{ - - return (ng_btsocket_rfcomm_peeraddr1(so, (struct sockaddr_rfcomm *)sa)); -} - -/* * Send data to socket */ @@ -1008,23 +985,23 @@ drop: */ int -ng_btsocket_rfcomm_sockaddr(struct socket *so, struct sockaddr **nam) +ng_btsocket_rfcomm_sockaddr(struct socket *so, struct sockaddr *sa) { ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so); - struct sockaddr_rfcomm sa; + struct sockaddr_rfcomm *rfcomm = (struct sockaddr_rfcomm *)sa; if (pcb == NULL) return (EINVAL); - bcopy(&pcb->src, &sa.rfcomm_bdaddr, sizeof(sa.rfcomm_bdaddr)); - sa.rfcomm_channel = pcb->channel; - sa.rfcomm_len = sizeof(sa); - sa.rfcomm_family = AF_BLUETOOTH; - - *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT); + *rfcomm = (struct sockaddr_rfcomm ){ + .rfcomm_len = sizeof(struct sockaddr_rfcomm), + .rfcomm_family = AF_BLUETOOTH, + .rfcomm_channel = pcb->channel, + }; + bcopy(&pcb->src, &rfcomm->rfcomm_bdaddr, sizeof(rfcomm->rfcomm_bdaddr)); - return ((*nam == NULL)? ENOMEM : 0); -} /* ng_btsocket_rfcomm_sockaddr */ + return (0); +} /* * Upcall function for L2CAP sockets. Enqueue RFCOMM task. diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c b/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c index d9700f91c132..115dd6d87ec4 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c @@ -1609,58 +1609,33 @@ out: return (error); } /* ng_btsocket_listen */ -static int -ng_btsocket_sco_peeraddr1(struct socket *so, struct sockaddr_sco *sa) +/* + * Return peer address for getpeername(2) or for accept(2). For the latter + * case no extra work to do here, socket must be connected and ready. + */ +int +ng_btsocket_sco_peeraddr(struct socket *so, struct sockaddr *sa) { ng_btsocket_sco_pcb_p pcb = so2sco_pcb(so); + struct sockaddr_sco *sco = (struct sockaddr_sco *)sa; if (pcb == NULL) return (EINVAL); if (ng_btsocket_sco_node == NULL) return (EINVAL); - *sa = (struct sockaddr_sco ){ + *sco = (struct sockaddr_sco ){ .sco_len = sizeof(struct sockaddr_sco), .sco_family = AF_BLUETOOTH, }; mtx_lock(&pcb->pcb_mtx); - bcopy(&pcb->dst, &sa->sco_bdaddr, sizeof(sa->sco_bdaddr)); + bcopy(&pcb->dst, &sco->sco_bdaddr, sizeof(sco->sco_bdaddr)); mtx_unlock(&pcb->pcb_mtx); return (0); } /* - * Get peer address - */ -int -ng_btsocket_sco_peeraddr(struct socket *so, struct sockaddr **nam) -{ - struct sockaddr_sco sa; - int error; - - error = ng_btsocket_sco_peeraddr1(so, &sa); - if (error != 0) - return (error); - *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT); - - return ((*nam == NULL)? ENOMEM : 0); -} - -/* - * Accept connection on socket. Nothing to do here, socket must be connected - * and ready, so just return peer address and be done with it. - */ -int -ng_btsocket_sco_accept(struct socket *so, struct sockaddr *sa) -{ - if (ng_btsocket_sco_node == NULL) - return (EINVAL); - - return (ng_btsocket_sco_peeraddr1(so, (struct sockaddr_sco *)sa)); -} - -/* * Send data to socket */ @@ -1791,27 +1766,26 @@ ng_btsocket_sco_send2(ng_btsocket_sco_pcb_p pcb) */ int -ng_btsocket_sco_sockaddr(struct socket *so, struct sockaddr **nam) +ng_btsocket_sco_sockaddr(struct socket *so, struct sockaddr *sa) { ng_btsocket_sco_pcb_p pcb = so2sco_pcb(so); - struct sockaddr_sco sa; + struct sockaddr_sco *sco = (struct sockaddr_sco *)sa; if (pcb == NULL) return (EINVAL); if (ng_btsocket_sco_node == NULL) return (EINVAL); + *sco = (struct sockaddr_sco ){ + .sco_len = sizeof(struct sockaddr_sco), + .sco_family = AF_BLUETOOTH, + }; mtx_lock(&pcb->pcb_mtx); - bcopy(&pcb->src, &sa.sco_bdaddr, sizeof(sa.sco_bdaddr)); + bcopy(&pcb->src, &sco->sco_bdaddr, sizeof(sco->sco_bdaddr)); mtx_unlock(&pcb->pcb_mtx); - sa.sco_len = sizeof(sa); - sa.sco_family = AF_BLUETOOTH; - - *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT); - - return ((*nam == NULL)? ENOMEM : 0); -} /* ng_btsocket_sco_sockaddr */ + return (0); +} /***************************************************************************** ***************************************************************************** diff --git a/sys/netgraph/ng_ksocket.c b/sys/netgraph/ng_ksocket.c index 23a53528833f..98eb19ab485b 100644 --- a/sys/netgraph/ng_ksocket.c +++ b/sys/netgraph/ng_ksocket.c @@ -771,9 +771,8 @@ ng_ksocket_rcvmsg(node_p node, item_p item, hook_p lasthook) case NGM_KSOCKET_GETNAME: case NGM_KSOCKET_GETPEERNAME: { - int (*func)(struct socket *so, struct sockaddr **nam); - struct sockaddr *sa = NULL; - int len; + int (*func)(struct socket *so, struct sockaddr *sa); + struct sockaddr_storage ss = { .ss_len = sizeof(ss) }; /* Sanity check */ if (msg->header.arglen != 0) @@ -786,27 +785,22 @@ ng_ksocket_rcvmsg(node_p node, item_p item, hook_p lasthook) if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0) ERROUT(ENOTCONN); - func = so->so_proto->pr_peeraddr; + func = sopeeraddr; } else - func = so->so_proto->pr_sockaddr; + func = sosockaddr; /* Get local or peer address */ - if ((error = (*func)(so, &sa)) != 0) - goto bail; - len = (sa == NULL) ? 0 : sa->sa_len; + error = (*func)(so, (struct sockaddr *)&ss); + if (error) + break; /* Send it back in a response */ - NG_MKRESPONSE(resp, msg, len, M_NOWAIT); - if (resp == NULL) { + NG_MKRESPONSE(resp, msg, ss.ss_len, M_NOWAIT); + if (resp != NULL) + bcopy(&ss, resp->data, ss.ss_len); + else error = ENOMEM; - goto bail; - } - bcopy(sa, resp->data, len); - bail: - /* Cleanup */ - if (sa != NULL) - free(sa, M_SONAME); break; } diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c index 8a8f127ee39b..c356f7d6aa12 100644 --- a/sys/netgraph/ng_socket.c +++ b/sys/netgraph/ng_socket.c @@ -500,11 +500,10 @@ ngd_connect(struct socket *so, struct sockaddr *nam, struct thread *td) * Used for both data and control sockets */ static int -ng_getsockaddr(struct socket *so, struct sockaddr **addr) +ng_getsockaddr(struct socket *so, struct sockaddr *sa) { + struct sockaddr_ng *sg = (struct sockaddr_ng *)sa; struct ngpcb *pcbp; - struct sockaddr_ng *sg; - int sg_len; int error = 0; pcbp = sotongpcb(so); @@ -512,9 +511,10 @@ ng_getsockaddr(struct socket *so, struct sockaddr **addr) /* XXXGL: can this still happen? */ return (EINVAL); - sg_len = sizeof(struct sockaddr_ng) + NG_NODESIZ - - sizeof(sg->sg_data); - sg = malloc(sg_len, M_SONAME, M_WAITOK | M_ZERO); + *sg = (struct sockaddr_ng ){ + .sg_len = sizeof(struct sockaddr_ng), + .sg_family = AF_NETGRAPH, + }; mtx_lock(&pcbp->sockdata->mtx); if (pcbp->sockdata->node != NULL) { @@ -526,16 +526,9 @@ ng_getsockaddr(struct socket *so, struct sockaddr **addr) else snprintf(sg->sg_data, sizeof(sg->sg_data), "[%x]", ng_node2ID(node)); - mtx_unlock(&pcbp->sockdata->mtx); - - sg->sg_len = sg_len; - sg->sg_family = AF_NETGRAPH; - *addr = (struct sockaddr *)sg; - } else { - mtx_unlock(&pcbp->sockdata->mtx); - free(sg, M_SONAME); + } else error = EINVAL; - } + mtx_unlock(&pcbp->sockdata->mtx); return (error); } |
