Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

193 lines
5.3 KiB

//=============================================================================
// 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;
}