Adds a performance improvement for when sctp_sendx is
called with only one address, we then can call the generic system call. Also fixes some socket api type issues and cleans up the "magic" numbers that were being used in the code. Reviewed by: gnn
This commit is contained in:
parent
6fac927ccc
commit
804cf64147
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=166884
@ -28,8 +28,10 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
@ -54,14 +56,20 @@ __FBSDID("$FreeBSD$");
|
||||
(*(const u_int32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff)))
|
||||
#endif
|
||||
|
||||
|
||||
#define SCTP_CONTROL_VEC_SIZE_SND 8192
|
||||
#define SCTP_CONTROL_VEC_SIZE_RCV 16384
|
||||
#define SCTP_STACK_BUF_SIZE 2048
|
||||
#define SCTP_SMALL_IOVEC_SIZE 2
|
||||
|
||||
#ifdef SCTP_DEBUG_PRINT_ADDRESS
|
||||
|
||||
#define SCTP_STRING_BUF_SZ 256
|
||||
|
||||
static void
|
||||
SCTPPrintAnAddress(struct sockaddr *a)
|
||||
{
|
||||
char stringToPrint[256];
|
||||
char stringToPrint[SCTP_STRING_BUF_SZ];
|
||||
u_short prt;
|
||||
char *srcaddr, *txt;
|
||||
|
||||
@ -79,8 +87,8 @@ SCTPPrintAnAddress(struct sockaddr *a)
|
||||
txt = "IPv6 Address: ";
|
||||
} else if (a->sa_family == AF_LINK) {
|
||||
int i;
|
||||
char tbuf[200];
|
||||
u_char adbuf[200];
|
||||
char tbuf[SCTP_STRING_BUF_SZ];
|
||||
u_char adbuf[SCTP_STRING_BUF_SZ];
|
||||
struct sockaddr_dl *dl;
|
||||
|
||||
dl = (struct sockaddr_dl *)a;
|
||||
@ -101,10 +109,6 @@ SCTPPrintAnAddress(struct sockaddr *a)
|
||||
printf(":");
|
||||
}
|
||||
printf("\n");
|
||||
/*
|
||||
* u_short sdl_route[16]; *//* source routing
|
||||
* information
|
||||
*/
|
||||
return;
|
||||
} else {
|
||||
return;
|
||||
@ -164,7 +168,7 @@ sctp_getaddrlen(sa_family_t family)
|
||||
int
|
||||
sctp_connectx(int sd, const struct sockaddr *addrs, int addrcnt)
|
||||
{
|
||||
char buf[2048];
|
||||
char buf[SCTP_STACK_BUF_SIZE];
|
||||
int i, ret, cnt, *aa;
|
||||
char *cpto;
|
||||
const struct sockaddr *at;
|
||||
@ -288,7 +292,7 @@ sctp_getpaddrs(int sd, sctp_assoc_t id, struct sockaddr **raddrs)
|
||||
struct sockaddr *re;
|
||||
sctp_assoc_t asoc;
|
||||
caddr_t lim;
|
||||
socklen_t siz;
|
||||
size_t siz;
|
||||
int cnt;
|
||||
|
||||
if (raddrs == NULL) {
|
||||
@ -298,14 +302,14 @@ sctp_getpaddrs(int sd, sctp_assoc_t id, struct sockaddr **raddrs)
|
||||
asoc = id;
|
||||
siz = sizeof(sctp_assoc_t);
|
||||
if (getsockopt(sd, IPPROTO_SCTP, SCTP_GET_REMOTE_ADDR_SIZE,
|
||||
&asoc, &siz) != 0) {
|
||||
&asoc, (socklen_t *) & siz) != 0) {
|
||||
errno = ENOMEM;
|
||||
return (-1);
|
||||
}
|
||||
/* size required is returned in 'asoc' */
|
||||
siz = (uint32_t) asoc;
|
||||
siz = (size_t)asoc;
|
||||
siz += sizeof(struct sctp_getaddresses);
|
||||
addrs = calloc((unsigned long)1, (unsigned long)siz);
|
||||
addrs = calloc(1, siz);
|
||||
if (addrs == NULL) {
|
||||
errno = ENOMEM;
|
||||
return (-1);
|
||||
@ -350,7 +354,7 @@ sctp_getladdrs(int sd, sctp_assoc_t id, struct sockaddr **raddrs)
|
||||
caddr_t lim;
|
||||
struct sockaddr *sa;
|
||||
int size_of_addresses;
|
||||
socklen_t siz;
|
||||
size_t siz;
|
||||
int cnt;
|
||||
|
||||
if (raddrs == NULL) {
|
||||
@ -360,7 +364,7 @@ sctp_getladdrs(int sd, sctp_assoc_t id, struct sockaddr **raddrs)
|
||||
size_of_addresses = 0;
|
||||
siz = sizeof(int);
|
||||
if (getsockopt(sd, IPPROTO_SCTP, SCTP_GET_LOCAL_ADDR_SIZE,
|
||||
&size_of_addresses, &siz) != 0) {
|
||||
&size_of_addresses, (socklen_t *) & siz) != 0) {
|
||||
errno = ENOMEM;
|
||||
return (-1);
|
||||
}
|
||||
@ -370,7 +374,7 @@ sctp_getladdrs(int sd, sctp_assoc_t id, struct sockaddr **raddrs)
|
||||
}
|
||||
siz = size_of_addresses + sizeof(struct sockaddr_storage);
|
||||
siz += sizeof(struct sctp_getaddresses);
|
||||
addrs = calloc((unsigned long)1, (unsigned long)siz);
|
||||
addrs = calloc(1, siz);
|
||||
if (addrs == NULL) {
|
||||
errno = ENOMEM;
|
||||
return (-1);
|
||||
@ -436,7 +440,7 @@ sctp_sendmsg(int s,
|
||||
ssize_t sz;
|
||||
struct msghdr msg;
|
||||
struct sctp_sndrcvinfo *s_info;
|
||||
struct iovec iov[2];
|
||||
struct iovec iov[SCTP_SMALL_IOVEC_SIZE];
|
||||
char controlVector[SCTP_CONTROL_VEC_SIZE_RCV];
|
||||
struct cmsghdr *cmsg;
|
||||
struct sockaddr *who = NULL;
|
||||
@ -547,7 +551,7 @@ sctp_send(int sd, const void *data, size_t len,
|
||||
#else
|
||||
ssize_t sz;
|
||||
struct msghdr msg;
|
||||
struct iovec iov[2];
|
||||
struct iovec iov[SCTP_SMALL_IOVEC_SIZE];
|
||||
struct sctp_sndrcvinfo *s_info;
|
||||
char controlVector[SCTP_CONTROL_VEC_SIZE_SND];
|
||||
struct cmsghdr *cmsg;
|
||||
@ -595,6 +599,20 @@ sctp_sendx(int sd, const void *msg, size_t msg_len,
|
||||
int add_len, len, no_end_cx = 0;
|
||||
struct sockaddr *at;
|
||||
|
||||
|
||||
#ifdef SYS_sctp_generic_sendmsg
|
||||
if (addrcnt < SCTP_SMALL_IOVEC_SIZE) {
|
||||
socklen_t l;
|
||||
|
||||
/*
|
||||
* Quick way, we don't need to do a connectx so lets use the
|
||||
* syscall directly.
|
||||
*/
|
||||
l = addrs->sa_len;
|
||||
return (syscall(SYS_sctp_generic_sendmsg, sd,
|
||||
msg, msg_len, addrs, l, sinfo, flags));
|
||||
}
|
||||
#endif
|
||||
len = sizeof(int);
|
||||
at = addrs;
|
||||
cnt = 0;
|
||||
@ -617,10 +635,6 @@ sctp_sendx(int sd, const void *msg, size_t msg_len,
|
||||
errno = EINVAL;
|
||||
return (-1);
|
||||
}
|
||||
if (len > 2048) {
|
||||
/* Never enough memory */
|
||||
return (E2BIG);
|
||||
}
|
||||
buf = malloc(len);
|
||||
if (buf == NULL) {
|
||||
return (ENOMEM);
|
||||
@ -693,7 +707,7 @@ sctp_recvmsg(int s,
|
||||
{
|
||||
|
||||
#ifdef SYS_sctp_generic_recvmsg
|
||||
struct iovec iov[2];
|
||||
struct iovec iov[SCTP_SMALL_IOVEC_SIZE];
|
||||
|
||||
iov[0].iov_base = dbuf;
|
||||
iov[0].iov_len = len;
|
||||
@ -704,7 +718,7 @@ sctp_recvmsg(int s,
|
||||
ssize_t sz;
|
||||
int sinfo_found = 0;
|
||||
struct msghdr msg;
|
||||
struct iovec iov[2];
|
||||
struct iovec iov[SCTP_SMALL_IOVEC_SIZE];
|
||||
char controlVector[SCTP_CONTROL_VEC_SIZE_RCV];
|
||||
struct cmsghdr *cmsg;
|
||||
|
||||
@ -826,3 +840,9 @@ sctp_peeloff(int sd, sctp_assoc_t assoc_id)
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#undef SCTP_CONTROL_VEC_SIZE_SND 8192
|
||||
#undef SCTP_CONTROL_VEC_SIZE_RCV 16384
|
||||
#undef SCTP_STACK_BUF_SIZE 2048
|
||||
#undef SCTP_SMALL_IOVEC_SIZE 2
|
||||
|
Loading…
Reference in New Issue
Block a user