/* ****************************************************************************** * INTERPEAK API HEADER FILE * * Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipmcp_mcast.h,v $ $Revision: 1.3 $ * $Source: /home/interpeak/CVSRoot/ipmcp/src/ipmcp_mcast.h,v $ * $Author: kenneth $ $Date: 2010-12-17 15:39:19 $ * $State: Exp $ $Locker: $ * * INTERPEAK_COPYRIGHT_STRING * Design and implementation by Kenneth Jonsson ****************************************************************************** */ #ifndef IPMCP_MCAST_H #define IPMCP_MCAST_H /* **************************************************************************** * 1 DESCRIPTION **************************************************************************** * Generic functions that can operate on both IPv4 and IPv6 addresses. * Implements most of the processing described in RFC3376 and RFC3810 */ /* **************************************************************************** * 2 CONFIGURATION **************************************************************************** */ #include "ipmcp_config.h" /* **************************************************************************** * 3 INCLUDE FILES **************************************************************************** */ #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* **************************************************************************** * 4 DEFINES **************************************************************************** */ /* IGMPv3 and MLDv2 Group record types */ #define IPMCP_GROUP_REC_TYPE_MODE_IS_INCLUDE 1 #define IPMCP_GROUP_REC_TYPE_MODE_IS_EXCLUDE 2 #define IPMCP_GROUP_REC_TYPE_MODE_CHANGE_TO_INCLUDE_MODE 3 #define IPMCP_GROUP_REC_TYPE_MODE_CHANGE_TO_EXCLUDE_MODE 4 #define IPMCP_GROUP_REC_TYPE_MODE_ALLOW_NEW_SOURCES 5 #define IPMCP_GROUP_REC_TYPE_MODE_BLOCK_OLD_SOURCES 6 /* Group compatibility modes */ #define IPMCP_MCAST_COMPAT_IGMPV1 1 #define IPMCP_MCAST_COMPAT_IGMPV2_MLDV1 2 #define IPMCP_MCAST_COMPAT_IGMPV3_MLDV2 3 /* **************************************************************************** * 5 TYPES **************************************************************************** */ /* *=========================================================================== * Ipmcp_rec_t *=========================================================================== * Base class for IGMPv3 and MLDv2 membership report record */ struct Ipmcp_rec_struct; #define RTHIS struct Ipmcp_rec_struct *self typedef struct Ipmcp_rec_ops_struct { /* Returns the record type */ Ip_u8 (*get_type)(RTHIS); /* Returns a pointer to the group address */ void * (*get_maddr)(RTHIS); /* Returns the number of source addresses */ unsigned (*get_num_saddrs)(RTHIS); /* Returns a pointer to the source address with index 'i' */ void * (*get_saddr)(RTHIS, unsigned i); /* Returns a IPCOM set with all source address in this record */ Ipcom_set * (*as_set)(RTHIS); /* Removes all source addresses from the record */ void (*clear_source_list)(RTHIS); } Ipmcp_rec_ops_t; typedef struct Ipmcp_rec_struct { Ipmcp_rec_ops_t *ops; } Ipmcp_rec_t; /* *=========================================================================== * Ipmcp_saddr_t *=========================================================================== * Base class a multicast source address entry */ struct Ipmcp_saddr_struct; #define STHIS struct Ipmcp_saddr_struct *self typedef struct Ipmcp_saddr_ops_struct { void (*dtor)(STHIS); void (*set_timer)(STHIS, Ip_u32 msec); void * (*get_addr)(STHIS); } Ipmcp_saddr_ops_t; typedef struct Ipmcp_saddr_struct { Ipmcp_saddr_ops_t *ops; Ipcom_tmo2 timer; /* Source timer, entry is remove when this expires */ struct Ipmcp_maddr_struct *maddr; /* The multicast address this entry is part of */ } Ipmcp_saddr_t; /* *=========================================================================== * Ipmcp_maddr_t *=========================================================================== * Base class a multicast address entry */ struct Ipmcp_maddr_struct; #define MTHIS struct Ipmcp_maddr_struct *self typedef struct Ipmcp_maddr_ops_struct { void (*dtor)(MTHIS); void * (*get_addr)(MTHIS); int (*compatibility_mode)(MTHIS); Ipmcp_saddr_t * (*add_saddr)(MTHIS, IP_CONST void *saddr, Ip_bool is_include_set); Ipmcp_saddr_t * (*get_saddr)(MTHIS, IP_CONST void *saddr, Ip_bool is_include_set); void (*del_saddrs_not_in_rec)(MTHIS, Ipmcp_rec_t *rec, Ip_bool is_include_set); void (*send_query)(MTHIS, Ip_u32 max_response_msec, Ipcom_set *saddr_set); Ip_u32 (*get_group_timer) (MTHIS); void (*set_group_timer)(MTHIS, Ip_u32 msec); Ip_u32 (*group_membership_interval)(MTHIS); void (*update_upstream_if_filter)(MTHIS); } Ipmcp_maddr_ops_t; typedef struct Ipmcp_maddr_struct { Ipmcp_maddr_ops_t *ops; int domain; unsigned addr_len; /* Address length for this domain */ Ipcom_tmo2 group_timer; /* Will switch to INCLUDE mode when this expires */ /* Fields use in specific queries on this group */ unsigned query_count; /* Number of times the current specific query will be resent */ Ipcom_tmo2 query_timer; /* Will send a specific query when expires */ Ip_u8 query_suppress_router_side_processing; /* Set to IP_TRUE if the S bit should be set in the next specific query for this address */ /* Fields use in source specific queries on this group */ Ip_u8 source_query_suppress_router_side_processing; /* Set to IP_TRUE if the S bit should be set in the next source specific query for this address */ unsigned source_query_count; /* Number of times the current specific query will be resent */ Ipcom_tmo2 source_query_timer; /* Will send a specific query when expires */ Ipcom_set *report_set; /* Set of sources to include in the next source specific query */ /* Multicast source addresses sets */ Ip_bool mode_is_include; Ipcom_hash *include_set; /* Set of sources that at least one listener want */ Ipcom_hash *exclude_set; /* Set of sources that at least one listener do not want */ /* Downstream interface for which this entry is valid */ struct Ipmcp_netif_struct *netif; } Ipmcp_maddr_t; /* *=========================================================================== * Ipmcp_upstream_maddr_t *=========================================================================== * Base class a multicast address entry */ struct Ipmcp_upstream_maddr_struct; #define UTHIS struct Ipmcp_upstream_maddr_struct *self typedef struct Ipmcp_upstream_maddr_ops_struct { void (*dtor)(UTHIS); void * (*get_addr)(UTHIS); void (*change_mode)(UTHIS, Ip_bool to_exclude); void (*add_source)(UTHIS, void *saddr); void (*del_source)(UTHIS, void *saddr); } Ipmcp_upstream_maddr_ops_t; typedef struct Ipmcp_upstream_maddr_struct { Ipmcp_upstream_maddr_ops_t *ops; /* Upstream operations */ Ipcom_set *filter; /* Current source filter */ } Ipmcp_upstream_maddr_t; /* **************************************************************************** * 6 FUNCTIONS **************************************************************************** */ IP_GLOBAL int ipmcp_handle_membership_report_rec(Ipmcp_maddr_t *maddr_obj, Ipmcp_rec_t *rec_obj); IP_GLOBAL Ip_u32 ipmcp_last_member_query_time(void); IP_GLOBAL void ipmcp_update_upstream_if_filter(Ipmcp_upstream_maddr_t *maddr_obj, Ipcom_hash*(*get_maddr_head)(struct Ipmcp_netif_struct *)); IP_GLOBAL Ip_u32 ipmcp_qqic_to_msec(Ip_u8 code); IP_GLOBAL Ip_u8 ipmcp_qqic_from_msec(Ip_u32 msec, int version); /* Source address methods */ IP_GLOBAL void ipmcp_saddr_ops_init(Ipmcp_saddr_ops_t *ops); /* Multicast address methods */ IP_GLOBAL void ipmcp_maddr_drop(Ipmcp_maddr_t *maddr, void *unused); IP_GLOBAL void ipmcp_maddr_cleanup(Ipmcp_maddr_t *maddr); IP_GLOBAL void ipmcp_maddr_ops_init(Ipmcp_maddr_ops_t *ops); #ifdef __cplusplus } #endif #endif /* **************************************************************************** * END OF FILE **************************************************************************** */