AP: Add multicast-to-unicast conversion send for "x_snoop"
authorKyeyoon Park <kyeyoonp@qca.qualcomm.com>
Sat, 1 Nov 2014 05:15:19 +0000 (22:15 -0700)
committerJouni Malinen <j@w1.fi>
Wed, 19 Nov 2014 14:25:13 +0000 (16:25 +0200)
Multicast-to-unicast conversion send will be needed in various part of
Proxy ARP and DGAF Disable.

Signed-off-by: Kyeyoon Park <kyeyoonp@qca.qualcomm.com>
src/ap/x_snoop.c
src/ap/x_snoop.h

index 20e8401..0ae2012 100644 (file)
@@ -10,6 +10,7 @@
 
 #include "utils/common.h"
 #include "hostapd.h"
+#include "sta_info.h"
 #include "ap_drv_ops.h"
 #include "x_snoop.h"
 
@@ -83,6 +84,33 @@ x_snoop_get_l2_packet(struct hostapd_data *hapd,
 }
 
 
+void x_snoop_mcast_to_ucast_convert_send(struct hostapd_data *hapd,
+                                        struct sta_info *sta, u8 *buf,
+                                        size_t len)
+{
+       int res;
+       u8 addr[ETH_ALEN];
+       u8 *dst_addr = buf;
+
+       if (!(dst_addr[0] & 0x01))
+               return;
+
+       /* save the multicast destination address for restoring it later */
+       os_memcpy(addr, buf, ETH_ALEN);
+
+       os_memcpy(buf, sta->addr, ETH_ALEN);
+       res = l2_packet_send(hapd->sock_dhcp, NULL, 0, buf, len);
+       if (res) {
+               wpa_printf(MSG_DEBUG,
+                          "x_snoop: Failed to send mcast to ucast converted packet to "
+                          MACSTR, MAC2STR(sta->addr));
+       }
+
+       /* restore the multicast destination address */
+       os_memcpy(buf, addr, ETH_ALEN);
+}
+
+
 void x_snoop_deinit(struct hostapd_data *hapd)
 {
        hostapd_drv_br_set_net_param(hapd, DRV_BR_NET_PARAM_GARP_ACCEPT, 0);
index 67ca0c6..e43a78d 100644 (file)
@@ -19,6 +19,9 @@ x_snoop_get_l2_packet(struct hostapd_data *hapd,
                      void (*handler)(void *ctx, const u8 *src_addr,
                                      const u8 *buf, size_t len),
                      enum l2_packet_filter_type type);
+void x_snoop_mcast_to_ucast_convert_send(struct hostapd_data *hapd,
+                                        struct sta_info *sta, u8 *buf,
+                                        size_t len);
 void x_snoop_deinit(struct hostapd_data *hapd);
 
 #else /* CONFIG_PROXYARP */
@@ -37,6 +40,13 @@ x_snoop_get_l2_packet(struct hostapd_data *hapd,
        return NULL;
 }
 
+static inline void
+x_snoop_mcast_to_ucast_convert_send(struct hostapd_data *hapd,
+                                   struct sta_info *sta, void *buf,
+                                   size_t len)
+{
+}
+
 static inline void x_snoop_deinit(struct hostapd_data *hapd)
 {
 }