/*++ Copyright (c) 1995 Microsoft Corporation Module Name: tfflts.c Abstract: IPX Router Console Monitoring and Configuration tool. Traffic Filters configuration and monitoring. Author: Vadim Eydelman 06/07/1996 --*/ #include "precomp.h" #pragma hdrstop #define OPERATION_DEL_TRAFFICFILTER (-1) #define OPERATION_SET_TRAFFICFILTER 0 #define OPERATION_ADD_TRAFFICFILTER 1 DWORD ReadTfFltDef ( int argc, WCHAR *argv[], PIPX_TRAFFIC_FILTER_INFO pTfFlt ); BOOL TfFltEqual ( PVOID Info1, PVOID Info2 ); VOID PrintTrafficFilterInfo ( PIPX_TRAFFIC_FILTER_GLOBAL_INFO pTfGlb, PIPX_TRAFFIC_FILTER_INFO pTfFlt, ULONG count, PWCHAR wszIfName, PWCHAR wszMode, BOOL bDump ); DWORD AdmSetTfFlt ( int operation, LPWSTR InterfaceNameW, ULONG Action, ULONG Mode, PIPX_TRAFFIC_FILTER_INFO TfFlt ); DWORD CfgSetTfFlt ( int operation, LPWSTR InterfaceNameW, ULONG Action, ULONG Mode, PIPX_TRAFFIC_FILTER_INFO TfFlt ); int APIENTRY HelpTfFlt ( IN int argc, IN WCHAR *argv[] ) { DisplayIPXMessage (g_hModule, MSG_IPX_HELP_TRAFFICFILTER); return 0; } int APIENTRY ShowTfFlt ( IN int argc, IN WCHAR *argv[], IN BOOL bDump ) { WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ]; DWORD rc, dwSize = sizeof(IfName); if (argc > 0) { LPBYTE pIfBlock; BOOLEAN fRouter = FALSE, fClient = FALSE; ULONG mode = 0; PWCHAR buffer[2]; unsigned count; #define InterfaceNameW argv[0] count = wcslen (InterfaceNameW); if ( ( count > 0 ) && ( count <= MAX_INTERFACE_NAME_LEN ) ) { fClient = FALSE; } else { if ( !bDump ) { DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME); } rc = ERROR_INVALID_PARAMETER; goto Exit; } if (argc > 1) { UINT n; if ( (argc == 2) && !MatchEnumTag( g_hModule, argv[1], NUM_TOKENS_IN_TABLE( FilterModes ), FilterModes, &mode ) ) { NOTHING; } else { if ( !bDump ) { DisplayIPXMessage (g_hModule, MSG_IPX_HELP_TRAFFICFILTER ); } rc = ERROR_INVALID_PARAMETER; goto Exit; } } if (g_hMprAdmin) { if (fClient) { DWORD sz; rc = MprAdminTransportGetInfo ( g_hMprAdmin, PID_IPX, NULL, NULL, &pIfBlock, &sz ); if (rc == NO_ERROR) { fRouter = TRUE; } else { if ( !bDump ) { DisplayError( g_hModule, rc ); } goto GetFromCfg; } } else { HANDLE hIfAdm; //====================================== // Translate the Interface Name //====================================== rc = IpmontrGetIfNameFromFriendlyName( InterfaceNameW, IfName, &dwSize ); if ( rc == NO_ERROR ) { //====================================== rc = MprAdminInterfaceGetHandle( g_hMprAdmin, IfName, &hIfAdm, FALSE ); if (rc == NO_ERROR) { DWORD sz; rc = MprAdminInterfaceTransportGetInfo( g_hMprAdmin, hIfAdm, PID_IPX, &pIfBlock, &sz ); } if (rc == NO_ERROR) { fRouter = TRUE; } else { if ( !bDump ) { DisplayError( g_hModule, rc); } goto GetFromCfg; } } else { if ( !bDump ) { DisplayError( g_hModule, rc ); } } } } else { GetFromCfg: if (fClient) { HANDLE hTrCfg; rc = MprConfigTransportGetHandle( g_hMprConfig, PID_IPX, &hTrCfg ); if (rc == NO_ERROR) { DWORD sz; rc = MprConfigTransportGetInfo( g_hMprConfig, hTrCfg, NULL, NULL, &pIfBlock, &sz, NULL ); } } else { HANDLE hIfCfg; //====================================== // Translate the Interface Name //====================================== rc = IpmontrGetIfNameFromFriendlyName( InterfaceNameW, IfName, &dwSize ); if ( rc == NO_ERROR ) { rc = MprConfigInterfaceGetHandle( g_hMprConfig, IfName, &hIfCfg ); if (rc == NO_ERROR) { HANDLE hIfTrCfg; rc = MprConfigInterfaceTransportGetHandle( g_hMprConfig, hIfCfg, PID_IPX, &hIfTrCfg ); if (rc == NO_ERROR) { DWORD sz; rc = MprConfigInterfaceTransportGetInfo( g_hMprConfig, hIfCfg, hIfTrCfg, &pIfBlock, &sz ); } } } else { if ( !bDump ) { DisplayError( g_hModule, rc ); } } } } if ( rc == NO_ERROR ) { PIPX_TOC_ENTRY pTfToc; PIPX_TOC_ENTRY pTfGlToc; if ((mode == 0) || (mode == OUTPUT_FILTER)) { pTfToc = GetIPXTocEntry ( (PIPX_INFO_BLOCK_HEADER)pIfBlock, IPX_OUT_TRAFFIC_FILTER_INFO_TYPE ); pTfGlToc = GetIPXTocEntry ( (PIPX_INFO_BLOCK_HEADER)pIfBlock, IPX_OUT_TRAFFIC_FILTER_GLOBAL_INFO_TYPE ); if ((pTfToc != NULL) && (pTfGlToc != NULL)) { PIPX_TRAFFIC_FILTER_GLOBAL_INFO pTfGlb = (PIPX_TRAFFIC_FILTER_GLOBAL_INFO) (pIfBlock + pTfGlToc->Offset); buffer[ 0 ] = GetEnumString( g_hModule, OUTPUT_FILTER, NUM_TOKENS_IN_TABLE( FilterModes ), FilterModes ); buffer[ 1 ] = GetEnumString( g_hModule, pTfGlb->FilterAction, NUM_TOKENS_IN_TABLE( TfFilterActions ), TfFilterActions ); if ( buffer[ 0 ] && buffer [ 1 ] ) { if ( bDump ) { DisplayMessageT( DMP_IPX_SET_FILTER, InterfaceNameW, buffer[0], buffer[1] ); } else { DisplayIPXMessage ( g_hModule, MSG_TRAFFICFILTER_TABLE_HDR, buffer[0], buffer[1] ); } PrintTrafficFilterInfo ( (PIPX_TRAFFIC_FILTER_GLOBAL_INFO) (pIfBlock + pTfGlToc->Offset), (PIPX_TRAFFIC_FILTER_INFO) (pIfBlock + pTfToc->Offset), pTfToc->Count, InterfaceNameW, buffer[ 0 ], bDump ); } } else { buffer[ 0 ] = GetEnumString( g_hModule, OUTPUT_FILTER, NUM_TOKENS_IN_TABLE( FilterModes ), FilterModes ); buffer[ 1 ] = VAL_DENY; if ( buffer[ 0 ] && buffer[ 1 ] ) { if ( bDump ) { DisplayMessageT( DMP_IPX_SET_FILTER, InterfaceNameW, buffer[ 0 ], buffer[ 1 ] ); } else { DisplayIPXMessage( g_hModule, MSG_TRAFFICFILTER_TABLE_HDR, buffer[0], buffer[1] ); } } } } if ((mode == 0) || (mode == INPUT_FILTER)) { pTfToc = GetIPXTocEntry( (PIPX_INFO_BLOCK_HEADER)pIfBlock, IPX_IN_TRAFFIC_FILTER_INFO_TYPE ); pTfGlToc = GetIPXTocEntry( (PIPX_INFO_BLOCK_HEADER)pIfBlock, IPX_IN_TRAFFIC_FILTER_GLOBAL_INFO_TYPE ); if ((pTfToc != NULL) && (pTfGlToc != NULL)) { PIPX_TRAFFIC_FILTER_GLOBAL_INFO pTfGlb = (PIPX_TRAFFIC_FILTER_GLOBAL_INFO) (pIfBlock + pTfGlToc->Offset); buffer[ 0 ] = GetEnumString( g_hModule, INPUT_FILTER, NUM_TOKENS_IN_TABLE( FilterModes ), FilterModes ); buffer[ 1 ] = GetEnumString( g_hModule, pTfGlb->FilterAction, NUM_TOKENS_IN_TABLE( TfFilterActions ), TfFilterActions ); if ( buffer[ 0 ] && buffer[ 1 ] ) { if ( bDump ) { DisplayMessageT( DMP_IPX_SET_FILTER, InterfaceNameW, buffer[0], buffer[1] ); } else { DisplayIPXMessage( g_hModule, MSG_TRAFFICFILTER_TABLE_HDR, buffer[0], buffer[1] ); } PrintTrafficFilterInfo ( (PIPX_TRAFFIC_FILTER_GLOBAL_INFO) (pIfBlock + pTfGlToc->Offset), (PIPX_TRAFFIC_FILTER_INFO) (pIfBlock + pTfToc->Offset), pTfToc->Count, InterfaceNameW, buffer[ 0 ], bDump ); } } else { buffer[ 0 ] = GetEnumString( g_hModule, INPUT_FILTER, NUM_TOKENS_IN_TABLE( FilterModes ), FilterModes ); buffer[ 1 ] = VAL_DENY; if ( buffer[ 0 ] && buffer[ 1 ] ) { if ( bDump ) { DisplayMessageT( DMP_IPX_SET_FILTER, InterfaceNameW, buffer[ 0 ], buffer[ 1 ] ); } else { DisplayIPXMessage( g_hModule, MSG_TRAFFICFILTER_TABLE_HDR, buffer[0], buffer[1] ); } } } } if (fRouter) { MprAdminBufferFree (pIfBlock); } else { MprConfigBufferFree (pIfBlock); } } else { if ( !bDump ) { DisplayError( g_hModule, rc); } } } else { if ( !bDump ) { DisplayIPXMessage (g_hModule, MSG_IPX_HELP_TRAFFICFILTER); } rc = ERROR_INVALID_PARAMETER; } Exit: return rc ; #undef InterfaceNameW } int APIENTRY SetTfFlt ( IN int argc, IN WCHAR *argv[] ) { DWORD rc = NO_ERROR; if (argc == 3) { BOOL fClient; ULONG mode, action; unsigned count; PWCHAR buffer; #define InterfaceNameW argv[0] count = wcslen (InterfaceNameW); #if 0 // Disable client interface filters for BETA if (_wcsicmp (argv[0], GetString (g_hModule, VAL_DIALINCLIENT, buffer)) == 0) { fClient = TRUE; } #endif if ( ( count > 0 ) && ( count <= MAX_INTERFACE_NAME_LEN ) ) { fClient = FALSE; } else { DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME); rc = ERROR_INVALID_PARAMETER; goto Exit; } if ( !MatchEnumTag( g_hModule, argv[1], NUM_TOKENS_IN_TABLE( FilterModes ), FilterModes, &mode ) && !MatchEnumTag( g_hModule, argv[2], NUM_TOKENS_IN_TABLE( TfFilterActions ), TfFilterActions, &action ) ) { if (g_hMprAdmin) { rc = AdmSetTfFlt( OPERATION_SET_TRAFFICFILTER, fClient ? NULL : InterfaceNameW, action, mode, NULL ); } else { rc = NO_ERROR; } if (rc == NO_ERROR) { rc = CfgSetTfFlt( OPERATION_SET_TRAFFICFILTER, fClient ? NULL : InterfaceNameW, action, mode, NULL ); } } else { rc = ERROR_INVALID_PARAMETER; DisplayIPXMessage (g_hModule, MSG_IPX_HELP_TRAFFICFILTER); } } else { DisplayIPXMessage (g_hModule, MSG_IPX_HELP_TRAFFICFILTER); rc = ERROR_INVALID_PARAMETER; } Exit: return (rc == NO_ERROR) ? 0 : 1; #undef InterfaceNameW } int APIENTRY CreateTfFlt ( IN int argc, IN WCHAR *argv[] ) { DWORD rc = NO_ERROR; if (argc > 1) { IPX_TRAFFIC_FILTER_INFO TfFlt; ULONG mode; BOOL fClient; PWCHAR buffer; unsigned count; #define InterfaceNameW argv[0] count = wcslen (InterfaceNameW); #if 0 // Disable client interface filters for BETA if (_wcsicmp (argv[0], GetString (g_hModule, VAL_DIALINCLIENT, buffer)) == 0) { fClient = TRUE; } else #endif if ((count > 0) && (count <= MAX_INTERFACE_NAME_LEN)) { fClient = FALSE; } else { DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME); rc = ERROR_INVALID_PARAMETER; goto Exit; } if ( !MatchEnumTag( g_hModule, argv[1], NUM_TOKENS_IN_TABLE( FilterModes ), FilterModes, &mode ) && ( ReadTfFltDef( argc - 2, &argv[2], &TfFlt) == NO_ERROR ) ) { if (g_hMprAdmin) { rc = AdmSetTfFlt( OPERATION_ADD_TRAFFICFILTER, fClient ? NULL : InterfaceNameW, IPX_TRAFFIC_FILTER_ACTION_DENY, mode, &TfFlt ); } else { rc = NO_ERROR; } if (rc == NO_ERROR) { rc = CfgSetTfFlt( OPERATION_ADD_TRAFFICFILTER, fClient ? NULL : InterfaceNameW, IPX_TRAFFIC_FILTER_ACTION_DENY, mode, &TfFlt ); } } else { DisplayIPXMessage (g_hModule, MSG_IPX_HELP_TRAFFICFILTER); } } else { DisplayIPXMessage (g_hModule, MSG_IPX_HELP_TRAFFICFILTER); rc = ERROR_INVALID_PARAMETER; } Exit: return rc ; #undef InterfaceNameW } int APIENTRY DeleteTfFlt ( IN int argc, IN WCHAR *argv[] ) { DWORD rc = NO_ERROR; if (argc > 1) { IPX_TRAFFIC_FILTER_INFO TfFlt; ULONG mode; BOOL fClient; PWCHAR buffer; unsigned count; #define InterfaceNameW argv[0] count = wcslen (InterfaceNameW); #if 0 // Disable client interface filters for BETA if (_tcsicmp (argv[0], GetString (g_hModule, VAL_DIALINCLIENT, buffer)) == 0) { fClient = TRUE; } #endif if ( (count > 0) && (count <= MAX_INTERFACE_NAME_LEN) ) { fClient = FALSE; } else { DisplayIPXMessage (g_hModule, MSG_INVALID_INTERFACE_NAME); rc = ERROR_INVALID_PARAMETER; goto Exit; } if ( !MatchEnumTag( g_hModule, argv[1], NUM_TOKENS_IN_TABLE( FilterModes ), FilterModes, &mode ) && ( ReadTfFltDef (argc - 2, &argv[2], &TfFlt) == NO_ERROR ) ) { if (g_hMprAdmin) { rc = AdmSetTfFlt( OPERATION_DEL_TRAFFICFILTER, fClient ? NULL : InterfaceNameW, IPX_TRAFFIC_FILTER_ACTION_DENY, mode, &TfFlt ); } else { rc = NO_ERROR; } if (rc == NO_ERROR) { rc = CfgSetTfFlt( OPERATION_DEL_TRAFFICFILTER, fClient ? NULL : InterfaceNameW, IPX_TRAFFIC_FILTER_ACTION_DENY, mode, &TfFlt ); } } else { DisplayIPXMessage (g_hModule, MSG_IPX_HELP_TRAFFICFILTER); } } else { DisplayIPXMessage (g_hModule, MSG_IPX_HELP_TRAFFICFILTER); rc = ERROR_INVALID_PARAMETER; } Exit: return rc ; #undef InterfaceNameW } DWORD ReadTfFltDef ( int argc, WCHAR *argv[], PIPX_TRAFFIC_FILTER_INFO pTfFlt ) { UINT n; USHORT val2; ULONG val41, val42; ULONGLONG val8; int i; pTfFlt->FilterDefinition = 0; for (i = 0; i < argc; i++) { if ( !_wcsicmp( argv[i], TOKEN_SRCNET ) ) { if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_SRCNET) && (i < argc - 2) && ( swscanf (argv[i+1], L"%8lx%n", &val41, &n) == 1) && (n == wcslen (argv[i+1])) && ( swscanf (argv[i+2], L"%8lx%n", &val42, &n) == 1) && (n == wcslen (argv[i+2])) && ((val41 & val42) == val41)) { i += 2; pTfFlt->SourceNetwork[0] = (BYTE)(val41 >> 24); pTfFlt->SourceNetwork[1] = (BYTE)(val41 >> 16); pTfFlt->SourceNetwork[2] = (BYTE)(val41 >> 8); pTfFlt->SourceNetwork[3] = (BYTE)val41; pTfFlt->SourceNetworkMask[0] = (BYTE)(val42 >> 24); pTfFlt->SourceNetworkMask[1] = (BYTE)(val42 >> 16); pTfFlt->SourceNetworkMask[2] = (BYTE)(val42 >> 8); pTfFlt->SourceNetworkMask[3] = (BYTE)val42; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_SRCNET; } else { break; } } else if ( !_wcsicmp (argv[i], TOKEN_SRCNODE ) ) { if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_SRCNODE) && (i < argc - 1) && (swscanf (argv[i+1], L"%I64x%n", &val8, &n) == 1) && (n == wcslen (argv[i+1]))) { i += 1; pTfFlt->SourceNode[0] = (BYTE)(val8 >> 40); pTfFlt->SourceNode[1] = (BYTE)(val8 >> 32); pTfFlt->SourceNode[2] = (BYTE)(val8 >> 24); pTfFlt->SourceNode[3] = (BYTE)(val8 >> 16); pTfFlt->SourceNode[4] = (BYTE)(val8 >> 8); pTfFlt->SourceNode[5] = (BYTE)val8; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_SRCNODE; } else { break; } } else if ( !_wcsicmp (argv[i], TOKEN_SRCSOCKET )) { if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_SRCSOCKET) && (i < argc - 1) && (swscanf (argv[i+1], L"%4hx%n", &val2, &n) == 1) && (n == wcslen (argv[i+1]))) { i += 1; pTfFlt->SourceSocket[0] = (BYTE)(val2 >> 8); pTfFlt->SourceSocket[1] = (BYTE)val2; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_SRCSOCKET; } else { break; } } else if ( !_wcsicmp (argv[i], TOKEN_DSTNET ) ) { if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_DSTNET) && (i < argc - 2) && (swscanf (argv[i+1], L"%8lx%n", &val41, &n) == 1) && (n == wcslen (argv[i+1])) && (swscanf (argv[i+2], L"%8lx%n", &val42, &n) == 1) && (n == wcslen (argv[i+2])) && ((val41 & val42) == val41)) { i += 2; pTfFlt->DestinationNetwork[0] = (BYTE)(val41 >> 24); pTfFlt->DestinationNetwork[1] = (BYTE)(val41 >> 16); pTfFlt->DestinationNetwork[2] = (BYTE)(val41 >> 8); pTfFlt->DestinationNetwork[3] = (BYTE)val41; pTfFlt->DestinationNetworkMask[0] = (BYTE)(val42 >> 24); pTfFlt->DestinationNetworkMask[1] = (BYTE)(val42 >> 16); pTfFlt->DestinationNetworkMask[2] = (BYTE)(val42 >> 8); pTfFlt->DestinationNetworkMask[3] = (BYTE)val42; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_DSTNET; } else { break; } } else if ( !_wcsicmp( argv[i], TOKEN_DSTNODE ) ) { if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_DSTNODE) && (swscanf (argv[i+1], L"%I64x%n", &val8, &n) == 1) && (n == wcslen (argv[i+1]))) { i += 1; pTfFlt->DestinationNode[0] = (BYTE)(val8 >> 40); pTfFlt->DestinationNode[1] = (BYTE)(val8 >> 32); pTfFlt->DestinationNode[2] = (BYTE)(val8 >> 24); pTfFlt->DestinationNode[3] = (BYTE)(val8 >> 16); pTfFlt->DestinationNode[4] = (BYTE)(val8 >> 8); pTfFlt->DestinationNode[5] = (BYTE)val8; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_DSTNODE; } else { break; } } else if ( !_wcsicmp (argv[i], TOKEN_DSTSOCKET )) { if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_DSTSOCKET) && (i < argc - 1) && (swscanf (argv[i+1], L"%4hx%n", &val2, &n) == 1) && (n == wcslen (argv[i+1]))) { i += 1; pTfFlt->DestinationSocket[0] = (BYTE)(val2 >> 8); pTfFlt->DestinationSocket[1] = (BYTE)val2; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_DSTSOCKET; } else { break; } } else if ( !_wcsicmp (argv[i], TOKEN_PKTTYPE)) { if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_PKTTYPE) && (i < argc - 1) && (swscanf (argv[i+1], L"%2hx%n", &val2, &n) == 1) && (n == wcslen (argv[i+1]))) { i += 1; pTfFlt->PacketType = (BYTE)val2; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_PKTTYPE; } else { break; } } else if ( !_wcsicmp (argv[i], TOKEN_LOGPACKETS )) { if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_LOG_MATCHES)) { pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_LOG_MATCHES; } else { break; } } else if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_SRCNET)) { if ((i < argc - 1) && (swscanf (argv[i], L"%8lx%n", &val41, &n) == 1) && (n == wcslen (argv[i])) && (swscanf (argv[i+1], L"%8lx%n", &val42, &n) == 1) && (n == wcslen (argv[i+1])) && ((val41 & val42) == val41)) { i += 1; pTfFlt->SourceNetwork[0] = (BYTE)(val41 >> 24); pTfFlt->SourceNetwork[1] = (BYTE)(val41 >> 16); pTfFlt->SourceNetwork[2] = (BYTE)(val41 >> 8); pTfFlt->SourceNetwork[3] = (BYTE)val41; pTfFlt->SourceNetworkMask[0] = (BYTE)(val42 >> 24); pTfFlt->SourceNetworkMask[1] = (BYTE)(val42 >> 16); pTfFlt->SourceNetworkMask[2] = (BYTE)(val42 >> 8); pTfFlt->SourceNetworkMask[3] = (BYTE)val42; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_SRCNET; } else { break; } } else if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_SRCNODE)) { if ((swscanf (argv[i], L"%12I64x%n", &val8, &n) == 1) && (n == wcslen (argv[i]))) { pTfFlt->SourceNode[0] = (BYTE)(val8 >> 40); pTfFlt->SourceNode[1] = (BYTE)(val8 >> 32); pTfFlt->SourceNode[2] = (BYTE)(val8 >> 24); pTfFlt->SourceNode[3] = (BYTE)(val8 >> 16); pTfFlt->SourceNode[4] = (BYTE)(val8 >> 8); pTfFlt->SourceNode[5] = (BYTE)val8; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_SRCNODE; } else { break; } } else if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_SRCSOCKET)) { if ((swscanf (argv[i], L"%4hx%n", &val2, &n) == 1) && (n == wcslen (argv[i]))) { pTfFlt->SourceSocket[0] = (BYTE)(val2 >> 8); pTfFlt->SourceSocket[1] = (BYTE)val2; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_SRCSOCKET; } else { break; } } else if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_DSTNET)) { if ((i < argc - 1) && (swscanf (argv[i], L"%8lx%n", &val41, &n) == 1) && (n == wcslen (argv[i])) && (swscanf (argv[i+1], L"%8lx%n", &val42, &n) == 1) && (n == wcslen (argv[i+1])) && ((val41 & val42) == val41)) { i += 1; pTfFlt->DestinationNetwork[0] = (BYTE)(val41 >> 24); pTfFlt->DestinationNetwork[1] = (BYTE)(val41 >> 16); pTfFlt->DestinationNetwork[2] = (BYTE)(val41 >> 8); pTfFlt->DestinationNetwork[3] = (BYTE)val41; pTfFlt->DestinationNetworkMask[0] = (BYTE)(val42 >> 24); pTfFlt->DestinationNetworkMask[1] = (BYTE)(val42 >> 16); pTfFlt->DestinationNetworkMask[2] = (BYTE)(val42 >> 8); pTfFlt->DestinationNetworkMask[3] = (BYTE)val42; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_DSTNET; } else { break; } } else if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_DSTNODE)) { if ((swscanf (argv[i], L"%12I64x%n", &val8, &n) == 1) && (n == wcslen (argv[i]))) { pTfFlt->DestinationNode[0] = (BYTE)(val8 >> 40); pTfFlt->DestinationNode[1] = (BYTE)(val8 >> 32); pTfFlt->DestinationNode[2] = (BYTE)(val8 >> 24); pTfFlt->DestinationNode[3] = (BYTE)(val8 >> 16); pTfFlt->DestinationNode[4] = (BYTE)(val8 >> 8); pTfFlt->DestinationNode[5] = (BYTE)val8; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_DSTNODE; } else { break; } } else if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_DSTSOCKET)) { if ((swscanf (argv[i], L"%4hx%n", &val2, &n) == 1) && (n == wcslen (argv[i]))) { pTfFlt->DestinationSocket[0] = (BYTE)(val2 >> 8); pTfFlt->DestinationSocket[1] = (BYTE)val2; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_DSTSOCKET; } else { break; } } else if (!(pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_PKTTYPE)) { if ((swscanf (argv[i], L"%2hx%n", &val2, &n) == 1) && (n == wcslen (argv[i]))) { pTfFlt->PacketType = (BYTE)val2; pTfFlt->FilterDefinition |= IPX_TRAFFIC_FILTER_ON_PKTTYPE; } else { break; } } else { break; } } if (i == argc) { return NO_ERROR; } else { return ERROR_INVALID_PARAMETER; } } VOID PrintTrafficFilterInfo ( PIPX_TRAFFIC_FILTER_GLOBAL_INFO pTfGlb, PIPX_TRAFFIC_FILTER_INFO pTfFlt, ULONG count, PWCHAR wszIfName, PWCHAR wszMode, BOOL bDump ) { WCHAR wszDumpString[ 512 ]; WCHAR wszDumpBuffer[ 64 ]; WCHAR buffer[10][128]; PWCHAR pBuffer[ 10 ]; UINT i, j; for ( i = 0; i < count; i++, pTfFlt++ ) { ZeroMemory( pBuffer, 10 * sizeof( PWCHAR ) ); ZeroMemory( wszDumpString, 512 * sizeof( WCHAR ) ); swprintf( wszDumpString, L"\"%s\" %s ", wszIfName, wszMode ); if (pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_SRCNET) { pBuffer[ 0 ] = &buffer[ 0 ][ 0 ]; pBuffer[ 1 ] = &buffer[ 1 ][ 0 ]; swprintf (pBuffer[0], L"%.2x%.2x%.2x%.2x", pTfFlt->SourceNetwork[0], pTfFlt->SourceNetwork[1], pTfFlt->SourceNetwork[2], pTfFlt->SourceNetwork[3] ); swprintf (pBuffer[1], L"%.2x%.2x%.2x%.2x", pTfFlt->SourceNetworkMask[0], pTfFlt->SourceNetworkMask[1], pTfFlt->SourceNetworkMask[2], pTfFlt->SourceNetworkMask[3] ); if ( bDump ) { swprintf( wszDumpBuffer, L"srcnet = 0x%s 0x%s ", pBuffer[0], pBuffer[1] ); wcscat( wszDumpString, wszDumpBuffer ); } } else { pBuffer[ 0 ] = VAL_ANYNETWORK ; pBuffer[ 1 ] = VAL_ANYNETWORK ; } if (pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_SRCNODE) { pBuffer[ 2 ] = &buffer[ 2 ][ 0 ]; swprintf (pBuffer[2], L"%.2x%.2x%.2x%.2x%.2x%.2x", pTfFlt->SourceNode[0], pTfFlt->SourceNode[1], pTfFlt->SourceNode[2], pTfFlt->SourceNode[3], pTfFlt->SourceNode[4], pTfFlt->SourceNode[5] ); if ( bDump ) { swprintf( wszDumpBuffer, L"srcnode = 0x%s ", pBuffer[2] ); wcscat( wszDumpString, wszDumpBuffer ); } } else { pBuffer[ 2 ] = VAL_ANYNODE; } if (pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_SRCSOCKET) { pBuffer[ 3 ] = &buffer[ 3 ][ 0 ]; swprintf (pBuffer[3], L"%.2x%.2x", pTfFlt->SourceSocket[0], pTfFlt->SourceSocket[1] ); if ( bDump ) { swprintf( wszDumpBuffer, L"srcsocket = 0x%s ", pBuffer[3] ); wcscat( wszDumpString, wszDumpBuffer ); } } else { pBuffer[ 3 ] = VAL_ANYSOCKET ; } if (pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_DSTNET) { pBuffer[ 4 ] = &buffer[ 4 ][ 0 ]; pBuffer[ 5 ] = &buffer[ 5 ][ 0 ]; swprintf( pBuffer[4], L"%.2x%.2x%.2x%.2x", pTfFlt->DestinationNetwork[0], pTfFlt->DestinationNetwork[1], pTfFlt->DestinationNetwork[2], pTfFlt->DestinationNetwork[3] ); swprintf (pBuffer[5], L"%.2x%.2x%.2x%.2x", pTfFlt->DestinationNetworkMask[0], pTfFlt->DestinationNetworkMask[1], pTfFlt->DestinationNetworkMask[2], pTfFlt->DestinationNetworkMask[3] ); if ( bDump ) { swprintf( wszDumpBuffer, L"dstnet = 0x%s 0x%s ", pBuffer[4], pBuffer[5] ); wcscat( wszDumpString, wszDumpBuffer ); } } else { pBuffer[ 4 ] = VAL_ANYNETWORK; pBuffer[ 5 ] = VAL_ANYNETWORK; } if (pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_DSTNODE) { pBuffer[ 6 ] = &buffer[ 6 ][ 0 ]; swprintf (pBuffer[6], L"%.2x%.2x%.2x%.2x%.2x%.2x", pTfFlt->DestinationNode[0], pTfFlt->DestinationNode[1], pTfFlt->DestinationNode[2], pTfFlt->DestinationNode[3], pTfFlt->DestinationNode[4], pTfFlt->DestinationNode[5] ); if ( bDump ) { swprintf( wszDumpBuffer, L"dstnode = 0x%s ", pBuffer[6] ); wcscat( wszDumpString, wszDumpBuffer ); } } else { pBuffer[ 6 ] = VAL_ANYNODE; } if (pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_DSTSOCKET) { pBuffer[ 7 ] = &buffer[ 7 ][ 0 ]; swprintf(pBuffer[7], L"%.2x%.2x", pTfFlt->DestinationSocket[0], pTfFlt->DestinationSocket[1] ); if ( bDump ) { swprintf( wszDumpBuffer, L"dstsocket = 0x%s ", pBuffer[7] ); wcscat( wszDumpString, wszDumpBuffer ); } } else { pBuffer[ 7 ] = VAL_ANYSOCKET; } if (pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_ON_PKTTYPE) { pBuffer[ 8 ] = &buffer[ 8 ][ 0 ]; swprintf (pBuffer[8], L"%.2x", pTfFlt->PacketType); if ( bDump ) { swprintf( wszDumpBuffer, L"pkttype = 0x%s ", pBuffer[8] ); wcscat( wszDumpString, wszDumpBuffer ); } } else { pBuffer[ 8 ] = VAL_ANYPKTTYPE; } if (pTfFlt->FilterDefinition & IPX_TRAFFIC_FILTER_LOG_MATCHES) { pBuffer[ 9 ] = VAL_YES; if ( bDump ) { swprintf( wszDumpBuffer, L"log" ); wcscat( wszDumpString, wszDumpBuffer ); } } else { pBuffer[ 9 ] = VAL_NO; } if ( bDump ) { DisplayMessageT( DMP_IPX_ADD_FILTER, wszDumpString ); } else { DisplayIPXMessage ( g_hModule, MSG_TRAFFICFILTER_TABLE_FMT, pBuffer[0], pBuffer[1], pBuffer[2], pBuffer[3], pBuffer[4], pBuffer[5], pBuffer[6], pBuffer[7], pBuffer[8], pBuffer[9] ); } } } DWORD AdmSetTfFlt ( int operation, LPWSTR InterfaceNameW, ULONG Action, ULONG Mode, PIPX_TRAFFIC_FILTER_INFO TfFlt ) { DWORD rc; HANDLE hIfAdm; LPBYTE pIfBlock; DWORD sz; WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ]; DWORD dwSize = sizeof(IfName); if ( InterfaceNameW != NULL ) { //====================================== // Translate the Interface Name //====================================== rc = IpmontrGetIfNameFromFriendlyName( InterfaceNameW, IfName, &dwSize ); if ( rc == NO_ERROR ) { rc = MprAdminInterfaceGetHandle( g_hMprAdmin, IfName, &hIfAdm, FALSE ); if (rc == NO_ERROR) { rc = MprAdminInterfaceTransportGetInfo( g_hMprAdmin, hIfAdm, PID_IPX, &pIfBlock, &sz ); } } } else { rc = MprAdminTransportGetInfo ( g_hMprAdmin, PID_IPX, NULL, NULL, &pIfBlock, &sz ); } if (rc == NO_ERROR) { UINT msg; LPBYTE pNewBlock = NULL; switch (operation) { case OPERATION_ADD_TRAFFICFILTER: rc = AddIPXInfoEntry ( (PIPX_INFO_BLOCK_HEADER)pIfBlock, (Mode == OUTPUT_FILTER) ? IPX_OUT_TRAFFIC_FILTER_INFO_TYPE : IPX_IN_TRAFFIC_FILTER_INFO_TYPE, sizeof (*TfFlt), TfFlt, TfFltEqual, (PIPX_INFO_BLOCK_HEADER * ) & pNewBlock ); if (rc == NO_ERROR) { if (GetIPXTocEntry ((PIPX_INFO_BLOCK_HEADER)pIfBlock, (Mode == OUTPUT_FILTER) ? IPX_OUT_TRAFFIC_FILTER_GLOBAL_INFO_TYPE : IPX_IN_TRAFFIC_FILTER_GLOBAL_INFO_TYPE) == NULL) { IPX_TRAFFIC_FILTER_GLOBAL_INFO GlInfo; LPBYTE pNewNewBlock; GlInfo.FilterAction = IPX_TRAFFIC_FILTER_ACTION_DENY; rc = AddIPXInfoEntry ( (PIPX_INFO_BLOCK_HEADER)pNewBlock, (Mode == OUTPUT_FILTER) ? IPX_OUT_TRAFFIC_FILTER_GLOBAL_INFO_TYPE : IPX_IN_TRAFFIC_FILTER_GLOBAL_INFO_TYPE, sizeof (GlInfo), &GlInfo, NULL, (PIPX_INFO_BLOCK_HEADER * ) & pNewNewBlock ); if (rc == NO_ERROR) { if (pNewBlock != pNewNewBlock) { if (pNewBlock != pIfBlock) { GlobalFree (pNewBlock); } pNewBlock = pNewNewBlock; } } else { if (pNewBlock != pIfBlock) { GlobalFree (pNewBlock); } } } } if (InterfaceNameW != NULL) { msg = MSG_TRAFFICFILTER_CREATED_ADM; } else { msg = MSG_CLIENT_TRAFFICFILTER_CREATED_ADM; } break; case OPERATION_SET_TRAFFICFILTER: { PIPX_TOC_ENTRY pTfGlToc; pTfGlToc = GetIPXTocEntry ( (PIPX_INFO_BLOCK_HEADER)pIfBlock, (Mode == OUTPUT_FILTER) ? IPX_OUT_TRAFFIC_FILTER_GLOBAL_INFO_TYPE : IPX_IN_TRAFFIC_FILTER_GLOBAL_INFO_TYPE ); if (pTfGlToc != NULL) { PIPX_TRAFFIC_FILTER_GLOBAL_INFO pTfGlb; pTfGlb = (PIPX_TRAFFIC_FILTER_GLOBAL_INFO) (pIfBlock + pTfGlToc->Offset); pTfGlb->FilterAction = Action; } if (InterfaceNameW != NULL) { msg = MSG_TRAFFICFILTER_SET_ADM; } else { msg = MSG_CLIENT_TRAFFICFILTER_SET_ADM; } pNewBlock = pIfBlock; break; } case OPERATION_DEL_TRAFFICFILTER: rc = DeleteIPXInfoEntry ( (PIPX_INFO_BLOCK_HEADER)pIfBlock, (Mode == OUTPUT_FILTER) ? IPX_OUT_TRAFFIC_FILTER_INFO_TYPE : IPX_IN_TRAFFIC_FILTER_INFO_TYPE, sizeof (*TfFlt), TfFlt, TfFltEqual, (PIPX_INFO_BLOCK_HEADER * ) & pNewBlock ); if (InterfaceNameW != NULL) { msg = MSG_TRAFFICFILTER_DELETED_ADM; } else { msg = MSG_CLIENT_TRAFFICFILTER_DELETED_ADM; } // Whistler bug 247549 netsh routing ipx set/add filter produces // error, "Cannot complete function" // pNewBlock = pIfBlock; break; } if (rc == NO_ERROR) { if ( InterfaceNameW != NULL ) { if (pNewBlock) { rc = MprAdminInterfaceTransportSetInfo ( g_hMprAdmin, hIfAdm, PID_IPX, pNewBlock, ((PIPX_INFO_BLOCK_HEADER)pNewBlock)->Size ); } else { rc = ERROR_CAN_NOT_COMPLETE; } } else { if (pNewBlock) { rc = MprAdminTransportSetInfo ( g_hMprAdmin, PID_IPX, NULL, 0, pNewBlock, ((PIPX_INFO_BLOCK_HEADER)pNewBlock)->Size ); } else { rc = ERROR_CAN_NOT_COMPLETE; } } if (pNewBlock != pIfBlock) { GlobalFree (pNewBlock); } if (rc == NO_ERROR) { DisplayIPXMessage (g_hModule, msg, InterfaceNameW); } else { DisplayError( g_hModule, rc); } } else { DisplayError( g_hModule, rc); } MprAdminBufferFree (pIfBlock); } else { DisplayError( g_hModule, rc); } return rc; } DWORD CfgSetTfFlt ( int operation, LPWSTR InterfaceNameW, ULONG Action, ULONG Mode, PIPX_TRAFFIC_FILTER_INFO TfFlt ) { DWORD rc; HANDLE hIfCfg; HANDLE hIfTrCfg; HANDLE hTrCfg; LPBYTE pIfBlock; DWORD sz; WCHAR IfName[ MAX_INTERFACE_NAME_LEN + 1 ]; DWORD dwSize = sizeof(IfName); if (InterfaceNameW != NULL) { //====================================== // Translate the Interface Name //====================================== rc = IpmontrGetIfNameFromFriendlyName( InterfaceNameW, IfName, &dwSize ); if ( rc == NO_ERROR ) { rc = MprConfigInterfaceGetHandle ( g_hMprConfig, IfName, &hIfCfg ); if (rc == NO_ERROR) { rc = MprConfigInterfaceTransportGetHandle ( g_hMprConfig, hIfCfg, PID_IPX, &hIfTrCfg ); if (rc == NO_ERROR) { rc = MprConfigInterfaceTransportGetInfo ( g_hMprConfig, hIfCfg, hIfTrCfg, &pIfBlock, &sz ); } } } } else { rc = MprConfigTransportGetHandle ( g_hMprConfig, PID_IPX, &hTrCfg ); if (rc == NO_ERROR) { rc = MprConfigTransportGetInfo ( g_hMprConfig, hTrCfg, NULL, NULL, &pIfBlock, &sz, NULL ); } } if (rc == NO_ERROR) { UINT msg; LPBYTE pNewBlock = NULL; switch (operation) { case OPERATION_ADD_TRAFFICFILTER: rc = AddIPXInfoEntry ( (PIPX_INFO_BLOCK_HEADER)pIfBlock, (Mode == OUTPUT_FILTER) ? IPX_OUT_TRAFFIC_FILTER_INFO_TYPE : IPX_IN_TRAFFIC_FILTER_INFO_TYPE, sizeof (*TfFlt), TfFlt, TfFltEqual, (PIPX_INFO_BLOCK_HEADER * ) & pNewBlock ); if (rc == NO_ERROR) { if (GetIPXTocEntry ((PIPX_INFO_BLOCK_HEADER)pIfBlock, (Mode == OUTPUT_FILTER) ? IPX_OUT_TRAFFIC_FILTER_GLOBAL_INFO_TYPE : IPX_IN_TRAFFIC_FILTER_GLOBAL_INFO_TYPE) == NULL) { IPX_TRAFFIC_FILTER_GLOBAL_INFO GlInfo; LPBYTE pNewNewBlock; GlInfo.FilterAction = IPX_TRAFFIC_FILTER_ACTION_DENY; rc = AddIPXInfoEntry ( (PIPX_INFO_BLOCK_HEADER)pNewBlock, (Mode == OUTPUT_FILTER) ? IPX_OUT_TRAFFIC_FILTER_GLOBAL_INFO_TYPE : IPX_IN_TRAFFIC_FILTER_GLOBAL_INFO_TYPE, sizeof (GlInfo), &GlInfo, NULL, (PIPX_INFO_BLOCK_HEADER * ) & pNewNewBlock ); if (rc == NO_ERROR) { if (pNewBlock != pNewNewBlock) { if (pNewBlock != pIfBlock) { GlobalFree (pNewBlock); } pNewBlock = pNewNewBlock; } } else { if (pNewBlock != pIfBlock) { GlobalFree (pNewBlock); } } } } if (InterfaceNameW != NULL) { msg = MSG_TRAFFICFILTER_CREATED_CFG; } else { msg = MSG_CLIENT_TRAFFICFILTER_CREATED_CFG; } break; case OPERATION_SET_TRAFFICFILTER: { PIPX_TOC_ENTRY pTfGlToc; pTfGlToc = GetIPXTocEntry ( (PIPX_INFO_BLOCK_HEADER)pIfBlock, (Mode == OUTPUT_FILTER) ? IPX_OUT_TRAFFIC_FILTER_GLOBAL_INFO_TYPE : IPX_IN_TRAFFIC_FILTER_GLOBAL_INFO_TYPE ); if (pTfGlToc != NULL) { PIPX_TRAFFIC_FILTER_GLOBAL_INFO pTfGlb; pTfGlb = (PIPX_TRAFFIC_FILTER_GLOBAL_INFO) (pIfBlock + pTfGlToc->Offset); pTfGlb->FilterAction = Action; } if (InterfaceNameW != NULL) { msg = MSG_TRAFFICFILTER_SET_CFG; } else { msg = MSG_CLIENT_TRAFFICFILTER_SET_CFG; } pNewBlock = pIfBlock; break; } case OPERATION_DEL_TRAFFICFILTER: rc = DeleteIPXInfoEntry ( (PIPX_INFO_BLOCK_HEADER)pIfBlock, (Mode == OUTPUT_FILTER) ? IPX_OUT_TRAFFIC_FILTER_INFO_TYPE : IPX_IN_TRAFFIC_FILTER_INFO_TYPE, sizeof (*TfFlt), TfFlt, TfFltEqual, (PIPX_INFO_BLOCK_HEADER * ) & pNewBlock ); if (InterfaceNameW != NULL) { msg = MSG_TRAFFICFILTER_DELETED_CFG; } else { msg = MSG_CLIENT_TRAFFICFILTER_DELETED_CFG; } // Whistler bug 247549 netsh routing ipx set/add filter produces // error, "Cannot complete function" // pNewBlock = pIfBlock; break; } if (rc == NO_ERROR) { if (InterfaceNameW != NULL) { // Whistler bug 247549 netsh routing ipx set/add filter produces // error, "Cannot complete function" // if (pNewBlock) { rc = MprConfigInterfaceTransportSetInfo ( g_hMprConfig, hIfCfg, hIfTrCfg, pNewBlock, ((PIPX_INFO_BLOCK_HEADER)pNewBlock)->Size ); } else { rc = ERROR_CAN_NOT_COMPLETE; } } else { // Whistler bug 247549 netsh routing ipx set/add filter produces // error, "Cannot complete function" // if (pNewBlock) { rc = MprConfigTransportSetInfo ( g_hMprConfig, hTrCfg, NULL, 0, pNewBlock, ((PIPX_INFO_BLOCK_HEADER)pNewBlock)->Size, NULL ); } else { rc = ERROR_CAN_NOT_COMPLETE; } } if (pNewBlock != pIfBlock) { GlobalFree (pNewBlock); } if (rc == NO_ERROR) { DisplayIPXMessage (g_hModule, msg, InterfaceNameW); } else { DisplayError( g_hModule, rc); } } else { DisplayError( g_hModule, rc); } MprConfigBufferFree (pIfBlock); } else { DisplayError( g_hModule, rc); } return rc; } BOOL TfFltEqual ( PVOID Info1, PVOID Info2 ) { #define f1 ((PIPX_TRAFFIC_FILTER_INFO)Info1) #define f2 ((PIPX_TRAFFIC_FILTER_INFO)Info2) ULONG fd; return ((fd = f1->FilterDefinition) == f2->FilterDefinition) && (!(fd & IPX_TRAFFIC_FILTER_ON_SRCNET) || ((memcmp (f1->SourceNetwork, f2->SourceNetwork, 4) == 0) && (memcmp (f1->SourceNetworkMask, f2->SourceNetworkMask, 4) == 0))) && (!(fd & IPX_TRAFFIC_FILTER_ON_SRCNODE) || (memcmp (f1->SourceNode, f2->SourceNode, 6) == 0)) && (!(fd & IPX_TRAFFIC_FILTER_ON_SRCSOCKET) || (memcmp (f1->SourceSocket, f2->SourceSocket, 2) == 0)) && (!(fd & IPX_TRAFFIC_FILTER_ON_DSTNET) || ((memcmp (f1->DestinationNetwork, f2->DestinationNetwork, 4) == 0) && (memcmp (f1->DestinationNetworkMask, f2->DestinationNetworkMask, 4) == 0))) && (!(fd & IPX_TRAFFIC_FILTER_ON_DSTNODE) || (memcmp (f1->DestinationNode, f2->DestinationNode, 6) == 0)) && (!(fd & IPX_TRAFFIC_FILTER_ON_DSTSOCKET) || (memcmp (f1->DestinationSocket, f2->DestinationSocket, 2) == 0)) && (!(fd & IPX_TRAFFIC_FILTER_ON_PKTTYPE) || (f1->PacketType == f2->PacketType)); #undef f2 #undef f1 }