From 5c58944d08718e7a8aefddd0e18825c288865604 Mon Sep 17 00:00:00 2001 From: Kyeyoon Park Date: Fri, 31 Oct 2014 22:15:19 -0700 Subject: [PATCH] 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 --- src/ap/x_snoop.c | 28 ++++++++++++++++++++++++++++ src/ap/x_snoop.h | 10 ++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/ap/x_snoop.c b/src/ap/x_snoop.c index 20e8401ae..0ae20128a 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 67ca0c699..e43a78d0d 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) { }