//========================================================================== // 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 //========================================================================== // // AUTHOR: Andrey A. Moiseenko // // Creation date: // //--------------------------------------------------------------------------- // ptr is ( unsigned ) char * //#define IP_ADDRESS( a, b, c, d ) ( ( _byte )( a ) + 0x100 * ( ( _byte )( b ) + 0x100 * ( ( _byte )( c ) + 0x100 * ( _byte )( d ) ) ) ) #define ByteToIP(x) ( ( _IP )( _byte )( x ) ) #define IP_A( a, b, c, d ) ( ByteToIP( a ) * 0x1000000 + ByteToIP( b ) * 0x10000 + ByteToIP( c ) * 0x100 + ByteToIP( d ) ) #define ReserverLengthForBiggerHeader 0x10 #define EthernetHeaderLength 14 #define EthernetPacketLength 14 #define EthernatTypicalFrameSize 0x5ea // 1514 #define FddiHeaderLength 0x15 #define FddiMinimalHeaderLength 0x0d #define FddiTypicalFrameSize 0x1187 // 4487 #define TokenRingHeaderLength 0x16 #define TokenRingMinimalHeaderLength 0x0e #define TokenRingTypicalFrameSize 0xfc0 // 4032 #define MaxMacHeaderSize 0x20 #define Eth_TypeCode( ptr ) ( *(unsigned short *)(ptr + 12) ) #define Proto_IP 0x0800 #define Proto_ARP 0x0806 /* Address Resolution packet */ #define Proto_RARP 0x8035 /* Reverse Addr Res packet */ #define Proto_IPX 0x8137 /* IPX over DIX */ #define Proto_IPV6 0x86DD /* IPv6 over bluebook */ #define Proto_IPX_802_3 0x0001 /* IPX for 802.3 frames */ #define Proto_NB_802_3 0x0002 /* NetBEUI type for 802.3 frames */ #define Proto_ALL 0x0003 /* Every packet (be careful!!!) */ struct CDrvMac6 { char Addr [ 6 ]; CDrvMac6 () { } CDrvMac6 ( const char * m ) { Set ( m, 6 ); } bool operator == ( const CDrvMac6 & That ) const { return * ( const long * ) Addr == * ( const long * ) That.Addr && * ( const short * )( Addr + 4 ) == * ( const short * )( That.Addr + 4 ); } bool operator != ( const CDrvMac6 & That ) const { return * ( const long * ) Addr != * ( const long * ) That.Addr || * ( const short * )( Addr + 4 ) != * ( const short * )( That.Addr + 4 ); } CDrvMac6 & operator |= ( const CDrvMac6 & That ) { * ( long * ) Addr |= * ( const long * ) That.Addr; * ( short * )( Addr + 4 ) |= * ( const short * )( That.Addr + 4 ); return *this; } bool IsBroadcast () const { if ( sizeof(long) != 4 || sizeof ( short ) != 2 ) { INT3; } return * ( const long * ) Addr == -1 && * ( const short * )( Addr + 4 ) == -1; } void SetToZero () { * ( long * ) Addr = 0; * ( short * )( Addr + 4 ) = 0; } void SetToBroadcast () { * ( long * ) Addr = -1; * ( short * )( Addr + 4 ) = -1; } void Set ( const void * p, int len ) { Memcpy ( Addr, p, len < sizeof ( Addr ) ? len : sizeof ( Addr ) ); if ( len < sizeof ( Addr ) ) { Memzero ( Addr + len, sizeof ( Addr ) - len ); } } } GCC_PACKED; struct CDrvEthHdr { CDrvMac6 DestinAddr, SourceAddr; short TypeCode; // 0800 = DOD IP - Department of Defense IP } GCC_PACKED; struct CDrvFddiHdr { char FC; CDrvMac6 DestinAddr, SourceAddr; char xz [ 6 ]; short TypeCode; // 0800 = DOD IP - Department of Defense IP } GCC_PACKED; struct CDrvTokenRingHdr { char AC; char FC; CDrvMac6 DestinAddr, SourceAddr; char xz [ 6 ]; short TypeCode; // 0800 = DOD IP - Department of Defense IP } GCC_PACKED; //#define swap16( x ) (unsigned short)( (( ((x)&0xff) << 8) + ( ((x)&0xff00) >> 8)) & 0xffff ) #ifdef _MaaRF_INTERNAL_BUILD #endif // IP header version 4 definition #define IPHeaderMinLen 20 #define IPHeaderCurrentVersion 4 #define IP_HeaderVersion( ptr ) ( (ptr[0]>>4) & 0x0f ) // 4 == IPHeaderCurrentVersion #define IP_HeaderLength( ptr ) ( 4 * (unsigned int)(ptr[0] & 0x0f) ) #define Max_IP_HeaderLength ( 4 * 0x0f ) #define IP_pTotalLength( ptr ) (unsigned short *)(ptr + 2) //#define IP_TotalLength( ptr ) ntohs( *(unsigned short *)(ptr + 2) ) #define IP_Id( ptr ) ( *(unsigned short *)(ptr + 4) ) #define IP_TTL_( ptr ) ( ptr [ 8 ] ) // time to live #define IP_Protocol( ptr ) ( ptr [ 9 ] ) // Proto_TCP==6 #define IP_pCheckSum( ptr ) (unsigned short *)(ptr + 10) #define IP_CheckSum( ptr ) *(unsigned short *)(ptr + 10) #define IP_SourceAddress( ptr ) ( *(unsigned long *)(ptr + 12) ) #define IP_DestinAddress( ptr ) ( *(unsigned long *)(ptr + 16) ) #define IP_Flag_Reserved 0x80 #define IP_Flag_DontFragment 0x40 #define IP_Flag_MoreFragments 0x20 #define IP_MustNotFragment( ptr ) ( ptr[6] & 0x40 ) #define IP_NotLastFragment( ptr ) ( ptr[6] & 0x20 ) #define IP_IsFragmented( ptr ) ( *( short * )( ptr + 6 ) & ~( 0x40 | 0x80 ) ) //#define IP_Fragmented( ptr ) ( ptr[6] & 0x20 ) #define IP_FragmentOffset( ptr ) ( ( 0x1fff & ntohs( *(unsigned short *)(ptr + 6) ) ) << 3 ) #define IP_fReserved 0x8000 #define IP_fDontFragment 0x4000 #define IP_fMoreFragments 0x2000 #define IP_pFragmentField( ptr ) ( (unsigned short *)(ptr + 6) ) #define IP_FragmentMask ( IP_fReserved | IP_fDontFragment | IP_fMoreFragments ) #define Proto_ICMP 1 #define Proto_TCP 6 #define Proto_UDP 17 // Transport Control Protocol #define TCPHeaderMinLen 20 #define TCP_SourcePort( ptr ) ( *(unsigned short *)((ptr) + 0) ) #define TCP_DestinPort( ptr ) ( *(unsigned short *)((ptr) + 2) ) #define TCP_Seq( ptr ) ( *(int *)((ptr) + 4) ) #define TCP_Ack( ptr ) ( *(int *)((ptr) + 8 ) ) #define TCP_CheckSum( ptr ) ( *(unsigned short *)((ptr) + 16) ) #define TCP_HeaderLength( ptr ) ( (unsigned int)(ptr[12] & 0xf0) / 4 ) inline void SetTcpHdrLen ( unsigned char * hdr, int len ) { hdr[12] = ( hdr[12] & 0x0f ) + ( ( len * 4 ) & 0xf0 ); } #ifdef IPLIR_SOCKETS #define TCP_Win( ptr ) ( *(unsigned short *)((ptr) + 14) ) #define TCP_Urg( ptr ) ( *(unsigned short *)((ptr) + 18) ) #endif //IPLIR_SOCKETS // User Datagram Protocol #define UDPHeaderLength 8 #define UDP_SourcePort( ptr ) TCP_SourcePort( ptr ) #define UDP_DestinPort( ptr ) TCP_DestinPort( ptr ) #define UDP_Length( ptr ) ( *(unsigned short *)(ptr + 4) ) #define UDP_CheckSum( ptr ) ( *(unsigned short *)(ptr + 6) ) #define TCP_Flags( ptr ) ( * ( 13 + ( unsigned char * ) ptr ) ) #define TCP_Flag_URG 0x20 // Urgent Pointer field significant #define TCP_Flag_ACK 0x10 // Acknowledgment field significant #define TCP_Flag_PSH 0x08 // Push Function #define TCP_Flag_RST 0x04 // Reset the connection #define TCP_Flag_SYN 0x02 // Synchronize sequence numbers #define TCP_Flag_FIN 0x01 // No more data from sender #define ICMPType_EchoRequest 8 #define ICMPType_EchoReply 0 #define ICMPType_DestinationUnreachable 3 #define ICMPType_TimeExceeded 11 #define ICMPType_ParameterProblem 12 #define PING_Identifier(ptr) ( *(unsigned short *)(ptr + 4 ) ) // ptr - icmp header #define PING_SequenceNumber(ptr) ( *(unsigned short *)(ptr + 6 ) ) #define ARP_HARDWARE_ETHERNET 1 #define ARP_OP_REQUEST 1 #define ARP_OP_RESPONSE 2 struct ARP_Header { _word m_Hardware; _word m_Protocol; _byte m_HardwareAddrLen, m_ProtocolAddrLen; _word m_Operation; } GCC_PACKED; struct ARP_For_Eth_And_IP { CDrvMac6 m_HardwareAddr; _IP m_Ip; } GCC_PACKED; struct ARP_Over_Ethernet : public ARP_Header { ARP_For_Eth_And_IP m_Source; ARP_For_Eth_And_IP m_Destin; };