#include <linux/skbuff.h>
#include <linux/rtnetlink.h>
#include <linux/moduleparam.h>
#include <linux/ip.h>
#include <linux/in.h>
#include <linux/igmp.h>
#include <linux/inetdevice.h>
#include <linux/delay.h>
#include <linux/completion.h>
#include <linux/slab.h>
#include <net/dst.h>
#include "ipoib.h"
#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
static int mcast_debug_level;
module_param(mcast_debug_level, int, 0644);
MODULE_PARM_DESC(…) …;
#endif
struct ipoib_mcast_iter { … };
#define SENDONLY_FULLMEMBER_JOIN …
static void __ipoib_mcast_schedule_join_thread(struct ipoib_dev_priv *priv,
struct ipoib_mcast *mcast,
bool delay)
{ … }
static void ipoib_mcast_free(struct ipoib_mcast *mcast)
{ … }
static struct ipoib_mcast *ipoib_mcast_alloc(struct net_device *dev)
{ … }
static struct ipoib_mcast *__ipoib_mcast_find(struct net_device *dev, void *mgid)
{ … }
static int __ipoib_mcast_add(struct net_device *dev, struct ipoib_mcast *mcast)
{ … }
static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
struct ib_sa_mcmember_rec *mcmember)
{ … }
void ipoib_mcast_carrier_on_task(struct work_struct *work)
{ … }
static int ipoib_mcast_join_complete(int status,
struct ib_sa_multicast *multicast)
{ … }
static int ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast)
{ … }
void ipoib_mcast_join_task(struct work_struct *work)
{ … }
void ipoib_mcast_start_thread(struct net_device *dev)
{ … }
void ipoib_mcast_stop_thread(struct net_device *dev)
{ … }
static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast)
{ … }
void ipoib_check_and_add_mcast_sendonly(struct ipoib_dev_priv *priv, u8 *mgid,
struct list_head *remove_list)
{ … }
void ipoib_mcast_remove_list(struct list_head *remove_list)
{ … }
void ipoib_mcast_send(struct net_device *dev, u8 *daddr, struct sk_buff *skb)
{ … }
void ipoib_mcast_dev_flush(struct net_device *dev)
{ … }
static int ipoib_mcast_addr_is_valid(const u8 *addr, const u8 *broadcast)
{ … }
void ipoib_mcast_restart_task(struct work_struct *work)
{ … }
#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
struct ipoib_mcast_iter *ipoib_mcast_iter_init(struct net_device *dev)
{ … }
int ipoib_mcast_iter_next(struct ipoib_mcast_iter *iter)
{ … }
void ipoib_mcast_iter_read(struct ipoib_mcast_iter *iter,
union ib_gid *mgid,
unsigned long *created,
unsigned int *queuelen,
unsigned int *complete,
unsigned int *send_only)
{ … }
#endif