aboutsummaryrefslogtreecommitdiff
path: root/sys/netgraph
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@FreeBSD.org>2023-11-30 16:30:55 +0000
committerGleb Smirnoff <glebius@FreeBSD.org>2023-11-30 16:31:10 +0000
commit0fac350c54d0a72f5341e15021efcde63eb58a4b (patch)
tree6b4229e6fe419e850c04226390fbe5396569aba6 /sys/netgraph
parentcfb1e92912b4cf75360b7fbe86197cc29bc212c1 (diff)
Diffstat (limited to 'sys/netgraph')
-rw-r--r--sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h3
-rw-r--r--sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h9
-rw-r--r--sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h4
-rw-r--r--sys/netgraph/bluetooth/include/ng_btsocket_sco.h4
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket.c8
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c29
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c75
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c47
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c61
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_sco.c62
-rw-r--r--sys/netgraph/ng_ksocket.c28
-rw-r--r--sys/netgraph/ng_socket.c23
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);
}