//========================================================================== // PRODUCT: RusRoute - MaaSoftware routing firewall software driver // (C) Copyright Moiseenko A.A., MaaSoftware, 2003-2008. All Rights Reserved. // http://www.maasoftware.ru http://www.maasoftware.com // http://www.rusroute.ru http://www.rusroute.com // support@maasoftware.ru //========================================================================== // FILE: Ioctl.h // // AUTHOR: Andrey A. Moiseenko // // OVERVIEW Device IO control related. // ~~~~~~~~ // DATE: 18.11.2003 //========================================================================== #ifndef __RUSROUTE_EXPORT_H #define __RUSROUTE_EXPORT_H //--------------------------------------------------------------------------- enum eRusRouteErrorCode { eNoErrors = 0, eTooSmallPacket = 80, eBadLengthOfPacket = 83, eSourceIsBroadcast = 88, eTooBigFrame = 96 }; //--------------------------------------------------------------------------- #ifdef __unix__ #define RUSROUTE_CtlCode( x ) x #else #define RUSROUTE_CtlCode( x ) CTL_CODE ( FILE_DEVICE_UNKNOWN, 0x900 + ( x ), METHOD_BUFFERED, FILE_ANY_ACCESS ) #endif //__unix__ #define RUSROUTE_GET_VERSION RUSROUTE_CtlCode ( 1 ) #define RUSROUTE_GET_ADAPTER_LIST RUSROUTE_CtlCode ( 2 ) #define RUSROUTE_GET_ADAPTER_INFO RUSROUTE_CtlCode ( 3 ) #define RUSROUTE_GET_PACKET RUSROUTE_CtlCode ( 4 ) #define RUSROUTE_PUT_PACKET RUSROUTE_CtlCode ( 5 ) #define RUSROUTE_SET_EVENT_HANDLE RUSROUTE_CtlCode ( 6 ) #define RUSROUTE_TCP_OPTIMIZE RUSROUTE_CtlCode ( 7 ) #define RUSROUTE_LOGIN_LOGOUT RUSROUTE_CtlCode ( 8 ) #define RUSROUTE_GET_JOURNAL_RECS RUSROUTE_CtlCode ( 9 ) #define RUSROUTE_GET_LOG RUSROUTE_CtlCode ( 10 ) #define RUSROUTE_GET_TCP_OPT_STR RUSROUTE_CtlCode ( 11 ) #define RUSROUTE_GET_WAN_UP_LINKS RUSROUTE_CtlCode ( 12 ) #define RUSROUTE_TEST1 RUSROUTE_CtlCode ( 100 ) #define RUSROUTE_TEST2 RUSROUTE_CtlCode ( 101 ) #ifndef _RR_INTERNAL //--------------------------------------------------------------------------- // // The structure passed up on a WAN_LINE_UP indication // typedef struct _RR_NDIS_WAN_LINE_UP { IN ULONG LinkSpeed; // 100 bps units IN ULONG MaximumTotalSize; // suggested max for send packets IN int /*NDIS_WAN_QUALITY*/ Quality; IN USHORT SendWindow; // suggested by the MAC IN UCHAR RemoteAddress[6]; IN OUT UCHAR LocalAddress[6]; //IN ULONG ProtocolBufferLength; // Length of protocol info buffer //IN PUCHAR ProtocolBuffer; // Information used by protocol IN USHORT ProtocolType; // Protocol ID //IN OUT NDIS_STRING DeviceName; } RR_NDIS_WAN_LINE_UP, *P_RR_NDIS_WAN_LINE_UP; //--------------------------------------------------------------------------- // // The structure passed up on a WAN_LINE_DOWN indication // typedef struct _RR_NDIS_WAN_LINE_DOWN { IN UCHAR RemoteAddress[6]; IN UCHAR LocalAddress[6]; } RR_NDIS_WAN_LINE_DOWN, *P_RR_NDIS_WAN_LINE_DOWN; //--------------------------------------------------------------------------- typedef struct _RR_NDIS_WAN_LINE_UP_LINK { IN ULONG LinkSpeed; // 100 bps units IN ULONG MaximumTotalSize; // suggested max for send packets IN int /*NDIS_WAN_QUALITY*/ Quality; IN USHORT SendWindow; // suggested by the MAC IN UCHAR RemoteAddress[6]; IN OUT UCHAR LocalAddress[6]; //IN ULONG ProtocolBufferLength; // Length of protocol info buffer //IN PUCHAR ProtocolBuffer; // Information used by protocol IN USHORT ProtocolType; // Protocol ID //IN OUT NDIS_STRING DeviceName; int m_BufferLength; unsigned char m_Buffer[32]; } RR_NDIS_WAN_LINE_UP_LINK, *P_RR_NDIS_WAN_LINE_UP_LINK; //--------------------------------------------------------------------------- #endif //--------------------------------------------------------------------------- #define Int2AdapterHandle(x) ((DWORD)(x)) #define BAD_ADAPTER_HANDLE0 Int2AdapterHandle(0) #define BAD_ADAPTER_HANDLE1 Int2AdapterHandle(-1) //--------------------------------------------------------------------------- struct CRusRoute_AdapterInfo { DWORD /*HANDLE*/ m_Number; int m_SelectedMedium, m_State; CDrvMac6 m_Mac, m_PermanentMac; unsigned long m_DataGetMaxFrameSize; unsigned int m_GeneralStatus; int m_IsWanLineUp, m_IsMediaConnected; RR_NDIS_WAN_LINE_UP m_WanUp; RR_NDIS_WAN_LINE_DOWN m_WanDown; int m_SendPacketsDropped; int m_RecvPacketsDropped; unsigned long m_LinkSpeed; // 100 bps units char m_Name [ 512 ]; } GCC_PACKED; //--------------------------------------------------------------------------- struct CRusRoute_SetEventHandle { int m_Type; union { HANDLE m_Event; __int64 m_tmp; }; DWORD m_AdapterNumber; } GCC_PACKED; //--------------------------------------------------------------------------- #define RUSROUTE_MAX_FRAME_SIZE 1514U #define RUSROUTE_STATUS_PASS_TO_TCP 0x02 #if 0 struct CRusRoute_Packet : public CMaaDLink { /*DWORD*/ HANDLE m_AdapterNumber; DWORD m_Status; DWORD m_Flags; DWORD m_Length; unsigned char m_Buffer [ RUSROUTE_MAX_FRAME_SIZE ]; int GetHdrLen() const { return 14; } unsigned char * GetIpHdr() { return m_Buffer + GetHdrLen(); } int GetDataLen() const { return m_Length - GetHdrLen(); } } GCC_PACKED; #endif struct CRusRoute_Packet0 { DWORD /*HANDLE*/ m_AdapterNumber; DWORD m_Status; DWORD m_Flags; DWORD m_Length; unsigned char m_Buffer [ RUSROUTE_MAX_FRAME_SIZE ]; int GetHdrLen() const { return 14; } unsigned char * GetIpHdr() { return m_Buffer + GetHdrLen(); } int GetDataLen() const { return m_Length - GetHdrLen(); } } GCC_PACKED; struct CRusRoute_Packet : public CMaaDLink, public CRusRoute_Packet0 { } GCC_PACKED; //--------------------------------------------------------------------------- struct CTcpHashKey { _IP IPs, IPd; _Port PortS, PortD; bool operator == (const CTcpHashKey & That) const { return IPs == That.IPs && IPd == That.IPd && PortS == That.PortS && PortD == That.PortD; } }; struct CRedirTcp { CTcpHashKey k0, k1; bool bIR0, bIR1; }; struct CTcpOptimization : public CMaaDLink { enum eHash { // duplicated in rr -- data.h eh0 = (1<<0), eh1 = (1<<1), eh2 = (1<<2), eh3 = (1<<3), eSRedir0 = (1<<4), eSRedir3 = (1<<5) }; int m_MainFlags, m_Flags; bool m_bDisableOptimization; bool m_bOptimizationPerformed; CRedirTcp s, d; DWORD m_Adapters[4]; int m_MTU[4]; unsigned char m_Eth[12 * 4]; bool m_bJournal, m_bJournalSecondaryLevel, m_bLevel2Send; bool m_b1stDirSend; int m_NewTTL; _IP m_UserIp; int m_Id, m_JournalId; unsigned long m_ISN[4], m_Seq[4], m_Ack[4]; // in host byte order, Seq is PktSeq+TcpSegmLen void Init() { m_MainFlags = m_Flags = 0; m_bDisableOptimization = false; m_bOptimizationPerformed = false; for (int i = 0; i < 4; i++) { m_Adapters[i] = Int2AdapterHandle(-1); m_MTU[i] = -1; m_ISN[i] = m_Seq[i] = m_Ack[i] = 0; } memset(m_Eth, 0, sizeof(m_Eth)); m_NewTTL = -1; m_UserIp = 0; m_Id = m_JournalId = -1; } }; struct CTcpOptHashData { int b; CTcpOptimization * p; }; //---------------------------------------------------------------------------- struct sOptJournalKey { int JournalId; int Id; _IP UserIp; bool operator == (const sOptJournalKey &That) const { return JournalId == That.JournalId && Id == That.Id && UserIp == That.UserIp; } }; struct sOptJournalData { unsigned int In, Out; }; struct sOptJournalRec { sOptJournalKey k; sOptJournalData d; }; struct sOptJournalRecs { int t; sOptJournalRec p[1010]; }; //---------------------------------------------------------------------------- #endif // __RUSROUTE_EXPORT_H