aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjoern A. Zeeb <bz@FreeBSD.org>2023-11-12 20:33:41 +0000
committerBjoern A. Zeeb <bz@FreeBSD.org>2023-12-02 20:37:36 +0000
commit1edc20b76953d9ef571b0bcf89b206b98ed13d9b (patch)
tree5bf3a80f8bdd82518a742fc80e3bef4326785f30
parentf071abd92e726fc12e9256662e1f286f364252ee (diff)
-rw-r--r--contrib/wpa/wpa_supplicant/ctrl_iface_unix.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/contrib/wpa/wpa_supplicant/ctrl_iface_unix.c b/contrib/wpa/wpa_supplicant/ctrl_iface_unix.c
index 639573dae75e..deeed2b11833 100644
--- a/contrib/wpa/wpa_supplicant/ctrl_iface_unix.c
+++ b/contrib/wpa/wpa_supplicant/ctrl_iface_unix.c
@@ -506,6 +506,10 @@ static int wpas_ctrl_iface_open_sock(struct wpa_supplicant *wpa_s,
struct group *grp;
char *endp;
int flags;
+#if defined(__FreeBSD__)
+ int optval, rc;
+ socklen_t optlen;
+#endif
buf = os_strdup(wpa_s->conf->ctrl_interface);
if (buf == NULL)
@@ -679,6 +683,22 @@ havesock:
}
}
+#if defined(__FreeBSD__)
+ /* Ensure we can send a full length message atomically. */
+ optval = 0;
+ optlen = sizeof(optval);
+ if (getsockopt(priv->sock, SOL_SOCKET, SO_SNDBUF, &optval, &optlen) == -1) {
+ wpa_printf(MSG_INFO, "failed to get sndbuf for sock=%d: %s",
+ priv->sock, strerror(errno));
+ } else if (optval < CTRL_IFACE_MAX_LEN) {
+ optval = CTRL_IFACE_MAX_LEN;
+ if (setsockopt(priv->sock, SOL_SOCKET, SO_SNDBUF, &optval,
+ sizeof(optval)) == -1)
+ wpa_printf(MSG_ERROR, "failed to set sndbuf for "
+ "sock=%d: %s", priv->sock, strerror(errno));
+ }
+#endif
+
eloop_register_read_sock(priv->sock, wpa_supplicant_ctrl_iface_receive,
wpa_s, priv);
wpa_msg_register_cb(wpa_supplicant_ctrl_iface_msg_cb);