version 1.1.1.1, 2012/02/21 22:39:10
|
version 1.1.1.2, 2014/06/15 16:37:11
|
Line 1
|
Line 1
|
/* $NetBSD: pfkey.c,v 1.21 2011/01/20 16:08:35 vanhu Exp $ */ | /* $NetBSD: pfkey.c,v 1.21.2.1 2011/11/14 13:25:06 tteras Exp $ */ |
|
|
/* $KAME: pfkey.c,v 1.47 2003/10/02 19:52:12 itojun Exp $ */ |
/* $KAME: pfkey.c,v 1.47 2003/10/02 19:52:12 itojun Exp $ */ |
|
|
Line 1783 int
|
Line 1783 int
|
pfkey_open(void) |
pfkey_open(void) |
{ |
{ |
int so; |
int so; |
int bufsiz = 128 * 1024; /*is 128K enough?*/ | int bufsiz_current, bufsiz_wanted; |
| int ret; |
| socklen_t len; |
|
|
if ((so = socket(PF_KEY, SOCK_RAW, PF_KEY_V2)) < 0) { |
if ((so = socket(PF_KEY, SOCK_RAW, PF_KEY_V2)) < 0) { |
__ipsec_set_strerror(strerror(errno)); |
__ipsec_set_strerror(strerror(errno)); |
Line 1794 pfkey_open(void)
|
Line 1796 pfkey_open(void)
|
* This is a temporary workaround for KAME PR 154. |
* This is a temporary workaround for KAME PR 154. |
* Don't really care even if it fails. |
* Don't really care even if it fails. |
*/ |
*/ |
(void)setsockopt(so, SOL_SOCKET, SO_SNDBUF, &bufsiz, sizeof(bufsiz)); | /* Try to have 128k. If we have more, do not lower it. */ |
(void)setsockopt(so, SOL_SOCKET, SO_RCVBUF, &bufsiz, sizeof(bufsiz)); | bufsiz_wanted = 128 * 1024; |
bufsiz = 256 * 1024; | len = sizeof(bufsiz_current); |
(void)setsockopt(so, SOL_SOCKET, SO_RCVBUF, &bufsiz, sizeof(bufsiz)); | ret = getsockopt(so, SOL_SOCKET, SO_SNDBUF, |
bufsiz = 512 * 1024; | &bufsiz_current, &len); |
(void)setsockopt(so, SOL_SOCKET, SO_RCVBUF, &bufsiz, sizeof(bufsiz)); | if ((ret < 0) || (bufsiz_current < bufsiz_wanted)) |
bufsiz = 1024 * 1024; | (void)setsockopt(so, SOL_SOCKET, SO_SNDBUF, |
(void)setsockopt(so, SOL_SOCKET, SO_RCVBUF, &bufsiz, sizeof(bufsiz)); | &bufsiz_wanted, sizeof(bufsiz_wanted)); |
| |
| /* Try to have have at least 2MB. If we have more, do not lower it. */ |
| bufsiz_wanted = 2 * 1024 * 1024; |
| len = sizeof(bufsiz_current); |
| ret = getsockopt(so, SOL_SOCKET, SO_RCVBUF, |
| &bufsiz_current, &len); |
| if (ret < 0) |
| bufsiz_current = 128 * 1024; |
| |
| for (; bufsiz_wanted > bufsiz_current; bufsiz_wanted /= 2) { |
| if (setsockopt(so, SOL_SOCKET, SO_RCVBUF, |
| &bufsiz_wanted, sizeof(bufsiz_wanted)) == 0) |
| break; |
| } |
| |
__ipsec_errcode = EIPSEC_NO_ERROR; |
__ipsec_errcode = EIPSEC_NO_ERROR; |
return so; |
return so; |
} |
} |