ethsock.h

Go to the documentation of this file.
00001 /*
00002  * ethsock.h
00003  *
00004  * Direct Ethernet socket I/O channel class.
00005  *
00006  * Portable Windows Library
00007  *
00008  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  * The Original Code is Portable Windows Library.
00021  *
00022  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
00023  *
00024  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
00025  * All Rights Reserved.
00026  *
00027  * Contributor(s): ______________________________________.
00028  *
00029  * $Revision: 20385 $
00030  * $Author: rjongbloed $
00031  * $Date: 2008-06-04 10:40:38 +0000 (Wed, 04 Jun 2008) $
00032  */
00033 
00034 #ifndef _PETHSOCKET
00035 #define _PETHSOCKET
00036 
00037 #ifdef P_USE_PRAGMA
00038 #pragma interface
00039 #endif
00040 
00041 #include <ptlib/socket.h>
00042 
00043 #ifdef _WIN32
00044 class PWin32PacketDriver;
00045 class PWin32SnmpLibrary;
00046 class PWin32PacketBuffer;
00047 
00048 PARRAY(PWin32PackBufArray, PWin32PacketBuffer);
00049 #endif
00050 
00054 class PEthSocket : public PSocket
00055 {
00056   PCLASSINFO(PEthSocket, PSocket);
00057 
00058   public:
00064     PEthSocket(
00065       PINDEX nReadBuffers = 8,  
00066       PINDEX nWriteBuffers = 1, 
00067       PINDEX size = 1514        
00068     );
00069 
00071     ~PEthSocket();
00073 
00074 
00075   public:
00076 #pragma pack(1)
00077 
00079     union Address {
00080       BYTE b[6];
00081       WORD w[3];
00082       struct {
00083         DWORD l;
00084         WORD  s;
00085       } ls;
00086 
00087       Address();
00088       Address(const BYTE * addr);
00089       Address(const Address & addr);
00090       Address(const PString & str);
00091       Address & operator=(const Address & addr);
00092       Address & operator=(const PString & str);
00093 
00094       bool operator==(const BYTE * eth) const;
00095       bool operator!=(const BYTE * eth) const;
00096       bool operator==(const Address & eth) const { return ls.l == eth.ls.l && ls.s == eth.ls.s; }
00097       bool operator!=(const Address & eth) const { return ls.l != eth.ls.l || ls.s != eth.ls.s; }
00098 
00099       operator PString() const;
00100 
00101       friend ostream & operator<<(ostream & s, const Address & a)
00102         { return s << (PString)a; }
00103     };
00104 
00107     struct Frame {
00108       Address dst_addr;
00109       Address src_addr;
00110       union {
00111         struct {
00112           WORD type;
00113           BYTE payload[1500];
00114         } ether;
00115         struct {
00116           WORD length;
00117           BYTE dsap;
00118           BYTE ssap;
00119           BYTE ctrl;
00120           BYTE oui[3];
00121           WORD type;
00122           BYTE payload[1492];
00123         } snap;
00124       };
00125 
00130       void Parse(
00131         WORD & type,      // Type of frame
00132         BYTE * & payload, // Pointer to payload
00133         PINDEX & length   // Length of payload (on input is full frame length)
00134       );
00135     };
00136 #pragma pack()
00137 
00145     virtual PBoolean Close();
00146 
00159     virtual PBoolean Read(
00160       void * buf,   
00161       PINDEX len    
00162     );
00163 
00175     virtual PBoolean Write(
00176       const void * buf, 
00177       PINDEX len        
00178     );
00180 
00190     virtual PBoolean Connect(
00191       const PString & address   
00192     );
00193 
00200     virtual PBoolean Listen(
00201       unsigned queueSize = 5,  
00202       WORD port = 0,           
00203       Reusability reuse = AddressIsExclusive 
00204     );
00206 
00207 
00220     PBoolean EnumInterfaces(
00221       PINDEX idx,      
00222       PString & name   
00223     );
00224 
00225 
00231     PBoolean GetAddress(
00232       Address & addr   
00233     );
00234 
00240     PBoolean GetIpAddress(
00241       PIPSocket::Address & addr     
00242     );
00243 
00250     PBoolean GetIpAddress(
00251       PIPSocket::Address & addr,    
00252       PIPSocket::Address & netMask  
00253     );
00254 
00264     PBoolean EnumIpAddress(
00265       PINDEX idx,                   
00266       PIPSocket::Address & addr,    
00267       PIPSocket::Address & netMask  
00268     );
00269 
00270 
00272     enum MediumTypes {
00274       MediumLoop,     
00276       Medium802_3,    
00278       MediumWan,      
00280       MediumUnknown,  
00281       NumMediumTypes
00282     };
00288     MediumTypes GetMedium();
00290 
00291 
00294 
00295     enum EthTypes {
00297       TypeAll = 3,          
00299       TypeIP  = 0x800,      
00301       TypeX25 = 0x805,      
00303       TypeARP = 0x806,      
00305       TypeAtalk = 0x809B,   
00307       TypeAARP = 0x80F3,    
00309       TypeIPX = 0x8137,     
00311       TypeIPv6 = 0x86DD     
00312     };
00313 
00315     enum FilterMask {
00317       FilterDirected     = 0x01,    
00319       FilterMulticast    = 0x02,    
00321       FilterAllMulticast = 0x04,    
00323       FilterBroadcast    = 0x08,    
00325       FilterPromiscuous  = 0x10     
00326     };
00327 
00339     PBoolean GetFilter(
00340       unsigned & mask,  
00341       WORD & type       
00342     );
00343 
00356     PBoolean SetFilter(
00357       unsigned mask,       
00358       WORD type = TypeAll  
00359     );
00361 
00362 
00367     PBoolean ResetAdaptor();
00368 
00376     PBoolean ReadPacket(
00377       PBYTEArray & buffer,  
00378       Address & dest,       
00379       Address & src,        
00380       WORD & type,          
00381       PINDEX & len,         
00382       BYTE * & payload      
00383     );
00385 
00386   protected:
00387     virtual PBoolean OpenSocket();
00388     virtual const char * GetProtocolName() const;
00389 
00390 
00391     WORD filterType;  // Remember the set filter frame type
00392 
00393 
00394 // Include platform dependent part of class
00395 #ifdef _WIN32
00396 #include "msos/ptlib/ethsock.h"
00397 #else
00398 #include "unix/ptlib/ethsock.h"
00399 #endif
00400 };
00401 
00402 #endif
00403 
00404 // End Of File ///////////////////////////////////////////////////////////////

Generated on Mon Feb 23 01:57:54 2009 for PTLib by  doxygen 1.5.1