aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyeyoon Park <kyeyoonp@qca.qualcomm.com>2014-11-01 05:15:19 (GMT)
committerJouni Malinen <j@w1.fi>2014-11-19 14:25:13 (GMT)
commit5c58944d08718e7a8aefddd0e18825c288865604 (patch)
treea70638743cbf54233365274cd781e9fedc75d156
parented4ddb6d77ae0aa35c0338774c7153ec3e63306e (diff)
downloadhostap-5c58944d08718e7a8aefddd0e18825c288865604.zip
hostap-5c58944d08718e7a8aefddd0e18825c288865604.tar.gz
hostap-5c58944d08718e7a8aefddd0e18825c288865604.tar.bz2
AP: Add multicast-to-unicast conversion send for "x_snoop"
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>
-rw-r--r--src/ap/x_snoop.c28
-rw-r--r--src/ap/x_snoop.h10
2 files changed, 38 insertions, 0 deletions
diff --git a/src/ap/x_snoop.c b/src/ap/x_snoop.c
index 20e8401..0ae2012 100644
--- a/src/ap/x_snoop.c
+++ b/src/ap/x_snoop.c
@@ -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);
diff --git a/src/ap/x_snoop.h b/src/ap/x_snoop.h
index 67ca0c6..e43a78d 100644
--- a/src/ap/x_snoop.h
+++ b/src/ap/x_snoop.h
@@ -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)
{
}