drivers: Move wired_multicast_membership() to a common file
This continues refactoring of the common parts of wired drivers code into a shared file, so that they can be reused by other drivers. Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
This commit is contained in:
parent
0abc8d10cc
commit
b0906ef770
6 changed files with 76 additions and 62 deletions
|
@ -76,34 +76,6 @@ struct macsec_qca_data {
|
|||
};
|
||||
|
||||
|
||||
static int macsec_qca_multicast_membership(int sock, int ifindex,
|
||||
const u8 *addr, int add)
|
||||
{
|
||||
#ifdef __linux__
|
||||
struct packet_mreq mreq;
|
||||
|
||||
if (sock < 0)
|
||||
return -1;
|
||||
|
||||
os_memset(&mreq, 0, sizeof(mreq));
|
||||
mreq.mr_ifindex = ifindex;
|
||||
mreq.mr_type = PACKET_MR_MULTICAST;
|
||||
mreq.mr_alen = ETH_ALEN;
|
||||
os_memcpy(mreq.mr_address, addr, ETH_ALEN);
|
||||
|
||||
if (setsockopt(sock, SOL_PACKET,
|
||||
add ? PACKET_ADD_MEMBERSHIP : PACKET_DROP_MEMBERSHIP,
|
||||
&mreq, sizeof(mreq)) < 0) {
|
||||
wpa_printf(MSG_ERROR, "setsockopt: %s", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
#else /* __linux__ */
|
||||
return -1;
|
||||
#endif /* __linux__ */
|
||||
}
|
||||
|
||||
|
||||
static int macsec_qca_get_ssid(void *priv, u8 *ssid)
|
||||
{
|
||||
ssid[0] = 0;
|
||||
|
@ -341,9 +313,9 @@ static void * macsec_qca_init(void *ctx, const char *ifname)
|
|||
drv->common.iff_up = 1;
|
||||
}
|
||||
|
||||
if (macsec_qca_multicast_membership(drv->common.pf_sock,
|
||||
if_nametoindex(drv->common.ifname),
|
||||
pae_group_addr, 1) == 0) {
|
||||
if (wired_multicast_membership(drv->common.pf_sock,
|
||||
if_nametoindex(drv->common.ifname),
|
||||
pae_group_addr, 1) == 0) {
|
||||
wpa_printf(MSG_DEBUG,
|
||||
"%s: Added multicast membership with packet socket",
|
||||
__func__);
|
||||
|
@ -392,9 +364,9 @@ static void macsec_qca_deinit(void *priv)
|
|||
int flags;
|
||||
|
||||
if (drv->common.membership &&
|
||||
macsec_qca_multicast_membership(drv->common.pf_sock,
|
||||
if_nametoindex(drv->common.ifname),
|
||||
pae_group_addr, 0) < 0) {
|
||||
wired_multicast_membership(drv->common.pf_sock,
|
||||
if_nametoindex(drv->common.ifname),
|
||||
pae_group_addr, 0) < 0) {
|
||||
wpa_printf(MSG_DEBUG,
|
||||
"%s: Failed to remove PAE multicast group (PACKET)",
|
||||
__func__);
|
||||
|
|
|
@ -76,34 +76,6 @@ struct dhcp_message {
|
|||
};
|
||||
|
||||
|
||||
static int wired_multicast_membership(int sock, int ifindex,
|
||||
const u8 *addr, int add)
|
||||
{
|
||||
#ifdef __linux__
|
||||
struct packet_mreq mreq;
|
||||
|
||||
if (sock < 0)
|
||||
return -1;
|
||||
|
||||
os_memset(&mreq, 0, sizeof(mreq));
|
||||
mreq.mr_ifindex = ifindex;
|
||||
mreq.mr_type = PACKET_MR_MULTICAST;
|
||||
mreq.mr_alen = ETH_ALEN;
|
||||
os_memcpy(mreq.mr_address, addr, ETH_ALEN);
|
||||
|
||||
if (setsockopt(sock, SOL_PACKET,
|
||||
add ? PACKET_ADD_MEMBERSHIP : PACKET_DROP_MEMBERSHIP,
|
||||
&mreq, sizeof(mreq)) < 0) {
|
||||
wpa_printf(MSG_ERROR, "setsockopt: %s", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
#else /* __linux__ */
|
||||
return -1;
|
||||
#endif /* __linux__ */
|
||||
}
|
||||
|
||||
|
||||
#ifdef __linux__
|
||||
static void handle_data(void *ctx, unsigned char *buf, size_t len)
|
||||
{
|
||||
|
|
57
src/drivers/driver_wired_common.c
Normal file
57
src/drivers/driver_wired_common.c
Normal file
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* Common functions for Wired Ethernet driver interfaces
|
||||
* Copyright (c) 2005-2009, Jouni Malinen <j@w1.fi>
|
||||
* Copyright (c) 2004, Gunter Burchardt <tira@isx.de>
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "eloop.h"
|
||||
#include "driver.h"
|
||||
#include "driver_wired_common.h"
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <net/if.h>
|
||||
#ifdef __linux__
|
||||
#include <netpacket/packet.h>
|
||||
#include <net/if_arp.h>
|
||||
#include <net/if.h>
|
||||
#endif /* __linux__ */
|
||||
#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
|
||||
#include <net/if_dl.h>
|
||||
#include <net/if_media.h>
|
||||
#endif /* defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) */
|
||||
#ifdef __sun__
|
||||
#include <sys/sockio.h>
|
||||
#endif /* __sun__ */
|
||||
|
||||
|
||||
int wired_multicast_membership(int sock, int ifindex, const u8 *addr, int add)
|
||||
{
|
||||
#ifdef __linux__
|
||||
struct packet_mreq mreq;
|
||||
|
||||
if (sock < 0)
|
||||
return -1;
|
||||
|
||||
os_memset(&mreq, 0, sizeof(mreq));
|
||||
mreq.mr_ifindex = ifindex;
|
||||
mreq.mr_type = PACKET_MR_MULTICAST;
|
||||
mreq.mr_alen = ETH_ALEN;
|
||||
os_memcpy(mreq.mr_address, addr, ETH_ALEN);
|
||||
|
||||
if (setsockopt(sock, SOL_PACKET,
|
||||
add ? PACKET_ADD_MEMBERSHIP : PACKET_DROP_MEMBERSHIP,
|
||||
&mreq, sizeof(mreq)) < 0) {
|
||||
wpa_printf(MSG_ERROR, "setsockopt: %s", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
#else /* __linux__ */
|
||||
return -1;
|
||||
#endif /* __linux__ */
|
||||
}
|
|
@ -22,4 +22,6 @@ struct driver_wired_common_data {
|
|||
static const u8 pae_group_addr[ETH_ALEN] =
|
||||
{ 0x01, 0x80, 0xc2, 0x00, 0x00, 0x03 };
|
||||
|
||||
int wired_multicast_membership(int sock, int ifindex, const u8 *addr, int add);
|
||||
|
||||
#endif /* DRIVER_WIRED_COMMON_H */
|
||||
|
|
|
@ -15,11 +15,17 @@ DRV_AP_LIBS =
|
|||
ifdef CONFIG_DRIVER_WIRED
|
||||
DRV_CFLAGS += -DCONFIG_DRIVER_WIRED
|
||||
DRV_OBJS += ../src/drivers/driver_wired.o
|
||||
NEED_DRV_WIRED_COMMON=1
|
||||
endif
|
||||
|
||||
ifdef CONFIG_DRIVER_MACSEC_QCA
|
||||
DRV_CFLAGS += -DCONFIG_DRIVER_MACSEC_QCA
|
||||
DRV_OBJS += ../src/drivers/driver_macsec_qca.o
|
||||
NEED_DRV_WIRED_COMMON=1
|
||||
endif
|
||||
|
||||
ifdef NEED_DRV_WIRED_COMMON
|
||||
DRV_OBJS += ../src/drivers/driver_wired_common.o
|
||||
endif
|
||||
|
||||
ifdef CONFIG_DRIVER_NL80211
|
||||
|
|
|
@ -15,6 +15,11 @@ DRV_AP_LIBS =
|
|||
ifdef CONFIG_DRIVER_WIRED
|
||||
DRV_CFLAGS += -DCONFIG_DRIVER_WIRED
|
||||
DRV_OBJS += src/drivers/driver_wired.c
|
||||
NEED_DRV_WIRED_COMMON=1
|
||||
endif
|
||||
|
||||
ifdef NEED_DRV_WIRED_COMMON
|
||||
DRV_OBJS += src/drivers/driver_wired_common.c
|
||||
endif
|
||||
|
||||
ifdef CONFIG_DRIVER_NL80211
|
||||
|
|
Loading…
Reference in a new issue