aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2020-08-24 08:25:00 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2020-08-24 08:25:00 +0000
commitc2acd568867621cf9d5e17465fca76ea03b3b47d (patch)
tree3bc9c977f24215132232a9c7841b1b83342c0634 /sys/netinet
parent180b28bb5067672f0573ee79f5efa039d85593b6 (diff)
Notes
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/sctp_uio.h17
-rw-r--r--sys/netinet/sctp_usrreq.c60
2 files changed, 37 insertions, 40 deletions
diff --git a/sys/netinet/sctp_uio.h b/sys/netinet/sctp_uio.h
index 022589de7170..a57197ee2364 100644
--- a/sys/netinet/sctp_uio.h
+++ b/sys/netinet/sctp_uio.h
@@ -39,7 +39,7 @@ __FBSDID("$FreeBSD$");
#define _NETINET_SCTP_UIO_H_
-#if ! defined(_KERNEL)
+#if !defined(_KERNEL)
#include <stdint.h>
#endif
#include <sys/types.h>
@@ -633,10 +633,15 @@ struct sctp_setpeerprim {
uint8_t sspp_padding[4];
};
+union sctp_sockstore {
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+ struct sockaddr sa;
+};
+
struct sctp_getaddresses {
sctp_assoc_t sget_assoc_id;
- /* addr is filled in for N * sockaddr_storage */
- struct sockaddr addr[1];
+ union sctp_sockstore addr[];
};
struct sctp_status {
@@ -1143,12 +1148,6 @@ struct sctpstat {
#define SCTP_STAT_DECR_COUNTER64(_x) SCTP_STAT_DECR(_x)
#define SCTP_STAT_DECR_GAUGE32(_x) SCTP_STAT_DECR(_x)
-union sctp_sockstore {
- struct sockaddr_in sin;
- struct sockaddr_in6 sin6;
- struct sockaddr sa;
-};
-
/***********************************/
/* And something for us old timers */
diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c
index ed5a4a4c05f1..920097305803 100644
--- a/sys/netinet/sctp_usrreq.c
+++ b/sys/netinet/sctp_usrreq.c
@@ -970,7 +970,7 @@ sctp_shutdown(struct socket *so)
* returns 0 on success, 1 on error
*/
static uint32_t
-sctp_fill_user_address(struct sockaddr_storage *ss, struct sockaddr *sa)
+sctp_fill_user_address(union sctp_sockstore *ss, struct sockaddr *sa)
{
#ifdef INET6
struct sockaddr_in6 lsa6;
@@ -991,7 +991,7 @@ static size_t
sctp_fill_up_addresses_vrf(struct sctp_inpcb *inp,
struct sctp_tcb *stcb,
size_t limit,
- struct sockaddr_storage *sas,
+ union sctp_sockstore *addr,
uint32_t vrf_id)
{
struct sctp_ifn *sctp_ifn;
@@ -1106,18 +1106,18 @@ sctp_fill_up_addresses_vrf(struct sctp_inpcb *inp,
if (actual + sizeof(struct sockaddr_in6) > limit) {
return (actual);
}
- in6_sin_2_v4mapsin6(sin, (struct sockaddr_in6 *)sas);
- ((struct sockaddr_in6 *)sas)->sin6_port = inp->sctp_lport;
- sas = (struct sockaddr_storage *)((caddr_t)sas + sizeof(struct sockaddr_in6));
+ in6_sin_2_v4mapsin6(sin, &addr->sin6);
+ addr->sin6.sin6_port = inp->sctp_lport;
+ addr = (union sctp_sockstore *)((caddr_t)addr + sizeof(struct sockaddr_in6));
actual += sizeof(struct sockaddr_in6);
} else {
#endif
if (actual + sizeof(struct sockaddr_in) > limit) {
return (actual);
}
- memcpy(sas, sin, sizeof(struct sockaddr_in));
- ((struct sockaddr_in *)sas)->sin_port = inp->sctp_lport;
- sas = (struct sockaddr_storage *)((caddr_t)sas + sizeof(struct sockaddr_in));
+ memcpy(addr, sin, sizeof(struct sockaddr_in));
+ addr->sin.sin_port = inp->sctp_lport;
+ addr = (union sctp_sockstore *)((caddr_t)addr + sizeof(struct sockaddr_in));
actual += sizeof(struct sockaddr_in);
#ifdef INET6
}
@@ -1169,9 +1169,9 @@ sctp_fill_up_addresses_vrf(struct sctp_inpcb *inp,
if (actual + sizeof(struct sockaddr_in6) > limit) {
return (actual);
}
- memcpy(sas, sin6, sizeof(struct sockaddr_in6));
- ((struct sockaddr_in6 *)sas)->sin6_port = inp->sctp_lport;
- sas = (struct sockaddr_storage *)((caddr_t)sas + sizeof(struct sockaddr_in6));
+ memcpy(addr, sin6, sizeof(struct sockaddr_in6));
+ addr->sin6.sin6_port = inp->sctp_lport;
+ addr = (union sctp_sockstore *)((caddr_t)addr + sizeof(struct sockaddr_in6));
actual += sizeof(struct sockaddr_in6);
} else {
continue;
@@ -1198,24 +1198,24 @@ sctp_fill_up_addresses_vrf(struct sctp_inpcb *inp,
if (actual + sa_len > limit) {
return (actual);
}
- if (sctp_fill_user_address(sas, &laddr->ifa->address.sa))
+ if (sctp_fill_user_address(addr, &laddr->ifa->address.sa))
continue;
switch (laddr->ifa->address.sa.sa_family) {
#ifdef INET
case AF_INET:
- ((struct sockaddr_in *)sas)->sin_port = inp->sctp_lport;
+ addr->sin.sin_port = inp->sctp_lport;
break;
#endif
#ifdef INET6
case AF_INET6:
- ((struct sockaddr_in6 *)sas)->sin6_port = inp->sctp_lport;
+ addr->sin6.sin6_port = inp->sctp_lport;
break;
#endif
default:
/* TSNH */
break;
}
- sas = (struct sockaddr_storage *)((caddr_t)sas + sa_len);
+ addr = (union sctp_sockstore *)((caddr_t)addr + sa_len);
actual += sa_len;
}
}
@@ -1226,13 +1226,13 @@ static size_t
sctp_fill_up_addresses(struct sctp_inpcb *inp,
struct sctp_tcb *stcb,
size_t limit,
- struct sockaddr_storage *sas)
+ union sctp_sockstore *addr)
{
size_t size = 0;
SCTP_IPI_ADDR_RLOCK();
/* fill up addresses for the endpoint's default vrf */
- size = sctp_fill_up_addresses_vrf(inp, stcb, limit, sas,
+ size = sctp_fill_up_addresses_vrf(inp, stcb, limit, addr,
inp->def_vrf_id);
SCTP_IPI_ADDR_RUNLOCK();
return (size);
@@ -2207,7 +2207,7 @@ flags_out:
*/
{
size_t cpsz, left;
- struct sockaddr_storage *sas;
+ union sctp_sockstore *addr;
struct sctp_nets *net;
struct sctp_getaddresses *saddr;
@@ -2215,9 +2215,9 @@ flags_out:
SCTP_FIND_STCB(inp, stcb, saddr->sget_assoc_id);
if (stcb) {
- left = (*optsize) - sizeof(sctp_assoc_t);
- *optsize = sizeof(sctp_assoc_t);
- sas = (struct sockaddr_storage *)&saddr->addr[0];
+ left = *optsize - offsetof(struct sctp_getaddresses, addr);
+ *optsize = offsetof(struct sctp_getaddresses, addr);
+ addr = &saddr->addr[0];
TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
switch (net->ro._l_addr.sa.sa_family) {
@@ -2255,16 +2255,16 @@ flags_out:
(net->ro._l_addr.sa.sa_family == AF_INET)) {
/* Must map the address */
in6_sin_2_v4mapsin6(&net->ro._l_addr.sin,
- (struct sockaddr_in6 *)sas);
+ &addr->sin6);
} else {
- memcpy(sas, &net->ro._l_addr, cpsz);
+ memcpy(addr, &net->ro._l_addr, cpsz);
}
#else
- memcpy(sas, &net->ro._l_addr, cpsz);
+ memcpy(addr, &net->ro._l_addr, cpsz);
#endif
- ((struct sockaddr_in *)sas)->sin_port = stcb->rport;
+ addr->sin.sin_port = stcb->rport;
- sas = (struct sockaddr_storage *)((caddr_t)sas + cpsz);
+ addr = (union sctp_sockstore *)((caddr_t)addr + cpsz);
left -= cpsz;
*optsize += cpsz;
}
@@ -2278,19 +2278,17 @@ flags_out:
case SCTP_GET_LOCAL_ADDRESSES:
{
size_t limit, actual;
- struct sockaddr_storage *sas;
struct sctp_getaddresses *saddr;
SCTP_CHECK_AND_CAST(saddr, optval, struct sctp_getaddresses, *optsize);
SCTP_FIND_STCB(inp, stcb, saddr->sget_assoc_id);
- sas = (struct sockaddr_storage *)&saddr->addr[0];
- limit = *optsize - sizeof(sctp_assoc_t);
- actual = sctp_fill_up_addresses(inp, stcb, limit, sas);
+ limit = *optsize - offsetof(struct sctp_getaddresses, addr);
+ actual = sctp_fill_up_addresses(inp, stcb, limit, saddr->addr);
if (stcb) {
SCTP_TCB_UNLOCK(stcb);
}
- *optsize = sizeof(sctp_assoc_t) + actual;
+ *optsize = offsetof(struct sctp_getaddresses, addr) + actual;
break;
}
case SCTP_PEER_ADDR_PARAMS: