194 lines
5.3 KiB
C
194 lines
5.3 KiB
C
|
//=============================================================================
|
||
|
// Copyright (c) 1998 Microsoft Corporation
|
||
|
// File Name: work.c
|
||
|
// Abstract:
|
||
|
//
|
||
|
// Author: K.S.Lokesh (lokeshs@) 1-1-98
|
||
|
//=============================================================================
|
||
|
|
||
|
|
||
|
#include "pchdvmrp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
DvmrpRpfCallback (
|
||
|
DWORD dwSourceAddr,
|
||
|
DWORD dwSourceMask,
|
||
|
DWORD dwGroupAddr,
|
||
|
DWORD dwGroupMask,
|
||
|
DWORD *dwInIfIndex,
|
||
|
DWORD *dwInIfNextHopAddr,
|
||
|
DWORD *dwUpstreamNeighbor,
|
||
|
DWORD dwHdrSize,
|
||
|
PBYTE pbPacketHdr,
|
||
|
PBYTE pbBuffer
|
||
|
);
|
||
|
|
||
|
DWORD
|
||
|
ProxyCreationAlertCallback(
|
||
|
IN DWORD dwSourceAddr,
|
||
|
IN DWORD dwSourceMask,
|
||
|
IN DWORD dwGroupAddr,
|
||
|
IN DWORD dwGroupMask,
|
||
|
IN DWORD dwInIfIndex,
|
||
|
IN DWORD dwInIfNextHopAddr,
|
||
|
IN DWORD dwIfCount,
|
||
|
IN OUT PMGM_IF_ENTRY pmieOutIfList
|
||
|
)
|
||
|
{
|
||
|
return ERROR_CAN_NOT_COMPLETE;
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
ProxyDeletionAlertCallback(
|
||
|
IN DWORD dwSourceAddr,
|
||
|
IN DWORD dwSourceMask,
|
||
|
IN DWORD dwGroupAddr,
|
||
|
IN DWORD dwGroupMask,
|
||
|
IN DWORD dwIfIndex,
|
||
|
IN DWORD dwIfNextHopAddr,
|
||
|
IN BOOL bMemberDelete,
|
||
|
IN OUT PDWORD pdwTimeout
|
||
|
)
|
||
|
{
|
||
|
return ERROR_CAN_NOT_COMPLETE;
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
ProxyNewMemberCallback(
|
||
|
IN DWORD dwSourceAddr,
|
||
|
IN DWORD dwSourceMask,
|
||
|
IN DWORD dwGroupAddr,
|
||
|
IN DWORD dwGroupMask
|
||
|
)
|
||
|
{
|
||
|
return ERROR_CAN_NOT_COMPLETE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// _GetCurrentDvmrpTimer
|
||
|
// uses GetTickCount(). converts it into 64 bit absolute timer.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
LONGLONG
|
||
|
GetCurrentDvmrpTime(
|
||
|
)
|
||
|
{
|
||
|
ULONG ulCurTimeLow = GetTickCount();
|
||
|
|
||
|
|
||
|
//
|
||
|
// see if timer has wrapped
|
||
|
//
|
||
|
// since multi-threaded, it might get preempted and CurrentTime
|
||
|
// might get lower than the global variable g_TimerStruct.CurrentTime.LowPart
|
||
|
// which might be set by another thread. So we also explicitly verify the
|
||
|
// switch from a very large DWORD to a small one.
|
||
|
// (code thanks to murlik&jamesg)
|
||
|
//
|
||
|
|
||
|
if ( (ulCurTimeLow < Globals.CurrentTime.LowPart)
|
||
|
&& ((LONG)Globals.CurrentTime.LowPart < 0)
|
||
|
&& ((LONG)ulCurTimeLow > 0) )
|
||
|
{
|
||
|
|
||
|
// use global CS instead of creating a new CS
|
||
|
|
||
|
ACQUIRE_WORKITEM_LOCK("_GetCurrentDvmrpTime");
|
||
|
|
||
|
|
||
|
// make sure that the global timer has not been updated meanwhile
|
||
|
|
||
|
if ( (LONG)Globals.CurrentTime.LowPart < 0)
|
||
|
{
|
||
|
Globals.CurrentTime.HighPart++;
|
||
|
Globals.CurrentTime.LowPart = ulCurTimeLow;
|
||
|
}
|
||
|
|
||
|
RELEASE_WORKITEM_LOCK("_GetCurrentDvmrpTime");
|
||
|
}
|
||
|
|
||
|
|
||
|
Globals.CurrentTime.LowPart = ulCurTimeLow;
|
||
|
|
||
|
|
||
|
return Globals.CurrentTime.QuadPart;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// RegisterDvmrpWithMgm
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DWORD
|
||
|
RegisterDvmrpWithMgm(
|
||
|
)
|
||
|
{
|
||
|
DWORD Error = NO_ERROR;
|
||
|
ROUTING_PROTOCOL_CONFIG rpiInfo;
|
||
|
HANDLE g_MgmProxyHandle;
|
||
|
|
||
|
rpiInfo.dwCallbackFlags = 0;
|
||
|
rpiInfo.pfnRpfCallback
|
||
|
= (PMGM_RPF_CALLBACK)DvmrpRpfCallback;
|
||
|
rpiInfo.pfnCreationAlertCallback
|
||
|
= (PMGM_CREATION_ALERT_CALLBACK)ProxyCreationAlertCallback;
|
||
|
rpiInfo.pfnDeletionAlertCallback
|
||
|
= (PMGM_DELETION_ALERT_CALLBACK)ProxyDeletionAlertCallback;
|
||
|
rpiInfo.pfnNewMemberCallback
|
||
|
= (PMGM_NEW_MEMBER_CALLBACK)ProxyNewMemberCallback;
|
||
|
rpiInfo.pfnWrongIfCallback
|
||
|
= NULL;
|
||
|
rpiInfo.pfnIgmpJoinCallback
|
||
|
= NULL;
|
||
|
rpiInfo.pfnIgmpLeaveCallback
|
||
|
= NULL;
|
||
|
|
||
|
|
||
|
Error = MgmRegisterMProtocol(
|
||
|
&rpiInfo, PROTO_IP_IGMP, // must be PROTO_IP_IGMP_PROXY
|
||
|
IGMP_PROXY,
|
||
|
&g_MgmProxyHandle);
|
||
|
|
||
|
if (Error!=NO_ERROR) {
|
||
|
Trace1(ERR, "Error:%d registering Igmp Proxy with Mgm", Error);
|
||
|
Logerr0(MGM_PROXY_REGISTER_FAILED, Error);
|
||
|
return Error;
|
||
|
}
|
||
|
|
||
|
return Error;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// ProxyRpfCallback
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DWORD
|
||
|
DvmrpRpfCallback (
|
||
|
DWORD dwSourceAddr,
|
||
|
DWORD dwSourceMask,
|
||
|
DWORD dwGroupAddr,
|
||
|
DWORD dwGroupMask,
|
||
|
DWORD *dwInIfIndex,
|
||
|
DWORD *dwInIfNextHopAddr,
|
||
|
DWORD *dwUpstreamNeighbor,
|
||
|
DWORD dwHdrSize,
|
||
|
PBYTE pbPacketHdr,
|
||
|
PBYTE pbBuffer
|
||
|
)
|
||
|
{
|
||
|
DWORD Error = NO_ERROR;
|
||
|
|
||
|
#if 0
|
||
|
PRTM_DEST_INFO
|
||
|
RtmGetMostSpecificDest(RtmHandle, dwSourceAddr, IP_PROTO_IGMP,
|
||
|
RTM_VIEW_ID_MCAST
|
||
|
);
|
||
|
#endif
|
||
|
|
||
|
return ERROR_CAN_NOT_COMPLETE;
|
||
|
}
|