27#ifndef _NETSIM_IGMP_H_
28#define _NETSIM_IGMP_H_
34#define IGMP_ROBUSTNESS_VARIABLE_DEFAULT 2
35#define IGMP_QUERY_INTERVAL_DEFAULT 125
36#define IGMP_QUERY_RESPONSE_INTERVAL_DEFAULT 100
37#define IGMP_GROUP_MEMBERSHIP_INTERVAL_DEFAULT IGMP_ROBUSTNESS_VARIABLE_DEFAULT*IGMP_QUERY_INTERVAL_DEFAULT +\
38 (IGMP_QUERY_RESPONSE_INTERVAL_DEFAULT)
39#define IGMP_QUERIER_PRESENT_INTERVAL_DEFAULT IGMP_ROBUSTNESS_VARIABLE_DEFAULT*IGMP_QUERY_INTERVAL_DEFAULT +\
40 (1/2.0*IGMP_QUERY_RESPONSE_INTERVAL_DEFAULT)
41#define IGMP_STARTUP_QUERY_INTERVAL_DEFAULT (1/4.0*IGMP_QUERY_INTERVAL_DEFAULT)
42#define IGMP_STARTUP_QUERY_COUNT_DEFAULT IGMP_ROBUSTNESS_VARIABLE_DEFAULT
43#define IGMP_LAST_MEMBER_QUERY_INTERVAL_DEFAULT 10
44#define IGMP_LAST_MEMBER_QUERY_COUNT_DEFAULT IGMP_ROBUSTNESS_VARIABLE_DEFAULT
45#define IGMP_UNSOLICITED_REPORT_INTERVAL_DEFAULT (10)
47#define IGMP_STARTUP_DELAY 1*MILLISECOND
49#define isBroadcastInterface(d,i) (DEVICE_INTERFACE(d,i)->nInterfaceType != INTERFACE_WAN_ROUTER)
64#define isIGMPPacket(packet) (packet->nControlDataType / 100 == NW_PROTOCOL_IPV4 && packet->nControlDataType % 100 >= 30 && packet->nControlDataType % 100 < 40)
82#define IGMP_HDR_SIZE 8
102#define IGMP_HOST_DB_ALLOC() (ptrIGMP_HOST_DB)list_alloc(sizeof(IGMP_HOST_DB),offsetof(IGMP_HOST_DB,ele))
103#define IGMP_HOST_DB_ADD(d,db) LIST_ADD_LAST((void**)&GET_IGMP_HOST(d)->database,db)
134#define IGMP_ROUTER_DB_ALLOC() (ptrIGMP_ROUTER_DB)list_alloc(sizeof(IGMP_ROUTER_DB),offsetof(IGMP_ROUTER_DB,ele))
135#define IGMP_ROUTER_DB_ADD(d,db) LIST_ADD_LAST((void**)&GET_IGMP_ROUTER(d)->database,db)
170#define GET_IGMP_VAR(d) ((ptrIGMP_VAR)GET_IP_DEVVAR(d)->igmp)
171#define SET_IGMP_VAR(d,var) (GET_IP_DEVVAR(d)->igmp = (void*)var)
172#define isIPHOST(d) (GET_IGMP_VAR(d)->devType == IP_HOST)
173#define isIPRouter(d) (GET_IGMP_VAR(d)->devType == IP_ROUTER)
174#define GET_IGMP_HOST(d) ((ptrIGMP_HOST)(GET_IGMP_VAR(d)->DEV.host))
175#define GET_IGMP_ROUTER(d) ((ptrIGMP_ROUTER)(GET_IGMP_VAR(d)->DEV.router))
176#define SET_IGMP_HOST(d,var) (GET_IGMP_VAR(d)->DEV.host = var)
177#define SET_IGMP_ROUTER(d,var) (GET_IGMP_VAR(d)->DEV.router = var)
184 bool* isAlreadyJoined);
bool router_process_report(NetSim_PACKET *packet, ptrIGMP_MSG msg, NETSIM_ID d)
struct stru_igmpvar IGMP_VAR
ptrIGMP_ROUTER_DB find_or_alloc_multicast_db_router(NETSIM_IPAddress addr, NETSIM_ID d, bool *isAlreadyJoined)
@ HostState_DelayingMember
struct stru_router_database IGMP_ROUTER_DB
void igmp_start_timer(NETSIM_ID d, IP_SUBEVENT sev, NETSIM_IPAddress addr, double time)
struct stru_igmp_router IGMP_ROUTER
ptrIGMP_ROUTER_DB router_get_multicast_db(NETSIM_ID d, NETSIM_IPAddress ip)
bool router_process_query(NetSim_PACKET *packet, ptrIGMP_MSG msg, NETSIM_ID d)
bool host_process_report(NetSim_PACKET *packet, ptrIGMP_MSG msg, NETSIM_ID d)
void router_free(NETSIM_ID d)
struct stru_igmp_router * ptrIGMP_ROUTER
bool host_process_query(NetSim_PACKET *packet, ptrIGMP_MSG msg, NETSIM_ID d)
void send_membership_report(NETSIM_ID d, NETSIM_IPAddress group)
struct stru_igmp_msg IGMP_MSG
void igmp_host_init(NETSIM_ID d)
void print_igmp_log(char *format,...)
struct stru_host_database IGMP_HOST_DB
struct stru_igmp_host IGMP_HOST
void igmp_router_init(NETSIM_ID d)
void host_free(NETSIM_ID d)
struct stru_host_database * ptrIGMP_HOST_DB
struct stru_igmp_msg * ptrIGMP_MSG
struct stru_igmpvar * ptrIGMP_VAR
struct stru_router_database * ptrIGMP_ROUTER_DB
ptrIGMP_HOST_DB host_get_multicast_db(NETSIM_ID d, NETSIM_IPAddress addr)
@ IGMPMSG_MembershipQuery
@ IGMPMSG_V1MembershipReport
@ IGMPMSG_V2MembershipReport
struct stru_igmp_host * ptrIGMP_HOST
IP_SUBEVENT
Enumeration for ip sub-events.
NETSIM_IPAddress GroupAddress
UINT startup_query_sent_count
ptrIGMP_ROUTER_DB database
union stru_igmpvar::@10 DEV
double GroupMembershipInterval
UINT QueryResponseInterval
UINT QueryPresentInterval
double UnsolicitedReportInterval
UINT StartupQueryInterval
double lastMemQueryInterval
double otherQuerierPresentTime
bool isGroupMembershipTimerStarted
bool isOtherquerierTimerStarted