#if (0)
//------------------------------------------------------------------------------
// Abbreviations:
//------------------------------------------------------------------------------
abbr: struct type description
pite: PIF_TABLE_ENTRY: pointer to interface table entry
pge: PGROUP_TABLE_ENTRY: pointer to group entry in group table.
GI_entry: the group entry for an interface.
pgie: PGI_ENTRY: pointer to group entry for an interface. It
hangs from both pite and pge lists.
ppge: PPROXY_GROUP_ENTRY: pointer to group joined on proxy interface.
Hangs from pite & also listed in proxy hash table
ptg: pointer to timer global.
DCS: Dynamic critical section lock
DRW: Dynamic read-write lock
IF: Interface
groups-if list list of all gi entries accessed through the
ordered group list.
if-groups list list of all gi entries accessed through the
ordered interface list.
//------------------------------------------------------------------------------
// Optimizations that can be done:
//------------------------------------------------------------------------------
1. Dynamically change the size of the interface, group, & proxy hash tables
2. Release InterfaceList locks early in AddInterface, DeleteInterface, etc.
(in that case you have to set a flag saying being initialized, so that that
interface is not enumerated)
//------------------------------------------------------------------------------
// Order of Locking:
//------------------------------------------------------------------------------
sockets-list CSLock protects the list of socket-event binding entries.
(many sockets, ie igmprtr interfaces are bound to
the same wait-event entry).
Take write lock when the interface is being created,
deleted, activated or protocol change.
Take read lock when the input packet is being
processed.
IF-list CSLock protects the ordered interface list
g_pIfTable->IFLists_CS
IF-bucket DRWLock protects the interface entry.
actually one lock for each interface hash bucket.
A write lock is required when an interface is
created, deleted, activated or its config is changed.
g_pIfTable->[IFbucket].DRWLock
Group-bucket DCSLock protects the group entry.
actually one lock for each group hash bucket.
Need this lock whenever accessing a group through
group hash table, or when adding/removing a GIentry
from a group list.
g_pGroupTable->[groupBucket].DCSLock
IF-groups-list DCSLock protects the list of gi_entries hanging from that IF.
actually one lock for each interface hash bucket.
can access/change a GI entry without this lock.
however, this lock is required when a gi entry is
created or delete.
g_pIfTable->[IFbucket].DCSLock
Group-list CSLock protects the list of ordered groups.
Global lock CSLock protects
g_CS
Note: a problem arises when enumerating the groups-if list. I first take the
group-list lock, find the next group entry, release the group-list lock,
and then lock the group-bucket and access its fields.
//------------------------------------------------------------------------------
// Configuration
//------------------------------------------------------------------------------
1. Proxy cannot be configured on a RasServer interface, ie interface of type
LOCAL_WORKSTATION_DIAL.
2. When IgmpRouter is configured on a RasServer interface(LOCAL_WORKSTATION_DIAL)
no igmp Group Specific packets are sent in response to leave packets. This
is based on the fact that there is only one ras-client on the other end.
3. When igmp router is configured on an interface, it sends StartupQueryCount
General queries on that inteface spaced at StartupQueryInterval. The next
General query timer is set to random value in [0,GenQueryInterval]. This is
so that when 'N' interfaces are configured with igmp router at startup,
all of them do not send General Queries at the same time (my own feeble
attempt to avoid synchronization of General Queries on different interfaces
of a router).
#endif // if (0)