FreeBSD kernel IPv4 code
in_mcast.c File Reference
#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <sys/protosw.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/sysctl.h>
#include <sys/ktr.h>
#include <sys/taskqueue.h>
#include <sys/tree.h>
#include <net/if.h>
#include <net/if_var.h>
#include <net/if_dl.h>
#include <net/route.h>
#include <net/route/nhop.h>
#include <net/vnet.h>
#include <net/ethernet.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/in_fib.h>
#include <netinet/in_pcb.h>
#include <netinet/in_var.h>
#include <netinet/ip_var.h>
#include <netinet/igmp_var.h>
Include dependency graph for in_mcast.c:

Go to the source code of this file.

Data Structures

union  sockunion
 

Macros

#define KTR_IGMPV3   KTR_INET
 
#define __SOCKUNION_DECLARED
 

Typedefs

typedef union sockunion sockunion_t
 

Functions

 __FBSDID ("$FreeBSD$")
 
static MALLOC_DEFINE (M_INMFILTER, "in_mfilter", "IPv4 multicast PCB-layer source filter")
 
static MALLOC_DEFINE (M_IPMADDR, "in_multi", "IPv4 multicast group")
 
static MALLOC_DEFINE (M_IPMOPTS, "ip_moptions", "IPv4 multicast options")
 
static MALLOC_DEFINE (M_IPMSOURCE, "ip_msource", "IPv4 multicast IGMP-layer source filter")
 
 MTX_SYSINIT (in_multi_mtx, &in_multi_list_mtx, "in_multi_list_mtx", MTX_DEF)
 
 MTX_SYSINIT (in_multi_free_mtx, &in_multi_free_mtx, "in_multi_free_mtx", MTX_DEF)
 
 SX_SYSINIT (in_multi_sx, &in_multi_sx, "in_multi_sx")
 
static void imf_commit (struct in_mfilter *)
 
static int imf_get_source (struct in_mfilter *imf, const struct sockaddr_in *psin, struct in_msource **)
 
static struct in_msourceimf_graft (struct in_mfilter *, const uint8_t, const struct sockaddr_in *)
 
static void imf_leave (struct in_mfilter *)
 
static int imf_prune (struct in_mfilter *, const struct sockaddr_in *)
 
static void imf_purge (struct in_mfilter *)
 
static void imf_rollback (struct in_mfilter *)
 
static void imf_reap (struct in_mfilter *)
 
static struct in_mfilterimo_match_group (const struct ip_moptions *, const struct ifnet *, const struct sockaddr *)
 
static struct in_msourceimo_match_source (struct in_mfilter *, const struct sockaddr *)
 
static void ims_merge (struct ip_msource *ims, const struct in_msource *lims, const int rollback)
 
static int in_getmulti (struct ifnet *, const struct in_addr *, struct in_multi **)
 
static int inm_get_source (struct in_multi *inm, const in_addr_t haddr, const int noalloc, struct ip_msource **pims)
 
static int inm_merge (struct in_multi *, struct in_mfilter *)
 
static void inm_purge (struct in_multi *)
 
static void inm_reap (struct in_multi *)
 
static void inm_release (struct in_multi *)
 
static struct ip_moptions * inp_findmoptions (struct inpcb *)
 
static int inp_get_source_filters (struct inpcb *, struct sockopt *)
 
static int inp_join_group (struct inpcb *, struct sockopt *)
 
static int inp_leave_group (struct inpcb *, struct sockopt *)
 
static struct ifnet * inp_lookup_mcast_ifp (const struct inpcb *, const struct sockaddr_in *, const struct in_addr)
 
static int inp_block_unblock_source (struct inpcb *, struct sockopt *)
 
static int inp_set_multicast_if (struct inpcb *, struct sockopt *)
 
static int inp_set_source_filters (struct inpcb *, struct sockopt *)
 
static int sysctl_ip_mcast_filters (SYSCTL_HANDLER_ARGS)
 
static SYSCTL_NODE (_net_inet_ip, OID_AUTO, mcast, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "IPv4 multicast")
 
 SYSCTL_ULONG (_net_inet_ip_mcast, OID_AUTO, maxgrpsrc, CTLFLAG_RWTUN, &in_mcast_maxgrpsrc, 0, "Max source filters per group")
 
 SYSCTL_ULONG (_net_inet_ip_mcast, OID_AUTO, maxsocksrc, CTLFLAG_RWTUN, &in_mcast_maxsocksrc, 0, "Max source filters per socket")
 
 SYSCTL_INT (_net_inet_ip_mcast, OID_AUTO, loop, CTLFLAG_RWTUN, &in_mcast_loop, 0, "Loopback multicast datagrams by default")
 
static SYSCTL_NODE (_net_inet_ip_mcast, OID_AUTO, filters, CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_ip_mcast_filters, "Per-interface stack-wide source filters")
 
 TASKQUEUE_DEFINE_THREAD (inm_free)
 
static void inm_release_task (void *arg __unused, int pending __unused)
 
void inm_release_wait (void *arg __unused)
 
void inm_release_list_deferred (struct in_multi_head *inmh)
 
void inm_disconnect (struct in_multi *inm)
 
void inm_release_deferred (struct in_multi *inm)
 
static __inline void imf_init (struct in_mfilter *imf, const int st0, const int st1)
 
struct in_mfilterip_mfilter_alloc (const int mflags, const int st0, const int st1)
 
void ip_mfilter_free (struct in_mfilter *imf)
 
struct in_multiinm_lookup_locked (struct ifnet *ifp, const struct in_addr ina)
 
struct in_multiinm_lookup (struct ifnet *ifp, const struct in_addr ina)
 
int imo_multi_filter (const struct ip_moptions *imo, const struct ifnet *ifp, const struct sockaddr *group, const struct sockaddr *src)
 
void inm_clear_recorded (struct in_multi *inm)
 
int inm_record_source (struct in_multi *inm, const in_addr_t naddr)
 
void inm_commit (struct in_multi *inm)
 
int in_joingroup (struct ifnet *ifp, const struct in_addr *gina, struct in_mfilter *imf, struct in_multi **pinm)
 
int in_joingroup_locked (struct ifnet *ifp, const struct in_addr *gina, struct in_mfilter *imf, struct in_multi **pinm)
 
int in_leavegroup (struct in_multi *inm, struct in_mfilter *imf)
 
int in_leavegroup_locked (struct in_multi *inm, struct in_mfilter *imf)
 
void inp_freemoptions (struct ip_moptions *imo)
 
int inp_getmoptions (struct inpcb *inp, struct sockopt *sopt)
 
int inp_setmoptions (struct inpcb *inp, struct sockopt *sopt)
 
void inm_print (const struct in_multi *inm)
 
 RB_GENERATE (ip_msource_tree, ip_msource, ims_link, ip_msource_cmp)
 

Variables

struct mtx in_multi_list_mtx
 
struct mtx in_multi_free_mtx
 
struct sx in_multi_sx
 
int ifma_restart
 
static u_long in_mcast_maxgrpsrc = IP_MAX_GROUP_SRC_FILTER
 
static u_long in_mcast_maxsocksrc = IP_MAX_SOCK_SRC_FILTER
 
int in_mcast_loop = IP_DEFAULT_MULTICAST_LOOP
 
static struct in_multi_head inm_free_list = SLIST_HEAD_INITIALIZER()
 
static struct task inm_free_task = TASK_INITIALIZER(0, inm_release_task, NULL)
 

Macro Definition Documentation

◆ __SOCKUNION_DECLARED

#define __SOCKUNION_DECLARED

Definition at line 84 of file in_mcast.c.

◆ KTR_IGMPV3

#define KTR_IGMPV3   KTR_INET

Definition at line 73 of file in_mcast.c.

Typedef Documentation

◆ sockunion_t

typedef union sockunion sockunion_t

Definition at line 83 of file in_mcast.c.

Function Documentation

◆ __FBSDID()

__FBSDID ( "$FreeBSD$"  )

◆ imf_commit()

static void imf_commit ( struct in_mfilter imf)
static

Definition at line 875 of file in_mcast.c.

References in_mfilter::imf_sources, in_mfilter::imf_st, and in_msource::imsl_st.

Referenced by inp_block_unblock_source(), inp_join_group(), inp_leave_group(), and inp_set_source_filters().

Here is the caller graph for this function:

◆ imf_get_source()

static int imf_get_source ( struct in_mfilter imf,
const struct sockaddr_in psin,
struct in_msource **  plims 
)
static

◆ imf_graft()

static struct in_msource * imf_graft ( struct in_mfilter imf,
const uint8_t  st1,
const struct sockaddr_in psin 
)
static

Definition at line 782 of file in_mcast.c.

References in_mfilter::imf_nsrc, in_mfilter::imf_sources, in_msource::ims_haddr, in_msource::imsl_st, in_addr::s_addr, and sockaddr_in::sin_addr.

Referenced by inp_block_unblock_source(), and inp_join_group().

Here is the caller graph for this function:

◆ imf_init()

static __inline void imf_init ( struct in_mfilter imf,
const int  st0,
const int  st1 
)
static

Definition at line 330 of file in_mcast.c.

References in_mfilter::imf_sources, and in_mfilter::imf_st.

Referenced by in_joingroup_locked(), in_leavegroup_locked(), and ip_mfilter_alloc().

Here is the caller graph for this function:

◆ imf_leave()

static void imf_leave ( struct in_mfilter imf)
static

Definition at line 859 of file in_mcast.c.

References in_mfilter::imf_sources, in_mfilter::imf_st, and in_msource::imsl_st.

Referenced by inp_freemoptions(), inp_leave_group(), and inp_set_source_filters().

Here is the caller graph for this function:

◆ imf_prune()

static int imf_prune ( struct in_mfilter imf,
const struct sockaddr_in psin 
)
static

Definition at line 811 of file in_mcast.c.

References in_mfilter::imf_sources, ip_msource::ims_haddr, in_msource::imsl_st, in_addr::s_addr, and sockaddr_in::sin_addr.

Referenced by inp_block_unblock_source(), and inp_leave_group().

Here is the caller graph for this function:

◆ imf_purge()

static void imf_purge ( struct in_mfilter imf)
static

Definition at line 912 of file in_mcast.c.

References in_mfilter::imf_nsrc, in_mfilter::imf_sources, in_mfilter::imf_st, and KTR_IGMPV3.

Referenced by ip_mfilter_free().

Here is the caller graph for this function:

◆ imf_reap()

static void imf_reap ( struct in_mfilter imf)
static

Definition at line 891 of file in_mcast.c.

References in_mfilter::imf_nsrc, in_mfilter::imf_sources, in_msource::imsl_st, and KTR_IGMPV3.

Referenced by inp_block_unblock_source(), inp_join_group(), inp_leave_group(), and inp_set_source_filters().

Here is the caller graph for this function:

◆ imf_rollback()

static void imf_rollback ( struct in_mfilter imf)
static

Definition at line 831 of file in_mcast.c.

References in_mfilter::imf_nsrc, in_mfilter::imf_sources, in_mfilter::imf_st, in_msource::imsl_st, and KTR_IGMPV3.

Referenced by inp_block_unblock_source(), inp_join_group(), inp_leave_group(), and inp_set_source_filters().

Here is the caller graph for this function:

◆ imo_match_group()

static struct in_mfilter * imo_match_group ( const struct ip_moptions *  imo,
const struct ifnet *  ifp,
const struct sockaddr *  group 
)
static

◆ imo_match_source()

static struct in_msource * imo_match_source ( struct in_mfilter imf,
const struct sockaddr *  src 
)
static

Definition at line 439 of file in_mcast.c.

References in_mfilter::imf_sources, ip_msource::ims_haddr, in_addr::s_addr, sockunion::sin, and sockaddr_in::sin_addr.

Referenced by imo_multi_filter(), inp_block_unblock_source(), inp_join_group(), and inp_leave_group().

Here is the caller graph for this function:

◆ imo_multi_filter()

int imo_multi_filter ( const struct ip_moptions *  imo,
const struct ifnet *  ifp,
const struct sockaddr *  group,
const struct sockaddr *  src 
)

Definition at line 462 of file in_mcast.c.

References in_mfilter::imf_st, imo_match_group(), imo_match_source(), in_msource::imsl_st, MCAST_NOTGMEMBER, MCAST_NOTSMEMBER, and MCAST_PASS.

Here is the call graph for this function:

◆ ims_merge()

static void ims_merge ( struct ip_msource ims,
const struct in_msource lims,
const int  rollback 
)
static

Definition at line 973 of file in_mcast.c.

References ip_msource::ims_st::ex, ip_msource::ims_haddr, ip_msource::ims_st, in_msource::imsl_st, ip_msource::ims_st::in, and KTR_IGMPV3.

Referenced by inm_merge().

Here is the caller graph for this function:

◆ in_getmulti()

◆ in_joingroup()

int in_joingroup ( struct ifnet *  ifp,
const struct in_addr gina,
struct in_mfilter imf,
struct in_multi **  pinm 
)

Definition at line 1201 of file in_mcast.c.

References in_joingroup_locked(), IN_MULTI_LOCK, and IN_MULTI_UNLOCK.

Referenced by carp_multicast_setup(), and in_aifaddr_ioctl().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ in_joingroup_locked()

int in_joingroup_locked ( struct ifnet *  ifp,
const struct in_addr gina,
struct in_mfilter imf,
struct in_multi **  pinm 
)

Definition at line 1223 of file in_mcast.c.

References igmp_change_state(), imf_init(), in_getmulti(), IN_MULTI_LIST_LOCK, IN_MULTI_LIST_UNLOCK, IN_MULTI_LIST_UNLOCK_ASSERT, IN_MULTI_LOCK_ASSERT, inm_merge(), inm_release_deferred(), KTR_IGMPV3, and in_addr::s_addr.

Referenced by in_joingroup(), and inp_join_group().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ in_leavegroup()

int in_leavegroup ( struct in_multi inm,
struct in_mfilter imf 
)

Definition at line 1286 of file in_mcast.c.

References in_leavegroup_locked(), IN_MULTI_LOCK, and IN_MULTI_UNLOCK.

Referenced by carp_multicast_cleanup(), in_difaddr_ioctl(), and inp_freemoptions().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ in_leavegroup_locked()

int in_leavegroup_locked ( struct in_multi inm,
struct in_mfilter imf 
)

Definition at line 1311 of file in_mcast.c.

References igmp_change_state(), imf_init(), IN_MULTI_LIST_LOCK, IN_MULTI_LIST_UNLOCK, IN_MULTI_LIST_UNLOCK_ASSERT, IN_MULTI_LOCK_ASSERT, in_multi::inm_addr, in_multi::inm_ifp, inm_merge(), inm_release_deferred(), KTR_IGMPV3, and in_addr::s_addr.

Referenced by in_leavegroup(), and inp_leave_group().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ inm_clear_recorded()

void inm_clear_recorded ( struct in_multi inm)

◆ inm_commit()

void inm_commit ( struct in_multi inm)

Definition at line 1143 of file in_mcast.c.

References ip_msource::ims_st, inm_print(), in_multi::inm_srcs, in_multi::inm_st, and KTR_IGMPV3.

Referenced by igmp_final_leave(), igmp_handle_state_change(), igmp_initial_join(), and igmp_v3_process_group_timers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ inm_disconnect()

void inm_disconnect ( struct in_multi inm)

Definition at line 258 of file in_mcast.c.

References ifma_restart, in_multi::inm_ifma, and in_multi::inm_ifp.

Referenced by inm_rele_locked(), and inm_release_deferred().

Here is the caller graph for this function:

◆ inm_get_source()

static int inm_get_source ( struct in_multi inm,
const in_addr_t  haddr,
const int  noalloc,
struct ip_msource **  pims 
)
static

Definition at line 939 of file in_mcast.c.

References ip_msource::ims_haddr, in_mcast_maxgrpsrc, in_multi::inm_nsrc, in_multi::inm_srcs, and KTR_IGMPV3.

Referenced by inm_merge().

Here is the caller graph for this function:

◆ inm_lookup()

struct in_multi * inm_lookup ( struct ifnet *  ifp,
const struct in_addr  ina 
)

Definition at line 390 of file in_mcast.c.

References IN_MULTI_LIST_LOCK_ASSERT, and inm_lookup_locked().

Referenced by igmp_input_v1_report(), igmp_input_v2_query(), igmp_input_v2_report(), igmp_input_v3_query(), and in_getmulti().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ inm_lookup_locked()

struct in_multi * inm_lookup_locked ( struct ifnet *  ifp,
const struct in_addr  ina 
)

Definition at line 364 of file in_mcast.c.

References IN_MULTI_LIST_LOCK_ASSERT, in_multi::inm_addr, and in_addr::s_addr.

Referenced by inm_lookup().

Here is the caller graph for this function:

◆ inm_merge()

◆ inm_print()

void inm_print ( const struct in_multi inm)

Definition at line 3033 of file in_mcast.c.

Referenced by inm_commit(), and inm_merge().

Here is the caller graph for this function:

◆ inm_purge()

static void inm_purge ( struct in_multi inm)
static

Definition at line 1181 of file in_mcast.c.

References in_multi::inm_nsrc, in_multi::inm_srcs, and KTR_IGMPV3.

Referenced by inm_release().

Here is the caller graph for this function:

◆ inm_reap()

static void inm_reap ( struct in_multi inm)
static

Definition at line 1161 of file in_mcast.c.

References ip_msource::ims_st::ex, ip_msource::ims_st, ip_msource::ims_stp, ip_msource::ims_st::in, in_multi::inm_nsrc, in_multi::inm_srcs, and KTR_IGMPV3.

Referenced by inm_merge().

Here is the caller graph for this function:

◆ inm_record_source()

int inm_record_source ( struct in_multi inm,
const in_addr_t  naddr 
)

◆ inm_release()

static void inm_release ( struct in_multi inm)
static

Definition at line 619 of file in_mcast.c.

References in_multi::inm_ifma, in_multi::inm_ifp, inm_purge(), in_multi::inm_refcount, and KTR_IGMPV3.

Referenced by inm_release_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ inm_release_deferred()

void inm_release_deferred ( struct in_multi inm)

Definition at line 291 of file in_mcast.c.

References IN_MULTI_LIST_LOCK_ASSERT, inm_disconnect(), in_multi::inm_ifma, in_multi::inm_refcount, and inm_release_list_deferred().

Referenced by in_joingroup_locked(), in_leavegroup_locked(), and inp_join_group().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ inm_release_list_deferred()

void inm_release_list_deferred ( struct in_multi_head *  inmh)

Definition at line 246 of file in_mcast.c.

References in_multi_free_mtx, inm_free_list, and inm_free_task.

Referenced by igmp_fasttimo_vnet(), igmp_ifdetach(), igmp_v3_cancel_link_timers(), in_purgemaddrs(), and inm_release_deferred().

Here is the caller graph for this function:

◆ inm_release_task()

static void inm_release_task ( void *arg  __unused,
int pending  __unused 
)
static

Definition at line 307 of file in_mcast.c.

References in_multi_free_mtx, IN_MULTI_LOCK, IN_MULTI_UNLOCK, inm_free_list, and inm_release().

Here is the call graph for this function:

◆ inm_release_wait()

void inm_release_wait ( void *arg  __unused)

Definition at line 231 of file in_mcast.c.

References inm_free_task.

Referenced by in_ifdetach().

Here is the caller graph for this function:

◆ inp_block_unblock_source()

static int inp_block_unblock_source ( struct inpcb inp,
struct sockopt *  sopt 
)
static

◆ inp_findmoptions()

static struct ip_moptions * inp_findmoptions ( struct inpcb inp)
static

◆ inp_freemoptions()

void inp_freemoptions ( struct ip_moptions *  imo)

Definition at line 1593 of file in_mcast.c.

References in_mfilter::imf_inm, imf_leave(), in_leavegroup(), in_multi::inm_ifp, ip_mfilter_first(), ip_mfilter_free(), and ip_mfilter_remove().

Referenced by in_pcbfree().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ inp_get_source_filters()

static int inp_get_source_filters ( struct inpcb inp,
struct sockopt *  sopt 
)
static

◆ inp_getmoptions()

int inp_getmoptions ( struct inpcb inp,
struct sockopt *  sopt 
)

Definition at line 1743 of file in_mcast.c.

References IA_SIN, IFP_TO_IA, in_nullhost, inp_get_source_filters(), inpcb::inp_moptions, inpcb::inp_socket, INP_UNLOCK_ASSERT, INP_WLOCK, and INP_WUNLOCK.

Referenced by ip_ctloutput().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ inp_join_group()

◆ inp_leave_group()

static int inp_leave_group ( struct inpcb inp,
struct sockopt *  sopt 
)
static

◆ inp_lookup_mcast_ifp()

static struct ifnet * inp_lookup_mcast_ifp ( const struct inpcb inp,
const struct sockaddr_in gsin,
const struct in_addr  ina 
)
static

Definition at line 1872 of file in_mcast.c.

References fib4_lookup(), in_nullhost, INADDR_TO_IFP, in_conninfo::inc_fibnum, inpcb::inp_inc, in_addr::s_addr, sockaddr_in::sin_addr, sockaddr_in::sin_family, and V_in_ifaddrhead.

Referenced by inp_join_group().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ inp_set_multicast_if()

static int inp_set_multicast_if ( struct inpcb inp,
struct sockopt *  sopt 
)
static

Definition at line 2463 of file in_mcast.c.

References in_nullhost, INADDR_ANY, INADDR_TO_IFP, inp_findmoptions(), INP_WUNLOCK, KTR_IGMPV3, and in_addr::s_addr.

Referenced by inp_setmoptions().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ inp_set_source_filters()

static int inp_set_source_filters ( struct inpcb inp,
struct sockopt *  sopt 
)
static

◆ inp_setmoptions()

int inp_setmoptions ( struct inpcb inp,
struct sockopt *  sopt 
)

Definition at line 2713 of file in_mcast.c.

References inp_block_unblock_source(), inp_findmoptions(), inp_join_group(), inp_leave_group(), inp_set_multicast_if(), inp_set_source_filters(), inpcb::inp_socket, INP_UNLOCK_ASSERT, INP_WUNLOCK, and legal_vif_num.

Referenced by ip_ctloutput().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ip_mfilter_alloc()

struct in_mfilter * ip_mfilter_alloc ( const int  mflags,
const int  st0,
const int  st1 
)

Definition at line 339 of file in_mcast.c.

References imf_init().

Referenced by carp_multicast_setup(), and inp_join_group().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ip_mfilter_free()

void ip_mfilter_free ( struct in_mfilter imf)

Definition at line 351 of file in_mcast.c.

References imf_purge().

Referenced by carp_multicast_cleanup(), carp_multicast_setup(), inp_freemoptions(), inp_join_group(), and inp_leave_group().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MALLOC_DEFINE() [1/4]

static MALLOC_DEFINE ( M_INMFILTER  ,
"in_mfilter"  ,
"IPv4 multicast PCB-layer source filter"   
)
static

◆ MALLOC_DEFINE() [2/4]

static MALLOC_DEFINE ( M_IPMADDR  ,
"in_multi"  ,
"IPv4 multicast group"   
)
static

◆ MALLOC_DEFINE() [3/4]

static MALLOC_DEFINE ( M_IPMOPTS  ,
"ip_moptions"  ,
"IPv4 multicast options"   
)
static

◆ MALLOC_DEFINE() [4/4]

static MALLOC_DEFINE ( M_IPMSOURCE  ,
"ip_msource"  ,
"IPv4 multicast IGMP-layer source filter"   
)
static

◆ MTX_SYSINIT() [1/2]

MTX_SYSINIT ( in_multi_free_mtx  ,
in_multi_free_mtx,
"in_multi_free_mtx"  ,
MTX_DEF   
)

◆ MTX_SYSINIT() [2/2]

MTX_SYSINIT ( in_multi_mtx  ,
in_multi_list_mtx,
"in_multi_list_mtx"  ,
MTX_DEF   
)

◆ RB_GENERATE()

RB_GENERATE ( ip_msource_tree  ,
ip_msource  ,
ims_link  ,
ip_msource_cmp   
)

◆ SX_SYSINIT()

SX_SYSINIT ( in_multi_sx  ,
in_multi_sx,
"in_multi_sx"   
)

◆ SYSCTL_INT()

SYSCTL_INT ( _net_inet_ip_mcast  ,
OID_AUTO  ,
loop  ,
CTLFLAG_RWTUN  ,
in_mcast_loop,
,
"Loopback multicast datagrams by default"   
)

◆ sysctl_ip_mcast_filters()

static int sysctl_ip_mcast_filters ( SYSCTL_HANDLER_ARGS  )
static

◆ SYSCTL_NODE() [1/2]

static SYSCTL_NODE ( _net_inet_ip  ,
OID_AUTO  ,
mcast  ,
CTLFLAG_RW|  CTLFLAG_MPSAFE,
,
"IPv4 multicast"   
)
static

◆ SYSCTL_NODE() [2/2]

static SYSCTL_NODE ( _net_inet_ip_mcast  ,
OID_AUTO  ,
filters  ,
CTLFLAG_RD|  CTLFLAG_MPSAFE,
sysctl_ip_mcast_filters  ,
"Per-interface stack-wide source filters"   
)
static

◆ SYSCTL_ULONG() [1/2]

SYSCTL_ULONG ( _net_inet_ip_mcast  ,
OID_AUTO  ,
maxgrpsrc  ,
CTLFLAG_RWTUN  ,
in_mcast_maxgrpsrc,
,
"Max source filters per group"   
)

◆ SYSCTL_ULONG() [2/2]

SYSCTL_ULONG ( _net_inet_ip_mcast  ,
OID_AUTO  ,
maxsocksrc  ,
CTLFLAG_RWTUN  ,
in_mcast_maxsocksrc,
,
"Max source filters per socket"   
)

◆ TASKQUEUE_DEFINE_THREAD()

TASKQUEUE_DEFINE_THREAD ( inm_free  )

Variable Documentation

◆ ifma_restart

int ifma_restart

Definition at line 116 of file in_mcast.c.

Referenced by igmp_fasttimo_vnet(), igmp_ifdetach(), in_purgemaddrs(), and inm_disconnect().

◆ in_mcast_loop

int in_mcast_loop = IP_DEFAULT_MULTICAST_LOOP

Definition at line 188 of file in_mcast.c.

Referenced by inp_findmoptions(), ip_output(), and send_packet().

◆ in_mcast_maxgrpsrc

u_long in_mcast_maxgrpsrc = IP_MAX_GROUP_SRC_FILTER
static

Definition at line 178 of file in_mcast.c.

Referenced by inm_get_source(), inm_record_source(), and sysctl_ip_mcast_filters().

◆ in_mcast_maxsocksrc

u_long in_mcast_maxsocksrc = IP_MAX_SOCK_SRC_FILTER
static

Definition at line 183 of file in_mcast.c.

Referenced by imf_get_source(), inp_get_source_filters(), and inp_set_source_filters().

◆ in_multi_free_mtx

struct mtx in_multi_free_mtx

Definition at line 110 of file in_mcast.c.

Referenced by inm_release_list_deferred(), and inm_release_task().

◆ in_multi_list_mtx

struct mtx in_multi_list_mtx

Definition at line 107 of file in_mcast.c.

◆ in_multi_sx

struct sx in_multi_sx

Definition at line 113 of file in_mcast.c.

◆ inm_free_list

struct in_multi_head inm_free_list = SLIST_HEAD_INITIALIZER()
static

Definition at line 226 of file in_mcast.c.

Referenced by inm_release_list_deferred(), and inm_release_task().

◆ inm_free_task

struct task inm_free_task = TASK_INITIALIZER(0, inm_release_task, NULL)
static

Definition at line 228 of file in_mcast.c.

Referenced by inm_release_list_deferred(), and inm_release_wait().