/*++

Copyright (c) 1995  Microsoft Corporation

Module Name:

    routing\inc\rtm.h

Abstract:
	Router Manager private interface for Routing Table Manager DLL


Author:

	Vadim Eydelman

Revision History:

--*/

#ifndef _ROUTING_RMRTM
#define _ROUTING_RMRTM

// Two protocol families are currently supported (IP, IPX)
// It should be enough to modify this constant to support additional
// protocol families (from the RTM's point of view). Up to 256 families
// can be supported (if somebody needs more (???!!!), the next constant should
// be modified to free more low order bits for use by protocol family constants)
//
// Changed the number of protocol families from 2
// to 1 (as we support only IPX). IP and other
// future address families are supported by RTMv2.
//
#define RTM_NUM_OF_PROTOCOL_FAMILIES		1

// Tag that rtm ors in Protocol Family field of the handles it
// exports to clients for validation purposes
#define RTM_CLIENT_HANDLE_TAG			('RTM'<<8)

/*++
*******************************************************************

	N E T W O R K _ N U M B E R _ C M P _ F U N C

Routine Description:
	Compares two network numbers and returns result that can be used for
	route sorting
Arguments:
	Net1,Net2	- pointers to protocol family dependent network number structures
					to be compared
Return Value:
	<0 - Net2 follows Net1 
	>0 - Net1 follows Net2
	=0 - Net1==Net2

*******************************************************************
--*/
typedef 
INT
(*PNETWORK_NUMBER_CMP_FUNC) (
	PVOID			Net1,
	PVOID			Net2
	);

/*++
*******************************************************************

	N E X T _ H O P _ A D D R E S S _ C M P _ F U N C

Routine Description:
	Compares next hop addresses of two routes and returns result that can be used for
	route sorting
Arguments:
	Route1,Route2	- pointers to protocol family dependent route structures whose
						next hop addresses are to be compared
Return Value:
	<0 - Route2 should follow Route1 if sorted by next hop address
	>0 - Route1 should follow Route2 if sorted by next hop address
	=0 - Route1 has same next hop address as Route2

*******************************************************************
--*/
typedef 
INT
(*PNEXT_HOP_ADDRESS_CMP_FUNC) (
	PVOID			Route1,
	PVOID			Route2
	);

/*++
*******************************************************************

	F A M I L Y _ S P E C I F I C _ D A T A _ C M P _ F U N C

Routine Description:
	Compares family specific data fields of two routes and returns if
	the are equal
Arguments:
	Route1,Route2	- pointers to protocol family dependent route structures whose
						protocol family specific data fields are to be compared
Return Value:
	TRUE	 - protocol family specific data fields of Route1 and Route2 are
				equivalent
	FALSE	 - protocol family specific data fields of Route1 and Route2 are
				different

*******************************************************************
--*/
typedef 
BOOL
(*PFAMILY_SPECIFIC_DATA_CMP_FUNC) (
	PVOID			Route1,
	PVOID			Route2
	);

/*++
*******************************************************************

		R O U T E _ M E T R I C _ C M P _ F U N C

Routine Description:
	Compares two routes and returns result that identifies the
	better route
Arguments:
	Route1,Route2	- pointers to protocol family dependent route structures whose
						parameters are to be compared
Return Value:
	<0 - Route1 is better than Route2
	>0 - Route2 is better than Route1
	=0 - Route1 is as good as Route2

*******************************************************************
--*/
typedef 
INT
(*PROUTE_METRIC_CMP_FUNC) (
	PVOID			Route1,
	PVOID			Route2
	);


/*++
*******************************************************************

	R O U T E _ H A S H _ F U N C

Routine Description:
	Retuns value that can be used for route hashing by network number
Arguments:
	Net -	network number to be used for hashing
Return Value:
	Hash value

*******************************************************************
--*/
typedef 
INT
(*PROUTE_HASH_FUNC) (
	PVOID			Net
	);

/*++
*******************************************************************

	R O U T E _ V A L I D A T E _ F U N C

Routine Description:
	Validates the data in the route structure and possibly updates
	some of them.  This routine is called each time the new route
	is added to tha table or any of parameters of an existing route
	changes
Arguments:
	Route -	pointer to protocol family dependent route structure to
			be validated
Return Value:
	NO_ERROR - route was successfully validated
	ERROR_INVALID_PARAMETER - route structure is invalid, RTM will reject
		client's request to add or change the route

*******************************************************************
--*/
typedef 
DWORD
(*PROUTE_VALIDATE_FUNC) (
	PVOID			Route
	);

/*++
*******************************************************************

	R O U T E _ C H A N G E _ C A L L B A C K

Routine Description:
	Gets called whenever the best route to some desination network changes
	(intended to be used by the protocol family manager to notify kernel mode
	forwarders of route changes)
Arguments:
	Flags - identifies what kind of change caused the call and what
			information is provided in the route buffers:
		RTM_ROUTE_ADDED - first route was added for a destination network,
							CurBestRoute is contains added route info
		RTM_ROUTE_DELETED - the only route available for a destination
							network was deleted, PrevBestRoute contains deleted
							route info
		RTM_ROUTE_CHANGED - there was a change in any of the following
							parameters of the BEST route to a destination
							network:
								RoutingProtocol,
								InterfaceID,
								Metric,
								NextHopAddress,
								FamilySpecificData.
							PrevBestRoute contains the route info as it was
							before the change, CurBestRoute contains current
							best route info.
				Note that the route change message can be generated
				both as result of protocol adding/deleting the route
				that becomes/was the best and changing best route parameters
				such that the route becomes/no longer is the best route.
	CurBestRoute - current best route info (if any)
	PrevBestRoute - previous best route info (if any)
	
Return Value:
	None
*******************************************************************
--*/
typedef 
VOID
(*PROUTE_CHANGE_CALLBACK) (
	DWORD			Flags,
	PVOID			CurBestRoute,
	PVOID			PrevBestRoute
	);


typedef struct _RTM_PROTOCOL_FAMILY_CONFIG {
	ULONG							RPFC_MaxTableSize;	// Size of address space reserved
														// for the table
	INT								RPFC_HashSize;		// Size of hash table
	INT								RPFC_RouteSize;		// Size of route structure
	PNETWORK_NUMBER_CMP_FUNC 		RPFC_NNcmp;
	PNEXT_HOP_ADDRESS_CMP_FUNC		RPFC_NHAcmp;
	PFAMILY_SPECIFIC_DATA_CMP_FUNC	RPFC_FSDcmp;
	PROUTE_METRIC_CMP_FUNC			RPFC_RMcmp;
	PROUTE_HASH_FUNC				RPFC_Hash;
	PROUTE_VALIDATE_FUNC			RPFC_Validate;
	PROUTE_CHANGE_CALLBACK			RPFC_Change;
	} RTM_PROTOCOL_FAMILY_CONFIG, *PRTM_PROTOCOL_FAMILY_CONFIG;


/*++
*******************************************************************

	R t m C r e a t e R o u t e T a b l e

Routine Description:
	Create route table for protocol family
Arguments:
	ProtocolFamily - index that identifies protocol family
	Config - protocol family table configuration parameters
Return Value:
	NO_ERROR - table was created ok
	ERROR_INVALID_PARAMETER - protocol family is out of range supported by the RTM
	ERROR_ALREDY_EXISTS - protocol family table already exists
	ERROR_NOT_ENOUGH_MEMORY - could not allocate memory to perform
						the operation
	ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
							try again later

*******************************************************************
--*/
DWORD
RtmCreateRouteTable (
	IN DWORD							ProtocolFamily,
	IN PRTM_PROTOCOL_FAMILY_CONFIG		Config
	);


/*++
*******************************************************************

	R t m D e l e t e R o u t e T a b l e

Routine Description:
	Dispose of all resources allocated for the route table
Arguments:
	ProtocolFamily - index that identifies protocol family
Return Value:
	NO_ERROR - table was deleted ok
	ERROR_INVALID_PARAMETER - no table to delete

*******************************************************************
--*/
DWORD
RtmDeleteRouteTable (
	DWORD		ProtocolFamily
	);


/*++
*******************************************************************

	R t m B l o c k S e t R o u t e E n a b l e

Routine Description:
	Disables/Reenables all routes in subset specified by enumeration
	flags and corresponding criteria.  This operation can only be performed
	by the registered client and applies only to routes added by this
	client.
	Route change messages will be generated for disabled/reenabled routes that
	were/became the best.
	Disabled routes are invisible for route queries, but could still be 
	maintained by the RTM itself or routing protocol handler that added
	these routes (add, delete, and aging mechanisms still apply)
Arguments:
	ClientHandle - handle that identifies the client and routing protocol
						of routes to be disabled/reenabled
	EnumerationFlags - further limit subset of routes being enabled to only
						those that have same values in the fields
						specified by the flags as in CriteriaRoute
		Note that only RTM_ONLY_THIS_NETWORK and RTM_ONLY_THIS_INTERFACE
		can be used (RTM_ONLY_BEST_ROUTES does not apply because best
		route designation is adjusted as routes are enabled/disabled and
		all routes will be affected anyway)
	CriteriaRoute - protocol family dependent structure (RTM_??_ROUTE) with
					set values in fields that correspond to EnumerationFlags
	Enable - FALSE: disable, TRUE: reenable
Return Value:
	NO_ERROR - routes were disabled/reenabled ok
	ERROR_NO_ROUTES - no routes exist that match specified criteria
	ERROR_INVALID_HANDLE - client handle is not a valid RTM handle
	ERROR_NOT_ENOUGH_MEMORY - could not allocate memory to perform
						the operation
	ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
							try again later

*******************************************************************
--*/
DWORD WINAPI
RtmBlockSetRouteEnable (
	IN HANDLE		ClientHandle,
	IN DWORD		EnumerationFlags,
	IN PVOID		CriteriaRoute,
	IN BOOL			Enable
	);
	
#define RtmBlockDisableRoutes(Handle,Flags,CriteriaRoute)	\
		RtmBlockSetRouteEnable(Handle,Flags,CriteriaRoute,FALSE)
#define RtmBlockReenableRoutes(Handle,Flags,CriteriaRoute)	\
		RtmBlockSetRouteEnable(Handle,Flags,CriteriaRoute,TRUE)


// Use this flags in enumeration methods to enumerate disabled routes
#define RTM_INCLUDE_DISABLED_ROUTES		0x40000000

/*++
*******************************************************************

	R t m B l o c k C o n v e r t R o u t e s T o S t a t i c

Routine Description:
	Converts all routes as specified by enumeration flags to routes of
	static protocol (as defined by StaticClientHandle).
	No route change messages are generated as the result of this operation.
	This functionality is normally used only by Router Manager for a specific
	protocol family
 Arguments:
	ClientHandle - handle that identifies static protocol client
	EnumerationFlags - limit subset of routes being converted to only
						those that have same values in the fields
						specified by the flags as in CriteriaRoute
	CriteriaRoute - protocol family dependent structure (RTM_??_ROUTE) with
					set values in fields that correspond to EnumerationFlags
Return Value:
	NO_ERROR - routes were converted ok
	ERROR_NO_ROUTES - no routes exist that match specified criteria
	ERROR_INVALID_HANDLE - client handle is not a valid RTM handle
	ERROR_NOT_ENOUGH_MEMORY - could not allocate memory to perform
						the operation
	ERROR_NO_SYSTEM_RESOURCES - not enough resources to perform the operation,
							try again later
*******************************************************************
--*/
DWORD WINAPI
RtmBlockConvertRoutesToStatic (
	IN HANDLE		ClientHandle,
	IN DWORD		EnumerationFlags,
	IN PVOID		CriteriaRoute
	);

	
#endif