在文件wmData.h和tlSystem.h文件中,都有BOOL数据类型的定义,定义为int类型。并且定义了TRUE为1,FALSE为0。

typedef int     BOOL;

#ifndef TRUE
#define TRUE   1
#endif
#ifndef FALSE
#define FALSE  0
#endif

在ospf协议代码中,对BOOL类型使用自定义的枚举类型BOOLEAN,在ospfCommonUtils.h文件中。


#if !defined BOOLEAN
typedef enum BOOLEAN
{
	 _FALSE = 0 		/* FALSE and TRUE are already defined here */
	,_TRUE = 1
} BOOLEAN;
#endif

对于某些ospf协议层的函数,如果输入参数中有BOOLEAN类型,在调用时就需要注意类型转化。

/* ospf协议层函数定义 */
void ospf_no_asbr_routing_aggregate(OSPF_CLASS *ospf, ULONG network, ULONG mask, 
			ULONG restore_tag, BOOLEAN restore_notAdvertise, BOOLEAN restore_nssaOnly)
{
	if(restore_notAdvertise)
	{
		//TO DO
	}
}

typedef enum OSPF_IMPORT_PARA_MASK
{
	OSPF_IMPORT_PARA_MASK_COST = (1<<0),
	OSPF_IMPORT_PARA_MASK_TYPE = (1<<1),
	OSPF_IMPORT_PARA_MASK_TAG= (1<<2),
	OSPF_IMPORT_PARA_MASK_NSSAONLY = (1<<3),
	OSPF_IMPORT_PARA_MASK_ALWAYS = (1<<4),
	OSPF_IMPORT_PARA_MASK_NOTADV = (1<<5)
}OSPF_IMPORT_PARA_TYPE;


/* sw层函数调用上面的函数 */
STATUS swOspfAsbrAggregateDestroy(ULONG pID,ULONG ipNum,ULONG maskNum,UINT32 paraMask)
{


	ospf_no_asbr_routing_aggregate(ospf,ipNum,maskNum,
				(paraMask & OSPF_IMPORT_PARA_MASK_TAG)? TRUE : FALSE,
				(paraMask & OSPF_IMPORT_PARA_MASK_NOTADV)? TRUE : FALSE, 
				(paraMask & OSPF_IMPORT_PARA_MASK_NSSAONLY)? TRUE : FALSE);

}

原来犯得错误是,在sw层调用时,写成如此:

/* sw层函数调用上面的函数 */
STATUS swOspfAsbrAggregateDestroy(ULONG pID,ULONG ipNum,ULONG maskNum,UINT32 paraMask)
{


	ospf_no_asbr_routing_aggregate(ospf,ipNum,maskNum,
				paraMask & OSPF_IMPORT_PARA_MASK_TAG,
				paraMask & OSPF_IMPORT_PARA_MASK_NOTADV, 
				paraMask & OSPF_IMPORT_PARA_MASK_NSSAONLY);

}

按照上面的代码,将导致传入的参数不对。例如,如果paraMask为0x0000,0008,那么这个参数将不能够被识别为BOOLEAN中定义的TRUE。

如果函数ospf_no_asbr_routing_aggregate()中的参数使用BOOL类型,则可以这么传入参数。因为如果把BOOL定义为int类型,则任何不为0的整数都可以被解释为TRUE,即判断if(a)是为TRUE。