driver_bsd.c: Clean up EAPOL frame transmission code
authorMasashi Honma <honma@ictec.co.jp>
Sat, 16 Jan 2010 09:47:05 +0000 (11:47 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 16 Jan 2010 09:47:05 +0000 (11:47 +0200)
The bsd_send_eapol() prepares 3000 bytes buffer for every EAPOL
frame transmission. I think malloc() is better way for efficient
memory use.

src/drivers/driver_bsd.c

index bd3f56b..9744570 100644 (file)
@@ -696,39 +696,35 @@ bsd_send_eapol(void *priv, const u8 *addr, const u8 *data, size_t data_len,
               int encrypt, const u8 *own_addr)
 {
        struct bsd_driver_data *drv = priv;
-       unsigned char buf[3000];
-       unsigned char *bp = buf;
+       unsigned char *bp;
        struct l2_ethhdr *eth;
        size_t len;
        int status;
 
        /*
-        * Prepend the Etherent header.  If the caller left us
+        * Prepend the Ethernet header.  If the caller left us
         * space at the front we could just insert it but since
         * we don't know we copy to a local buffer.  Given the frequency
         * and size of frames this probably doesn't matter.
         */
        len = data_len + sizeof(struct l2_ethhdr);
-       if (len > sizeof(buf)) {
-               bp = malloc(len);
-               if (bp == NULL) {
-                       printf("EAPOL frame discarded, cannot malloc temp "
-                              "buffer of size %u!\n", (unsigned int) len);
-                       return -1;
-               }
+       bp = os_zalloc(len);
+       if (bp == NULL) {
+               wpa_printf(MSG_ERROR, "malloc() failed for bsd_send_eapol"
+                          "(len=%lu)", (unsigned long) len);
+               return -1;
        }
        eth = (struct l2_ethhdr *) bp;
-       memcpy(eth->h_dest, addr, ETH_ALEN);
-       memcpy(eth->h_source, own_addr, ETH_ALEN);
+       os_memcpy(eth->h_dest, addr, ETH_ALEN);
+       os_memcpy(eth->h_source, own_addr, ETH_ALEN);
        eth->h_proto = htons(ETH_P_EAPOL);
-       memcpy(eth+1, data, data_len);
+       os_memcpy(eth + 1, data, data_len);
 
        wpa_hexdump(MSG_MSGDUMP, "TX EAPOL", bp, len);
 
        status = l2_packet_send(drv->sock_xmit, addr, ETH_P_EAPOL, bp, len);
 
-       if (bp != buf)
-               free(bp);
+       os_free(bp);
        return status;
 }