<div dir="ltr"><div><div>Currently these three steps runs for each event.</div><div>1. get buffer size via system</div><div>2. allocate a memory for event</div><div>3. free the memory</div><div><br></div><div>The wpa_supplicant receives 4 events from boot to be connected.</div>
<div>So this patch prepare the event buffer at the init process.</div><div><br></div><div>I have tested wpa_supplicant on NetBSD 6.1.2.</div><div>But I could not tested hostapd because I do not have AP enabled device.</div>
<div><br></div><div>Signed-hostap: Masashi Honma <<a href="mailto:masashi.honma@gmail.com">masashi.honma@gmail.com</a>></div><div><br></div><div>diff --git a/src/drivers/driver_bsd.c b/src/drivers/driver_bsd.c</div>
<div>index fb6402d..e4e050a 100644</div><div>--- a/src/drivers/driver_bsd.c</div><div>+++ b/src/drivers/driver_bsd.c</div><div>@@ -62,6 +62,8 @@ struct bsd_driver_data {</div><div> <span class="" style="white-space:pre">        </span>int<span class="" style="white-space:pre">        </span>prev_privacy;<span class="" style="white-space:pre">        </span>/* privacy state to restore on deinit */</div>
<div> <span class="" style="white-space:pre">        </span>int<span class="" style="white-space:pre">        </span>prev_wpa;<span class="" style="white-space:pre">        </span>/* wpa state to restore on deinit */</div><div> <span class="" style="white-space:pre">        </span>enum ieee80211_opmode opmode;<span class="" style="white-space:pre">        </span>/* operation mode */</div>
<div>+<span class="" style="white-space:pre">        </span>char<span class="" style="white-space:pre">        </span>*event_buf;</div><div>+<span class="" style="white-space:pre">        </span>size_t<span class="" style="white-space:pre">        </span>event_buf_len;</div>
<div> };</div><div> </div><div> /* Generic functions for hostapd and wpa_supplicant */</div><div>@@ -642,7 +644,7 @@ bsd_set_opt_ie(void *priv, const u8 *ie, size_t ie_len)</div><div> <span class="" style="white-space:pre">        </span>return 0;</div>
<div> }</div><div> </div><div>-static int</div><div>+static size_t</div><div> rtbuf_len(void)</div><div> {</div><div> <span class="" style="white-space:pre">        </span>size_t len;</div><div>@@ -779,37 +781,26 @@ static void</div>
<div> bsd_wireless_event_receive(int sock, void *ctx, void *sock_ctx)</div><div> {</div><div> <span class="" style="white-space:pre">        </span>struct bsd_driver_data *drv = ctx;</div><div>-<span class="" style="white-space:pre">        </span>char *buf;</div>
<div> <span class="" style="white-space:pre">        </span>struct if_announcemsghdr *ifan;</div><div> <span class="" style="white-space:pre">        </span>struct rt_msghdr *rtm;</div><div> <span class="" style="white-space:pre">        </span>struct ieee80211_michael_event *mic;</div>
<div> <span class="" style="white-space:pre">        </span>struct ieee80211_join_event *join;</div><div> <span class="" style="white-space:pre">        </span>struct ieee80211_leave_event *leave;</div><div>-<span class="" style="white-space:pre">        </span>int n, len;</div>
<div>+<span class="" style="white-space:pre">        </span>int n;</div><div> <span class="" style="white-space:pre">        </span>union wpa_event_data data;</div><div> </div><div>-<span class="" style="white-space:pre">        </span>len = rtbuf_len();</div>
<div>-</div><div>-<span class="" style="white-space:pre">        </span>buf = os_malloc(len);</div><div>-<span class="" style="white-space:pre">        </span>if (buf == NULL) {</div><div>-<span class="" style="white-space:pre">                </span>wpa_printf(MSG_ERROR, "%s os_malloc() failed\n", __func__);</div>
<div>-<span class="" style="white-space:pre">                </span>return;</div><div>-<span class="" style="white-space:pre">        </span>}</div><div>-</div><div>-<span class="" style="white-space:pre">        </span>n = read(sock, buf, len);</div>
<div>+<span class="" style="white-space:pre">        </span>n = read(sock, drv->event_buf, drv->event_buf_len);</div><div> <span class="" style="white-space:pre">        </span>if (n < 0) {</div><div> <span class="" style="white-space:pre">                </span>if (errno != EINTR && errno != EAGAIN)</div>
<div> <span class="" style="white-space:pre">                        </span>wpa_printf(MSG_ERROR, "%s read() failed: %s\n",</div><div> <span class="" style="white-space:pre">                                </span> __func__, strerror(errno));</div><div>-<span class="" style="white-space:pre">                </span>os_free(buf);</div>
<div> <span class="" style="white-space:pre">                </span>return;</div><div> <span class="" style="white-space:pre">        </span>}</div><div> </div><div>-<span class="" style="white-space:pre">        </span>rtm = (struct rt_msghdr *) buf;</div>
<div>+<span class="" style="white-space:pre">        </span>rtm = (struct rt_msghdr *)drv->event_buf;</div><div> <span class="" style="white-space:pre">        </span>if (rtm->rtm_version != RTM_VERSION) {</div><div> <span class="" style="white-space:pre">                </span>wpa_printf(MSG_DEBUG, "Invalid routing message version=%d",</div>
<div> <span class="" style="white-space:pre">                        </span> rtm->rtm_version);</div><div>-<span class="" style="white-space:pre">                </span>os_free(buf);</div><div> <span class="" style="white-space:pre">                </span>return;</div>
<div> <span class="" style="white-space:pre">        </span>}</div><div> <span class="" style="white-space:pre">        </span>ifan = (struct if_announcemsghdr *) rtm;</div><div>@@ -850,7 +841,6 @@ bsd_wireless_event_receive(int sock, void *ctx, void *sock_ctx)</div>
<div> <span class="" style="white-space:pre">                </span>}</div><div> <span class="" style="white-space:pre">                </span>break;</div><div> <span class="" style="white-space:pre">        </span>}</div><div>-<span class="" style="white-space:pre">        </span>os_free(buf);</div>
<div> }</div><div> </div><div> static void</div><div>@@ -871,6 +861,14 @@ bsd_init(struct hostapd_data *hapd, struct wpa_init_params *params)</div><div> <span class="" style="white-space:pre">                </span>goto bad;</div><div>
<span class="" style="white-space:pre">        </span>}</div><div> </div><div>+<span class="" style="white-space:pre">        </span>drv->event_buf_len = rtbuf_len();</div><div>+</div><div>+<span class="" style="white-space:pre">        </span>drv->event_buf = os_malloc(drv->event_buf_len);</div>
<div>+<span class="" style="white-space:pre">        </span>if (drv->event_buf == NULL) {</div><div>+<span class="" style="white-space:pre">                </span>wpa_printf(MSG_ERROR, "%s os_malloc() failed\n", __func__);</div><div>
+<span class="" style="white-space:pre">                </span>goto bad;</div><div>+<span class="" style="white-space:pre">        </span>}</div><div>+</div><div> <span class="" style="white-space:pre">        </span>drv->hapd = hapd;</div><div> <span class="" style="white-space:pre">        </span>drv->sock = socket(PF_INET, SOCK_DGRAM, 0);</div>
<div> <span class="" style="white-space:pre">        </span>if (drv->sock < 0) {</div><div>@@ -910,6 +908,8 @@ bad:</div><div> <span class="" style="white-space:pre">                </span>l2_packet_deinit(drv->sock_xmit);</div><div>
<span class="" style="white-space:pre">        </span>if (drv->sock >= 0)</div><div> <span class="" style="white-space:pre">                </span>close(drv->sock);</div><div>+<span class="" style="white-space:pre">        </span>if (drv->event_buf != NULL)</div>
<div>+<span class="" style="white-space:pre">                </span>os_free(drv->event_buf);</div><div> <span class="" style="white-space:pre">        </span>if (drv != NULL)</div><div> <span class="" style="white-space:pre">                </span>os_free(drv);</div>
<div> <span class="" style="white-space:pre">        </span>return NULL;</div><div>@@ -930,6 +930,7 @@ bsd_deinit(void *priv)</div><div> <span class="" style="white-space:pre">                </span>close(drv->sock);</div><div> <span class="" style="white-space:pre">        </span>if (drv->sock_xmit != NULL)</div>
<div> <span class="" style="white-space:pre">                </span>l2_packet_deinit(drv->sock_xmit);</div><div>+<span class="" style="white-space:pre">        </span>os_free(drv->event_buf);</div><div> <span class="" style="white-space:pre">        </span>os_free(drv);</div>
<div> }</div><div> </div><div>@@ -1208,7 +1209,6 @@ static void</div><div> wpa_driver_bsd_event_receive(int sock, void *ctx, void *sock_ctx)</div><div> {</div><div> <span class="" style="white-space:pre">        </span>struct bsd_driver_data *drv = sock_ctx;</div>
<div>-<span class="" style="white-space:pre">        </span>char *buf;</div><div> <span class="" style="white-space:pre">        </span>struct if_announcemsghdr *ifan;</div><div> <span class="" style="white-space:pre">        </span>struct if_msghdr *ifm;</div>
<div> <span class="" style="white-space:pre">        </span>struct rt_msghdr *rtm;</div><div>@@ -1216,30 +1216,20 @@ wpa_driver_bsd_event_receive(int sock, void *ctx, void *sock_ctx)</div><div> <span class="" style="white-space:pre">        </span>struct ieee80211_michael_event *mic;</div>
<div> <span class="" style="white-space:pre">        </span>struct ieee80211_leave_event *leave;</div><div> <span class="" style="white-space:pre">        </span>struct ieee80211_join_event *join;</div><div>-<span class="" style="white-space:pre">        </span>int n, len;</div>
<div>+<span class="" style="white-space:pre">        </span>int n;</div><div> </div><div>-<span class="" style="white-space:pre">        </span>len = rtbuf_len();</div><div>-</div><div>-<span class="" style="white-space:pre">        </span>buf = os_malloc(len);</div>
<div>-<span class="" style="white-space:pre">        </span>if (buf == NULL) {</div><div>-<span class="" style="white-space:pre">                </span>wpa_printf(MSG_ERROR, "%s os_malloc() failed\n", __func__);</div><div>-<span class="" style="white-space:pre">                </span>return;</div>
<div>-<span class="" style="white-space:pre">        </span>}</div><div>-</div><div>-<span class="" style="white-space:pre">        </span>n = read(sock, buf, len);</div><div>+<span class="" style="white-space:pre">        </span>n = read(sock, drv->event_buf, drv->event_buf_len);</div>
<div> <span class="" style="white-space:pre">        </span>if (n < 0) {</div><div> <span class="" style="white-space:pre">                </span>if (errno != EINTR && errno != EAGAIN)</div><div> <span class="" style="white-space:pre">                        </span>wpa_printf(MSG_ERROR, "%s read() failed: %s\n",</div>
<div> <span class="" style="white-space:pre">                                </span> __func__, strerror(errno));</div><div>-<span class="" style="white-space:pre">                </span>os_free(buf);</div><div> <span class="" style="white-space:pre">                </span>return;</div>
<div> <span class="" style="white-space:pre">        </span>}</div><div> </div><div>-<span class="" style="white-space:pre">        </span>rtm = (struct rt_msghdr *) buf;</div><div>+<span class="" style="white-space:pre">        </span>rtm = (struct rt_msghdr *)drv->event_buf;</div>
<div> <span class="" style="white-space:pre">        </span>if (rtm->rtm_version != RTM_VERSION) {</div><div> <span class="" style="white-space:pre">                </span>wpa_printf(MSG_DEBUG, "Invalid routing message version=%d",</div>
<div> <span class="" style="white-space:pre">                        </span> rtm->rtm_version);</div><div>-<span class="" style="white-space:pre">                </span>os_free(buf);</div><div> <span class="" style="white-space:pre">                </span>return;</div>
<div> <span class="" style="white-space:pre">        </span>}</div><div> <span class="" style="white-space:pre">        </span>os_memset(&event, 0, sizeof(event));</div><div>@@ -1254,7 +1244,6 @@ wpa_driver_bsd_event_receive(int sock, void *ctx, void *sock_ctx)</div>
<div> <span class="" style="white-space:pre">                </span>case IFAN_DEPARTURE:</div><div> <span class="" style="white-space:pre">                        </span>event.interface_status.ievent = EVENT_INTERFACE_REMOVED;</div><div> <span class="" style="white-space:pre">                </span>default:</div>
<div>-<span class="" style="white-space:pre">                        </span>os_free(buf);</div><div> <span class="" style="white-space:pre">                        </span>return;</div><div> <span class="" style="white-space:pre">                </span>}</div><div> <span class="" style="white-space:pre">                </span>wpa_printf(MSG_DEBUG, "RTM_IFANNOUNCE: Interface '%s' %s",</div>
<div>@@ -1327,7 +1316,6 @@ wpa_driver_bsd_event_receive(int sock, void *ctx, void *sock_ctx)</div><div> <span class="" style="white-space:pre">                </span>}</div><div> <span class="" style="white-space:pre">                </span>break;</div>
<div> <span class="" style="white-space:pre">        </span>}</div><div>-<span class="" style="white-space:pre">        </span>os_free(buf);</div><div> }</div><div> </div><div> static void</div><div>@@ -1508,6 +1496,14 @@ wpa_driver_bsd_init(void *ctx, const char *ifname)</div>
<div> <span class="" style="white-space:pre">        </span>drv = os_zalloc(sizeof(*drv));</div><div> <span class="" style="white-space:pre">        </span>if (drv == NULL)</div><div> <span class="" style="white-space:pre">                </span>return NULL;</div>
<div>+</div><div>+<span class="" style="white-space:pre">        </span>drv->event_buf_len = rtbuf_len();</div><div>+</div><div>+<span class="" style="white-space:pre">        </span>drv->event_buf = os_malloc(drv->event_buf_len);</div>
<div>+<span class="" style="white-space:pre">        </span>if (drv->event_buf == NULL) {</div><div>+<span class="" style="white-space:pre">                </span>wpa_printf(MSG_ERROR, "%s os_malloc() failed\n", __func__);</div><div>
+<span class="" style="white-space:pre">                </span>goto fail1;</div><div>+<span class="" style="white-space:pre">        </span>}</div><div> <span class="" style="white-space:pre">        </span>/*</div><div> <span class="" style="white-space:pre">        </span> * NB: We require the interface name be mappable to an index.</div>
<div> <span class="" style="white-space:pre">        </span> * This implies we do not support having wpa_supplicant</div><div>@@ -1562,6 +1558,7 @@ wpa_driver_bsd_init(void *ctx, const char *ifname)</div><div> fail:</div><div>
<span class="" style="white-space:pre">        </span>close(drv->sock);</div><div> fail1:</div><div>+<span class="" style="white-space:pre">        </span>os_free(drv->event_buf);</div><div> <span class="" style="white-space:pre">        </span>os_free(drv);</div>
<div> <span class="" style="white-space:pre">        </span>return NULL;</div><div> #undef GETPARAM</div><div>@@ -1587,6 +1584,7 @@ wpa_driver_bsd_deinit(void *priv)</div><div> <span class="" style="white-space:pre">                </span>l2_packet_deinit(drv->sock_xmit);</div>
<div> <span class="" style="white-space:pre">        </span>(void) close(drv->route);<span class="" style="white-space:pre">                </span>/* ioctl socket */</div><div> <span class="" style="white-space:pre">        </span>(void) close(drv->sock);<span class="" style="white-space:pre">                </span>/* event socket */</div>
<div>+<span class="" style="white-space:pre">        </span>os_free(drv->event_buf);</div><div> <span class="" style="white-space:pre">        </span>os_free(drv);</div><div> }</div><div> </div><div><br></div><div>Regards,</div><div>
Masashi Honma.</div></div><div><br></div></div>